aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp11
-rw-r--r--src/server/game/Globals/ObjectMgr.h8
-rw-r--r--src/server/game/Scripting/MapScripts.cpp6
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h11
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp4
9 files changed, 61 insertions, 13 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 8b26988726d..0e61c3d0df9 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13429,6 +13429,20 @@ void Unit::SendDurabilityLoss(Player* receiver, uint32 percent)
receiver->GetSession()->SendPacket(packet.Write());
}
+void Unit::PlayOneShotAnimKitId(uint16 animKitId)
+{
+ if (!sAnimKitStore.LookupEntry(animKitId))
+ {
+ TC_LOG_ERROR("entities.unit", "Unit::PlayOneShotAnimKitId using invalid AnimKit ID: %u", animKitId);
+ return;
+ }
+
+ WorldPackets::Misc::PlayOneShotAnimKit data;
+ data.Unit = GetGUID();
+ data.AnimKitID = animKitId;
+ SendMessageToSet(data.Write(), true);
+}
+
void Unit::SetAIAnimKitId(uint16 animKitId)
{
if (_aiAnimKitId == animKitId)
@@ -13477,14 +13491,6 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId)
SendMessageToSet(data.Write(), true);
}
-void Unit::PlayOneShotAnimKit(uint16 animKitId)
-{
- WorldPacket data(SMSG_PLAY_ONE_SHOT_ANIM_KIT, 7+2);
- data << GetPackGUID();
- data << uint16(animKitId);
- SendMessageToSet(&data, true);
-}
-
void Unit::Kill(Unit* victim, bool durabilityLoss)
{
// Prevent killing unit twice (and giving reward from kill twice)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index ddc0bf14278..9902b2a2af9 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1499,13 +1499,13 @@ class Unit : public WorldObject
MountCapabilityEntry const* GetMountCapability(uint32 mountType) const;
void SendDurabilityLoss(Player* receiver, uint32 percent);
+ void PlayOneShotAnimKitId(uint16 animKitId);
void SetAIAnimKitId(uint16 animKitId);
uint16 GetAIAnimKitId() const override { return _aiAnimKitId; }
void SetMovementAnimKitId(uint16 animKitId);
uint16 GetMovementAnimKitId() const override { return _movementAnimKitId; }
void SetMeleeAnimKitId(uint16 animKitId);
uint16 GetMeleeAnimKitId() const override { return _meleeAnimKitId; }
- void PlayOneShotAnimKit(uint16 animKitId);
uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
void DealDamageMods(Unit* victim, uint32 &damage, uint32* absorb);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index e23f3f0c06c..2efcc71ae75 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -111,6 +111,7 @@ std::string GetScriptCommandName(ScriptCommands command)
case SCRIPT_COMMAND_MODEL: res = "SCRIPT_COMMAND_MODEL"; break;
case SCRIPT_COMMAND_CLOSE_GOSSIP: res = "SCRIPT_COMMAND_CLOSE_GOSSIP"; break;
case SCRIPT_COMMAND_PLAYMOVIE: res = "SCRIPT_COMMAND_PLAYMOVIE"; break;
+ case SCRIPT_COMMAND_PLAY_ANIMKIT: res = "SCRIPT_COMMAND_PLAY_ANIMKIT"; break;
default:
{
char sz[32];
@@ -4863,6 +4864,16 @@ void ObjectMgr::LoadScripts(ScriptsType type)
}
break;
}
+ case SCRIPT_COMMAND_PLAY_ANIMKIT:
+ {
+ if (!sAnimKitStore.LookupEntry(tmp.PlayAnimKit.AnimKitID))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `%s` has invalid AnimKid id (datalong = %u) in SCRIPT_COMMAND_PLAY_ANIMKIT for script id %u",
+ tableName.c_str(), tmp.PlayAnimKit.AnimKitID, tmp.id);
+ continue;
+ }
+ break;
+ }
default:
break;
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 7c43fac5c6d..7fb35c15504 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -112,7 +112,8 @@ enum ScriptCommands
SCRIPT_COMMAND_EQUIP = 31, // soucre = Creature, datalong = equipment id
SCRIPT_COMMAND_MODEL = 32, // source = Creature, datalong = model id
SCRIPT_COMMAND_CLOSE_GOSSIP = 33, // source = Player
- SCRIPT_COMMAND_PLAYMOVIE = 34 // source = Player, datalong = movie id
+ SCRIPT_COMMAND_PLAYMOVIE = 34, // source = Player, datalong = movie id
+ SCRIPT_COMMAND_PLAY_ANIMKIT = 35 // source = Creature, datalong = AnimKit id
};
// Benchmarked: Faster than std::unordered_map (insert/find)
@@ -361,6 +362,11 @@ struct ScriptInfo
{
uint32 MovieID; // datalong
} PlayMovie;
+
+ struct // SCRIPT_COMMAND_PLAY_ANIMKIT (35)
+ {
+ uint32 AnimKitID; // datalong
+ } PlayAnimKit;
};
std::string GetDebugInfo() const;
diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp
index 47bfb804efe..8caabbbe1ec 100644
--- a/src/server/game/Scripting/MapScripts.cpp
+++ b/src/server/game/Scripting/MapScripts.cpp
@@ -889,6 +889,12 @@ void Map::ScriptsProcess()
player->SendMovieStart(step.script->PlayMovie.MovieID);
break;
+ case SCRIPT_COMMAND_PLAY_ANIMKIT:
+ // Source must be Creature.
+ if (Creature* cSource = _GetScriptCreature(source, true, step.script))
+ cSource->PlayOneShotAnimKitId(step.script->PlayAnimKit.AnimKitID);
+ break;
+
default:
TC_LOG_ERROR("scripts", "Unknown script command %s.", step.script->GetDebugInfo().c_str());
break;
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index d37e29c023a..ec440305d26 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -524,6 +524,14 @@ WorldPacket const* WorldPackets::Misc::LoadCUFProfiles::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Misc::PlayOneShotAnimKit::Write()
+{
+ _worldPacket << Unit;
+ _worldPacket << uint16(AnimKitID);
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Misc::SetAIAnimKit::Write()
{
_worldPacket << Unit;
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index ca81a8dcc18..ebf920e2787 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -666,6 +666,17 @@ namespace WorldPackets
std::vector<CUFProfile const*> CUFProfiles;
};
+ class PlayOneShotAnimKit final : public ServerPacket
+ {
+ public:
+ PlayOneShotAnimKit() : ServerPacket(SMSG_PLAY_ONE_SHOT_ANIM_KIT, 7 + 2) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Unit;
+ uint16 AnimKitID = 0;
+ };
+
class SetAIAnimKit final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 8ccd0739273..e8f924ced63 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1444,7 +1444,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TABARD_VENDOR_ACTIVATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_OBJECT_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ONE_SHOT_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ONE_SHOT_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ORPHAN_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SCENE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SOUND, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
index 839e214fde7..ae608a86413 100644
--- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
+++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
@@ -281,7 +281,7 @@ class npc_blazing_monstrosity : public CreatureScript
{
DoZoneInCombat();
me->RemoveAurasDueToSpell(SPELL_SLEEP_ULTRA_HIGH_PRIORITY);
- me->PlayOneShotAnimKit(ANIM_KIT_BIRD_WAKE);
+ me->PlayOneShotAnimKitId(ANIM_KIT_BIRD_WAKE);
_events.Reset();
_events.ScheduleEvent(EVENT_START_SPITTING, 6000);
_events.ScheduleEvent(EVENT_CONTINUE_SPITTING, 9000);
@@ -602,7 +602,7 @@ class spell_alysrazor_turn_monstrosity : public SpellScriptLoader
void TurnBird(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
- GetHitUnit()->PlayOneShotAnimKit(ANIM_KIT_BIRD_TURN);
+ GetHitUnit()->PlayOneShotAnimKitId(ANIM_KIT_BIRD_TURN);
}
void Register() override