Index: src/game/Object.cpp =================================================================== --- src/game/Object.cpp (working copy) +++ src/game/Object.cpp (working copy) @@ -584,6 +584,8 @@ m_mapId = 0; m_InstanceId = 0; + m_name = ""; + mSemaphoreTeleport = false; if (instantiator) @@ -596,7 +598,8 @@ { Object::_Create(guidlow, guidhigh); - SetUInt32Value( OBJECT_FIELD_ENTRY,nameId); + // nameId not required, it set in other place... + //SetUInt32Value( OBJECT_FIELD_ENTRY,nameId); m_mapId = mapid; m_positionX = x; @@ -720,6 +723,72 @@ z = GetPositionZ(); } +void WorldObject::Say(const std::string text, const uint32 language) +{ + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_MONSTER_SAY; + data << (uint32)language; + data << (uint64)GetGUID(); + data << (uint32)(strlen(GetName())+1); + data << GetName(); + data << (uint64)0; + data << (uint32)(text.length()+1); + data << text; + data << (uint8)0; // ChatTag + + SendMessageToSet(&data, true); +} + +void WorldObject::Yell(const std::string text, const uint32 language) +{ + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_MONSTER_YELL; + data << (uint32)language; + data << (uint64)GetGUID(); + data << (uint32)(strlen(GetName())+1); + data << GetName(); + data << (uint64)0; + data << (uint32)(text.length()+1); + data << text; + data << (uint8)0; // ChatTag + + SendMessageToSet(&data, true); +} + +void WorldObject::TextEmote(const std::string text) +{ + std::string rightText = "%s " + text; + + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_MONSTER_EMOTE; + data << (uint32)LANG_UNIVERSAL; + data << (uint32)(strlen(GetName())+1); + data << GetName(); + data << (uint64)0; + data << (uint32)(rightText.length()+1); + data << rightText; + data << (uint8)0; // ChatTag + + SendMessageToSet(&data, true); // SendMessageToOwnTeamSet()? +} + +void WorldObject::Whisper(const uint64 receiver, const std::string text) +{ + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_MONSTER_WHISPER; + data << (uint32)LANG_UNIVERSAL; + data << (uint32)1; + data << GetName(); + data << (uint64)receiver; + data << (uint32)(text.length()+1); + data << text; + data << (uint8)0; // ChatTag + + Player *player = objmgr.GetPlayer(receiver); + if(player && player->GetSession()) + player->GetSession()->SendPacket(&data); +} + void WorldObject::GetClosePoint( const WorldObject* victim, float &x, float &y, float &z, float distance, float angle ) const { angle += victim ? GetAngle( victim ) : GetOrientation(); Index: src/game/Object.h =================================================================== --- src/game/Object.h (working copy) +++ src/game/Object.h (working copy) @@ -275,7 +275,10 @@ uint32 GetMapId() const { return m_mapId; } uint32 GetZoneId() const; - uint32 GetAreaId() const; + uint32 GetAreaId() const; + + const char* GetName() const { return m_name.c_str(); } + void SetName(std::string newname) { m_name=newname; } float GetDistanceSq( const WorldObject* obj ) const; float GetDistance2dSq( const WorldObject* obj ) const; @@ -293,6 +296,11 @@ bool IsBeingTeleported() { return mSemaphoreTeleport; } void SetSemaphoreTeleport(bool semphsetting) { mSemaphoreTeleport = semphsetting; } + virtual void Say(const std::string text, const uint32 language); + virtual void Yell(const std::string text, const uint32 language); + virtual void TextEmote(const std::string text); + virtual void Whisper(const uint64 receiver, const std::string text); + void SendDestroyObject(uint64 guid); void SendObjectDeSpawnAnim(uint64 guid); @@ -304,6 +312,8 @@ protected: WorldObject( WorldObject *instantiator ); + std::string m_name; + private: uint32 m_mapId; Index: src/game/Player.h =================================================================== --- src/game/Player.h (working copy) +++ src/game/Player.h (working copy) @@ -646,6 +646,11 @@ void RemovePet(Pet* pet, PetSaveMode mode); void Uncharm(); + void Say(const std::string text, const uint32 language); + void Yell(const std::string text, const uint32 language); + void TextEmote(const std::string text); + void Whisper(const uint64 receiver, const std::string text, const uint32 language); + float GetResistanceBuffMods(SpellSchools school, bool positive) const { return GetFloatValue(positive ? PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE+school ); } void SetResistanceBuffMods(SpellSchools school, bool positive, float val) { SetFloatValue(positive ? PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE+school,val); } void ApplyResistanceBuffModsMod(SpellSchools school, bool positive, float val, bool apply) { ApplyModFloatValue(positive ? PLAYER_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : PLAYER_FIELD_RESISTANCEBUFFMODSNEGATIVE+school, val, apply); } Index: src/game/World.cpp =================================================================== --- src/game/World.cpp (working copy) +++ src/game/World.cpp (working copy) @@ -348,7 +348,9 @@ ||!MapManager::ExistMAP(1,-618.518,-4251.67) ||!MapManager::ExistMAP(0, 1676.35, 1677.45) ||!MapManager::ExistMAP(1, 10311.3, 832.463) - ||!MapManager::ExistMAP(1,-2917.58,-257.98)) + ||!MapManager::ExistMAP(1,-2917.58,-257.98) + ||!MapManager::ExistMAP(530,10349.6,-6357.29) + ||!MapManager::ExistMAP(530,-3961.64,-13931.2)) { sLog.outError("Correct *.map files not found in path '%smaps'. Please place *.map files in the directory pointed by this path or correct the DataDir value in the mangosd.conf file.",m_dataPath.c_str()); exit(1); @@ -406,7 +408,7 @@ sLog.outString( "Loading Item Texts..." ); objmgr.LoadItemTexts(); - sLog.outString( "Loading Creature Templates..." ); + sLog.outString( "Loading Creature templates..." ); objmgr.LoadCreatureTemplates(); sLog.outString( "Loading Creature Reputation OnKill Data..." ); @@ -701,7 +703,7 @@ break; } - ((Creature *)step.source)->MonsterSay(step.script->datatext.c_str(), 0, step.target->GetGUID()); + ((Creature *)step.source)->Say(step.script->datatext.c_str(), 0); break; case SCRIPT_COMMAND_EMOTE: if(!step.source) Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (working copy) +++ src/game/Player.cpp (working copy) @@ -11510,6 +11510,99 @@ GetSession()->SendPacket(&data); } +void Player::Say(const std::string text, const uint32 language) +{ + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_SAY; + data << (uint32)language; + data << (uint64)GetGUID(); + data << (uint64)GetGUID(); + data << (uint32)(text.length()+1); + data << text; + data << (uint8)chatTag(); + + SendMessageToSet(&data, true); +} + +void Player::Yell(const std::string text, const uint32 language) +{ + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_YELL; + data << (uint32)language; + data << (uint64)GetGUID(); + data << (uint64)GetGUID(); + data << (uint32)(text.length()+1); + data << text; + data << (uint8)chatTag(); + + SendMessageToSet(&data, true); +} + +void Player::TextEmote(const std::string text) +{ + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_EMOTE; + data << (uint32)LANG_UNIVERSAL; + data << (uint64)GetGUID(); + data << (uint32)(text.length()+1); + data << text; + data << (uint8)chatTag(); + + SendMessageToSet(&data, true); +} + +void Player::Whisper(const uint64 receiver, const std::string text, const uint32 language) +{ + Player *player = objmgr.GetPlayer(receiver); + + WorldPacket data(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_WHISPER; + data << (uint32)LANG_UNIVERSAL; + data << (uint64)GetGUID(); + data << (uint32)(text.length()+1); + data << text; + data << (uint8)chatTag(); + player->GetSession()->SendPacket(&data); + + data.Initialize(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_WHISPER_INFORM; + data << (uint32)language; + data << (uint64)player->GetGUID(); + data << (uint32)(text.length()+1); + data << text; + data << (uint8)chatTag(); + GetSession()->SendPacket(&data); + + if(player->isAFK()) + { + data.Initialize(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_AFK; + data << (uint32)language; + data << (uint64)player->GetGUID(); + data << (uint32)(player->afkMsg.length()+1); + data << player->afkMsg; + data << (uint8)0; + GetSession()->SendPacket(&data); + } + if(player->isDND()) + { + data.Initialize(SMSG_MESSAGECHAT, 200); + data << (uint8)CHAT_MSG_DND; + data << (uint32)language; + data << (uint64)player->GetGUID(); + data << (uint32)(player->dndMsg.length()+1); + data << player->dndMsg; + data << (uint8)0; + GetSession()->SendPacket(&data); + } + + if(!isAcceptWhispers()) + { + SetAcceptWhispers(true); + sChatHandler.SendSysMessage(GetSession() ,"Whispers accepting now: ON"); + } +} + void Player::PetSpellInitialize() { Pet* pet = GetPet(); Index: src/game/ChatHandler.cpp =================================================================== --- src/game/ChatHandler.cpp (working copy) +++ src/game/ChatHandler.cpp (working copy) @@ -59,8 +59,9 @@ switch(type) { - case CHAT_MSG_SAY: - case CHAT_MSG_EMOTE: // "/me text" emote type + case CHAT_MSG_SAY: + case CHAT_MSG_EMOTE: + case CHAT_MSG_YELL: { std::string msg = ""; recv_data >> msg; @@ -68,18 +69,52 @@ if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) break; - if(type==CHAT_MSG_SAY) + if(type == CHAT_MSG_SAY) + GetPlayer()->Say(msg, lang); + else if(type == CHAT_MSG_EMOTE) + GetPlayer()->TextEmote(msg); + else if(type == CHAT_MSG_YELL) + GetPlayer()->Yell(msg, lang); + } break; + + case CHAT_MSG_WHISPER: + { + std::string to, msg; + recv_data >> to; + CHECK_PACKET_SIZE(recv_data,4+4+(to.size()+1)+1); + recv_data >> msg; + + if(to.size() == 0) { - sChatHandler.FillMessageData( &data, this, type, lang, NULL, 0, msg.c_str() ); - GetPlayer()->SendMessageToSet( &data, true ); + WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); + data<GetSession()->GetSecurity() > 0 && !player->isAcceptWhispers()) { - std::ostringstream msg2; - msg2 << GetPlayer()->GetName() << " " << msg; - sChatHandler.FillMessageData( &data, this, type, lang, NULL, 0, msg2.str().c_str() ); - GetPlayer()->SendMessageToOwnTeamSet( &data, true ); + WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); + data<GetSession()->GetSecurity() == 0 ) + { + uint32 sidea = GetPlayer()->GetTeam(); + uint32 sideb = player->GetTeam(); + if( sidea != sideb ) + { + WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); + data<Whisper(player->GetGUID(), msg, lang); } break; case CHAT_MSG_PARTY: @@ -99,7 +134,6 @@ group->BroadcastPacket(&data, group->GetMemberGroup(GetPlayer()->GetGUID())); } break; - case CHAT_MSG_GUILD: { std::string msg = ""; @@ -133,88 +167,50 @@ } break; } - - case CHAT_MSG_YELL: + case CHAT_MSG_RAID: { - std::string msg = ""; + std::string msg=""; recv_data >> msg; if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) break; - sChatHandler.FillMessageData(&data, this, type, lang, NULL, 0, msg.c_str() ); + Group *group = GetPlayer()->groupInfo.group; + if(!group || !group->isRaidGroup()) + return; - //please test this, its important that this is correct. I leave the previouse code becouse of this. - GetPlayer()->SendMessageToSet( &data, true ); - //SendPacket(&data); - //sWorld.SendGlobalMessage(&data, this); - + WorldPacket data; + sChatHandler.FillMessageData(&data, this, CHAT_MSG_RAID, lang, "", 0, msg.c_str()); + group->BroadcastPacket(&data); } break; - - case CHAT_MSG_WHISPER: + case CHAT_MSG_RAID_LEADER: { - std::string to, msg; - recv_data >> to; - - // recheck - CHECK_PACKET_SIZE(recv_data,4+4+(to.size()+1)+1); - + std::string msg=""; recv_data >> msg; - if(to.size() == 0) - { - WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); - data< 0) break; - } - normalizePlayerName(to); - Player *player = objmgr.GetPlayer(to.c_str()); - // send whispers from player to GM only if GM accept its (not show online state GM in other case) - if(!player || GetSecurity() == 0 && player->GetSession()->GetSecurity() > 0 && !player->isAcceptWhispers()) - { - WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); - data<GetSession()->GetSecurity() == 0 ) - { - uint32 sidea = GetPlayer()->GetTeam(); - uint32 sideb = player->GetTeam(); - if( sidea != sideb ) - { - WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1)); - data<groupInfo.group; + if(!group || !group->isRaidGroup() || !group->IsLeader(GetPlayer()->GetGUID())) + return; - sChatHandler.FillMessageData(&data, this, type, lang, NULL, 0, msg.c_str() ); - player->GetSession()->SendPacket(&data); + WorldPacket data; + sChatHandler.FillMessageData(&data, this, CHAT_MSG_RAID_LEADER, lang, "", 0, msg.c_str()); + group->BroadcastPacket(&data); + } break; + case CHAT_MSG_RAID_WARN: + { + std::string msg=""; + recv_data >> msg; - sChatHandler.FillMessageData(&data,this,CHAT_MSG_WHISPER_INFORM,lang,NULL,player->GetGUID(),msg.c_str() ); - SendPacket(&data); + Group *group = GetPlayer()->groupInfo.group; + if(!group || !group->isRaidGroup() || !group->IsLeader(GetPlayer()->GetGUID())) + return; - if(player->isAFK()) - { - sChatHandler.FillMessageData(&data, this, CHAT_MSG_AFK, LANG_UNIVERSAL, NULL, player->GetGUID(), player->afkMsg.c_str()); - SendPacket(&data); - } - if(player->isDND()) - { - sChatHandler.FillMessageData(&data, this, CHAT_MSG_DND, LANG_UNIVERSAL, NULL, player->GetGUID(), player->dndMsg.c_str()); - SendPacket(&data); - } - - // Auto enable whispers accepting at sending whispers - if(!GetPlayer()->isAcceptWhispers()) - { - GetPlayer()->SetAcceptWhispers(true); - sChatHandler.SendSysMessage(this ,"Whispers accepting now: ON"); - } + WorldPacket data; + sChatHandler.FillMessageData(&data, this, CHAT_MSG_RAID_WARN, lang, "", 0, msg.c_str()); + group->BroadcastPacket(&data); } break; case CHAT_MSG_CHANNEL: @@ -227,9 +223,9 @@ recv_data >> msg; - if(ChannelMgr* cMgr = channelMgr(GetPlayer()->GetTeam())) - if(Channel *chn = cMgr->GetChannel(channel,GetPlayer())) - chn->Say(GetPlayer(),msg.c_str(),lang); + if(ChannelMgr* cMgr = channelMgr(_player->GetTeam())) + if(Channel *chn = cMgr->GetChannel(channel,_player)) + chn->Say(_player->GetGUID(),msg.c_str(),lang); } break; case CHAT_MSG_AFK: @@ -237,12 +233,12 @@ std::string msg; recv_data >> msg; - GetPlayer()->afkMsg = msg; - if((msg.size() == 0 || !GetPlayer()->isAFK()) && !GetPlayer()->isInCombat() ) + _player->afkMsg = msg; + if((msg.size() == 0 || !_player->isAFK()) && !_player->isInCombat() ) { - GetPlayer()->ToggleAFK(); - if(GetPlayer()->isAFK() && GetPlayer()->isDND()) - GetPlayer()->ToggleDND(); + _player->ToggleAFK(); + if(_player->isAFK() && _player->isDND()) + _player->ToggleDND(); } } break; @@ -260,54 +256,8 @@ } } break; - case CHAT_MSG_RAID: - { - std::string msg=""; - recv_data >> msg; - if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) - break; - Group *group = GetPlayer()->groupInfo.group; - if(!group || !group->isRaidGroup()) - return; - - WorldPacket data; - sChatHandler.FillMessageData(&data, this, CHAT_MSG_RAID, lang, "", 0, msg.c_str()); - group->BroadcastPacket(&data); - } break; - - case CHAT_MSG_RAID_LEADER: - { - std::string msg=""; - recv_data >> msg; - - if (sChatHandler.ParseCommands(msg.c_str(), this) > 0) - break; - - Group *group = GetPlayer()->groupInfo.group; - if(!group || !group->isRaidGroup() || !group->IsLeader(GetPlayer()->GetGUID())) - return; - - WorldPacket data; - sChatHandler.FillMessageData(&data, this, CHAT_MSG_RAID_LEADER, lang, "", 0, msg.c_str()); - group->BroadcastPacket(&data); - } break; - - case CHAT_MSG_RAID_WARN: - { - std::string msg=""; - recv_data >> msg; - - Group *group = GetPlayer()->groupInfo.group; - if(!group || !group->isRaidGroup() || !group->IsLeader(GetPlayer()->GetGUID())) - return; - - WorldPacket data; - sChatHandler.FillMessageData(&data, this, CHAT_MSG_RAID_WARN, lang, "", 0, msg.c_str()); - group->BroadcastPacket(&data); - } break; - default: sLog.outError("CHAT: unknown msg type %u, lang: %u", type, lang); } Index: src/game/Creature.cpp =================================================================== --- src/game/Creature.cpp (working copy) +++ src/game/Creature.cpp (working copy) @@ -1303,22 +1303,6 @@ } } -void Creature::Say(char const* message, uint32 language) -{ - WorldPacket data; - - sChatHandler.FillMessageData( &data, NULL, CHAT_MSG_SAY, language, NULL, 0, message ); - SendMessageToSet( &data, false ); -} - -void Creature::MonsterSay(char const* message, uint32 language, uint64 targetGUID) -{ - WorldPacket data; - - sChatHandler.FillMessageData( &data, NULL, CHAT_MSG_MONSTER_SAY, language, NULL, targetGUID, message, this ); - SendMessageToSet( &data, false ); -} - bool Creature::IsImmunedToSpell(SpellEntry const* spellInfo) const { if (!spellInfo)