diff options
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 93 | ||||
-rw-r--r-- | src/server/game/World/World.h | 2 |
3 files changed, 66 insertions, 31 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 95bff2e4fdc..e6d9fb21361 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2267,7 +2267,7 @@ void Creature::AllLootRemovedFromCorpse() else decayRate = 0.0f; - uint32 diff = (m_corpseRemoveTime - now) * decayRate; + uint32 diff = uint32((m_corpseRemoveTime - now) * decayRate); m_corpseRemoveTime -= diff; m_respawnTime -= diff; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 5eccf0666a4..2edc516c427 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3030,40 +3030,75 @@ void Map::ScriptsProcess() switch (step.script->command) { case SCRIPT_COMMAND_TALK: - // Source or target must be Creature. - if (Creature *cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script)) + if (step.script->datalong > CHAT_TYPE_WHISPER) { - if (step.script->datalong > CHAT_TYPE_WHISPER) + sLog.outError("%s invalid chat type (%u) specified, skipping.", step.script->GetDebugInfo().c_str(), step.script->datalong); + break; + } + if (step.script->datalong2 & 0x1) + { + if (Player *pSource = _GetScriptPlayerSourceOrTarget(source, target, step.script)) { - sLog.outError("%s invalid chat type (%u) specified, skipping.", step.script->GetDebugInfo().c_str(), step.script->datalong); - break; - } + uint64 targetGUID = target ? target->GetGUID() : 0; + int loc_idx = pSource->GetSession()->GetSessionDbLocaleIndex(); + const std::string text(sObjectMgr.GetTrinityString(step.script->dataint, loc_idx)); - uint64 targetGUID = target ? target->GetGUID() : 0; - switch (step.script->datalong) + switch (step.script->datalong) + { + case CHAT_TYPE_SAY: + pSource->Say(text, LANG_UNIVERSAL); + break; + case CHAT_TYPE_YELL: + pSource->Yell(text, LANG_UNIVERSAL); + break; + case CHAT_TYPE_TEXT_EMOTE: + case CHAT_TYPE_BOSS_EMOTE: + pSource->TextEmote(text); + break; + case CHAT_TYPE_WHISPER: + if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) + { + sLog.outError("%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); + break; + } + pSource->Whisper(text, LANG_UNIVERSAL, targetGUID); + break; + default: + break; // must be already checked at load + } + } + } + else + { + // Source or target must be Creature. + if (Creature *cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script)) { - case CHAT_TYPE_SAY: - cSource->Say(step.script->dataint, LANG_UNIVERSAL, targetGUID); - break; - case CHAT_TYPE_YELL: - cSource->Yell(step.script->dataint, LANG_UNIVERSAL, targetGUID); - break; - case CHAT_TYPE_TEXT_EMOTE: - cSource->TextEmote(step.script->dataint, targetGUID); - break; - case CHAT_TYPE_BOSS_EMOTE: - cSource->MonsterTextEmote(step.script->dataint, targetGUID, true); - break; - case CHAT_TYPE_WHISPER: - if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) - { - sLog.outError("%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); + uint64 targetGUID = target ? target->GetGUID() : 0; + switch (step.script->datalong) + { + case CHAT_TYPE_SAY: + cSource->Say(step.script->dataint, LANG_UNIVERSAL, targetGUID); break; - } - cSource->Whisper(step.script->dataint, targetGUID); - break; - default: - break; // must be already checked at load + case CHAT_TYPE_YELL: + cSource->Yell(step.script->dataint, LANG_UNIVERSAL, targetGUID); + break; + case CHAT_TYPE_TEXT_EMOTE: + cSource->TextEmote(step.script->dataint, targetGUID); + break; + case CHAT_TYPE_BOSS_EMOTE: + cSource->MonsterTextEmote(step.script->dataint, targetGUID, true); + break; + case CHAT_TYPE_WHISPER: + if (!targetGUID || !IS_PLAYER_GUID(targetGUID)) + { + sLog.outError("%s attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo().c_str()); + break; + } + cSource->Whisper(step.script->dataint, targetGUID); + break; + default: + break; // must be already checked at load + } } } break; diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index e273fc80e8a..46c2f5d2949 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -455,7 +455,7 @@ enum WorldStates // DB scripting commands enum ScriptCommands { - SCRIPT_COMMAND_TALK = 0, // source/target = Creature, target = any, datalong = talk type (0=say, 1=whisper, 2=yell, 3=emote text, 4=boss emote text), dataint = string_id + SCRIPT_COMMAND_TALK = 0, // source/target = Creature, target = any, datalong = talk type (0=say, 1=whisper, 2=yell, 3=emote text, 4=boss emote text), datalong2 & 1 = player talk (instead of creature), dataint = string_id SCRIPT_COMMAND_EMOTE = 1, // source/target = Creature, datalong = emote id, datalong2 = 0: set emote state; > 0: play emote state SCRIPT_COMMAND_FIELD_SET = 2, // source/target = Creature, datalong = field id, datalog2 = value SCRIPT_COMMAND_MOVE_TO = 3, // source/target = Creature, datalong2 = time to reach, x/y/z = destination |