Created
February 17, 2017 09:28
-
-
Save Aokromes/15adef92b869ead6f1100dfcc35999b2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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