Make some cleanup.
My thank goes to Az@zel for the code analysis. --HG-- branch : trunk
This commit is contained in:
@@ -188,7 +188,6 @@ Battleground::Battleground()
|
|||||||
m_TeamScores[BG_TEAM_HORDE] = 0;
|
m_TeamScores[BG_TEAM_HORDE] = 0;
|
||||||
|
|
||||||
m_PrematureCountDown = false;
|
m_PrematureCountDown = false;
|
||||||
m_PrematureCountDown = 0;
|
|
||||||
|
|
||||||
m_HonorMode = BG_NORMAL;
|
m_HonorMode = BG_NORMAL;
|
||||||
|
|
||||||
|
|||||||
@@ -911,19 +911,15 @@ void GameObject::TriggeringLinkedGameObject(uint32 trapEntry, Unit* target)
|
|||||||
if (!trapSpell) // checked at load already
|
if (!trapSpell) // checked at load already
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*** FIXME: this maybe not correct ***/
|
||||||
float range;
|
float range;
|
||||||
SpellRangeEntry const * srentry = sSpellRangeStore.LookupEntry(trapSpell->rangeIndex);
|
SpellRangeEntry const * srentry = sSpellRangeStore.LookupEntry(trapSpell->rangeIndex);
|
||||||
//get owner to check hostility of GameObject
|
//get owner to check hostility of GameObject
|
||||||
if (GetSpellMaxRangeForHostile(srentry) == GetSpellMaxRangeForHostile(srentry))
|
if (Unit *owner = GetOwner())
|
||||||
range = GetSpellMaxRangeForHostile(srentry);
|
range = (float)owner->GetSpellMaxRangeForTarget(target, srentry);
|
||||||
else
|
else
|
||||||
{
|
//if no owner assume that object is hostile to target
|
||||||
if (Unit *owner = GetOwner())
|
range = GetSpellMaxRangeForHostile(srentry);
|
||||||
range = (float)owner->GetSpellMaxRangeForTarget(target, srentry);
|
|
||||||
else
|
|
||||||
//if no owner assume that object is hostile to target
|
|
||||||
range = GetSpellMaxRangeForHostile(srentry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// search nearest linked GO
|
// search nearest linked GO
|
||||||
GameObject* trapGO = NULL;
|
GameObject* trapGO = NULL;
|
||||||
@@ -1509,15 +1505,15 @@ void GameObject::Use(Unit* user)
|
|||||||
{
|
{
|
||||||
case 179785: // Silverwing Flag
|
case 179785: // Silverwing Flag
|
||||||
// check if it's correct bg
|
// check if it's correct bg
|
||||||
if (bg->GetTypeID(true) == BATTLEGROUND_WS)
|
if (bg->IsRandom() ? bg->GetTypeID(true) : bg->GetTypeID(false) == BATTLEGROUND_WS)
|
||||||
bg->EventPlayerClickedOnFlag(player, this);
|
bg->EventPlayerClickedOnFlag(player, this);
|
||||||
break;
|
break;
|
||||||
case 179786: // Warsong Flag
|
case 179786: // Warsong Flag
|
||||||
if (bg->GetTypeID(true) == BATTLEGROUND_WS)
|
if (bg->IsRandom() ? bg->GetTypeID(true) : bg->GetTypeID(false) == BATTLEGROUND_WS)
|
||||||
bg->EventPlayerClickedOnFlag(player, this);
|
bg->EventPlayerClickedOnFlag(player, this);
|
||||||
break;
|
break;
|
||||||
case 184142: // Netherstorm Flag
|
case 184142: // Netherstorm Flag
|
||||||
if (bg->GetTypeID(true) == BATTLEGROUND_EY)
|
if (bg->IsRandom() ? bg->GetTypeID(true) : bg->GetTypeID(false) == BATTLEGROUND_EY)
|
||||||
bg->EventPlayerClickedOnFlag(player, this);
|
bg->EventPlayerClickedOnFlag(player, this);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -471,7 +471,6 @@ bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids)
|
|||||||
// sLog.outDetail(" Generated %lu waypoints, total time %u.", (unsigned long)m_WayPoints.size(), timer);
|
// sLog.outDetail(" Generated %lu waypoints, total time %u.", (unsigned long)m_WayPoints.size(), timer);
|
||||||
|
|
||||||
m_curr = m_WayPoints.begin();
|
m_curr = m_WayPoints.begin();
|
||||||
m_curr = GetNextWayPoint();
|
|
||||||
m_next = GetNextWayPoint();
|
m_next = GetNextWayPoint();
|
||||||
m_pathTime = timer;
|
m_pathTime = timer;
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ IdleMovementGenerator si_idleMovement;
|
|||||||
// But it should not be sent otherwise there are many redundent packets
|
// But it should not be sent otherwise there are many redundent packets
|
||||||
void IdleMovementGenerator::Initialize(Unit &owner)
|
void IdleMovementGenerator::Initialize(Unit &owner)
|
||||||
{
|
{
|
||||||
if (owner.hasUnitState(UNIT_STAT_MOVE))
|
Reset(owner);
|
||||||
owner.StopMoving();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -283,13 +283,8 @@ void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket)
|
|||||||
|
|
||||||
void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket)
|
void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket)
|
||||||
{
|
{
|
||||||
sLog.outDebug("Opcode %u", recvPacket.GetOpcode());
|
// this should be OK because the 2 function _were_ the same
|
||||||
//recvPacket.hexlike();
|
HandleChannelList(recvPacket);
|
||||||
std::string channelname;
|
|
||||||
recvPacket >> channelname;
|
|
||||||
if (ChannelMgr* cMgr = channelMgr(_player->GetTeam()))
|
|
||||||
if (Channel *chn = cMgr->GetChannel(channelname, _player))
|
|
||||||
chn->List(_player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket)
|
void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket)
|
||||||
|
|||||||
@@ -4223,14 +4223,9 @@ void AuraEffect::HandleAuraModIncreaseSpeed(AuraApplication const * aurApp, uint
|
|||||||
target->UpdateSpeed(MOVE_RUN, true);
|
target->UpdateSpeed(MOVE_RUN, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleAuraModIncreaseMountedSpeed(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
void AuraEffect::HandleAuraModIncreaseMountedSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
||||||
{
|
{
|
||||||
if (!(mode & AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK))
|
HandleAuraModIncreaseSpeed(aurApp, mode, apply);
|
||||||
return;
|
|
||||||
|
|
||||||
Unit * target = aurApp->GetTarget();
|
|
||||||
|
|
||||||
target->UpdateSpeed(MOVE_RUN, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
||||||
@@ -4868,20 +4863,9 @@ void AuraEffect::HandleModPowerRegen(AuraApplication const * aurApp, uint8 mode,
|
|||||||
// other powers are not immediate effects - implemented in Player::Regenerate, Creature::Regenerate
|
// other powers are not immediate effects - implemented in Player::Regenerate, Creature::Regenerate
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleModPowerRegenPCT(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
void AuraEffect::HandleModPowerRegenPCT(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
||||||
{
|
{
|
||||||
if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
|
HandleModPowerRegen(aurApp, mode, apply);
|
||||||
return;
|
|
||||||
|
|
||||||
Unit * target = aurApp->GetTarget();
|
|
||||||
|
|
||||||
if (target->GetTypeId() != TYPEID_PLAYER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Update manaregen value
|
|
||||||
if (GetMiscValue() == POWER_MANA)
|
|
||||||
target->ToPlayer()->UpdateManaRegen();
|
|
||||||
// other powers are not immediate effects - implemented in Player::Regenerate, Creature::Regenerate
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleModManaRegen(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
void AuraEffect::HandleModManaRegen(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
||||||
@@ -5055,17 +5039,9 @@ void AuraEffect::HandleAuraModBlockPercent(AuraApplication const * aurApp, uint8
|
|||||||
target->ToPlayer()->UpdateBlockPercentage();
|
target->ToPlayer()->UpdateBlockPercentage();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleAuraModRegenInterrupt(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
void AuraEffect::HandleAuraModRegenInterrupt(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
||||||
{
|
{
|
||||||
if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
|
HandleModManaRegen(aurApp, mode, apply);
|
||||||
return;
|
|
||||||
|
|
||||||
Unit * target = aurApp->GetTarget();
|
|
||||||
|
|
||||||
if (target->GetTypeId() != TYPEID_PLAYER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
target->ToPlayer()->UpdateManaRegen();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleAuraModWeaponCritPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
void AuraEffect::HandleAuraModWeaponCritPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
||||||
@@ -5362,16 +5338,9 @@ void AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent(AuraApplication con
|
|||||||
target->ToPlayer()->UpdateAttackPowerAndDamage(true);
|
target->ToPlayer()->UpdateAttackPowerAndDamage(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleAuraModAttackPowerOfStatPercent(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
void AuraEffect::HandleAuraModAttackPowerOfStatPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const
|
||||||
{
|
{
|
||||||
if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
|
HandleAuraModAttackPowerOfArmor(aurApp, mode, apply);
|
||||||
return;
|
|
||||||
|
|
||||||
Unit * target = aurApp->GetTarget();
|
|
||||||
|
|
||||||
// Recalculate bonus
|
|
||||||
if (target->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
target->ToPlayer()->UpdateAttackPowerAndDamage(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleAuraModAttackPowerOfArmor(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
void AuraEffect::HandleAuraModAttackPowerOfArmor(AuraApplication const * aurApp, uint8 mode, bool /*apply*/) const
|
||||||
|
|||||||
@@ -3228,10 +3228,10 @@ void Spell::EffectDualWield(SpellEffIndex /*effIndex*/)
|
|||||||
unitTarget->ToCreature()->UpdateDamagePhysical(OFF_ATTACK);
|
unitTarget->ToCreature()->UpdateDamagePhysical(OFF_ATTACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectPull(SpellEffIndex /*effIndex*/)
|
void Spell::EffectPull(SpellEffIndex effIndex)
|
||||||
{
|
{
|
||||||
// TODO: create a proper pull towards distract spell center for distract
|
// TODO: create a proper pull towards distract spell center for distract
|
||||||
sLog.outDebug("WORLD: Spell Effect DUMMY");
|
EffectNULL(effIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectDistract(SpellEffIndex /*effIndex*/)
|
void Spell::EffectDistract(SpellEffIndex /*effIndex*/)
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ public:
|
|||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
summons.DespawnAll();
|
DespawnAllImp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* summon)
|
void JustSummoned(Creature* summon)
|
||||||
|
|||||||
@@ -125,8 +125,10 @@ public:
|
|||||||
DrainLifeTimer = 3000 + rand()%4000;
|
DrainLifeTimer = 3000 + rand()%4000;
|
||||||
DrainManaTimer = DrainLifeTimer + 5000;
|
DrainManaTimer = DrainLifeTimer + 5000;
|
||||||
FelExplosionTimer = 2100;
|
FelExplosionTimer = 2100;
|
||||||
DrainCrystalTimer = 10000 + rand()%5000;
|
if (IsHeroic())
|
||||||
DrainCrystalTimer = 20000 + rand()%5000;
|
DrainCrystalTimer = 10000 + rand()%5000;
|
||||||
|
else
|
||||||
|
DrainCrystalTimer = 20000 + rand()%5000;
|
||||||
EmpowerTimer = 10000;
|
EmpowerTimer = 10000;
|
||||||
|
|
||||||
IsDraining = false;
|
IsDraining = false;
|
||||||
|
|||||||
@@ -104,17 +104,17 @@ public:
|
|||||||
ai->Reset();
|
ai->Reset();
|
||||||
ai->EnterEvadeMode();
|
ai->EnterEvadeMode();
|
||||||
|
|
||||||
ai->Spell[0].SpellId = SPELL_BLIZZARD;
|
ai->Spells[0].SpellId = SPELL_BLIZZARD;
|
||||||
ai->Spell[0].Cooldown = 15000 + rand()%20000;
|
ai->Spells[0].Cooldown = 15000 + rand()%20000;
|
||||||
ai->Spell[0].TargetType = TARGETTYPE_RANDOM;
|
ai->Spells[0].TargetType = TARGETTYPE_RANDOM;
|
||||||
|
|
||||||
ai->Spell[1].SpellId = SPELL_PYROBLAST;
|
ai->Spells[1].SpellId = SPELL_PYROBLAST;
|
||||||
ai->Spell[1].Cooldown = 5500 + rand()%4000;
|
ai->Spells[1].Cooldown = 5500 + rand()%4000;
|
||||||
ai->Spell[1].TargetType = TARGETTYPE_RANDOM;
|
ai->Spells[1].TargetType = TARGETTYPE_RANDOM;
|
||||||
|
|
||||||
ai->Spell[2].SpellId = SPELL_SUMMON_ELEMENTALS;
|
ai->Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS;
|
||||||
ai->Spell[2].Cooldown = 15000 + rand()%30000;
|
ai->Spells[2].Cooldown = 15000 + rand()%30000;
|
||||||
ai->Spell[2].TargetType = TARGETTYPE_SELF;
|
ai->Spells[2].TargetType = TARGETTYPE_SELF;
|
||||||
|
|
||||||
return ai;
|
return ai;
|
||||||
}
|
}
|
||||||
@@ -188,13 +188,13 @@ public:
|
|||||||
ai->Reset();
|
ai->Reset();
|
||||||
ai->EnterEvadeMode();
|
ai->EnterEvadeMode();
|
||||||
|
|
||||||
ai->Spell[0].SpellId = SPELL_CHAIN_LIGHTNING;
|
ai->Spells[0].SpellId = SPELL_CHAIN_LIGHTNING;
|
||||||
ai->Spell[0].Cooldown = 3000 + rand()%5000;
|
ai->Spells[0].Cooldown = 3000 + rand()%5000;
|
||||||
ai->Spell[0].TargetType = TARGETTYPE_VICTIM;
|
ai->Spells[0].TargetType = TARGETTYPE_VICTIM;
|
||||||
|
|
||||||
ai->Spell[1].SpellId = SPELL_SUMMON_DIRE_WOLF;
|
ai->Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF;
|
||||||
ai->Spell[1].Cooldown = 6000 + rand()%35000;
|
ai->Spells[1].Cooldown = 6000 + rand()%35000;
|
||||||
ai->Spell[1].TargetType = TARGETTYPE_RANDOM;
|
ai->Spells[1].TargetType = TARGETTYPE_RANDOM;
|
||||||
|
|
||||||
return ai;
|
return ai;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ void hyjalAI::Reset()
|
|||||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||||
|
|
||||||
//Initialize spells
|
//Initialize spells
|
||||||
memset(Spell, 0, sizeof(Spell));
|
memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS);
|
||||||
|
|
||||||
//Reset Instance Data for trash count
|
//Reset Instance Data for trash count
|
||||||
if (pInstance)
|
if (pInstance)
|
||||||
@@ -425,9 +425,9 @@ void hyjalAI::EnterEvadeMode()
|
|||||||
void hyjalAI::EnterCombat(Unit * /*who*/)
|
void hyjalAI::EnterCombat(Unit * /*who*/)
|
||||||
{
|
{
|
||||||
if (IsDummy)return;
|
if (IsDummy)return;
|
||||||
for (uint8 i = 0; i < 3; ++i)
|
for (uint8 i = 0; i < HYJAL_AI_MAX_SPELLS; ++i)
|
||||||
if (Spell[i].Cooldown)
|
if (Spells[i].Cooldown)
|
||||||
SpellTimer[i] = Spell[i].Cooldown;
|
SpellTimer[i] = Spells[i].Cooldown;
|
||||||
|
|
||||||
Talk(ATTACKED);
|
Talk(ATTACKED);
|
||||||
}
|
}
|
||||||
@@ -881,9 +881,9 @@ void hyjalAI::UpdateAI(const uint32 diff)
|
|||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (uint8 i = 0; i < 3; ++i)
|
for (uint8 i = 0; i < HYJAL_AI_MAX_SPELLS; ++i)
|
||||||
{
|
{
|
||||||
if (Spell[i].SpellId)
|
if (Spells[i].SpellId)
|
||||||
{
|
{
|
||||||
if (SpellTimer[i] <= diff)
|
if (SpellTimer[i] <= diff)
|
||||||
{
|
{
|
||||||
@@ -892,7 +892,7 @@ void hyjalAI::UpdateAI(const uint32 diff)
|
|||||||
|
|
||||||
Unit *pTarget = NULL;
|
Unit *pTarget = NULL;
|
||||||
|
|
||||||
switch(Spell[i].TargetType)
|
switch(Spells[i].TargetType)
|
||||||
{
|
{
|
||||||
case TARGETTYPE_SELF: pTarget = me; break;
|
case TARGETTYPE_SELF: pTarget = me; break;
|
||||||
case TARGETTYPE_RANDOM: pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); break;
|
case TARGETTYPE_RANDOM: pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); break;
|
||||||
@@ -901,8 +901,8 @@ void hyjalAI::UpdateAI(const uint32 diff)
|
|||||||
|
|
||||||
if (pTarget && pTarget->isAlive())
|
if (pTarget && pTarget->isAlive())
|
||||||
{
|
{
|
||||||
DoCast(pTarget, Spell[i].SpellId);
|
DoCast(pTarget, Spells[i].SpellId);
|
||||||
SpellTimer[i] = Spell[i].Cooldown;
|
SpellTimer[i] = Spells[i].Cooldown;
|
||||||
}
|
}
|
||||||
} else SpellTimer[i] -= diff;
|
} else SpellTimer[i] -= diff;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
#include "hyjal.h"
|
#include "hyjal.h"
|
||||||
#include "ScriptedEscortAI.h"
|
#include "ScriptedEscortAI.h"
|
||||||
|
|
||||||
|
#define HYJAL_AI_MAX_SPELLS 3
|
||||||
|
|
||||||
// Trash Mobs summoned in waves
|
// Trash Mobs summoned in waves
|
||||||
#define NECROMANCER 17899//done
|
#define NECROMANCER 17899//done
|
||||||
#define ABOMINATION 17898//done
|
#define ABOMINATION 17898//done
|
||||||
@@ -252,7 +254,7 @@ struct hyjalAI : public npc_escortAI
|
|||||||
uint32 SpellId;
|
uint32 SpellId;
|
||||||
uint32 Cooldown;
|
uint32 Cooldown;
|
||||||
uint32 TargetType;
|
uint32 TargetType;
|
||||||
}Spell[3];
|
} Spells[HYJAL_AI_MAX_SPELLS];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32 SpellTimer[3];
|
uint32 SpellTimer[3];
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ public:
|
|||||||
case 0: RandX = 0.0f - Rand; break;
|
case 0: RandX = 0.0f - Rand; break;
|
||||||
case 1: RandX = 0.0f + Rand; break;
|
case 1: RandX = 0.0f + Rand; break;
|
||||||
}
|
}
|
||||||
Rand = 0;
|
|
||||||
Rand = 10 + (rand()%10);
|
Rand = 10 + (rand()%10);
|
||||||
switch (rand()%2)
|
switch (rand()%2)
|
||||||
{
|
{
|
||||||
case 0: RandY = 0.0f - Rand; break;
|
case 0: RandY = 0.0f - Rand; break;
|
||||||
|
|||||||
@@ -1194,7 +1194,7 @@ public:
|
|||||||
m_uiShadowBreathTimer -= uiDiff;
|
m_uiShadowBreathTimer -= uiDiff;
|
||||||
|
|
||||||
// Don't attack current target if he's not visible for us.
|
// Don't attack current target if he's not visible for us.
|
||||||
if(me->getVictim() && me->getVictim() && me->getVictim()->HasAura(57874, 0))
|
if(me->getVictim() && me->getVictim()->HasAura(57874, 0))
|
||||||
me->getThreatManager().modifyThreatPercent(me->getVictim(), -100);
|
me->getThreatManager().modifyThreatPercent(me->getVictim(), -100);
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
|
|||||||
Reference in New Issue
Block a user