mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Core/Entities: correct creature damage, offhand damage should work too
* todo: some creatures need dmg_multiplier update in creature_template
This commit is contained in:
@@ -297,12 +297,7 @@ public:
|
||||
void ClearWeapons()
|
||||
{
|
||||
SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
|
||||
|
||||
//damage
|
||||
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, cinfo->mindmg);
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, cinfo->maxdmg);
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
me->SetCanDualWield(false);
|
||||
}
|
||||
|
||||
void EnfeebleHealthEffect()
|
||||
@@ -419,19 +414,8 @@ public:
|
||||
//models
|
||||
SetEquipmentSlots(false, EQUIP_ID_AXE, EQUIP_ID_AXE, EQUIP_NO_CHANGE);
|
||||
|
||||
//damage
|
||||
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 2*cinfo->mindmg);
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 2*cinfo->maxdmg);
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
|
||||
me->SetBaseWeaponDamage(OFF_ATTACK, MINDAMAGE, cinfo->mindmg);
|
||||
me->SetBaseWeaponDamage(OFF_ATTACK, MAXDAMAGE, cinfo->maxdmg);
|
||||
//Sigh, updating only works on main attack, do it manually ....
|
||||
me->SetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, cinfo->mindmg);
|
||||
me->SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, cinfo->maxdmg);
|
||||
|
||||
me->SetAttackTime(OFF_ATTACK, (me->GetAttackTime(BASE_ATTACK)*150)/100);
|
||||
me->SetCanDualWield(true);
|
||||
}
|
||||
}
|
||||
else if (phase == 2)
|
||||
|
||||
@@ -96,24 +96,21 @@ class boss_arlokk : public CreatureScript
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
if (events.IsInPhase(PHASE_TWO))
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
|
||||
_Reset();
|
||||
_summonCountA = 0;
|
||||
_summonCountB = 0;
|
||||
me->RemoveAllAuras();
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
|
||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
|
||||
gate->SetGoState(GO_STATE_READY);
|
||||
me->SetWalk(false);
|
||||
me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
me->RemoveAllAuras();
|
||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
instance->SetBossState(DATA_ARLOKK, DONE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
@@ -154,11 +151,9 @@ class boss_arlokk : public CreatureScript
|
||||
|
||||
void EnterEvadeMode() OVERRIDE
|
||||
{
|
||||
if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
|
||||
object->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_GONG_OF_BETHEKK)))
|
||||
BossAI::EnterEvadeMode();
|
||||
if (GameObject* object = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_GONG_OF_BETHEKK)))
|
||||
object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
instance->SetBossState(DATA_ARLOKK, NOT_STARTED);
|
||||
me->DespawnOrUnsummon(4000);
|
||||
}
|
||||
|
||||
@@ -194,7 +189,7 @@ class boss_arlokk : public CreatureScript
|
||||
case EVENT_SUMMON_PROWLERS:
|
||||
if (_summonCountA < MAX_PROWLERS_PER_SIDE)
|
||||
{
|
||||
if (Unit* trigger = me->GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
|
||||
if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
|
||||
{
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
|
||||
++_summonCountA;
|
||||
@@ -202,7 +197,7 @@ class boss_arlokk : public CreatureScript
|
||||
}
|
||||
if (_summonCountB < MAX_PROWLERS_PER_SIDE)
|
||||
{
|
||||
if (Unit* trigger = me->GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
|
||||
if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
|
||||
{
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
|
||||
++_summonCountB;
|
||||
@@ -225,13 +220,15 @@ class boss_arlokk : public CreatureScript
|
||||
}
|
||||
case EVENT_TRANSFORM:
|
||||
{
|
||||
DoCast(me, SPELL_PANTHER_TRANSFORM);
|
||||
DoCast(me, SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP));
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP));
|
||||
/*
|
||||
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
*/
|
||||
me->AttackStop();
|
||||
DoResetThreat();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
@@ -262,6 +259,7 @@ class boss_arlokk : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
|
||||
events.ScheduleEvent(EVENT_TRANSFORM_BACK, urand(15000, 18000), 0, PHASE_TWO);
|
||||
events.SetPhase(PHASE_TWO);
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, true); // hack
|
||||
break;
|
||||
case EVENT_RAVAGE:
|
||||
DoCastVictim(SPELL_RAVAGE, true);
|
||||
@@ -269,14 +267,17 @@ class boss_arlokk : public CreatureScript
|
||||
break;
|
||||
case EVENT_TRANSFORM_BACK:
|
||||
{
|
||||
me->RemoveAura(SPELL_PANTHER_TRANSFORM);
|
||||
me->RemoveAura(SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM
|
||||
DoCast(me, SPELL_VANISH_VISUAL);
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
|
||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
|
||||
/*
|
||||
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg));
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg));
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
*/
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
|
||||
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(4000, 7000), 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, urand(16000, 20000), 0, PHASE_ONE);
|
||||
|
||||
@@ -64,11 +64,6 @@ enum Phases
|
||||
PHASE_THREE = 3
|
||||
};
|
||||
|
||||
enum ModelId
|
||||
{
|
||||
MODEL_MARLI = 15220
|
||||
};
|
||||
|
||||
class boss_marli : public CreatureScript
|
||||
{
|
||||
public: boss_marli() : CreatureScript("boss_marli") { }
|
||||
@@ -79,6 +74,8 @@ class boss_marli : public CreatureScript
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
if (events.IsInPhase(PHASE_THREE))
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
|
||||
_Reset();
|
||||
}
|
||||
|
||||
@@ -155,11 +152,14 @@ class boss_marli : public CreatureScript
|
||||
case EVENT_TRANSFORM:
|
||||
{
|
||||
Talk(SAY_TRANSFORM);
|
||||
DoCast(me, SPELL_SPIDER_FORM);
|
||||
DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM
|
||||
/*
|
||||
CreatureTemplate const* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
*/
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, true); // hack
|
||||
DoCastVictim(SPELL_ENVOLWINGWEB);
|
||||
if (DoGetThreat(me->GetVictim()))
|
||||
DoModifyThreatPercent(me->GetVictim(), -100);
|
||||
@@ -188,11 +188,14 @@ class boss_marli : public CreatureScript
|
||||
}
|
||||
case EVENT_TRANSFORM_BACK:
|
||||
{
|
||||
me->SetDisplayId(MODEL_MARLI);
|
||||
me->RemoveAura(SPELL_SPIDER_FORM);
|
||||
/*
|
||||
CreatureTemplate const* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
*/
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
|
||||
events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO);
|
||||
events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
|
||||
events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000);
|
||||
|
||||
@@ -89,6 +89,8 @@ class boss_thekal : public CreatureScript
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
if (events.IsInPhase(PHASE_TWO))
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
|
||||
_Reset();
|
||||
Enraged = false;
|
||||
WasDead = false;
|
||||
@@ -141,15 +143,17 @@ class boss_thekal : public CreatureScript
|
||||
//Thekal will transform to Tiger if he died and was not resurrected after 10 seconds.
|
||||
if (WasDead)
|
||||
{
|
||||
DoCast(me, SPELL_TIGER_FORM);
|
||||
DoCast(me, SPELL_TIGER_FORM); // SPELL_AURA_TRANSFORM
|
||||
me->SetObjectScale(2.00f);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetFullHealth();
|
||||
/*
|
||||
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
|
||||
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
|
||||
me->UpdateDamagePhysical(BASE_ATTACK);
|
||||
*/
|
||||
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 40.0f, true); // hack
|
||||
DoResetThreat();
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); // Phase 2
|
||||
events.ScheduleEvent(EVENT_FORCEPUNCH, 4000, 0, PHASE_TWO); // Phase 2
|
||||
|
||||
@@ -27,6 +27,12 @@ EndScriptData */
|
||||
#include "InstanceScript.h"
|
||||
#include "zulgurub.h"
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_FORCEFIELD, DATA_ARLOKK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
|
||||
};
|
||||
|
||||
class instance_zulgurub : public InstanceMapScript
|
||||
{
|
||||
public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) { }
|
||||
@@ -36,6 +42,7 @@ class instance_zulgurub : public InstanceMapScript
|
||||
instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDoorData(doorData);
|
||||
}
|
||||
|
||||
void Initialize() OVERRIDE
|
||||
@@ -46,7 +53,6 @@ class instance_zulgurub : public InstanceMapScript
|
||||
_jindoTheHexxerGUID = 0;
|
||||
_vilebranchSpeakerGUID = 0;
|
||||
_arlokkGUID = 0;
|
||||
_goForcefieldGUID = 0;
|
||||
_goGongOfBethekkGUID = 0;
|
||||
}
|
||||
|
||||
@@ -86,7 +92,7 @@ class instance_zulgurub : public InstanceMapScript
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FORCEFIELD:
|
||||
_goForcefieldGUID = go->GetGUID();
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_GONG_OF_BETHEKK:
|
||||
_goGongOfBethekkGUID = go->GetGUID();
|
||||
@@ -100,6 +106,18 @@ class instance_zulgurub : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go) OVERRIDE
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FORCEFIELD:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 uiData) const OVERRIDE
|
||||
{
|
||||
switch (uiData)
|
||||
@@ -119,9 +137,6 @@ class instance_zulgurub : public InstanceMapScript
|
||||
case NPC_ARLOKK:
|
||||
return _arlokkGUID;
|
||||
break;
|
||||
case GO_FORCEFIELD:
|
||||
return _goForcefieldGUID;
|
||||
break;
|
||||
case GO_GONG_OF_BETHEKK:
|
||||
return _goGongOfBethekkGUID;
|
||||
break;
|
||||
@@ -181,7 +196,6 @@ class instance_zulgurub : public InstanceMapScript
|
||||
uint64 _jindoTheHexxerGUID;
|
||||
uint64 _vilebranchSpeakerGUID;
|
||||
uint64 _arlokkGUID;
|
||||
uint64 _goForcefieldGUID;
|
||||
uint64 _goGongOfBethekkGUID;
|
||||
};
|
||||
|
||||
|
||||
@@ -232,7 +232,6 @@ public:
|
||||
npc_nadox_eggsAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
creature->UpdateAllStats();
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE { }
|
||||
|
||||
@@ -281,7 +281,6 @@ struct boss_twin_baseAI : public BossAI
|
||||
{
|
||||
SetEquipmentSlots(false, Weapon, mode ? Weapon : int32(EQUIP_UNEQUIP), EQUIP_UNEQUIP);
|
||||
me->SetCanDualWield(mode);
|
||||
me->UpdateDamagePhysical(mode ? OFF_ATTACK : BASE_ATTACK);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
|
||||
enum HunterSpells
|
||||
{
|
||||
SPELL_HUNTER_CRIPPLING_POISON = 30981, // Viper
|
||||
SPELL_HUNTER_DEADLY_POISON = 34655, // Venomous Snake
|
||||
SPELL_HUNTER_MIND_NUMBING_POISON = 25810 // Viper
|
||||
SPELL_HUNTER_CRIPPLING_POISON = 30981, // Viper
|
||||
SPELL_HUNTER_DEADLY_POISON_PASSIVE = 34657, // Venomous Snake
|
||||
SPELL_HUNTER_MIND_NUMBING_POISON = 25810 // Viper
|
||||
};
|
||||
|
||||
enum HunterCreatures
|
||||
@@ -57,14 +57,17 @@ class npc_pet_hunter_snake_trap : public CreatureScript
|
||||
me->SetMaxHealth(uint32(107 * (me->getLevel() - 40) * 0.025f));
|
||||
// Add delta to make them not all hit the same time
|
||||
uint32 delta = (rand() % 7) * 100;
|
||||
me->SetStatFloatValue(UNIT_FIELD_BASEATTACKTIME, float(Info->baseattacktime + delta));
|
||||
me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower));
|
||||
me->SetAttackTime(BASE_ATTACK, Info->baseattacktime + delta);
|
||||
//me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower));
|
||||
|
||||
// Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target
|
||||
if (!me->GetVictim() && me->IsSummon())
|
||||
if (Unit* Owner = me->ToTempSummon()->GetSummoner())
|
||||
if (Owner->getAttackerForHelper())
|
||||
AttackStart(Owner->getAttackerForHelper());
|
||||
|
||||
if (!_isViper)
|
||||
DoCast(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true);
|
||||
}
|
||||
|
||||
// Redefined for random target selection:
|
||||
@@ -99,32 +102,19 @@ class npc_pet_hunter_snake_trap : public CreatureScript
|
||||
return;
|
||||
}
|
||||
|
||||
if (_spellTimer <= diff)
|
||||
// Viper
|
||||
if (_isViper)
|
||||
{
|
||||
if (_isViper) // Viper
|
||||
if (_spellTimer <= diff)
|
||||
{
|
||||
if (urand(0, 2) == 0) //33% chance to cast
|
||||
{
|
||||
uint32 spell;
|
||||
if (urand(0, 1) == 0)
|
||||
spell = SPELL_HUNTER_MIND_NUMBING_POISON;
|
||||
else
|
||||
spell = SPELL_HUNTER_CRIPPLING_POISON;
|
||||
|
||||
DoCastVictim(spell);
|
||||
}
|
||||
if (urand(0, 2) == 0) // 33% chance to cast
|
||||
DoCastVictim(RAND(SPELL_HUNTER_MIND_NUMBING_POISON, SPELL_HUNTER_CRIPPLING_POISON));
|
||||
|
||||
_spellTimer = 3000;
|
||||
}
|
||||
else // Venomous Snake
|
||||
{
|
||||
if (urand(0, 2) == 0) // 33% chance to cast
|
||||
DoCastVictim(SPELL_HUNTER_DEADLY_POISON);
|
||||
_spellTimer = 1500 + (rand() % 5) * 100;
|
||||
}
|
||||
else
|
||||
_spellTimer -= diff;
|
||||
}
|
||||
else
|
||||
_spellTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user