[c12623] Handle GO Trap triggering like GO handling is expected

This commit is contained in:
Schmoozerd 2013-05-31 12:25:50 +01:00 committed by Antz
parent 30fc2b7af6
commit 7e9d6dc954
2 changed files with 31 additions and 38 deletions

View file

@ -299,16 +299,11 @@ void GameObject::Update(uint32 update_diff, uint32 p_time)
{ {
// traps can have time and can not have // traps can have time and can not have
GameObjectInfo const* goInfo = GetGOInfo(); GameObjectInfo const* goInfo = GetGOInfo();
if (goInfo->type == GAMEOBJECT_TYPE_TRAP) if (goInfo->type == GAMEOBJECT_TYPE_TRAP) // traps
{ {
if (m_cooldownTime >= time(NULL)) if (m_cooldownTime >= time(NULL))
return; return;
// traps
Unit* owner = GetOwner();
Unit* ok = NULL; // pointer to appropriate target if found any
bool IsBattleGroundTrap = false;
// FIXME: this is activation radius (in different casting radius that must be selected from spell data) // FIXME: this is activation radius (in different casting radius that must be selected from spell data)
// TODO: move activated state code (cast itself) to GO_ACTIVATED, in this place only check activating and set state // TODO: move activated state code (cast itself) to GO_ACTIVATED, in this place only check activating and set state
float radius = float(goInfo->trap.radius); float radius = float(goInfo->trap.radius);
@ -323,36 +318,16 @@ void GameObject::Update(uint32 update_diff, uint32 p_time)
// battlegrounds gameobjects has data2 == 0 && data5 == 3 // battlegrounds gameobjects has data2 == 0 && data5 == 3
radius = float(goInfo->trap.cooldown); radius = float(goInfo->trap.cooldown);
IsBattleGroundTrap = true;
} }
} }
// Should trap trigger? // Should trap trigger?
Unit* enemy = NULL; // pointer to appropriate target if found any
MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, radius); MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, radius);
MaNGOS::UnitSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> checker(ok, u_check); MaNGOS::UnitSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> checker(enemy, u_check);
Cell::VisitAllObjects(this, checker, radius); Cell::VisitAllObjects(this, checker, radius);
if (enemy)
if (ok) Use(enemy);
{
Unit* caster = owner ? owner : ok;
// Code below should be refactored into GO::Use, but not clear how to handle caster/victim for non AoE spells
caster->CastSpell(ok, goInfo->trap.spellId, true, NULL, NULL, GetObjectGuid());
// use template cooldown if provided
m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4));
// count charges
if (goInfo->trap.charges > 0)
AddUse();
if (IsBattleGroundTrap && ok->GetTypeId() == TYPEID_PLAYER)
{
// BattleGround gameobjects case
if (BattleGround* bg = ((Player*)ok)->GetBattleGround())
bg->HandleTriggerBuff(GetObjectGuid());
}
}
} }
if (uint32 max_charges = goInfo->GetCharges()) if (uint32 max_charges = goInfo->GetCharges())
@ -1074,23 +1049,41 @@ void GameObject::Use(Unit* user)
} }
case GAMEOBJECT_TYPE_TRAP: // 6 case GAMEOBJECT_TYPE_TRAP: // 6
{ {
// Currently we do not expect trap code below to be Use()
// directly (except from spell effect). Code here will be called by TriggerLinkedGameObject.
if (scriptReturnValue) if (scriptReturnValue)
return; return;
Unit* owner = GetOwner();
Unit* caster = owner ? owner : user;
GameObjectInfo const* goInfo = GetGOInfo();
float radius = float(goInfo->trap.radius);
bool IsBattleGroundTrap = !radius && goInfo->trap.cooldown == 3 && m_respawnTime == 0;
// FIXME: when GO casting will be implemented trap must cast spell to target // FIXME: when GO casting will be implemented trap must cast spell to target
if (spellId = GetGOInfo()->trap.spellId) if (spellId = goInfo->trap.spellId)
user->CastSpell(user, spellId, true, NULL, NULL, GetObjectGuid()); caster->CastSpell(user, spellId, true, NULL, NULL, GetObjectGuid());
// use template cooldown if provided
m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4));
// count charges
if (goInfo->trap.charges > 0)
AddUse();
if (IsBattleGroundTrap && user->GetTypeId() == TYPEID_PLAYER)
{
// BattleGround gameobjects case
if (BattleGround* bg = ((Player*)user)->GetBattleGround())
bg->HandleTriggerBuff(GetObjectGuid());
}
// TODO: all traps can be activated, also those without spell. // TODO: all traps can be activated, also those without spell.
// Some may have have animation and/or are expected to despawn. // Some may have have animation and/or are expected to despawn.
// TODO: Improve this when more information is available, currently these traps are known that must send the anim (Onyxia/ Heigan Fissures) // TODO: Improve this when more information is available, currently these traps are known that must send the anim (Onyxia/ Heigan Fissures/ Trap in DireMaul)
if (GetDisplayId() == 4392 || GetDisplayId() == 4472 || GetDisplayId() == 6785) if (GetDisplayId() == 4392 || GetDisplayId() == 4472 || GetDisplayId() == 6785 || GetDisplayId() == 3073)
SendGameObjectCustomAnim(GetObjectGuid()); SendGameObjectCustomAnim(GetObjectGuid());
// TODO: Despawning of traps? (Also related to code in ::Update)
return; return;
} }
case GAMEOBJECT_TYPE_CHAIR: // 7 Sitting: Wooden bench, chairs case GAMEOBJECT_TYPE_CHAIR: // 7 Sitting: Wooden bench, chairs

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "12622" #define REVISION_NR "12623"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__