Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

MTA Lua. Не отменяется событие

tzi izi Знаток (410), открыт 1 неделю назад
  
local chatRadius = 20


function sendMessageToNearbyPlayers(message, messageType)

if messageType == 0 then

local posX1, posY1, posZ1 = getElementPosition(source)


for id, player in ipairs(getElementsByType("player")) do
local posX2, posY2, posZ2 = getElementPosition(player)
if getDistanceBetweenPoints3D(posX1, posY1, posZ1, posX2, posY2, posZ2) <= chatRadius then
outputChatBox(message, player, 255, 255, 255)
end
end
end

cancelEvent()
end

addEventHandler( "onPlayerChat", getRootElement(), sendMessageToNearbyPlayers )
В чат должно прийти сообщение для игроков в определённом радиусе, и сообщение приходит, но у отправившего сообщение двоится, то есть сначало отправляется то что он написал в глобальный чат, а после в локальный как и должно быть в этой функции. Почему то cancelEvent не работает
1 ответ
☀ ИИ-Помощник | Ответы Mail.ru Мастер (1043) 1 неделю назад
Проблема с тем, что cancelEvent() не работает, скорее всего, кроется в том, как вы обрабатываете событие onPlayerChat.

Проблема:

* Неправильное местоположение cancelEvent(): cancelEvent() должен быть вызван перед тем, как сообщение будет отправлено в глобальный чат. В вашем коде, cancelEvent() вызывается после того, как сообщение уже отобразилось в глобальном чате.
* Встроенные обработчики: MTA имеет встроенные обработчики для onPlayerChat, которые вызываются перед вашим sendMessageToNearbyPlayers. Эти обработчики отправляют сообщение в глобальный чат, а затем ваш код делает тоже самое.

Решение:

1. Измените порядок: Перенесите cancelEvent() перед outputChatBox в вашем коде, чтобы предотвратить отправку сообщения в глобальный чат.

function sendMessageToNearbyPlayers(message, messageType)
if messageType == 0 then
local posX1, posY1, posZ1 = getElementPosition(source)

cancelEvent() -- Предотвращаем отправку сообщения в глобальный чат

for id, player in ipairs(getElementsByType("player")) do
local posX2, posY2, posZ2 = getElementPosition(player)
if getDistanceBetweenPoints3D(posX1, posY1, posZ1, posX2, posY2, posZ2) <= chatRadius then
outputChatBox(message, player, 255, 255, 255)
end
end
end
end

addEventHandler( "onPlayerChat", getRootElement(), sendMessageToNearbyPlayers )


2. Используйте setElementData: Чтобы избежать конфликтов с встроенными обработчиками, используйте setElementData для сохранения сообщения и cancelEvent. Затем создайте другой обработчик, который будет отправлять сообщение только локально, если оно было сохранено.

function onPlayerChat(message, messageType)
if messageType == 0 then
setElementData(source, "localChatMsg", message)
cancelEvent()
end
end

function sendLocalChat(player)
local message = getElementData(player, "localChatMsg")
if message then
local posX1, posY1, posZ1 = getElementPosition(player)

for id, p in ipairs(getElementsByType("player")) do
local posX2, posY2, posZ2 = getElementPosition(p)
if getDistanceBetweenPoints3D(posX1, posY1, posZ1, posX2, posY2, posZ2) <= chatRadius then
outputChatBox(message, p, 255, 255, 255)
end
end
removeElementData(player, "localChatMsg")
end
end

addEventHandler("onPlayerChat", getRootElement(), onPlayerChat)
addEventHandler("onPlayerChat", getRootElement(), sendLocalChat)


Объяснение:

* onPlayerChat: этот обработчик сохраняет сообщение в переменную localChatMsg и отменяет стандартную обработку.
* sendLocalChat: этот обработчик проверяет, есть ли сообщение в localChatMsg. Если есть, он отправляет сообщение только тем, кто находится в радиусе. После отправки сообщения, оно удаляется.

Важно:

* Убедитесь, что ваши обработчики события onPlayerChat добавлены в правильном порядке, чтобы sendLocalChat вызывался после того, как onPlayerChat сохранит сообщение.
* Используйте cancelEvent с осторожностью. Он может нарушить стандартную обработку события.
Похожие вопросы