Skip to content

Instantly share code, notes, and snippets.

@Aokromes
Created February 17, 2017 09:28
Show Gist options
  • Save Aokromes/15adef92b869ead6f1100dfcc35999b2 to your computer and use it in GitHub Desktop.
Save Aokromes/15adef92b869ead6f1100dfcc35999b2 to your computer and use it in GitHub Desktop.
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 808945e..96bf08e 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -34,7 +34,7 @@
#include "Transport.h"
GameObject::GameObject() : WorldObject(false), MapObject(),
- m_model(nullptr), m_goValue(), m_AI(nullptr)
+ m_model(nullptr), m_goValue(), m_AI(nullptr), _animKitId(0)
{
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
@@ -2469,6 +2469,25 @@ void GameObject::UpdateModelPosition()
}
}
+void GameObject::SetAnimKitId(uint16 animKitId, bool oneshot)
+{
+ if (_animKitId == animKitId)
+ return;
+
+ if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
+ return;
+
+ if (!oneshot)
+ _animKitId = animKitId;
+ else
+ _animKitId = 0;
+
+ WorldPacket data(SMSG_SET_AI_ANIM_KIT, 16 + 2);
+ data << GetPackGUID();
+ data << uint16(animKitId);
+ SendMessageToSet(&data, true);
+}
+
class GameObjectModelOwnerImpl : public GameObjectModelOwnerBase
{
public:
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index d0db93a..962436c 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -903,6 +903,9 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
void UpdateModelPosition();
+ uint16 GetAIAnimKitId() const override { return _animKitId; }
+ void SetAnimKitId(uint16 animKitId, bool oneshot);
+
void AIM_Destroy();
bool AIM_Initialize();
@@ -957,5 +960,6 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
}
GameObjectAI* m_AI;
+ uint16 _animKitId;
};
#endif
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index b6cc9bd..eddebb8 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1202,8 +1202,7 @@ void MovementInfo::OutDebug()
WorldObject::WorldObject(bool isWorldObject) : WorldLocation(), LastUsedScriptID(0),
m_name(""), m_isActive(false), m_isWorldObject(isWorldObject), m_zoneScript(NULL),
m_transport(NULL), m_currMap(NULL), m_InstanceId(0),
-m_phaseMask(PHASEMASK_NORMAL), _dbPhase(0), m_notifyflags(0), m_executed_notifies(0),
-m_aiAnimKitId(0), m_movementAnimKitId(0), m_meleeAnimKitId(0)
+m_phaseMask(PHASEMASK_NORMAL), _dbPhase(0), m_notifyflags(0), m_executed_notifies(0)
{
m_serverSideVisibility.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE | GHOST_VISIBILITY_GHOST);
m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE);
@@ -2896,54 +2895,6 @@ template void WorldObject::GetPlayerListInGrid(std::list<Player*>&, float) const
template void WorldObject::GetPlayerListInGrid(std::deque<Player*>&, float) const;
template void WorldObject::GetPlayerListInGrid(std::vector<Player*>&, float) const;
-void WorldObject::SetAIAnimKitId(uint16 animKitId)
-{
- if (m_aiAnimKitId == animKitId)
- return;
-
- if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
- return;
-
- m_aiAnimKitId = animKitId;
-
- WorldPacket data(SMSG_SET_AI_ANIM_KIT, 8 + 2);
- data << GetPackGUID();
- data << uint16(animKitId);
- SendMessageToSet(&data, true);
-}
-
-void WorldObject::SetMovementAnimKitId(uint16 animKitId)
-{
- if (m_movementAnimKitId == animKitId)
- return;
-
- if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
- return;
-
- m_movementAnimKitId = animKitId;
-
- WorldPacket data(SMSG_SET_MOVEMENT_ANIM_KIT, 8 + 2);
- data << GetPackGUID();
- data << uint16(animKitId);
- SendMessageToSet(&data, true);
-}
-
-void WorldObject::SetMeleeAnimKitId(uint16 animKitId)
-{
- if (m_meleeAnimKitId == animKitId)
- return;
-
- if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
- return;
-
- m_meleeAnimKitId = animKitId;
-
- WorldPacket data(SMSG_SET_MELEE_ANIM_KIT, 8 + 2);
- data << GetPackGUID();
- data << uint16(animKitId);
- SendMessageToSet(&data, true);
-}
-
void WorldObject::RebuildTerrainSwaps()
{
// Clear all terrain swaps, will be rebuilt below
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index ec71fb8..db9799e 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -652,12 +652,9 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
virtual float GetStationaryZ() const { return GetPositionZ(); }
virtual float GetStationaryO() const { return GetOrientation(); }
- uint16 GetAIAnimKitId() const { return m_aiAnimKitId; }
- void SetAIAnimKitId(uint16 animKitId);
- uint16 GetMovementAnimKitId() const { return m_movementAnimKitId; }
- void SetMovementAnimKitId(uint16 animKitId);
- uint16 GetMeleeAnimKitId() const { return m_meleeAnimKitId; }
- void SetMeleeAnimKitId(uint16 animKitId);
+ virtual uint16 GetAIAnimKitId() const { return 0; }
+ virtual uint16 GetMovementAnimKitId() const { return 0; }
+ virtual uint16 GetMeleeAnimKitId() const { return 0; }
protected:
std::string m_name;
@@ -699,10 +696,6 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
bool CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert = false) const;
bool CanDetectInvisibilityOf(WorldObject const* obj) const;
bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const;
-
- uint16 m_aiAnimKitId;
- uint16 m_movementAnimKitId;
- uint16 m_meleeAnimKitId;
};
namespace Trinity
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index a4a95ec..77a1128 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -187,7 +187,9 @@ Unit::Unit(bool isWorldObject) :
i_AI(NULL), i_disabledAI(NULL), m_AutoRepeatFirstCast(false), m_procDeep(0),
m_removedAurasCount(0), i_motionMaster(new MotionMaster(this)), m_regenTimer(0), m_ThreatManager(this),
m_vehicle(NULL), m_vehicleKit(NULL), m_unitTypeMask(UNIT_MASK_NONE),
- m_HostileRefManager(this), _lastDamagedTime(0), m_spellHistory(new SpellHistory(this))
+ m_HostileRefManager(this), _lastDamagedTime(0),
+ _aiAnimKitId(0), _movementAnimKitId(0), _meleeAnimKitId(0),
+ m_spellHistory(new SpellHistory(this))
{
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
@@ -13995,14 +13997,70 @@ void Unit::SendDurabilityLoss(Player* receiver, uint32 percent)
receiver->GetSession()->SendPacket(&data);
}
-void Unit::PlayOneShotAnimKit(uint16 animKitId)
+void Unit::PlayOneShotAnimKitId(uint16 animKitId)
{
+ if (!sAnimKitStore.LookupEntry(animKitId))
+ {
+ TC_LOG_ERROR("entities.unit", "Unit::PlayOneShotAnimKitId using invalid AnimKit ID: %u", animKitId);
+ return;
+ }
+
WorldPacket data(SMSG_PLAY_ONE_SHOT_ANIM_KIT, 7+2);
data << GetPackGUID();
data << uint16(animKitId);
SendMessageToSet(&data, true);
}
+void Unit::SetAIAnimKitId(uint16 animKitId)
+{
+ if (_aiAnimKitId == animKitId)
+ return;
+
+ if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
+ return;
+
+ _aiAnimKitId = animKitId;
+
+ WorldPacket data(SMSG_SET_AI_ANIM_KIT, 8 + 2);
+ data << GetPackGUID();
+ data << uint16(animKitId);
+ SendMessageToSet(&data, true);
+}
+
+void Unit::SetMovementAnimKitId(uint16 animKitId)
+{
+ if (_movementAnimKitId == animKitId)
+ return;
+
+ if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
+ return;
+
+ _movementAnimKitId = animKitId;
+
+
+ WorldPacket data(SMSG_SET_MOVEMENT_ANIM_KIT, 8 + 2);
+ data << GetPackGUID();
+ data << uint16(animKitId);
+ SendMessageToSet(&data, true);
+}
+
+void Unit::SetMeleeAnimKitId(uint16 animKitId)
+{
+ if (_meleeAnimKitId == animKitId)
+ return;
+
+ if (animKitId && !sAnimKitStore.LookupEntry(animKitId))
+ return;
+
+ _meleeAnimKitId = animKitId;
+
+
+ WorldPacket data(SMSG_SET_MELEE_ANIM_KIT, 8 + 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 a91d667..ae18f2d 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1467,7 +1467,13 @@ class TC_GAME_API Unit : public WorldObject
MountCapabilityEntry const* GetMountCapability(uint32 mountType) const;
void SendDurabilityLoss(Player* receiver, uint32 percent);
- void PlayOneShotAnimKit(uint16 animKitId);
+ 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; }
uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
void DealDamageMods(Unit* victim, uint32 &damage, uint32* absorb);
@@ -1903,6 +1909,10 @@ class TC_GAME_API Unit : public WorldObject
// Check if our current channel spell has attribute SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING
bool IsMovementPreventedByCasting() const;
+ uint16 _aiAnimKitId;
+ uint16 _movementAnimKitId;
+ uint16 _meleeAnimKitId;
+
SpellHistory* GetSpellHistory() { return m_spellHistory; }
SpellHistory const* GetSpellHistory() const { return m_spellHistory; }
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index fec5ba1..f222e2a 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;
case SCRIPT_COMMAND_MOVEMENT: res = "SCRIPT_COMMAND_MOVEMENT"; break;
default:
{
@@ -5109,6 +5110,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 885f885..81c30a8 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -113,7 +113,8 @@ enum ScriptCommands
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_MOVEMENT = 35 // soucre = Creature, datalong = MovementType, datalong2 = MovementDistance (spawndist f.ex.), dataint = pathid
+ SCRIPT_COMMAND_MOVEMENT = 35, // soucre = Creature, datalong = MovementType, datalong2 = MovementDistance (spawndist f.ex.), dataint = pathid
+ SCRIPT_COMMAND_PLAY_ANIMKIT = 36 // source = Creature, datalong = AnimKit id
};
// Benchmarked: Faster than std::unordered_map (insert/find)
@@ -369,6 +370,11 @@ struct ScriptInfo
uint32 MovementDistance; // datalong2
int32 Path; // dataint
} Movement;
+
+ struct // SCRIPT_COMMAND_PLAY_ANIMKIT (36)
+ {
+ uint32 AnimKitID; // datalong
+ } PlayAnimKit;
};
std::string GetDebugInfo() const;
diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp
index eac666c..e580571 100644
--- a/src/server/game/Maps/MapScripts.cpp
+++ b/src/server/game/Maps/MapScripts.cpp
@@ -872,6 +872,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;
+
case SCRIPT_COMMAND_MOVEMENT:
// Source must be Creature.
if (Creature* cSource = _GetScriptCreature(source, true, step.script))
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
index 596b0c8..6acc9eb 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment