diff options
author | megamage <none@none> | 2009-03-22 19:20:03 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-03-22 19:20:03 -0600 |
commit | a47d2e1c22237e1b2337e89b0f1d910cca68b6ed (patch) | |
tree | c8b48faff0f424b69c0178395ebd609a068dcb73 /src | |
parent | ce71c0e798ed3f47dd6356c34766e16d951a8ca5 (diff) |
*Note some script id are changed. DB change may be needed.
[7518] Implement new script command SCRIPT_COMMAND_PLAY_SOUND (look in World.h for args) Author: VladimirMangos
* Also rewrite use SMSG_PLAY_OBJECT_SOUND/SMSG_PLAY_SOUND
Now WorldObject have 2 function for sound level dependent from distance (PlayDistanceSound)
and for not depednet (PlayDirectSound)
* Old Player::PlaySound function removed and uses need to be updated to WorldObject functions
Note: function called for _source_ of sound in different from old function.
* chat command .debug ps removed and .debug playsound can used for bother packects test:
if no selection used SMSG_PLAY_SOUND, if selection exist including self then SMSG_PLAY_OBJECT_SOUND.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Chat.cpp | 1 | ||||
-rw-r--r-- | src/game/Chat.h | 1 | ||||
-rw-r--r-- | src/game/Debugcmds.cpp | 36 | ||||
-rw-r--r-- | src/game/Level1.cpp | 29 | ||||
-rw-r--r-- | src/game/Object.cpp | 21 | ||||
-rw-r--r-- | src/game/Object.h | 3 | ||||
-rw-r--r-- | src/game/Player.cpp | 10 | ||||
-rw-r--r-- | src/game/Player.h | 2 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 3 | ||||
-rw-r--r-- | src/game/World.cpp | 50 | ||||
-rw-r--r-- | src/game/World.h | 8 |
11 files changed, 102 insertions, 62 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 24ce216cc93..26645052a13 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -121,7 +121,6 @@ ChatCommand * ChatHandler::getCommandTable() { "sendopcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendOpcodeCommand, "", NULL }, { "spawnvehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpawnVehicle, "", NULL }, { "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdateWorldStateCommand, "", NULL }, - { "ps", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugPlaySound2Command, "", NULL }, { "scn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendChannelNotifyCommand, "", NULL }, { "scm", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendChatMsgCommand, "", NULL }, { "sps", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendSetPhaseShiftCommand, "", NULL }, diff --git a/src/game/Chat.h b/src/game/Chat.h index ee95f78a396..f584af40bd2 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -467,7 +467,6 @@ class ChatHandler bool HandleDebugSellErrorCommand(const char* args); bool HandleDebugBuyErrorCommand(const char* args); bool HandleDebugUpdateWorldStateCommand(const char* args); - bool HandleDebugPlaySound2Command(const char* args); bool HandleDebugSendChannelNotifyCommand(const char* args); bool HandleDebugSendChatMsgCommand(const char* args); bool HandleRenameCommand(const char * args); diff --git a/src/game/Debugcmds.cpp b/src/game/Debugcmds.cpp index 73aff0dbb09..d0402b4851c 100644 --- a/src/game/Debugcmds.cpp +++ b/src/game/Debugcmds.cpp @@ -243,13 +243,41 @@ bool ChatHandler::HandleDebugUpdateWorldStateCommand(const char* args) return true; } -bool ChatHandler::HandleDebugPlaySound2Command(const char* args) +//Play sound +bool ChatHandler::HandleDebugPlaySoundCommand(const char* args) { - if(!args) + // USAGE: .debug playsound #soundid + // #soundid - ID decimal number from SoundEntries.dbc (1st column) + if( !*args ) + { + SendSysMessage(LANG_BAD_VALUE); + SetSentErrorMessage(true); + return false; + } + + uint32 dwSoundId = atoi((char*)args); + + if(!sSoundEntriesStore.LookupEntry(dwSoundId)) + { + PSendSysMessage(LANG_SOUND_NOT_EXIST, dwSoundId); + SetSentErrorMessage(true); return false; + } + + Unit* unit = getSelectedUnit(); + if(!unit) + { + SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + SetSentErrorMessage(true); + return false; + } + + if(m_session->GetPlayer()->GetSelection()) + unit->PlayDistanceSound(dwSoundId,m_session->GetPlayer()); + else + unit->PlayDirectSound(dwSoundId,m_session->GetPlayer()); - uint32 soundid = atoi(args); - m_session->GetPlayer()->PlaySound(soundid, false); + PSendSysMessage(LANG_YOU_HEAR_SOUND, dwSoundId); return true; } diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index f4c9c62ba09..650084e7557 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -2383,35 +2383,6 @@ bool ChatHandler::HandleWhispersCommand(const char* args) return false; } -//Play sound -bool ChatHandler::HandleDebugPlaySoundCommand(const char* args) -{ - // USAGE: .debug playsound #soundid - // #soundid - ID decimal number from SoundEntries.dbc (1st column) - // this file have about 5000 sounds. - // In this realization only caller can hear this sound. - if( *args ) - { - uint32 dwSoundId = atoi((char*)args); - - if( !sSoundEntriesStore.LookupEntry(dwSoundId) ) - { - PSendSysMessage(LANG_SOUND_NOT_EXIST, dwSoundId); - SetSentErrorMessage(true); - return false; - } - - WorldPacket data(SMSG_PLAY_OBJECT_SOUND,4+8); - data << uint32(dwSoundId) << m_session->GetPlayer()->GetGUID(); - m_session->SendPacket(&data); - - PSendSysMessage(LANG_YOU_HEAR_SOUND, dwSoundId); - return true; - } - - return false; -} - //Save all players in the world bool ChatHandler::HandleSaveAllCommand(const char* /*args*/) { diff --git a/src/game/Object.cpp b/src/game/Object.cpp index b6069fe1ae1..26405d13cf7 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1884,3 +1884,24 @@ void WorldObject::SetPhaseMask(uint32 newPhaseMask, bool update) if(update && IsInWorld()) ObjectAccessor::UpdateObjectVisibility(this); } + +void WorldObject::PlayDistanceSound( uint32 sound_id, Player* target /*= NULL*/ ) +{ + WorldPacket data(SMSG_PLAY_OBJECT_SOUND,4+8); + data << uint32(sound_id); + data << GetGUID(); + if (target) + target->SendDirectMessage( &data ); + else + SendMessageToSet( &data, true ); +} + +void WorldObject::PlayDirectSound( uint32 sound_id, Player* target /*= NULL*/ ) +{ + WorldPacket data(SMSG_PLAY_SOUND, 4); + data << uint32(sound_id); + if (target) + target->SendDirectMessage( &data ); + else + SendMessageToSet( &data, true ); +} diff --git a/src/game/Object.h b/src/game/Object.h index 4107a6e5aa4..134df409ec7 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -480,6 +480,9 @@ class TRINITY_DLL_SPEC WorldObject : public Object void MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisper = false); void BuildMonsterChat(WorldPacket *data, uint8 msgtype, char const* text, uint32 language, char const* name, uint64 TargetGuid) const; + void PlayDistanceSound(uint32 sound_id, Player* target = NULL); + void PlayDirectSound(uint32 sound_id, Player* target = NULL); + void SendObjectDeSpawnAnim(uint64 guid); virtual void SaveRespawnTime() {} diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 28080c58b6d..6482bf3b684 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -16794,16 +16794,6 @@ void Player::SendAutoRepeatCancel() GetSession()->SendPacket( &data ); } -void Player::PlaySound(uint32 Sound, bool OnlySelf) -{ - WorldPacket data(SMSG_PLAY_SOUND, 4); - data << Sound; - if (OnlySelf) - GetSession()->SendPacket( &data ); - else - SendMessageToSet( &data, true ); -} - void Player::SendExplorationExperience(uint32 Area, uint32 Experience) { WorldPacket data( SMSG_EXPLORATION_EXPERIENCE, 8 ); diff --git a/src/game/Player.h b/src/game/Player.h index 8eb26c3b6fd..a6810e85c50 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1613,8 +1613,6 @@ class TRINITY_DLL_SPEC Player : public Unit void SendDelayResponse(const uint32); void SendLogXPGain(uint32 GivenXP,Unit* victim,uint32 RestXP); - //Low Level Packets - void PlaySound(uint32 Sound, bool OnlySelf); //notifiers void SendAttackSwingCantAttack(); void SendAttackSwingCancelAttack(); diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 4f7ba18beb4..60f505c3a2e 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1999,8 +1999,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real) m_target->CastSpell(m_target, 51581, true, NULL, this); return; case 43873: // Headless Horseman Laugh - if(caster->GetTypeId() == TYPEID_PLAYER) - ((Player*)caster)->PlaySound(11965, false); + m_target->PlayDistanceSound(11965); return; case 46354: // Blood Elf Illusion if(caster) diff --git a/src/game/World.cpp b/src/game/World.cpp index 12d8d2ed64b..3e25ff086c0 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -2510,15 +2510,6 @@ void World::ScriptsProcess() return; } - case SCRIPT_COMMAND_PLAYSOUND: - { - if(!source) - break; - //datalong sound_id, datalong2 onlyself - ((WorldObject*)source)->SendPlaySound(step.script->datalong, step.script->datalong2); - break; - } - case SCRIPT_COMMAND_KILL: { if(!source || ((Creature*)source)->isDead()) @@ -2534,6 +2525,47 @@ void World::ScriptsProcess() break; } + case SCRIPT_COMMAND_PLAY_SOUND: + { + if(!source) + { + sLog.outError("SCRIPT_COMMAND_PLAY_SOUND call for NULL creature."); + break; + } + + WorldObject* pSource = dynamic_cast<WorldObject*>(source); + if(!pSource) + { + sLog.outError("SCRIPT_COMMAND_PLAY_SOUND call for non-world object (TypeId: %u), skipping.",source->GetTypeId()); + break; + } + + // bitmask: 0/1=anyone/target, 0/2=with distance dependent + Player* pTarget = NULL; + if(step.script->datalong2 & 1) + { + if(!target) + { + sLog.outError("SCRIPT_COMMAND_PLAY_SOUND in targeted mode call for NULL target."); + break; + } + + if(target->GetTypeId()!=TYPEID_PLAYER) + { + sLog.outError("SCRIPT_COMMAND_PLAY_SOUND in targeted mode call for non-player (TypeId: %u), skipping.",target->GetTypeId()); + break; + } + + pTarget = (Player*)target; + } + + // bitmask: 0/1=anyone/target, 0/2=with distance dependent + if(step.script->datalong2 & 2) + pSource->PlayDistanceSound(step.script->datalong,pTarget); + else + pSource->PlayDirectSound(step.script->datalong,pTarget); + break; + } default: sLog.outError("Unknown script command %u called.",step.script->command); break; diff --git a/src/game/World.h b/src/game/World.h index 7e9af69a7da..e997f34f089 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -342,10 +342,10 @@ enum RealmZone #define SCRIPT_COMMAND_ACTIVATE_OBJECT 13 // source = unit, target=GO #define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id #define SCRIPT_COMMAND_CAST_SPELL 15 // source/target cast spell at target/source (script->datalong2: 0: s->t 1: s->s 2: t->t 3: t->s -#define SCRIPT_COMMAND_LOAD_PATH 16 // source = unit, path = datalong, repeatable datalong2 -#define SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT 17 // datalong scriptid, lowguid datalong2, dataint table -#define SCRIPT_COMMAND_PLAYSOUND 18 // datalong soundid, datalong2 play only self -#define SCRIPT_COMMAND_KILL 19 // datalong removecorpse +#define SCRIPT_COMMAND_PLAY_SOUND 16 // source = any object, target=any/player, datalong (sound_id), datalong2 (bitmask: 0/1=anyone/target, 0/2=with distance dependent, so 1|2 = 3 is target with distance dependent) +#define SCRIPT_COMMAND_LOAD_PATH 20 // source = unit, path = datalong, repeatable datalong2 +#define SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT 21 // datalong scriptid, lowguid datalong2, dataint table +#define SCRIPT_COMMAND_KILL 22 // datalong removecorpse /// Storage class for commands issued for delayed execution struct CliCommandHolder |