Core/GameObject: Refactored destructible building handling, properly implemented spell effect repair
This commit is contained in:
@@ -331,7 +331,7 @@ class Battleground
|
||||
{
|
||||
}
|
||||
|
||||
virtual void DestroyGate(Player* /*pl*/, GameObject* /*go*/, uint32 /*destroyedEvent*/) {}
|
||||
virtual void DestroyGate(Player* /*pl*/, GameObject* /*go*/) {}
|
||||
|
||||
/* achievement req. */
|
||||
virtual bool IsAllNodesConrolledByTeam(uint32 /*team*/) const { return false; }
|
||||
|
||||
@@ -817,7 +817,7 @@ void BattlegroundIC::HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture)
|
||||
}
|
||||
}
|
||||
|
||||
void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedEvent*/)
|
||||
void BattlegroundIC::DestroyGate(Player* player, GameObject* go)
|
||||
{
|
||||
GateStatus[GetGateIDFromEntry(go->GetEntry())] = BG_IC_GATE_DESTROYED;
|
||||
uint32 uws_open = GetWorldStateFromGateEntry(go->GetEntry(), true);
|
||||
@@ -827,7 +827,7 @@ void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedE
|
||||
UpdateWorldState(uws_close, 0);
|
||||
UpdateWorldState(uws_open, 1);
|
||||
}
|
||||
DoorOpen((pl->GetTeamId() == TEAM_ALLIANCE ? BG_IC_GO_HORDE_KEEP_PORTCULLIS : BG_IC_GO_DOODAD_PORTCULLISACTIVE02));
|
||||
DoorOpen((player->GetTeamId() == TEAM_ALLIANCE ? BG_IC_GO_HORDE_KEEP_PORTCULLIS : BG_IC_GO_DOODAD_PORTCULLISACTIVE02));
|
||||
|
||||
uint32 lang_entry = 0;
|
||||
|
||||
@@ -850,7 +850,7 @@ void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedE
|
||||
break;
|
||||
}
|
||||
|
||||
SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (pl->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP));
|
||||
SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP));
|
||||
}
|
||||
|
||||
void BattlegroundIC::EventPlayerDamagedGO(Player* /*plr*/, GameObject* /*go*/, uint32 /*eventType*/)
|
||||
|
||||
@@ -879,7 +879,7 @@ class BattlegroundIC : public Battleground
|
||||
void EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/);
|
||||
|
||||
void EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint32 eventType);
|
||||
void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent);
|
||||
void DestroyGate(Player* player, GameObject* go);
|
||||
|
||||
virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
|
||||
|
||||
|
||||
@@ -598,15 +598,15 @@ void BattlegroundSA::DemolisherStartState(bool start)
|
||||
}
|
||||
}
|
||||
|
||||
void BattlegroundSA::DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent)
|
||||
void BattlegroundSA::DestroyGate(Player* player, GameObject* go)
|
||||
{
|
||||
uint32 i = GetGateIDFromDestroyEventID(destroyedEvent);
|
||||
uint32 i = GetGateIDFromDestroyEventID(go->GetGOInfo()->building.destroyedEvent);
|
||||
if (!GateStatus[i])
|
||||
return;
|
||||
|
||||
if (GameObject* g = GetBGObject(i))
|
||||
{
|
||||
if (g->GetGOValue()->building.health == 0)
|
||||
if (g->GetGOValue()->Building.Health == 0)
|
||||
{
|
||||
GateStatus[i] = BG_SA_GATE_DESTROYED;
|
||||
uint32 uws = GetWorldStateFromGateID(i);
|
||||
@@ -635,9 +635,9 @@ void BattlegroundSA::DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroye
|
||||
|
||||
if (i < 5)
|
||||
DelObject(i+9);
|
||||
UpdatePlayerScore(pl, SCORE_DESTROYED_WALL, 1);
|
||||
UpdatePlayerScore(player, SCORE_DESTROYED_WALL, 1);
|
||||
if (rewardHonor)
|
||||
UpdatePlayerScore(pl, SCORE_BONUS_HONOR, (GetBonusHonorFromKill(1)));
|
||||
UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -516,7 +516,7 @@ class BattlegroundSA : public Battleground
|
||||
* -Update worldstate
|
||||
* -Delete gameobject in front of door (lighting object, with different colours for each door)
|
||||
*/
|
||||
void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent);
|
||||
void DestroyGate(Player* player, GameObject* go);
|
||||
/// Update timer worldstate
|
||||
void SendTime();
|
||||
/**
|
||||
|
||||
@@ -205,6 +205,9 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
|
||||
|
||||
SetEntry(goinfo->entry);
|
||||
|
||||
// set name for logs usage, doesn't affect anything ingame
|
||||
SetName(goinfo->name);
|
||||
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
|
||||
|
||||
// GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3
|
||||
@@ -214,10 +217,11 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
|
||||
SetGoArtKit(0); // unknown what this is
|
||||
SetByteValue(GAMEOBJECT_BYTES_1, 2, artKit);
|
||||
|
||||
switch(goinfo->type)
|
||||
switch (goinfo->type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING:
|
||||
m_goValue->building.health = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
|
||||
m_goValue->Building.Health = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
|
||||
m_goValue->Building.MaxHealth = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
|
||||
SetGoAnimProgress(255);
|
||||
break;
|
||||
case GAMEOBJECT_TYPE_TRANSPORT:
|
||||
@@ -1676,88 +1680,6 @@ bool GameObject::IsInRange(float x, float y, float z, float radius) const
|
||||
&& dz < info->maxZ + radius && dz > info->minZ - radius;
|
||||
}
|
||||
|
||||
void GameObject::TakenDamage(uint32 damage, Unit *who)
|
||||
{
|
||||
if (!m_goValue->building.health)
|
||||
return;
|
||||
|
||||
Player* pwho = NULL;
|
||||
if (who)
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
pwho = who->ToPlayer();
|
||||
else if (who->IsVehicle() && who->GetCharmerOrOwner())
|
||||
pwho = who->GetCharmerOrOwner()->ToPlayer();
|
||||
}
|
||||
|
||||
if (m_goValue->building.health > damage)
|
||||
m_goValue->building.health -= damage;
|
||||
else
|
||||
m_goValue->building.health = 0;
|
||||
|
||||
if (HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED)) // from damaged to destroyed
|
||||
{
|
||||
if (!m_goValue->building.health)
|
||||
{
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
|
||||
uint32 modelId = m_goInfo->building.destroyedDisplayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
if (modelData->DestroyedDisplayId)
|
||||
modelId = modelData->DestroyedDisplayId;
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
|
||||
|
||||
EventInform(m_goInfo->building.destroyedEvent);
|
||||
if (pwho)
|
||||
if (Battleground* bg = pwho->GetBattleground())
|
||||
{
|
||||
bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.destroyedEvent);
|
||||
bg->DestroyGate(pwho, this, m_goInfo->building.destroyedEvent);
|
||||
}
|
||||
sScriptMgr->OnGameObjectDestroyed(this, pwho, m_goInfo->building.destroyedEvent);
|
||||
}
|
||||
}
|
||||
else // from intact to damaged
|
||||
{
|
||||
if (m_goValue->building.health + damage >= m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits)
|
||||
if (pwho)
|
||||
if (Battleground* bg = pwho->GetBattleground())
|
||||
bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.damageEvent);
|
||||
|
||||
if (m_goValue->building.health <= m_goInfo->building.damagedNumHits)
|
||||
{
|
||||
if (!m_goInfo->building.destroyedDisplayId)
|
||||
m_goValue->building.health = m_goInfo->building.damagedNumHits;
|
||||
else if (!m_goValue->building.health)
|
||||
m_goValue->building.health = 1;
|
||||
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
|
||||
uint32 modelId = m_goInfo->building.damagedDisplayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
if (modelData->DamagedDisplayId)
|
||||
modelId = modelData->DamagedDisplayId;
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
|
||||
|
||||
EventInform(m_goInfo->building.damagedEvent);
|
||||
sScriptMgr->OnGameObjectDamaged(this, pwho, m_goInfo->building.damagedEvent);
|
||||
if (pwho)
|
||||
if (Battleground* bg = pwho->GetBattleground())
|
||||
bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.damagedEvent);
|
||||
}
|
||||
}
|
||||
SetGoAnimProgress(m_goValue->building.health*255/(m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits));
|
||||
}
|
||||
|
||||
void GameObject::Rebuild()
|
||||
{
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
|
||||
m_goValue->building.health = m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits;
|
||||
EventInform(m_goInfo->building.rebuildingEvent);
|
||||
}
|
||||
|
||||
void GameObject::EventInform(uint32 eventId)
|
||||
{
|
||||
if (eventId && m_zoneScript)
|
||||
@@ -1807,3 +1729,125 @@ void GameObject::UpdateRotationFields(float rotation2 /*=0.0f*/, float rotation3
|
||||
SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2);
|
||||
SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rotation3);
|
||||
}
|
||||
|
||||
void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= NULL*/, uint32 spellId /*= 0*/)
|
||||
{
|
||||
if (!GetGOValue()->Building.MaxHealth || !change)
|
||||
return;
|
||||
|
||||
if (int32(GetGOValue()->Building.Health) + change <= 0)
|
||||
GetGOValue()->Building.Health = 0;
|
||||
else if (int32(GetGOValue()->Building.Health) + change >= int32(GetGOValue()->Building.MaxHealth))
|
||||
GetGOValue()->Building.Health = GetGOValue()->Building.MaxHealth;
|
||||
else
|
||||
GetGOValue()->Building.Health += change;
|
||||
|
||||
SetGoAnimProgress(GetGOValue()->Building.Health * 255 / GetGOValue()->Building.MaxHealth);
|
||||
|
||||
Player* player = attackerOrHealer->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
|
||||
// dealing damage, send packet
|
||||
// TODO: is there any packet for healing?
|
||||
if (change < 0 && player)
|
||||
{
|
||||
WorldPacket data(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, 8 + 8 + 8 + 4 + 4);
|
||||
data.appendPackGUID(GetGUID());
|
||||
data.appendPackGUID(attackerOrHealer->GetGUID());
|
||||
data.appendPackGUID(player->GetGUID());
|
||||
data << uint32(-change);
|
||||
data << uint32(spellId);
|
||||
player->GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
if (!GetGOValue()->Building.Health)
|
||||
SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, player, false);
|
||||
else if (GetGOValue()->Building.Health <= GetGOInfo()->building.damagedNumHits)
|
||||
SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED, player, false);
|
||||
}
|
||||
|
||||
void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* eventInvoker /*= NULL*/, bool setHealth /*= false*/)
|
||||
{
|
||||
// the user calling this must know he is already operating on destructible gameobject
|
||||
ASSERT(GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case GO_DESTRUCTIBLE_INTACT:
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
|
||||
if (setHealth)
|
||||
{
|
||||
m_goValue->Building.Health = m_goValue->Building.MaxHealth;
|
||||
SetGoAnimProgress(255);
|
||||
}
|
||||
break;
|
||||
case GO_DESTRUCTIBLE_DAMAGED:
|
||||
{
|
||||
EventInform(m_goInfo->building.damagedEvent);
|
||||
sScriptMgr->OnGameObjectDamaged(this, eventInvoker);
|
||||
if (eventInvoker)
|
||||
if (Battleground* bg = eventInvoker->GetBattleground())
|
||||
bg->EventPlayerDamagedGO(eventInvoker, this, m_goInfo->building.damagedEvent);
|
||||
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
|
||||
uint32 modelId = m_goInfo->building.damagedDisplayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
if (modelData->DamagedDisplayId)
|
||||
modelId = modelData->DamagedDisplayId;
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
|
||||
|
||||
if (setHealth)
|
||||
{
|
||||
m_goValue->Building.Health = m_goInfo->building.damagedNumHits;
|
||||
uint32 maxHealth = m_goValue->Building.MaxHealth;
|
||||
// in this case current health is 0 anyway so just prevent crashing here
|
||||
if (!maxHealth)
|
||||
maxHealth = 1;
|
||||
SetGoAnimProgress(m_goValue->Building.Health * 255 / maxHealth);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GO_DESTRUCTIBLE_DESTROYED:
|
||||
{
|
||||
sScriptMgr->OnGameObjectDestroyed(this, eventInvoker);
|
||||
EventInform(m_goInfo->building.destroyedEvent);
|
||||
if (eventInvoker)
|
||||
{
|
||||
if (Battleground* bg = eventInvoker->GetBattleground())
|
||||
{
|
||||
bg->EventPlayerDamagedGO(eventInvoker, this, m_goInfo->building.destroyedEvent);
|
||||
bg->DestroyGate(eventInvoker, this);
|
||||
}
|
||||
}
|
||||
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
|
||||
uint32 modelId = m_goInfo->building.destroyedDisplayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
if (modelData->DestroyedDisplayId)
|
||||
modelId = modelData->DestroyedDisplayId;
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
|
||||
|
||||
if (setHealth)
|
||||
{
|
||||
m_goValue->Building.Health = 0;
|
||||
SetGoAnimProgress(0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GO_DESTRUCTIBLE_REBUILDING:
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
|
||||
SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
|
||||
EventInform(m_goInfo->building.rebuildingEvent);
|
||||
// restores to full health
|
||||
if (setHealth)
|
||||
{
|
||||
m_goValue->Building.Health = m_goValue->Building.MaxHealth;
|
||||
SetGoAnimProgress(255);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -541,12 +541,13 @@ union GameObjectValue
|
||||
struct
|
||||
{
|
||||
OPvPCapturePoint *OPvPObj;
|
||||
}capturePoint;
|
||||
} CapturePoint;
|
||||
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
|
||||
struct
|
||||
{
|
||||
uint32 health;
|
||||
}building;
|
||||
uint32 Health;
|
||||
uint32 MaxHealth;
|
||||
} Building;
|
||||
};
|
||||
|
||||
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
|
||||
@@ -767,8 +768,10 @@ class GameObject : public WorldObject, public GridObject<GameObject>
|
||||
void CastSpell(Unit* target, uint32 spell);
|
||||
void SendCustomAnim(uint32 anim);
|
||||
bool IsInRange(float x, float y, float z, float radius) const;
|
||||
void TakenDamage(uint32 damage, Unit* who = NULL);
|
||||
void Rebuild();
|
||||
|
||||
void ModifyHealth(int32 change, Unit* attackerOrHealer = NULL, uint32 spellId = 0);
|
||||
// sets GameObject type 33 destruction flags and optionally default health for that state
|
||||
void SetDestructibleState(GameObjectDestructibleState state, Player* eventInvoker = NULL, bool setHealth = false);
|
||||
|
||||
void EventInform(uint32 eventId);
|
||||
|
||||
|
||||
@@ -656,171 +656,171 @@ enum Team
|
||||
|
||||
enum SpellEffects
|
||||
{
|
||||
SPELL_EFFECT_INSTAKILL = 1,
|
||||
SPELL_EFFECT_SCHOOL_DAMAGE = 2,
|
||||
SPELL_EFFECT_DUMMY = 3,
|
||||
SPELL_EFFECT_PORTAL_TELEPORT = 4,
|
||||
SPELL_EFFECT_TELEPORT_UNITS = 5,
|
||||
SPELL_EFFECT_APPLY_AURA = 6,
|
||||
SPELL_EFFECT_ENVIRONMENTAL_DAMAGE = 7,
|
||||
SPELL_EFFECT_POWER_DRAIN = 8,
|
||||
SPELL_EFFECT_HEALTH_LEECH = 9,
|
||||
SPELL_EFFECT_HEAL = 10,
|
||||
SPELL_EFFECT_BIND = 11,
|
||||
SPELL_EFFECT_PORTAL = 12,
|
||||
SPELL_EFFECT_RITUAL_BASE = 13,
|
||||
SPELL_EFFECT_RITUAL_SPECIALIZE = 14,
|
||||
SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL = 15,
|
||||
SPELL_EFFECT_QUEST_COMPLETE = 16,
|
||||
SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL = 17,
|
||||
SPELL_EFFECT_RESURRECT = 18,
|
||||
SPELL_EFFECT_ADD_EXTRA_ATTACKS = 19,
|
||||
SPELL_EFFECT_DODGE = 20,
|
||||
SPELL_EFFECT_EVADE = 21,
|
||||
SPELL_EFFECT_PARRY = 22,
|
||||
SPELL_EFFECT_BLOCK = 23,
|
||||
SPELL_EFFECT_CREATE_ITEM = 24,
|
||||
SPELL_EFFECT_WEAPON = 25,
|
||||
SPELL_EFFECT_DEFENSE = 26,
|
||||
SPELL_EFFECT_PERSISTENT_AREA_AURA = 27,
|
||||
SPELL_EFFECT_SUMMON = 28,
|
||||
SPELL_EFFECT_LEAP = 29,
|
||||
SPELL_EFFECT_ENERGIZE = 30,
|
||||
SPELL_EFFECT_WEAPON_PERCENT_DAMAGE = 31,
|
||||
SPELL_EFFECT_TRIGGER_MISSILE = 32,
|
||||
SPELL_EFFECT_OPEN_LOCK = 33,
|
||||
SPELL_EFFECT_SUMMON_CHANGE_ITEM = 34,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_PARTY = 35,
|
||||
SPELL_EFFECT_LEARN_SPELL = 36,
|
||||
SPELL_EFFECT_SPELL_DEFENSE = 37,
|
||||
SPELL_EFFECT_DISPEL = 38,
|
||||
SPELL_EFFECT_LANGUAGE = 39,
|
||||
SPELL_EFFECT_DUAL_WIELD = 40,
|
||||
SPELL_EFFECT_JUMP = 41,
|
||||
SPELL_EFFECT_JUMP_DEST = 42,
|
||||
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
|
||||
SPELL_EFFECT_SKILL_STEP = 44,
|
||||
SPELL_EFFECT_ADD_HONOR = 45,
|
||||
SPELL_EFFECT_SPAWN = 46,
|
||||
SPELL_EFFECT_TRADE_SKILL = 47,
|
||||
SPELL_EFFECT_STEALTH = 48,
|
||||
SPELL_EFFECT_DETECT = 49,
|
||||
SPELL_EFFECT_TRANS_DOOR = 50,
|
||||
SPELL_EFFECT_FORCE_CRITICAL_HIT = 51,
|
||||
SPELL_EFFECT_GUARANTEE_HIT = 52,
|
||||
SPELL_EFFECT_ENCHANT_ITEM = 53,
|
||||
SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY = 54,
|
||||
SPELL_EFFECT_TAMECREATURE = 55,
|
||||
SPELL_EFFECT_SUMMON_PET = 56,
|
||||
SPELL_EFFECT_LEARN_PET_SPELL = 57,
|
||||
SPELL_EFFECT_WEAPON_DAMAGE = 58,
|
||||
SPELL_EFFECT_CREATE_RANDOM_ITEM = 59,
|
||||
SPELL_EFFECT_PROFICIENCY = 60,
|
||||
SPELL_EFFECT_SEND_EVENT = 61,
|
||||
SPELL_EFFECT_POWER_BURN = 62,
|
||||
SPELL_EFFECT_THREAT = 63,
|
||||
SPELL_EFFECT_TRIGGER_SPELL = 64,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
|
||||
SPELL_EFFECT_CREATE_MANA_GEM = 66,
|
||||
SPELL_EFFECT_HEAL_MAX_HEALTH = 67,
|
||||
SPELL_EFFECT_INTERRUPT_CAST = 68,
|
||||
SPELL_EFFECT_DISTRACT = 69,
|
||||
SPELL_EFFECT_PULL = 70,
|
||||
SPELL_EFFECT_PICKPOCKET = 71,
|
||||
SPELL_EFFECT_ADD_FARSIGHT = 72,
|
||||
SPELL_EFFECT_UNTRAIN_TALENTS = 73,
|
||||
SPELL_EFFECT_APPLY_GLYPH = 74,
|
||||
SPELL_EFFECT_HEAL_MECHANICAL = 75,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
|
||||
SPELL_EFFECT_SCRIPT_EFFECT = 77,
|
||||
SPELL_EFFECT_ATTACK = 78,
|
||||
SPELL_EFFECT_SANCTUARY = 79,
|
||||
SPELL_EFFECT_ADD_COMBO_POINTS = 80,
|
||||
SPELL_EFFECT_CREATE_HOUSE = 81,
|
||||
SPELL_EFFECT_BIND_SIGHT = 82,
|
||||
SPELL_EFFECT_DUEL = 83,
|
||||
SPELL_EFFECT_STUCK = 84,
|
||||
SPELL_EFFECT_SUMMON_PLAYER = 85,
|
||||
SPELL_EFFECT_ACTIVATE_OBJECT = 86,
|
||||
SPELL_EFFECT_WMO_DAMAGE = 87,
|
||||
SPELL_EFFECT_WMO_REPAIR = 88,
|
||||
SPELL_EFFECT_WMO_CHANGE = 89,
|
||||
SPELL_EFFECT_KILL_CREDIT = 90,
|
||||
SPELL_EFFECT_THREAT_ALL = 91,
|
||||
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
|
||||
SPELL_EFFECT_FORCE_DESELECT = 93,
|
||||
SPELL_EFFECT_SELF_RESURRECT = 94,
|
||||
SPELL_EFFECT_SKINNING = 95,
|
||||
SPELL_EFFECT_CHARGE = 96,
|
||||
SPELL_EFFECT_CAST_BUTTON = 97,
|
||||
SPELL_EFFECT_KNOCK_BACK = 98,
|
||||
SPELL_EFFECT_DISENCHANT = 99,
|
||||
SPELL_EFFECT_INEBRIATE = 100,
|
||||
SPELL_EFFECT_FEED_PET = 101,
|
||||
SPELL_EFFECT_DISMISS_PET = 102,
|
||||
SPELL_EFFECT_REPUTATION = 103,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT1 = 104,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT2 = 105,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT3 = 106,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT4 = 107,
|
||||
SPELL_EFFECT_DISPEL_MECHANIC = 108,
|
||||
SPELL_EFFECT_SUMMON_DEAD_PET = 109,
|
||||
SPELL_EFFECT_DESTROY_ALL_TOTEMS = 110,
|
||||
SPELL_EFFECT_DURABILITY_DAMAGE = 111,
|
||||
SPELL_EFFECT_112 = 112,
|
||||
SPELL_EFFECT_RESURRECT_NEW = 113,
|
||||
SPELL_EFFECT_ATTACK_ME = 114,
|
||||
SPELL_EFFECT_DURABILITY_DAMAGE_PCT = 115,
|
||||
SPELL_EFFECT_SKIN_PLAYER_CORPSE = 116,
|
||||
SPELL_EFFECT_SPIRIT_HEAL = 117,
|
||||
SPELL_EFFECT_SKILL = 118,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_PET = 119,
|
||||
SPELL_EFFECT_TELEPORT_GRAVEYARD = 120,
|
||||
SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121,
|
||||
SPELL_EFFECT_122 = 122,
|
||||
SPELL_EFFECT_SEND_TAXI = 123,
|
||||
SPELL_EFFECT_PULL_TOWARDS = 124,
|
||||
SPELL_EFFECT_MODIFY_THREAT_PERCENT = 125,
|
||||
SPELL_EFFECT_STEAL_BENEFICIAL_BUFF = 126,
|
||||
SPELL_EFFECT_PROSPECTING = 127,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
|
||||
SPELL_EFFECT_REDIRECT_THREAT = 130,
|
||||
SPELL_EFFECT_131 = 131,
|
||||
SPELL_EFFECT_PLAY_MUSIC = 132,
|
||||
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
|
||||
SPELL_EFFECT_KILL_CREDIT2 = 134,
|
||||
SPELL_EFFECT_CALL_PET = 135,
|
||||
SPELL_EFFECT_HEAL_PCT = 136,
|
||||
SPELL_EFFECT_ENERGIZE_PCT = 137,
|
||||
SPELL_EFFECT_LEAP_BACK = 138,
|
||||
SPELL_EFFECT_CLEAR_QUEST = 139,
|
||||
SPELL_EFFECT_FORCE_CAST = 140,
|
||||
SPELL_EFFECT_FORCE_CAST_WITH_VALUE = 141,
|
||||
SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
|
||||
SPELL_EFFECT_KNOCK_BACK_DEST = 144,
|
||||
SPELL_EFFECT_PULL_TOWARDS_DEST = 145,
|
||||
SPELL_EFFECT_ACTIVATE_RUNE = 146,
|
||||
SPELL_EFFECT_QUEST_FAIL = 147,
|
||||
SPELL_EFFECT_148 = 148,
|
||||
SPELL_EFFECT_CHARGE_DEST = 149,
|
||||
SPELL_EFFECT_QUEST_START = 150,
|
||||
SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
|
||||
SPELL_EFFECT_152 = 152,
|
||||
SPELL_EFFECT_CREATE_TAMED_PET = 153,
|
||||
SPELL_EFFECT_DISCOVER_TAXI = 154,
|
||||
SPELL_EFFECT_TITAN_GRIP = 155,
|
||||
SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC = 156,
|
||||
SPELL_EFFECT_CREATE_ITEM_2 = 157,
|
||||
SPELL_EFFECT_MILLING = 158,
|
||||
SPELL_EFFECT_ALLOW_RENAME_PET = 159,
|
||||
SPELL_EFFECT_160 = 160,
|
||||
SPELL_EFFECT_TALENT_SPEC_COUNT = 161,
|
||||
SPELL_EFFECT_TALENT_SPEC_SELECT = 162,
|
||||
SPELL_EFFECT_163 = 163,
|
||||
SPELL_EFFECT_REMOVE_AURA = 164,
|
||||
TOTAL_SPELL_EFFECTS = 165
|
||||
SPELL_EFFECT_INSTAKILL = 1,
|
||||
SPELL_EFFECT_SCHOOL_DAMAGE = 2,
|
||||
SPELL_EFFECT_DUMMY = 3,
|
||||
SPELL_EFFECT_PORTAL_TELEPORT = 4,
|
||||
SPELL_EFFECT_TELEPORT_UNITS = 5,
|
||||
SPELL_EFFECT_APPLY_AURA = 6,
|
||||
SPELL_EFFECT_ENVIRONMENTAL_DAMAGE = 7,
|
||||
SPELL_EFFECT_POWER_DRAIN = 8,
|
||||
SPELL_EFFECT_HEALTH_LEECH = 9,
|
||||
SPELL_EFFECT_HEAL = 10,
|
||||
SPELL_EFFECT_BIND = 11,
|
||||
SPELL_EFFECT_PORTAL = 12,
|
||||
SPELL_EFFECT_RITUAL_BASE = 13,
|
||||
SPELL_EFFECT_RITUAL_SPECIALIZE = 14,
|
||||
SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL = 15,
|
||||
SPELL_EFFECT_QUEST_COMPLETE = 16,
|
||||
SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL = 17,
|
||||
SPELL_EFFECT_RESURRECT = 18,
|
||||
SPELL_EFFECT_ADD_EXTRA_ATTACKS = 19,
|
||||
SPELL_EFFECT_DODGE = 20,
|
||||
SPELL_EFFECT_EVADE = 21,
|
||||
SPELL_EFFECT_PARRY = 22,
|
||||
SPELL_EFFECT_BLOCK = 23,
|
||||
SPELL_EFFECT_CREATE_ITEM = 24,
|
||||
SPELL_EFFECT_WEAPON = 25,
|
||||
SPELL_EFFECT_DEFENSE = 26,
|
||||
SPELL_EFFECT_PERSISTENT_AREA_AURA = 27,
|
||||
SPELL_EFFECT_SUMMON = 28,
|
||||
SPELL_EFFECT_LEAP = 29,
|
||||
SPELL_EFFECT_ENERGIZE = 30,
|
||||
SPELL_EFFECT_WEAPON_PERCENT_DAMAGE = 31,
|
||||
SPELL_EFFECT_TRIGGER_MISSILE = 32,
|
||||
SPELL_EFFECT_OPEN_LOCK = 33,
|
||||
SPELL_EFFECT_SUMMON_CHANGE_ITEM = 34,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_PARTY = 35,
|
||||
SPELL_EFFECT_LEARN_SPELL = 36,
|
||||
SPELL_EFFECT_SPELL_DEFENSE = 37,
|
||||
SPELL_EFFECT_DISPEL = 38,
|
||||
SPELL_EFFECT_LANGUAGE = 39,
|
||||
SPELL_EFFECT_DUAL_WIELD = 40,
|
||||
SPELL_EFFECT_JUMP = 41,
|
||||
SPELL_EFFECT_JUMP_DEST = 42,
|
||||
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER = 43,
|
||||
SPELL_EFFECT_SKILL_STEP = 44,
|
||||
SPELL_EFFECT_ADD_HONOR = 45,
|
||||
SPELL_EFFECT_SPAWN = 46,
|
||||
SPELL_EFFECT_TRADE_SKILL = 47,
|
||||
SPELL_EFFECT_STEALTH = 48,
|
||||
SPELL_EFFECT_DETECT = 49,
|
||||
SPELL_EFFECT_TRANS_DOOR = 50,
|
||||
SPELL_EFFECT_FORCE_CRITICAL_HIT = 51,
|
||||
SPELL_EFFECT_GUARANTEE_HIT = 52,
|
||||
SPELL_EFFECT_ENCHANT_ITEM = 53,
|
||||
SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY = 54,
|
||||
SPELL_EFFECT_TAMECREATURE = 55,
|
||||
SPELL_EFFECT_SUMMON_PET = 56,
|
||||
SPELL_EFFECT_LEARN_PET_SPELL = 57,
|
||||
SPELL_EFFECT_WEAPON_DAMAGE = 58,
|
||||
SPELL_EFFECT_CREATE_RANDOM_ITEM = 59,
|
||||
SPELL_EFFECT_PROFICIENCY = 60,
|
||||
SPELL_EFFECT_SEND_EVENT = 61,
|
||||
SPELL_EFFECT_POWER_BURN = 62,
|
||||
SPELL_EFFECT_THREAT = 63,
|
||||
SPELL_EFFECT_TRIGGER_SPELL = 64,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
|
||||
SPELL_EFFECT_CREATE_MANA_GEM = 66,
|
||||
SPELL_EFFECT_HEAL_MAX_HEALTH = 67,
|
||||
SPELL_EFFECT_INTERRUPT_CAST = 68,
|
||||
SPELL_EFFECT_DISTRACT = 69,
|
||||
SPELL_EFFECT_PULL = 70,
|
||||
SPELL_EFFECT_PICKPOCKET = 71,
|
||||
SPELL_EFFECT_ADD_FARSIGHT = 72,
|
||||
SPELL_EFFECT_UNTRAIN_TALENTS = 73,
|
||||
SPELL_EFFECT_APPLY_GLYPH = 74,
|
||||
SPELL_EFFECT_HEAL_MECHANICAL = 75,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
|
||||
SPELL_EFFECT_SCRIPT_EFFECT = 77,
|
||||
SPELL_EFFECT_ATTACK = 78,
|
||||
SPELL_EFFECT_SANCTUARY = 79,
|
||||
SPELL_EFFECT_ADD_COMBO_POINTS = 80,
|
||||
SPELL_EFFECT_CREATE_HOUSE = 81,
|
||||
SPELL_EFFECT_BIND_SIGHT = 82,
|
||||
SPELL_EFFECT_DUEL = 83,
|
||||
SPELL_EFFECT_STUCK = 84,
|
||||
SPELL_EFFECT_SUMMON_PLAYER = 85,
|
||||
SPELL_EFFECT_ACTIVATE_OBJECT = 86,
|
||||
SPELL_EFFECT_GAMEOBJECT_DAMAGE = 87,
|
||||
SPELL_EFFECT_GAMEOBJECT_REPAIR = 88,
|
||||
SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE = 89,
|
||||
SPELL_EFFECT_KILL_CREDIT = 90,
|
||||
SPELL_EFFECT_THREAT_ALL = 91,
|
||||
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
|
||||
SPELL_EFFECT_FORCE_DESELECT = 93,
|
||||
SPELL_EFFECT_SELF_RESURRECT = 94,
|
||||
SPELL_EFFECT_SKINNING = 95,
|
||||
SPELL_EFFECT_CHARGE = 96,
|
||||
SPELL_EFFECT_CAST_BUTTON = 97,
|
||||
SPELL_EFFECT_KNOCK_BACK = 98,
|
||||
SPELL_EFFECT_DISENCHANT = 99,
|
||||
SPELL_EFFECT_INEBRIATE = 100,
|
||||
SPELL_EFFECT_FEED_PET = 101,
|
||||
SPELL_EFFECT_DISMISS_PET = 102,
|
||||
SPELL_EFFECT_REPUTATION = 103,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT1 = 104,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT2 = 105,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT3 = 106,
|
||||
SPELL_EFFECT_SUMMON_OBJECT_SLOT4 = 107,
|
||||
SPELL_EFFECT_DISPEL_MECHANIC = 108,
|
||||
SPELL_EFFECT_SUMMON_DEAD_PET = 109,
|
||||
SPELL_EFFECT_DESTROY_ALL_TOTEMS = 110,
|
||||
SPELL_EFFECT_DURABILITY_DAMAGE = 111,
|
||||
SPELL_EFFECT_112 = 112,
|
||||
SPELL_EFFECT_RESURRECT_NEW = 113,
|
||||
SPELL_EFFECT_ATTACK_ME = 114,
|
||||
SPELL_EFFECT_DURABILITY_DAMAGE_PCT = 115,
|
||||
SPELL_EFFECT_SKIN_PLAYER_CORPSE = 116,
|
||||
SPELL_EFFECT_SPIRIT_HEAL = 117,
|
||||
SPELL_EFFECT_SKILL = 118,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_PET = 119,
|
||||
SPELL_EFFECT_TELEPORT_GRAVEYARD = 120,
|
||||
SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121,
|
||||
SPELL_EFFECT_122 = 122,
|
||||
SPELL_EFFECT_SEND_TAXI = 123,
|
||||
SPELL_EFFECT_PULL_TOWARDS = 124,
|
||||
SPELL_EFFECT_MODIFY_THREAT_PERCENT = 125,
|
||||
SPELL_EFFECT_STEAL_BENEFICIAL_BUFF = 126,
|
||||
SPELL_EFFECT_PROSPECTING = 127,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
|
||||
SPELL_EFFECT_REDIRECT_THREAT = 130,
|
||||
SPELL_EFFECT_131 = 131,
|
||||
SPELL_EFFECT_PLAY_MUSIC = 132,
|
||||
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
|
||||
SPELL_EFFECT_KILL_CREDIT2 = 134,
|
||||
SPELL_EFFECT_CALL_PET = 135,
|
||||
SPELL_EFFECT_HEAL_PCT = 136,
|
||||
SPELL_EFFECT_ENERGIZE_PCT = 137,
|
||||
SPELL_EFFECT_LEAP_BACK = 138,
|
||||
SPELL_EFFECT_CLEAR_QUEST = 139,
|
||||
SPELL_EFFECT_FORCE_CAST = 140,
|
||||
SPELL_EFFECT_FORCE_CAST_WITH_VALUE = 141,
|
||||
SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
|
||||
SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
|
||||
SPELL_EFFECT_KNOCK_BACK_DEST = 144,
|
||||
SPELL_EFFECT_PULL_TOWARDS_DEST = 145,
|
||||
SPELL_EFFECT_ACTIVATE_RUNE = 146,
|
||||
SPELL_EFFECT_QUEST_FAIL = 147,
|
||||
SPELL_EFFECT_148 = 148,
|
||||
SPELL_EFFECT_CHARGE_DEST = 149,
|
||||
SPELL_EFFECT_QUEST_START = 150,
|
||||
SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
|
||||
SPELL_EFFECT_152 = 152,
|
||||
SPELL_EFFECT_CREATE_TAMED_PET = 153,
|
||||
SPELL_EFFECT_DISCOVER_TAXI = 154,
|
||||
SPELL_EFFECT_TITAN_GRIP = 155,
|
||||
SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC = 156,
|
||||
SPELL_EFFECT_CREATE_ITEM_2 = 157,
|
||||
SPELL_EFFECT_MILLING = 158,
|
||||
SPELL_EFFECT_ALLOW_RENAME_PET = 159,
|
||||
SPELL_EFFECT_160 = 160,
|
||||
SPELL_EFFECT_TALENT_SPEC_COUNT = 161,
|
||||
SPELL_EFFECT_TALENT_SPEC_SELECT = 162,
|
||||
SPELL_EFFECT_163 = 163,
|
||||
SPELL_EFFECT_REMOVE_AURA = 164,
|
||||
TOTAL_SPELL_EFFECTS = 165
|
||||
};
|
||||
|
||||
enum SpellCastResult
|
||||
@@ -1492,6 +1492,14 @@ enum GameObjectDynamicLowFlags
|
||||
GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle
|
||||
};
|
||||
|
||||
enum GameObjectDestructibleState
|
||||
{
|
||||
GO_DESTRUCTIBLE_INTACT = 0,
|
||||
GO_DESTRUCTIBLE_DAMAGED = 1,
|
||||
GO_DESTRUCTIBLE_DESTROYED = 2,
|
||||
GO_DESTRUCTIBLE_REBUILDING = 3,
|
||||
};
|
||||
|
||||
enum TextEmotes
|
||||
{
|
||||
TEXT_EMOTE_AGREE = 1,
|
||||
|
||||
@@ -823,20 +823,20 @@ uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go)
|
||||
return tmpscript->GetDialogStatus(player, go);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player, uint32 eventId)
|
||||
void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player)
|
||||
{
|
||||
ASSERT(go);
|
||||
|
||||
GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
|
||||
tmpscript->OnDestroyed(go, player, eventId);
|
||||
tmpscript->OnDestroyed(go, player);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player, uint32 eventId)
|
||||
void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player)
|
||||
{
|
||||
ASSERT(go);
|
||||
|
||||
GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
|
||||
tmpscript->OnDamaged(go, player, eventId);
|
||||
tmpscript->OnDamaged(go, player);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff)
|
||||
|
||||
@@ -465,9 +465,9 @@ class GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
|
||||
virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/) { return 100; }
|
||||
|
||||
// Called when the gameobject is destroyed (destructible buildings only).
|
||||
virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/, uint32 /*eventId*/) { }
|
||||
virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/) { }
|
||||
// Called when the gameobject is damaged (destructible buildings only).
|
||||
virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/, uint32 /*eventId*/) { }
|
||||
virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { }
|
||||
};
|
||||
|
||||
class AreaTriggerScript : public ScriptObject
|
||||
@@ -865,8 +865,8 @@ class ScriptMgr
|
||||
bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest);
|
||||
bool OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt);
|
||||
uint32 GetDialogStatus(Player* player, GameObject* go);
|
||||
void OnGameObjectDestroyed(GameObject* go, Player* player, uint32 eventId);
|
||||
void OnGameObjectDamaged(GameObject* go, Player* player, uint32 eventId);
|
||||
void OnGameObjectDestroyed(GameObject* go, Player* player);
|
||||
void OnGameObjectDamaged(GameObject* go, Player* player);
|
||||
void OnGameObjectUpdate(GameObject* go, uint32 diff);
|
||||
|
||||
public: /* AreaTriggerScript */
|
||||
|
||||
@@ -1012,20 +1012,34 @@ void Spell::AddUnitTarget(uint64 unitGUID, uint32 effIndex)
|
||||
AddUnitTarget(unit, effIndex);
|
||||
}
|
||||
|
||||
void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
|
||||
void Spell::AddGOTarget(GameObject* go, uint32 effIndex)
|
||||
{
|
||||
if (m_spellInfo->Effect[effIndex] == 0)
|
||||
return;
|
||||
|
||||
uint64 targetGUID = pVictim->GetGUID();
|
||||
switch (m_spellInfo->Effect[effIndex])
|
||||
{
|
||||
case SPELL_EFFECT_GAMEOBJECT_DAMAGE:
|
||||
case SPELL_EFFECT_GAMEOBJECT_REPAIR:
|
||||
case SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE:
|
||||
if (go->GetGoType() != GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
uint64 targetGUID = go->GetGUID();
|
||||
|
||||
// Lookup target in already in list
|
||||
for (std::list<GOTargetInfo>::iterator ihit = m_UniqueGOTargetInfo.begin(); ihit != m_UniqueGOTargetInfo.end(); ++ihit)
|
||||
{
|
||||
if (targetGUID == ihit->targetGUID) // Found in list
|
||||
{
|
||||
ihit->effectMask |= 1 << effIndex; // Add only effect mask
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// This is new target calculate data for him
|
||||
|
||||
@@ -1038,10 +1052,11 @@ void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
|
||||
if (m_spellInfo->speed > 0.0f)
|
||||
{
|
||||
// calculate spell incoming interval
|
||||
float dist = m_caster->GetDistance(pVictim->GetPositionX(), pVictim->GetPositionY(), pVictim->GetPositionZ());
|
||||
if (dist < 5.0f) dist = 5.0f;
|
||||
target.timeDelay = (uint64) floor(dist / m_spellInfo->speed * 1000.0f);
|
||||
if (m_delayMoment == 0 || m_delayMoment>target.timeDelay)
|
||||
float dist = m_caster->GetDistance(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ());
|
||||
if (dist < 5.0f)
|
||||
dist = 5.0f;
|
||||
target.timeDelay = uint64(floor(dist / m_spellInfo->speed * 1000.0f));
|
||||
if (m_delayMoment == 0 || m_delayMoment > target.timeDelay)
|
||||
m_delayMoment = target.timeDelay;
|
||||
}
|
||||
else
|
||||
@@ -1053,8 +1068,7 @@ void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
|
||||
|
||||
void Spell::AddGOTarget(uint64 goGUID, uint32 effIndex)
|
||||
{
|
||||
GameObject* go = m_caster->GetMap()->GetGameObject(goGUID);
|
||||
if (go)
|
||||
if (GameObject* go = m_caster->GetMap()->GetGameObject(goGUID))
|
||||
AddGOTarget(go, effIndex);
|
||||
}
|
||||
|
||||
|
||||
@@ -369,9 +369,9 @@ class Spell
|
||||
void EffectQuestFail(SpellEffIndex effIndex);
|
||||
void EffectQuestStart(SpellEffIndex effIndex);
|
||||
void EffectRedirectThreat(SpellEffIndex effIndex);
|
||||
void EffectWMODamage(SpellEffIndex effIndex);
|
||||
void EffectWMORepair(SpellEffIndex effIndex);
|
||||
void EffectWMOChange(SpellEffIndex effIndex);
|
||||
void EffectGameObjectDamage(SpellEffIndex effIndex);
|
||||
void EffectGameObjectRepair(SpellEffIndex effIndex);
|
||||
void EffectGameObjectSetDestructionState(SpellEffIndex effIndex);
|
||||
void EffectActivateRune(SpellEffIndex effIndex);
|
||||
void EffectCreateTamedPet(SpellEffIndex effIndex);
|
||||
void EffectDiscoverTaxi(SpellEffIndex effIndex);
|
||||
|
||||
@@ -151,9 +151,9 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
|
||||
&Spell::EffectStuck, // 84 SPELL_EFFECT_STUCK
|
||||
&Spell::EffectSummonPlayer, // 85 SPELL_EFFECT_SUMMON_PLAYER
|
||||
&Spell::EffectActivateObject, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
|
||||
&Spell::EffectWMODamage, // 87 SPELL_EFFECT_WMO_DAMAGE
|
||||
&Spell::EffectWMORepair, // 88 SPELL_EFFECT_WMO_REPAIR
|
||||
&Spell::EffectWMOChange, // 89 SPELL_EFFECT_WMO_CHANGE // 0 intact // 1 damaged // 2 destroyed // 3 rebuilding
|
||||
&Spell::EffectGameObjectDamage, // 87 SPELL_EFFECT_GAMEOBJECT_DAMAGE
|
||||
&Spell::EffectGameObjectRepair, // 88 SPELL_EFFECT_GAMEOBJECT_REPAIR
|
||||
&Spell::EffectGameObjectSetDestructionState, // 89 SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE
|
||||
&Spell::EffectKillCreditPersonal, // 90 SPELL_EFFECT_KILL_CREDIT Kill credit but only for single person
|
||||
&Spell::EffectUnused, // 91 SPELL_EFFECT_THREAT_ALL one spell: zzOLDBrainwash
|
||||
&Spell::EffectEnchantHeldItem, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
|
||||
@@ -2133,23 +2133,18 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex)
|
||||
*/
|
||||
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell ScriptStart %u for spellid %u in EffectSendEvent ", m_spellInfo->EffectMiscValue[effIndex], m_spellInfo->Id);
|
||||
|
||||
Object *pTarget;
|
||||
Object* target = NULL;
|
||||
if (focusObject)
|
||||
pTarget = focusObject;
|
||||
target = focusObject;
|
||||
else if (unitTarget)
|
||||
pTarget = unitTarget;
|
||||
target = unitTarget;
|
||||
else if (gameObjTarget)
|
||||
pTarget = gameObjTarget;
|
||||
else
|
||||
pTarget = NULL;
|
||||
target = gameObjTarget;
|
||||
|
||||
if (unitTarget)
|
||||
{
|
||||
if (ZoneScript* zoneScript = unitTarget->GetZoneScript())
|
||||
zoneScript->ProcessEvent(unitTarget, m_spellInfo->EffectMiscValue[effIndex]);
|
||||
}
|
||||
if (ZoneScript* zoneScript = m_caster->GetZoneScript())
|
||||
zoneScript->ProcessEvent(unitTarget, m_spellInfo->EffectMiscValue[effIndex]);
|
||||
|
||||
m_caster->GetMap()->ScriptsStart(sEventScripts, m_spellInfo->EffectMiscValue[effIndex], m_caster, pTarget);
|
||||
m_caster->GetMap()->ScriptsStart(sEventScripts, m_spellInfo->EffectMiscValue[effIndex], m_caster, target);
|
||||
}
|
||||
|
||||
void Spell::EffectPowerBurn(SpellEffIndex effIndex)
|
||||
@@ -6760,73 +6755,37 @@ void Spell::EffectRedirectThreat(SpellEffIndex /*effIndex*/)
|
||||
m_caster->SetReducedThreatPercent((uint32)damage, unitTarget->GetGUID());
|
||||
}
|
||||
|
||||
void Spell::EffectWMODamage(SpellEffIndex /*effIndex*/)
|
||||
void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (gameObjTarget && gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
|
||||
{
|
||||
Unit* caster = m_originalCaster;
|
||||
if (!caster)
|
||||
return;
|
||||
if (!gameObjTarget)
|
||||
return;
|
||||
|
||||
// Do not allow damage if hp is 0
|
||||
if (gameObjTarget->GetGOValue()->building.health == 0)
|
||||
return;
|
||||
Unit* caster = m_originalCaster;
|
||||
if (!caster)
|
||||
return;
|
||||
|
||||
FactionTemplateEntry const *casterft, *goft;
|
||||
casterft = caster->getFactionTemplateEntry();
|
||||
goft = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION));
|
||||
// Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons)
|
||||
if ((casterft && goft && !casterft->IsFriendlyTo(*goft)) || !goft)
|
||||
{
|
||||
gameObjTarget->TakenDamage(uint32(damage), caster);
|
||||
WorldPacket data(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, 8+8+8+4+4);
|
||||
data.append(gameObjTarget->GetPackGUID());
|
||||
data.append(caster->GetPackGUID());
|
||||
if (Unit* who = caster->GetCharmerOrOwner())
|
||||
data.append(who->GetPackGUID());
|
||||
else
|
||||
data << uint8(0);
|
||||
data << uint32(damage);
|
||||
data << uint32(m_spellInfo->Id);
|
||||
gameObjTarget->SendMessageToSet(&data, false);
|
||||
}
|
||||
}
|
||||
FactionTemplateEntry const* casterFaction = caster->getFactionTemplateEntry();
|
||||
FactionTemplateEntry const* targetFaction = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION));
|
||||
// Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons)
|
||||
if ((casterFaction && targetFaction && !casterFaction->IsFriendlyTo(*targetFaction)) || !targetFaction)
|
||||
gameObjTarget->ModifyHealth(-damage, caster, GetSpellInfo()->Id);
|
||||
}
|
||||
|
||||
void Spell::EffectWMORepair(SpellEffIndex /*effIndex*/)
|
||||
void Spell::EffectGameObjectRepair(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (gameObjTarget && gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
|
||||
gameObjTarget->Rebuild();
|
||||
if (!gameObjTarget)
|
||||
return;
|
||||
|
||||
gameObjTarget->ModifyHealth(damage, m_caster);
|
||||
}
|
||||
|
||||
void Spell::EffectWMOChange(SpellEffIndex effIndex)
|
||||
void Spell::EffectGameObjectSetDestructionState(SpellEffIndex effIndex)
|
||||
{
|
||||
if (gameObjTarget && gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
|
||||
{
|
||||
Unit* caster = m_originalCaster;
|
||||
if (!caster)
|
||||
return;
|
||||
if (!gameObjTarget || !m_originalCaster)
|
||||
return;
|
||||
|
||||
int ChangeType = m_spellInfo->EffectMiscValue[effIndex];
|
||||
switch (ChangeType)
|
||||
{
|
||||
case 0: // intact
|
||||
if (gameObjTarget->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED))
|
||||
gameObjTarget->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
if (gameObjTarget->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED))
|
||||
gameObjTarget->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
break;
|
||||
case 1: // damaged
|
||||
gameObjTarget->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
break;
|
||||
case 2: // destroyed
|
||||
gameObjTarget->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
break;
|
||||
case 3: // rebuild
|
||||
gameObjTarget->Rebuild();
|
||||
break;
|
||||
}
|
||||
}
|
||||
Player* player = m_originalCaster->GetCharmerOrOwnerPlayerOrPlayerItself();
|
||||
gameObjTarget->SetDestructibleState(GameObjectDestructibleState(m_spellInfo->EffectMiscValue[effIndex]), player, true);
|
||||
}
|
||||
|
||||
void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const *properties)
|
||||
|
||||
+2
-2
@@ -204,7 +204,7 @@ class npc_announcer_toc10 : public CreatureScript
|
||||
return true;
|
||||
|
||||
if (GameObject* floor = GameObject::GetGameObject(*player, instanceScript->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
|
||||
floor->TakenDamage(1000000);
|
||||
floor->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
|
||||
|
||||
creature->CastSpell(creature, 69016, false);
|
||||
|
||||
@@ -319,7 +319,7 @@ class boss_lich_king_toc : public CreatureScript
|
||||
break;
|
||||
case 5080:
|
||||
if (GameObject* pGoFloor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
|
||||
pGoFloor->TakenDamage(1000000);
|
||||
pGoFloor->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
|
||||
me->CastSpell(me, 69016, false);
|
||||
if (m_pInstance)
|
||||
{
|
||||
|
||||
@@ -983,7 +983,7 @@ class spell_gen_seaforium_blast : public SpellScriptLoader
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffect += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_WMO_DAMAGE);
|
||||
OnEffect += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user