Merge branch 'master' of github.com:joschiwald/TrinityCore into spellscripts
Conflicts: src/server/game/Entities/Unit/Unit.cpp src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/Spell.cpp src/server/game/Spells/SpellEffects.cpp src/server/scripts/Spells/spell_paladin.cpp
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
#include "World.h"
|
||||
#include "CreatureAIImpl.h"
|
||||
|
||||
int GuardAI::Permissible(const Creature* creature)
|
||||
int GuardAI::Permissible(Creature const* creature)
|
||||
{
|
||||
if (creature->isGuard())
|
||||
return PERMIT_BASE_SPECIAL;
|
||||
@@ -31,7 +31,7 @@ int GuardAI::Permissible(const Creature* creature)
|
||||
return PERMIT_BASE_NO;
|
||||
}
|
||||
|
||||
GuardAI::GuardAI(Creature* creature) : ScriptedAI(creature), i_victimGuid(0), i_state(STATE_NORMAL), i_tracker(TIME_INTERVAL_LOOK)
|
||||
GuardAI::GuardAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -40,108 +40,35 @@ bool GuardAI::CanSeeAlways(WorldObject const* obj)
|
||||
if (!obj->isType(TYPEMASK_UNIT))
|
||||
return false;
|
||||
|
||||
std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
|
||||
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
|
||||
{
|
||||
if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
|
||||
if (unit == obj)
|
||||
return true;
|
||||
}
|
||||
std::list<HostileReference*> threatList = me->getThreatManager().getThreatList();
|
||||
for (std::list<HostileReference*>::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
|
||||
if ((*itr)->getUnitGuid() == obj->GetGUID())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void GuardAI::MoveInLineOfSight(Unit* unit)
|
||||
{
|
||||
// Ignore Z for flying creatures
|
||||
if (!me->CanFly() && me->GetDistanceZ(unit) > CREATURE_Z_ATTACK_RANGE)
|
||||
return;
|
||||
|
||||
if (!me->getVictim() && me->IsValidAttackTarget(unit) &&
|
||||
(unit->IsHostileToPlayers() || me->IsHostileTo(unit)) &&
|
||||
unit->isInAccessiblePlaceFor(me))
|
||||
{
|
||||
float attackRadius = me->GetAttackDistance(unit);
|
||||
if (me->IsWithinDistInMap(unit, attackRadius))
|
||||
{
|
||||
//Need add code to let guard support player
|
||||
AttackStart(unit);
|
||||
//u->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GuardAI::EnterEvadeMode()
|
||||
{
|
||||
if (!me->isAlive())
|
||||
{
|
||||
sLog->outStaticDebug("Creature stopped attacking because he is dead [guid=%u]", me->GetGUIDLow());
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
|
||||
i_state = STATE_NORMAL;
|
||||
|
||||
i_victimGuid = 0;
|
||||
me->CombatStop(true);
|
||||
me->DeleteThreatList();
|
||||
return;
|
||||
}
|
||||
|
||||
Unit* victim = ObjectAccessor::GetUnit(*me, i_victimGuid);
|
||||
|
||||
if (!victim)
|
||||
{
|
||||
sLog->outStaticDebug("Creature stopped attacking because victim does not exist [guid=%u]", me->GetGUIDLow());
|
||||
}
|
||||
else if (!victim->isAlive())
|
||||
{
|
||||
sLog->outStaticDebug("Creature stopped attacking because victim is dead [guid=%u]", me->GetGUIDLow());
|
||||
}
|
||||
else if (victim->HasStealthAura())
|
||||
{
|
||||
sLog->outStaticDebug("Creature stopped attacking because victim is using stealth [guid=%u]", me->GetGUIDLow());
|
||||
}
|
||||
else if (victim->isInFlight())
|
||||
{
|
||||
sLog->outStaticDebug("Creature stopped attacking because victim is flying away [guid=%u]", me->GetGUIDLow());
|
||||
}
|
||||
else
|
||||
{
|
||||
sLog->outStaticDebug("Creature stopped attacking because victim outran him [guid=%u]", me->GetGUIDLow());
|
||||
}
|
||||
sLog->outDebug(LOG_FILTER_UNITS, "Guard entry: %u enters evade mode.", me->GetEntry());
|
||||
|
||||
me->RemoveAllAuras();
|
||||
me->DeleteThreatList();
|
||||
i_victimGuid = 0;
|
||||
me->CombatStop(true);
|
||||
i_state = STATE_NORMAL;
|
||||
|
||||
// Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead
|
||||
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
}
|
||||
|
||||
void GuardAI::UpdateAI(const uint32 /*diff*/)
|
||||
{
|
||||
// update i_victimGuid if me->getVictim() !=0 and changed
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
Unit* const victim = me->getVictim();
|
||||
if (!victim)
|
||||
return;
|
||||
|
||||
i_victimGuid = victim->GetGUID();
|
||||
|
||||
if (me->isAttackReady())
|
||||
{
|
||||
if (me->IsWithinMeleeRange(victim))
|
||||
{
|
||||
me->AttackerStateUpdate(victim);
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GuardAI::JustDied(Unit* killer)
|
||||
{
|
||||
if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
|
||||
@@ -20,34 +20,19 @@
|
||||
#define TRINITY_GUARDAI_H
|
||||
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Timer.h"
|
||||
|
||||
class Creature;
|
||||
|
||||
class GuardAI : public ScriptedAI
|
||||
{
|
||||
enum GuardState
|
||||
{
|
||||
STATE_NORMAL = 1,
|
||||
STATE_LOOK_AT_VICTIM = 2
|
||||
};
|
||||
|
||||
public:
|
||||
explicit GuardAI(Creature* creature);
|
||||
|
||||
explicit GuardAI(Creature* c);
|
||||
|
||||
void MoveInLineOfSight(Unit*);
|
||||
void EnterEvadeMode();
|
||||
void JustDied(Unit*);
|
||||
static int Permissible(Creature const* creature);
|
||||
bool CanSeeAlways(WorldObject const* obj);
|
||||
|
||||
void UpdateAI(const uint32);
|
||||
static int Permissible(const Creature*);
|
||||
|
||||
private:
|
||||
uint64 i_victimGuid;
|
||||
GuardState i_state;
|
||||
TimeTracker i_tracker;
|
||||
void EnterEvadeMode();
|
||||
void JustDied(Unit* killer);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -153,40 +153,56 @@ void PetAI::UpdateAI(const uint32 diff)
|
||||
|
||||
if (spellInfo->IsPositive())
|
||||
{
|
||||
// non combat spells allowed
|
||||
// only pet spells have IsNonCombatSpell and not fit this reqs:
|
||||
// Consume Shadows, Lesser Invisibility, so ignore checks for its
|
||||
if (spellInfo->CanBeUsedInCombat())
|
||||
{
|
||||
// allow only spell without spell cost or with spell cost but not duration limit
|
||||
int32 duration = spellInfo->GetDuration();
|
||||
if ((spellInfo->ManaCost || spellInfo->ManaCostPercentage || spellInfo->ManaPerSecond) && duration > 0)
|
||||
// check spell cooldown
|
||||
if (me->HasSpellCooldown(spellInfo->Id))
|
||||
continue;
|
||||
|
||||
// allow only spell without cooldown > duration
|
||||
int32 cooldown = spellInfo->GetRecoveryTime();
|
||||
if (cooldown >= 0 && duration >= 0 && cooldown > duration)
|
||||
// Check if we're in combat or commanded to attack
|
||||
if (!me->isInCombat() && !me->GetCharmInfo()->IsCommandAttack())
|
||||
continue;
|
||||
}
|
||||
|
||||
Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0);
|
||||
|
||||
bool spellUsed = false;
|
||||
for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
|
||||
|
||||
// Some spells can target enemy or friendly (DK Ghoul's Leap)
|
||||
// Check for enemy first (pet then owner)
|
||||
Unit* target = me->getAttackerForHelper();
|
||||
if (!target && owner)
|
||||
target = owner->getAttackerForHelper();
|
||||
|
||||
if (target)
|
||||
{
|
||||
Unit* target = ObjectAccessor::GetUnit(*me, *tar);
|
||||
|
||||
//only buff targets that are in combat, unless the spell can only be cast while out of combat
|
||||
if (!target)
|
||||
continue;
|
||||
|
||||
if (spell->CanAutoCast(target))
|
||||
if (CanAttack(target) && spell->CanAutoCast(target))
|
||||
{
|
||||
targetSpellStore.push_back(std::make_pair(target, spell));
|
||||
spellUsed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// No enemy, check friendly
|
||||
if (!spellUsed)
|
||||
{
|
||||
for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
|
||||
{
|
||||
Unit* ally = ObjectAccessor::GetUnit(*me, *tar);
|
||||
|
||||
//only buff targets that are in combat, unless the spell can only be cast while out of combat
|
||||
if (!ally)
|
||||
continue;
|
||||
|
||||
if (spell->CanAutoCast(ally))
|
||||
{
|
||||
targetSpellStore.push_back(std::make_pair(ally, spell));
|
||||
spellUsed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// No valid targets at all
|
||||
if (!spellUsed)
|
||||
delete spell;
|
||||
}
|
||||
|
||||
@@ -383,7 +383,7 @@ void npc_escortAI::FillPointMovementListForCreature()
|
||||
if (movePoints.empty())
|
||||
return;
|
||||
|
||||
ScriptPointVector::const_iterator itrEnd = movePoints.end();;
|
||||
ScriptPointVector::const_iterator itrEnd = movePoints.end();
|
||||
for (ScriptPointVector::const_iterator itr = movePoints.begin(); itr != itrEnd; ++itr)
|
||||
{
|
||||
Escort_Waypoint point(itr->uiPointId, itr->fX, itr->fY, itr->fZ, itr->uiWaitTime);
|
||||
|
||||
@@ -804,12 +804,12 @@ void SmartAI::SetFollow(Unit* target, float dist, float angle, uint32 credit, ui
|
||||
return;
|
||||
SetRun(mRun);
|
||||
mFollowGuid = target->GetGUID();
|
||||
mFollowDist = dist ? dist : PET_FOLLOW_DIST;
|
||||
mFollowAngle = angle ? angle : me->GetFollowAngle();
|
||||
mFollowDist = dist >= 0.0f ? dist : PET_FOLLOW_DIST;
|
||||
mFollowAngle = angle >= 0.0f ? angle : me->GetFollowAngle();
|
||||
mFollowArrivedTimer = 1000;
|
||||
mFollowCredit = credit;
|
||||
mFollowArrivedEntry = end;
|
||||
me->GetMotionMaster()->MoveFollow(target, dist, angle);
|
||||
me->GetMotionMaster()->MoveFollow(target, mFollowDist, mFollowAngle);
|
||||
mFollowCreditType = creditType;
|
||||
}
|
||||
|
||||
|
||||
@@ -1925,7 +1925,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
||||
break;
|
||||
}
|
||||
default:
|
||||
sLog->outErrorDb("SmartScript::ProcessAction: Unhandled Action type %u", e.GetActionType());
|
||||
sLog->outErrorDb("SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -324,7 +324,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d, event type %u can not be used for Script type %u", e.entryOrGuid, e.GetEventType(), e.GetScriptType());
|
||||
return false;
|
||||
}
|
||||
if (e.action.type >= SMART_ACTION_END)
|
||||
if (e.action.type <= 0 || e.action.type >= SMART_ACTION_END)
|
||||
{
|
||||
sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d using event(%u) has invalid action type (%u), skipped.", e.entryOrGuid, e.event_id, e.GetActionType());
|
||||
return false;
|
||||
@@ -334,6 +334,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d using event(%u) has invalid phase mask (%u), skipped.", e.entryOrGuid, e.event_id, e.event.event_phase_mask);
|
||||
return false;
|
||||
}
|
||||
if (e.event.event_flags > SMART_EVENT_FLAGS_ALL)
|
||||
{
|
||||
sLog->outErrorDb("SmartAIMgr: EntryOrGuid %d using event(%u) has invalid event flags (%u), skipped.", e.entryOrGuid, e.event_id, e.event.event_flags);
|
||||
return false;
|
||||
}
|
||||
if (e.GetScriptType() == SMART_SCRIPT_TYPE_TIMED_ACTIONLIST)
|
||||
{
|
||||
e.event.type = SMART_EVENT_UPDATE_OOC;//force default OOC, can change when calling the script!
|
||||
|
||||
@@ -1175,7 +1175,8 @@ enum SmartEventFlags
|
||||
SMART_EVENT_FLAG_DEBUG_ONLY = 0x080, //Event only occurs in debug build
|
||||
SMART_EVENT_FLAG_DONT_RESET = 0x100, //Event will not reset in SmartScript::OnReset()
|
||||
|
||||
SMART_EVENT_FLAG_DIFFICULTY_ALL = (SMART_EVENT_FLAG_DIFFICULTY_0|SMART_EVENT_FLAG_DIFFICULTY_1|SMART_EVENT_FLAG_DIFFICULTY_2|SMART_EVENT_FLAG_DIFFICULTY_3)
|
||||
SMART_EVENT_FLAG_DIFFICULTY_ALL = (SMART_EVENT_FLAG_DIFFICULTY_0|SMART_EVENT_FLAG_DIFFICULTY_1|SMART_EVENT_FLAG_DIFFICULTY_2|SMART_EVENT_FLAG_DIFFICULTY_3),
|
||||
SMART_EVENT_FLAGS_ALL = (SMART_EVENT_FLAG_NOT_REPEATABLE|SMART_EVENT_FLAG_DIFFICULTY_ALL|SMART_EVENT_FLAG_RESERVED_5|SMART_EVENT_FLAG_RESERVED_6|SMART_EVENT_FLAG_DEBUG_ONLY|SMART_EVENT_FLAG_DONT_RESET)
|
||||
};
|
||||
|
||||
enum SmartCastFlags
|
||||
|
||||
@@ -267,7 +267,7 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result)
|
||||
if (Empty() || !captainPresentInTeam)
|
||||
{
|
||||
// Arena team is empty or captain is not in team, delete from db
|
||||
sLog->outErrorDb("ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", TeamId);
|
||||
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", TeamId);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -550,7 +550,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
|
||||
|
||||
if (dist >= maxDist)
|
||||
{
|
||||
sLog->outError("BATTLEGROUND: Sending %s back to start location (possible exploit)", plr->GetName());
|
||||
sLog->outError("BATTLEGROUND: Sending %s back to start location (map: %u) (possible exploit)", plr->GetName(), GetMapId());
|
||||
plr->TeleportTo(GetMapId(), x, y, z, o);
|
||||
}
|
||||
}
|
||||
@@ -850,9 +850,12 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
if (team == winner)
|
||||
{
|
||||
// update achievement BEFORE personal rating update
|
||||
ArenaTeamMember* member = winner_arena_team->GetMember(player->GetGUID());
|
||||
if (member)
|
||||
player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, 1);
|
||||
if (ArenaTeamMember* member = winner_arena_team->GetMember(player->GetGUID()))
|
||||
{
|
||||
uint32 rating = player->GetArenaPersonalRating(winner_arena_team->GetSlot());
|
||||
player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA,
|
||||
rating ? rating : 1);
|
||||
}
|
||||
|
||||
winner_arena_team->MemberWon(player, loser_matchmaker_rating, winner_matchmaker_change);
|
||||
}
|
||||
|
||||
@@ -290,7 +290,7 @@ int32 BattlegroundAB::_GetNodeNameId(uint8 node)
|
||||
case BG_AB_NODE_LUMBER_MILL:return LANG_BG_AB_NODE_LUMBER_MILL;
|
||||
case BG_AB_NODE_GOLD_MINE: return LANG_BG_AB_NODE_GOLD_MINE;
|
||||
default:
|
||||
ASSERT(0);
|
||||
ASSERT(false);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -720,8 +720,13 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source)
|
||||
|
||||
DelCreature(BG_SA_MAXNPC + i);
|
||||
GraveyardStatus[i] = Source->GetTeamId();
|
||||
WorldSafeLocsEntry const* sg = NULL;
|
||||
sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]);
|
||||
WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]);
|
||||
if (!sg)
|
||||
{
|
||||
sLog->outError("BattlegroundSA::CaptureGraveyard: non-existant GY entry: %u", BG_SA_GYEntries[i]);
|
||||
return;
|
||||
}
|
||||
|
||||
AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], (GraveyardStatus[i] == TEAM_ALLIANCE? ALLIANCE : HORDE));
|
||||
uint32 npc = 0;
|
||||
uint32 flag = 0;
|
||||
@@ -781,7 +786,7 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source)
|
||||
SendWarningToAll(LANG_BG_SA_H_GY_SOUTH);
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
ASSERT(false);
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -95,9 +95,9 @@ CalendarEventIdList const& CalendarMgr::GetPlayerEvents(uint64 guid)
|
||||
|
||||
CalendarInvite* CalendarMgr::GetInvite(uint64 inviteId)
|
||||
{
|
||||
CalendarInviteMap::iterator it = _invites.find(inviteId);
|
||||
if (it != _invites.end())
|
||||
return &(it->second);
|
||||
CalendarInviteMap::iterator itr = _invites.find(inviteId);
|
||||
if (itr != _invites.end())
|
||||
return &(itr->second);
|
||||
|
||||
sLog->outError("CalendarMgr::GetInvite: [" UI64FMTD "] not found!", inviteId);
|
||||
return NULL;
|
||||
@@ -105,9 +105,9 @@ CalendarInvite* CalendarMgr::GetInvite(uint64 inviteId)
|
||||
|
||||
CalendarEvent* CalendarMgr::GetEvent(uint64 eventId)
|
||||
{
|
||||
CalendarEventMap::iterator it = _events.find(eventId);
|
||||
if (it != _events.end())
|
||||
return &(it->second);
|
||||
CalendarEventMap::iterator itr = _events.find(eventId);
|
||||
if (itr != _events.end())
|
||||
return &(itr->second);
|
||||
|
||||
sLog->outError("CalendarMgr::GetEvent: [" UI64FMTD "] not found!", eventId);
|
||||
return NULL;
|
||||
@@ -316,11 +316,6 @@ void CalendarMgr::AddAction(CalendarAction const& action)
|
||||
if (!calendarEvent)
|
||||
return;
|
||||
|
||||
CalendarInviteIdList const& inviteIds = calendarEvent->GetInviteIdList();
|
||||
for (CalendarInviteIdList::const_iterator it = inviteIds.begin(); it != inviteIds.end(); ++it)
|
||||
if (uint64 invitee = RemoveInvite(*it))
|
||||
SendCalendarEventRemovedAlert(invitee, *calendarEvent);
|
||||
|
||||
RemoveEvent(eventId);
|
||||
break;
|
||||
}
|
||||
@@ -464,8 +459,6 @@ bool CalendarMgr::RemoveEvent(uint64 eventId)
|
||||
return false;
|
||||
}
|
||||
|
||||
_events.erase(itr);
|
||||
|
||||
bool val = true;
|
||||
|
||||
CalendarInviteIdList const& invites = itr->second.GetInviteIdList();
|
||||
@@ -474,8 +467,13 @@ bool CalendarMgr::RemoveEvent(uint64 eventId)
|
||||
CalendarInvite* invite = GetInvite(*itrInvites);
|
||||
if (!invite || !RemovePlayerEvent(invite->GetInvitee(), eventId))
|
||||
val = false;
|
||||
|
||||
if (uint64 invitee = RemoveInvite(*itrInvites))
|
||||
SendCalendarEventRemovedAlert(invitee, itr->second);
|
||||
}
|
||||
|
||||
_events.erase(itr);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
@@ -535,6 +535,7 @@ void ThreatManager::processThreatEvent(ThreatRefStatusChangeEvent* threatRefStat
|
||||
setCurrentVictim(NULL);
|
||||
setDirty(true);
|
||||
}
|
||||
iOwner->SendRemoveFromThreatListOpcode(hostilRef);
|
||||
iThreatContainer.remove(hostilRef);
|
||||
iThreatOfflineContainer.addReference(hostilRef);
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
|
||||
}
|
||||
case CONDITION_OBJECT_ENTRY:
|
||||
{
|
||||
if (object->GetTypeId() == ConditionValue1)
|
||||
if (uint32(object->GetTypeId()) == ConditionValue1)
|
||||
condMeets = (!ConditionValue2) || (object->GetEntry() == ConditionValue2);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -245,7 +245,7 @@ enum AreaFlags
|
||||
AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?)
|
||||
AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
|
||||
AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled)
|
||||
AREA_FLAG_NEED_FLY = 0x00001000, // Unknown
|
||||
AREA_FLAG_NEED_FLY = 0x00001000, // Respawn alive at the graveyard without corpse
|
||||
AREA_FLAG_UNUSED1 = 0x00002000, // Unused in 3.3.5a
|
||||
AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
|
||||
AREA_FLAG_OUTDOOR_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area)
|
||||
@@ -260,7 +260,7 @@ enum AreaFlags
|
||||
AREA_FLAG_WINTERGRASP = 0x01000000, // Wintergrasp and it's subzones
|
||||
AREA_FLAG_INSIDE = 0x02000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors
|
||||
AREA_FLAG_OUTSIDE = 0x04000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors
|
||||
AREA_FLAG_WINTERGRASP_2 = 0x08000000, // Same as AREA_FLAG_WINTERGRASP except for The Sunken Ring and Western Bridge.
|
||||
AREA_FLAG_WINTERGRASP_2 = 0x08000000, // Can Hearth And Resurrect From Area
|
||||
AREA_FLAG_NO_FLY_ZONE = 0x20000000 // Marks zones where you cannot fly
|
||||
};
|
||||
|
||||
|
||||
@@ -468,9 +468,9 @@ void Creature::Update(uint32 diff)
|
||||
|
||||
switch (m_deathState)
|
||||
{
|
||||
case JUST_ALIVED:
|
||||
// Must not be called, see Creature::setDeathState JUST_ALIVED -> ALIVE promoting.
|
||||
sLog->outError("Creature (GUID: %u Entry: %u) in wrong state: JUST_ALIVED (4)", GetGUIDLow(), GetEntry());
|
||||
case JUST_RESPAWNED:
|
||||
// Must not be called, see Creature::setDeathState JUST_RESPAWNED -> ALIVE promoting.
|
||||
sLog->outError("Creature (GUID: %u Entry: %u) in wrong state: JUST_RESPAWNED (4)", GetGUIDLow(), GetEntry());
|
||||
break;
|
||||
case JUST_DIED:
|
||||
// Must not be called, see Creature::setDeathState JUST_DIED -> CORPSE promoting.
|
||||
@@ -1555,7 +1555,7 @@ void Creature::setDeathState(DeathState s)
|
||||
|
||||
Unit::setDeathState(CORPSE);
|
||||
}
|
||||
else if (s == JUST_ALIVED)
|
||||
else if (s == JUST_RESPAWNED)
|
||||
{
|
||||
//if (isPet())
|
||||
// setActive(true);
|
||||
@@ -1611,7 +1611,7 @@ void Creature::Respawn(bool force)
|
||||
CreatureTemplate const* cinfo = GetCreatureTemplate();
|
||||
SelectLevel(cinfo);
|
||||
|
||||
setDeathState(JUST_ALIVED);
|
||||
setDeathState(JUST_RESPAWNED);
|
||||
|
||||
uint32 displayID = GetNativeDisplayId();
|
||||
CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelRandomGender(&displayID);
|
||||
@@ -1668,8 +1668,8 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo)
|
||||
if (!spellInfo)
|
||||
return false;
|
||||
|
||||
// Spells that don't have effectMechanics.
|
||||
if (!spellInfo->HasAnyEffectMechanic() && GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
|
||||
// Creature is immune to main mechanic of the spell
|
||||
if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
|
||||
return true;
|
||||
|
||||
// This check must be done instead of 'if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))' for not break
|
||||
|
||||
@@ -1910,6 +1910,7 @@ void GameObject::SetLootState(LootState state, Unit* unit)
|
||||
{
|
||||
m_lootState = state;
|
||||
AI()->OnStateChanged(state, unit);
|
||||
sScriptMgr->OnGameObjectLootStateChanged(this, state, unit);
|
||||
if (m_model)
|
||||
{
|
||||
// startOpen determines whether we are going to add or remove the LoS on activation
|
||||
@@ -1929,6 +1930,7 @@ void GameObject::SetLootState(LootState state, Unit* unit)
|
||||
void GameObject::SetGoState(GOState state)
|
||||
{
|
||||
SetByteValue(GAMEOBJECT_BYTES_1, 0, state);
|
||||
sScriptMgr->OnGameObjectStateChanged(this, state);
|
||||
if (m_model)
|
||||
{
|
||||
if (!IsInWorld())
|
||||
|
||||
@@ -10157,7 +10157,8 @@ uint32 Player::GetItemCount(uint32 item, bool inBankAlso, Item* skipItem) const
|
||||
|
||||
if (inBankAlso)
|
||||
{
|
||||
for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i)
|
||||
// checking every item from 39 to 74 (including bank bags)
|
||||
for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
if (pItem != skipItem && pItem->GetEntry() == item)
|
||||
count += pItem->GetCount();
|
||||
@@ -10197,7 +10198,7 @@ uint32 Player::GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipIte
|
||||
if (Bag* pBag = GetBagByPos(i))
|
||||
count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
|
||||
|
||||
for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i)
|
||||
for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
if (pItem != skipItem)
|
||||
if (ItemTemplate const* pProto = pItem->GetTemplate())
|
||||
@@ -10223,7 +10224,7 @@ Item* Player::GetItemByGuid(uint64 guid) const
|
||||
if (pItem->GetGUID() == guid)
|
||||
return pItem;
|
||||
|
||||
for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i)
|
||||
for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
|
||||
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||
if (pItem->GetGUID() == guid)
|
||||
return pItem;
|
||||
@@ -12019,7 +12020,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje
|
||||
Map const* map = lootedObject->GetMap();
|
||||
if (uint32 dungeonId = sLFGMgr->GetDungeon(GetGroup()->GetGUID(), true))
|
||||
if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
|
||||
if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty())
|
||||
if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == uint32(map->GetDifficulty()))
|
||||
lootedObjectInDungeon = true;
|
||||
|
||||
if (!lootedObjectInDungeon)
|
||||
@@ -12180,11 +12181,6 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update
|
||||
pItem->SetItemRandomProperties(randomPropertyId);
|
||||
pItem = StoreItem(dest, pItem, update);
|
||||
|
||||
const ItemTemplate* proto = pItem->GetTemplate();
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
|
||||
CastSpell(this, proto->Spells[i].SpellId, true, pItem);
|
||||
|
||||
if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound())
|
||||
{
|
||||
pItem->SetSoulboundTradeable(allowedLooters);
|
||||
@@ -12290,6 +12286,14 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool
|
||||
AddEnchantmentDurations(pItem);
|
||||
AddItemDurations(pItem);
|
||||
|
||||
|
||||
const ItemTemplate* proto = pItem->GetTemplate();
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
|
||||
if (bag == INVENTORY_SLOT_BAG_0 || (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END))
|
||||
if (!HasAura(proto->Spells[i].SpellId))
|
||||
CastSpell(this, proto->Spells[i].SpellId, true, pItem);
|
||||
|
||||
return pItem;
|
||||
}
|
||||
else
|
||||
@@ -12326,6 +12330,13 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool
|
||||
|
||||
pItem2->SetState(ITEM_CHANGED, this);
|
||||
|
||||
const ItemTemplate* proto = pItem2->GetTemplate();
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
|
||||
if (bag == INVENTORY_SLOT_BAG_0 || (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END))
|
||||
if (!HasAura(proto->Spells[i].SpellId))
|
||||
CastSpell(this, proto->Spells[i].SpellId, true, pItem2);
|
||||
|
||||
return pItem2;
|
||||
}
|
||||
}
|
||||
@@ -17658,7 +17669,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff)
|
||||
}
|
||||
else
|
||||
if (IsBagPos(item->GetPos()))
|
||||
if (Bag* pBag = item->ToBag())
|
||||
if (item->IsBag())
|
||||
invalidBagMap[item->GetGUIDLow()] = item;
|
||||
}
|
||||
else
|
||||
@@ -17811,7 +17822,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F
|
||||
GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
|
||||
for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
|
||||
{
|
||||
if (events[*itr].holiday_id == proto->HolidayId)
|
||||
if (uint32(events[*itr].holiday_id) == proto->HolidayId)
|
||||
{
|
||||
remove = false;
|
||||
break;
|
||||
|
||||
@@ -954,7 +954,7 @@ uint32 Unit::SpellNonMeleeDamageLog(Unit* victim, uint32 spellID, uint32 damage)
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
|
||||
SpellNonMeleeDamage damageInfo(this, victim, spellInfo->Id, spellInfo->SchoolMask);
|
||||
damage = SpellDamageBonusDone(victim, spellInfo, damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = victim->SpellDamageBonusTaken(spellInfo, damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = victim->SpellDamageBonusTaken(this, spellInfo, damage, SPELL_DIRECT_DAMAGE);
|
||||
|
||||
CalculateSpellDamageTaken(&damageInfo, damage, spellInfo);
|
||||
DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb);
|
||||
@@ -1151,7 +1151,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam
|
||||
damage += CalculateDamage(damageInfo->attackType, false, true);
|
||||
// Add melee damage bonus
|
||||
damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType);
|
||||
damage = MeleeDamageBonusTaken(damage, damageInfo->attackType);
|
||||
damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType);
|
||||
|
||||
// Calculate armor reduction
|
||||
if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damageSchoolMask)))
|
||||
@@ -1405,7 +1405,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
|
||||
if (Unit* caster = (*dmgShieldItr)->GetCaster())
|
||||
{
|
||||
damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = this->SpellDamageBonusTaken(i_spellProto, damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
|
||||
}
|
||||
|
||||
// No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that
|
||||
@@ -5789,7 +5789,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
|
||||
if (AuraEffect* aurEff = victim->GetAuraEffect(64413, 0, GetGUID()))
|
||||
{
|
||||
// The shield can grow to a maximum size of 20, 000 damage absorbtion
|
||||
aurEff->SetAmount(std::max<int32>(aurEff->GetAmount() + basepoints0, 20000));
|
||||
aurEff->SetAmount(std::min<int32>(aurEff->GetAmount() + basepoints0, 20000));
|
||||
|
||||
// Refresh and return to prevent replacing the aura
|
||||
aurEff->GetBase()->RefreshDuration();
|
||||
@@ -7285,30 +7285,16 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
|
||||
if (procSpell->SpellIconID != 2019)
|
||||
return false;
|
||||
|
||||
AuraEffect* aurEffA = NULL;
|
||||
AuraEffectList const& auras = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE);
|
||||
for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
|
||||
if (Creature* totem = GetMap()->GetCreature(m_SummonSlot[1])) // Fire totem summon slot
|
||||
{
|
||||
SpellInfo const* spell = (*i)->GetSpellInfo();
|
||||
if (spell->SpellFamilyName == uint32(SPELLFAMILY_SHAMAN) && spell->SpellFamilyFlags.HasFlag(0, 0x02000000, 0))
|
||||
if (SpellInfo const* totemSpell = sSpellMgr->GetSpellInfo(totem->m_spells[0]))
|
||||
{
|
||||
if ((*i)->GetCasterGUID() != GetGUID())
|
||||
continue;
|
||||
if (spell->Id == 63283)
|
||||
continue;
|
||||
aurEffA = (*i);
|
||||
break;
|
||||
int32 bp0 = CalculatePctN(totemSpell->Effects[EFFECT_0].CalcValue(), triggerAmount);
|
||||
int32 bp1 = CalculatePctN(totemSpell->Effects[EFFECT_1].CalcValue(), triggerAmount);
|
||||
CastCustomSpell(this, 63283, &bp0, &bp1, NULL, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (aurEffA)
|
||||
{
|
||||
int32 bp0 = 0, bp1 = 0;
|
||||
bp0 = CalculatePctN(triggerAmount, aurEffA->GetAmount());
|
||||
if (AuraEffect* aurEffB = aurEffA->GetBase()->GetEffect(EFFECT_1))
|
||||
bp1 = CalculatePctN(triggerAmount, aurEffB->GetAmount());
|
||||
CastCustomSpell(this, 63283, &bp0, &bp1, NULL, true, NULL, triggeredByAura);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
@@ -7705,17 +7691,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
|
||||
}
|
||||
}
|
||||
}
|
||||
// Item - Death Knight T10 Melee 4P Bonus
|
||||
if (dummySpell->Id == 70656)
|
||||
{
|
||||
Player* player = ToPlayer();
|
||||
if (!player)
|
||||
return false;
|
||||
|
||||
for (uint32 i = 0; i < MAX_RUNES; ++i)
|
||||
if (player->GetRuneCooldown(i) == 0)
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_POTION:
|
||||
@@ -7983,7 +7958,7 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp
|
||||
*handled = true;
|
||||
if (victim && victim->HasAura(53601))
|
||||
{
|
||||
int32 bp0 = CalculatePctN(int32(damage / 12), dummySpell->Effects[EFFECT_2]. CalcValue());
|
||||
int32 bp0 = CalculatePctN(int32(damage / 12), dummySpell->Effects[EFFECT_2].CalcValue());
|
||||
// Item - Paladin T9 Holy 4P Bonus
|
||||
if (AuraEffect const* aurEff = GetAuraEffect(67191, 0))
|
||||
AddPctN(bp0, aurEff->GetAmount());
|
||||
@@ -8643,6 +8618,16 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
|
||||
trigger_spell_id = 50475;
|
||||
basepoints0 = CalculatePctN(int32(damage), triggerAmount);
|
||||
}
|
||||
// Item - Death Knight T10 Melee 4P Bonus
|
||||
else if (auraSpellInfo->Id == 70656)
|
||||
{
|
||||
if (GetTypeId() != TYPEID_PLAYER || getClass() != CLASS_DEATH_KNIGHT)
|
||||
return false;
|
||||
|
||||
for (uint8 i = 0; i < MAX_RUNES; ++i)
|
||||
if (ToPlayer()->GetRuneCooldown(i) == 0)
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_ROGUE:
|
||||
@@ -10125,7 +10110,7 @@ Unit* Unit::GetFirstControlled() const
|
||||
// Sequence: charmed, pet, other guardians
|
||||
Unit* unit = GetCharm();
|
||||
if (!unit)
|
||||
if (uint64 guid = GetUInt64Value(UNIT_FIELD_SUMMON))
|
||||
if (uint64 guid = GetMinionGUID())
|
||||
unit = ObjectAccessor::GetUnit(*this, guid);
|
||||
|
||||
return unit;
|
||||
@@ -10326,20 +10311,24 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (GetTypeId() == TYPEID_UNIT && !ToCreature()->isPet())
|
||||
DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
|
||||
|
||||
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
|
||||
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
|
||||
// Some spells don't benefit from pct done mods
|
||||
if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS) && !spellProto->IsRankOf(sSpellMgr->GetSpellInfo(12162)))
|
||||
{
|
||||
if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1) //prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
|
||||
continue;
|
||||
|
||||
if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
|
||||
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
|
||||
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
|
||||
{
|
||||
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1) //prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
|
||||
continue;
|
||||
|
||||
if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
|
||||
{
|
||||
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10519,7 +10508,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_PRIEST:
|
||||
// Mind Flay
|
||||
if (spellProto->SpellFamilyFlags[0] & 0x800000)
|
||||
@@ -10552,7 +10541,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))
|
||||
AddPctN(DoneTotalMod, aurEff->GetAmount());
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_PALADIN:
|
||||
// Judgement of Vengeance/Judgement of Corruption
|
||||
if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
|
||||
@@ -10570,7 +10559,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (stacks)
|
||||
AddPctU(DoneTotalMod, 10 * stacks);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_DRUID:
|
||||
// Thorns
|
||||
if (spellProto->SpellFamilyFlags[0] & 0x100)
|
||||
@@ -10579,7 +10568,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
|
||||
AddPctN(DoneTotalMod, aurEff->GetAmount());
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_WARLOCK:
|
||||
// Fire and Brimstone
|
||||
if (spellProto->SpellFamilyFlags[1] & 0x00020040)
|
||||
@@ -10601,14 +10590,14 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (spellProto->SpellFamilyFlags[1] & 0x00400000 && isPet())
|
||||
if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
|
||||
AddPctN(DoneTotalMod, 15 * count);
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_HUNTER:
|
||||
// Steady Shot
|
||||
if (spellProto->SpellFamilyFlags[1] & 0x1)
|
||||
if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
|
||||
if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
|
||||
AddPctN(DoneTotalMod, aurEff->GetAmount());
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_DEATHKNIGHT:
|
||||
// Improved Icy Touch
|
||||
if (spellProto->SpellFamilyFlags[0] & 0x2)
|
||||
@@ -10649,7 +10638,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
// Done fixed damage bonus auras
|
||||
@@ -10670,7 +10659,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (bonus->ap_dot_bonus > 0)
|
||||
{
|
||||
WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
|
||||
float APbonus = (float) victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
|
||||
float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS));
|
||||
APbonus += GetTotalAttackPowerValue(attType);
|
||||
DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
|
||||
}
|
||||
@@ -10681,7 +10670,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
if (bonus->ap_bonus > 0)
|
||||
{
|
||||
WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
|
||||
float APbonus = (float) victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
|
||||
float APbonus = float(victim->GetTotalAuraModifier(attType == BASE_ATTACK ? SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS : SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS));
|
||||
APbonus += GetTotalAttackPowerValue(attType);
|
||||
DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
|
||||
}
|
||||
@@ -10711,12 +10700,6 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
DoneTotalMod = 1.0f;
|
||||
}
|
||||
|
||||
// Some spells don't benefit from pct done mods
|
||||
// maybe should be implemented like SPELL_ATTR3_NO_DONE_BONUS,
|
||||
// but then it may break spell power coeffs work on spell 31117
|
||||
if (spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS)
|
||||
DoneTotalMod = 1.0f;
|
||||
|
||||
float tmpDamage = (int32(pdamage) + DoneTotal) * DoneTotalMod;
|
||||
// apply spellmod to Done damage (flat and pct)
|
||||
if (Player* modOwner = GetSpellModOwner())
|
||||
@@ -10725,7 +10708,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
|
||||
return uint32(std::max(tmpDamage, 0.0f));
|
||||
}
|
||||
|
||||
uint32 Unit::SpellDamageBonusTaken(SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack)
|
||||
uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack)
|
||||
{
|
||||
if (!spellProto || damagetype == DIRECT_DAMAGE)
|
||||
return pdamage;
|
||||
@@ -10733,11 +10716,11 @@ uint32 Unit::SpellDamageBonusTaken(SpellInfo const* spellProto, uint32 pdamage,
|
||||
int32 TakenTotal = 0;
|
||||
float TakenTotalMod = 1.0f;
|
||||
|
||||
//from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
|
||||
//multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
|
||||
// from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
|
||||
// multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
|
||||
TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask());
|
||||
|
||||
//.. taken pct: dummy auras
|
||||
//.. taken pct: dummy auras
|
||||
AuraEffectList const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
|
||||
for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
|
||||
{
|
||||
@@ -10759,7 +10742,7 @@ uint32 Unit::SpellDamageBonusTaken(SpellInfo const* spellProto, uint32 pdamage,
|
||||
// From caster spells
|
||||
AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER);
|
||||
for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
|
||||
if ((*i)->GetCasterGUID() == GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
|
||||
if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
|
||||
AddPctN(TakenTotalMod, (*i)->GetAmount());
|
||||
|
||||
// Mod damage from spell mechanic
|
||||
@@ -10796,7 +10779,7 @@ uint32 Unit::SpellDamageBonusTaken(SpellInfo const* spellProto, uint32 pdamage,
|
||||
TakenTotal+= int32(TakenAdvertisedBenefit * coeff * factorMod);
|
||||
}
|
||||
|
||||
float tmpDamage = (pdamage + TakenTotal) * TakenTotalMod;
|
||||
float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
|
||||
|
||||
return uint32(std::max(tmpDamage, 0.0f));
|
||||
}
|
||||
@@ -10837,7 +10820,7 @@ int32 Unit::SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
|
||||
DoneAdvertisedBenefit += int32(CalculatePctN(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
|
||||
|
||||
}
|
||||
return DoneAdvertisedBenefit > 0 ? DoneAdvertisedBenefit : 0;
|
||||
return DoneAdvertisedBenefit;
|
||||
}
|
||||
|
||||
int32 Unit::SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask)
|
||||
@@ -10849,7 +10832,7 @@ int32 Unit::SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask)
|
||||
if (((*i)->GetMiscValue() & schoolMask) != 0)
|
||||
TakenAdvertisedBenefit += (*i)->GetAmount();
|
||||
|
||||
return TakenAdvertisedBenefit > 0 ? TakenAdvertisedBenefit : 0;
|
||||
return TakenAdvertisedBenefit;
|
||||
}
|
||||
|
||||
bool Unit::isSpellCrit(Unit* victim, SpellInfo const* spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType) const
|
||||
@@ -11116,16 +11099,16 @@ uint32 Unit::SpellCriticalHealingBonus(SpellInfo const* spellProto, uint32 damag
|
||||
uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack)
|
||||
{
|
||||
// For totems get healing bonus from owner (statue isn't totem in fact)
|
||||
if (GetTypeId() == TYPEID_UNIT && ToCreature()->isTotem())
|
||||
if (GetTypeId() == TYPEID_UNIT && isTotem())
|
||||
if (Unit* owner = GetOwner())
|
||||
return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, stack);
|
||||
|
||||
// no bonus for heal potions/bandages
|
||||
// No bonus healing for potion spells
|
||||
if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
|
||||
return healamount;
|
||||
|
||||
float DoneTotalMod = 1.0f;
|
||||
int32 DoneTotal = 0;
|
||||
float DoneTotalMod = 1.0f;
|
||||
int32 DoneTotal = 0;
|
||||
|
||||
// Healing done percent
|
||||
AuraEffectList const& mHealingDonePct = GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
|
||||
@@ -11189,7 +11172,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
||||
}
|
||||
|
||||
// Done fixed damage bonus auras
|
||||
int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
|
||||
int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
|
||||
|
||||
// Check for table values
|
||||
SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
|
||||
@@ -11202,16 +11185,22 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
||||
coeff = bonus->dot_damage;
|
||||
if (bonus->ap_dot_bonus > 0)
|
||||
DoneTotal += int32(bonus->ap_dot_bonus * stack * GetTotalAttackPowerValue(
|
||||
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE)? RANGED_ATTACK : BASE_ATTACK));
|
||||
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
|
||||
}
|
||||
else
|
||||
{
|
||||
coeff = bonus->direct_damage;
|
||||
if (bonus->ap_bonus > 0)
|
||||
DoneTotal += int32(bonus->ap_bonus * stack * GetTotalAttackPowerValue(
|
||||
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE)? RANGED_ATTACK : BASE_ATTACK));
|
||||
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
|
||||
if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
|
||||
return healamount;
|
||||
}
|
||||
|
||||
// Default calculation
|
||||
if (DoneAdvertisedBenefit)
|
||||
@@ -11228,23 +11217,21 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
||||
coeff /= 100.0f;
|
||||
}
|
||||
|
||||
// Gift of the Naaru
|
||||
if (spellProto->SpellFamilyFlags[2] & 0x80000000 && spellProto->SpellIconID == 329)
|
||||
{
|
||||
int32 apBonus = int32(std::max(GetTotalAttackPowerValue(BASE_ATTACK), GetTotalAttackPowerValue(RANGED_ATTACK)));
|
||||
if (apBonus > DoneAdvertisedBenefit)
|
||||
DoneTotal += int32(apBonus * 0.22f); // 22% of AP per tick
|
||||
else
|
||||
DoneTotal += int32(DoneAdvertisedBenefit * 0.377f); // 37.7% of BH per tick
|
||||
}
|
||||
else
|
||||
{
|
||||
// Earthliving - 0.45% of normal hot coeff
|
||||
if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000)
|
||||
// Earthliving - 0.45% of normal hot coeff
|
||||
if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000)
|
||||
factorMod *= 0.45f;
|
||||
|
||||
DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
|
||||
}
|
||||
DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
|
||||
}
|
||||
|
||||
// Gift of the Naaru
|
||||
if (spellProto->SpellFamilyFlags[2] & 0x80000000 && spellProto->SpellIconID == 329)
|
||||
{
|
||||
int32 apBonus = int32(std::max(GetTotalAttackPowerValue(BASE_ATTACK), GetTotalAttackPowerValue(RANGED_ATTACK)));
|
||||
if (apBonus > DoneAdvertisedBenefit)
|
||||
DoneTotal += int32(apBonus * 0.22f); // 22% of AP per tick
|
||||
else
|
||||
DoneTotal += int32(DoneAdvertisedBenefit * 0.377f); // 37.7% of BH per tick
|
||||
}
|
||||
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
@@ -11258,11 +11245,11 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
||||
break;
|
||||
}
|
||||
if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
|
||||
DoneTotal = 0;
|
||||
DoneTotal = 0;
|
||||
}
|
||||
|
||||
// use float as more appropriate for negative values and percent applying
|
||||
float heal = (int32(healamount) + DoneTotal) * DoneTotalMod;
|
||||
float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
|
||||
// apply spellmod to Done amount
|
||||
if (Player* modOwner = GetSpellModOwner())
|
||||
modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
|
||||
@@ -11270,16 +11257,16 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
||||
return uint32(std::max(heal, 0.0f));
|
||||
}
|
||||
|
||||
uint32 Unit::SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack)
|
||||
uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack)
|
||||
{
|
||||
float TakenTotalMod = 1.0f;
|
||||
float TakenTotalMod = 1.0f;
|
||||
|
||||
// Healing taken percent
|
||||
float minval = (float)GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT);
|
||||
float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT));
|
||||
if (minval)
|
||||
AddPctF(TakenTotalMod, minval);
|
||||
|
||||
float maxval = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT);
|
||||
float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT));
|
||||
if (maxval)
|
||||
AddPctF(TakenTotalMod, maxval);
|
||||
|
||||
@@ -11288,7 +11275,7 @@ uint32 Unit::SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamou
|
||||
AddPctN(TakenTotalMod, Tenacity->GetAmount());
|
||||
|
||||
// Healing Done
|
||||
int32 TakenTotal = 0;
|
||||
int32 TakenTotal = 0;
|
||||
|
||||
// Taken fixed damage bonus auras
|
||||
int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
|
||||
@@ -11305,11 +11292,11 @@ uint32 Unit::SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamou
|
||||
if (damagetype == DOT)
|
||||
{
|
||||
// Healing over time taken percent
|
||||
float minval_hot = (float)GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT);
|
||||
float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
|
||||
if (minval_hot)
|
||||
AddPctF(TakenTotalMod, minval_hot);
|
||||
|
||||
float maxval_hot = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT);
|
||||
float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
|
||||
if (maxval_hot)
|
||||
AddPctF(TakenTotalMod, maxval_hot);
|
||||
}
|
||||
@@ -11320,6 +11307,15 @@ uint32 Unit::SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamou
|
||||
float factorMod = 1.0f;
|
||||
if (bonus)
|
||||
coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
|
||||
else
|
||||
{
|
||||
// No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
|
||||
if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
|
||||
{
|
||||
healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
|
||||
return healamount;
|
||||
}
|
||||
}
|
||||
|
||||
// Default calculation
|
||||
if (TakenAdvertisedBenefit)
|
||||
@@ -11344,7 +11340,7 @@ uint32 Unit::SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamou
|
||||
|
||||
AuraEffectList const& mHealingGet= GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_RECEIVED);
|
||||
for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
|
||||
if (GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
|
||||
if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
|
||||
AddPctN(TakenTotalMod, (*i)->GetAmount());
|
||||
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
@@ -11358,10 +11354,10 @@ uint32 Unit::SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamou
|
||||
break;
|
||||
}
|
||||
if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
|
||||
TakenTotal = 0;
|
||||
TakenTotal = 0;
|
||||
}
|
||||
|
||||
float heal = (int32(healamount) + TakenTotal) * TakenTotalMod;
|
||||
float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
|
||||
|
||||
return uint32(std::max(heal, 0.0f));
|
||||
}
|
||||
@@ -11434,7 +11430,7 @@ bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo)
|
||||
return false;
|
||||
|
||||
uint32 shoolMask = spellInfo->GetSchoolMask();
|
||||
if (spellInfo->Id != 42292 && spellInfo->Id !=59752)
|
||||
if (spellInfo->Id != 42292 && spellInfo->Id != 59752)
|
||||
{
|
||||
// If m_immuneToSchool type contain this school type, IMMUNE damage.
|
||||
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
||||
@@ -11475,7 +11471,7 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo)
|
||||
}
|
||||
|
||||
// Spells that don't have effectMechanics.
|
||||
if (!spellInfo->HasAnyEffectMechanic() && spellInfo->Mechanic)
|
||||
if (spellInfo->Mechanic)
|
||||
{
|
||||
SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
|
||||
for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
|
||||
@@ -11488,16 +11484,17 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo)
|
||||
{
|
||||
// State/effect immunities applied by aura expect full spell immunity
|
||||
// Ignore effects with mechanic, they are supposed to be checked separately
|
||||
if (spellInfo->Effects[i].Mechanic || !IsImmunedToSpellEffect(spellInfo, i))
|
||||
if (!IsImmunedToSpellEffect(spellInfo, i))
|
||||
{
|
||||
immuneToAllEffects = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
|
||||
return true;
|
||||
|
||||
if (spellInfo->Id != 42292 && spellInfo->Id !=59752)
|
||||
if (spellInfo->Id != 42292 && spellInfo->Id != 59752)
|
||||
{
|
||||
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
|
||||
for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
|
||||
@@ -11515,8 +11512,9 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo)
|
||||
|
||||
bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const
|
||||
{
|
||||
if (!spellInfo)
|
||||
if (!spellInfo || !spellInfo->Effects[index].IsEffect())
|
||||
return false;
|
||||
|
||||
// If m_immuneToEffect type contain this effect type, IMMUNE effect.
|
||||
uint32 effect = spellInfo->Effects[index].Effect;
|
||||
SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
|
||||
@@ -11552,10 +11550,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons
|
||||
|
||||
uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto)
|
||||
{
|
||||
if (!victim)
|
||||
return 0;
|
||||
|
||||
if (pdamage == 0)
|
||||
if (!victim || pdamage == 0)
|
||||
return 0;
|
||||
|
||||
uint32 creatureTypeMask = victim->GetCreatureTypeMask();
|
||||
@@ -11612,23 +11607,24 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType
|
||||
// Done total percent damage auras
|
||||
float DoneTotalMod = 1.0f;
|
||||
|
||||
// ..done
|
||||
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
|
||||
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
|
||||
{
|
||||
if (spellProto)
|
||||
// Some spells don't benefit from pct done mods
|
||||
if (spellProto)
|
||||
if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS) && !spellProto->IsRankOf(sSpellMgr->GetSpellInfo(12162)))
|
||||
{
|
||||
if ((*i)->GetMiscValue() & spellProto->GetSchoolMask() && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL))
|
||||
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
|
||||
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
|
||||
{
|
||||
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
if ((*i)->GetMiscValue() & spellProto->GetSchoolMask() && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_NORMAL))
|
||||
{
|
||||
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
|
||||
AddPctN(DoneTotalMod, (*i)->GetAmount());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AuraEffectList const& mDamageDoneVersus = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS);
|
||||
for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
|
||||
@@ -11727,7 +11723,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType
|
||||
return uint32(std::max(tmpDamage, 0.0f));
|
||||
}
|
||||
|
||||
uint32 Unit::MeleeDamageBonusTaken(uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto)
|
||||
uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto)
|
||||
{
|
||||
if (pdamage == 0)
|
||||
return 0;
|
||||
@@ -11751,15 +11747,15 @@ uint32 Unit::MeleeDamageBonusTaken(uint32 pdamage, WeaponAttackType attType, Spe
|
||||
// ..taken
|
||||
TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetMeleeDamageSchoolMask());
|
||||
|
||||
// From caster spells
|
||||
AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER);
|
||||
for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
|
||||
if ((*i)->GetCasterGUID() == GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
|
||||
AddPctN(TakenTotalMod, (*i)->GetAmount());
|
||||
|
||||
// .. taken pct (special attacks)
|
||||
if (spellProto)
|
||||
{
|
||||
// From caster spells
|
||||
AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER);
|
||||
for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
|
||||
if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
|
||||
AddPctN(TakenTotalMod, (*i)->GetAmount());
|
||||
|
||||
// Mod damage from spell mechanic
|
||||
uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
|
||||
|
||||
@@ -12160,7 +12156,7 @@ bool Unit::IsValidAttackTarget(Unit const* target) const
|
||||
}
|
||||
|
||||
// function based on function Unit::CanAttack from 13850 client
|
||||
bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) const
|
||||
bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, WorldObject const* obj) const
|
||||
{
|
||||
ASSERT(target);
|
||||
|
||||
@@ -12178,8 +12174,8 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) co
|
||||
if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
|
||||
return false;
|
||||
|
||||
// can't attack invisible (ignore stealth for aoe spells)
|
||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
|
||||
// can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
|
||||
if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !canSeeOrDetect(target, bySpell && bySpell->IsAffectingArea())))
|
||||
return false;
|
||||
|
||||
// can't attack dead
|
||||
@@ -12740,11 +12736,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
|
||||
|
||||
void Unit::setDeathState(DeathState s)
|
||||
{
|
||||
// death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
|
||||
// it can be used to check creation of death items (such as soul shards).
|
||||
m_deathState = s;
|
||||
|
||||
if (s != ALIVE && s != JUST_ALIVED)
|
||||
if (s != ALIVE && s != JUST_RESPAWNED)
|
||||
{
|
||||
CombatStop();
|
||||
DeleteThreatList();
|
||||
@@ -12787,8 +12779,10 @@ void Unit::setDeathState(DeathState s)
|
||||
if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : (ZoneScript*)GetInstanceScript())
|
||||
zoneScript->OnUnitDeath(this);
|
||||
}
|
||||
else if (s == JUST_ALIVED)
|
||||
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
|
||||
else if (s == JUST_RESPAWNED)
|
||||
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
|
||||
|
||||
m_deathState = s;
|
||||
}
|
||||
|
||||
/*########################################
|
||||
@@ -14402,7 +14396,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
|
||||
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: doing %u damage from spell id %u (triggered by %s aura of spell %u)", triggeredByAura->GetAmount(), spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
|
||||
SpellNonMeleeDamage damageInfo(this, target, spellInfo->Id, spellInfo->SchoolMask);
|
||||
uint32 newDamage = SpellDamageBonusDone(target, spellInfo, triggeredByAura->GetAmount(), SPELL_DIRECT_DAMAGE);
|
||||
newDamage = target->SpellDamageBonusTaken(spellInfo, newDamage, SPELL_DIRECT_DAMAGE);
|
||||
newDamage = target->SpellDamageBonusTaken(this, spellInfo, newDamage, SPELL_DIRECT_DAMAGE);
|
||||
CalculateSpellDamageTaken(&damageInfo, newDamage, spellInfo);
|
||||
DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb);
|
||||
SendSpellNonMeleeDamageLog(&damageInfo);
|
||||
@@ -16943,7 +16937,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
|
||||
}
|
||||
|
||||
if (IsInMap(caster))
|
||||
caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1, target, true, NULL, NULL, origCasterGUID);
|
||||
caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0+i), seatId+1, target, false, NULL, NULL, origCasterGUID);
|
||||
else // This can happen during Player::_LoadAuras
|
||||
{
|
||||
int32 bp0 = seatId;
|
||||
@@ -16953,7 +16947,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
|
||||
else
|
||||
{
|
||||
if (IsInMap(caster))
|
||||
caster->CastSpell(target, spellEntry, true, NULL, NULL, origCasterGUID);
|
||||
caster->CastSpell(target, spellEntry, false, NULL, NULL, origCasterGUID);
|
||||
else
|
||||
Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, NULL, NULL, origCasterGUID);
|
||||
}
|
||||
|
||||
@@ -465,7 +465,7 @@ enum DeathState
|
||||
JUST_DIED = 1,
|
||||
CORPSE = 2,
|
||||
DEAD = 3,
|
||||
JUST_ALIVED = 4,
|
||||
JUST_RESPAWNED = 4,
|
||||
};
|
||||
|
||||
enum UnitState
|
||||
@@ -1573,7 +1573,7 @@ class Unit : public WorldObject
|
||||
bool isTargetableForAttack(bool checkFakeDeath = true) const;
|
||||
|
||||
bool IsValidAttackTarget(Unit const* target) const;
|
||||
bool _IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) const;
|
||||
bool _IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, WorldObject const* obj = NULL) const;
|
||||
|
||||
bool IsValidAssistTarget(Unit const* target) const;
|
||||
bool _IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) const;
|
||||
@@ -2038,14 +2038,14 @@ class Unit : public WorldObject
|
||||
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask);
|
||||
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask);
|
||||
uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1);
|
||||
uint32 SpellDamageBonusTaken(SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1);
|
||||
uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1);
|
||||
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask);
|
||||
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask);
|
||||
uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1);
|
||||
uint32 SpellHealingBonusTaken(SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1);
|
||||
uint32 SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1);
|
||||
|
||||
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto = NULL);
|
||||
uint32 MeleeDamageBonusTaken(uint32 pdamage,WeaponAttackType attType, SpellInfo const *spellProto = NULL);
|
||||
uint32 MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage,WeaponAttackType attType, SpellInfo const *spellProto = NULL);
|
||||
|
||||
|
||||
bool isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType attackType = BASE_ATTACK);
|
||||
|
||||
@@ -6247,74 +6247,54 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
|
||||
switch (guidhigh)
|
||||
{
|
||||
case HIGHGUID_ITEM:
|
||||
if (_hiItemGuid >= 0xFFFFFFFE)
|
||||
{
|
||||
sLog->outError("Item guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiItemGuid < 0xFFFFFFFE && "Item guid overflow!");
|
||||
return _hiItemGuid++;
|
||||
}
|
||||
case HIGHGUID_UNIT:
|
||||
if (_hiCreatureGuid >= 0x00FFFFFE)
|
||||
{
|
||||
sLog->outError("Creature guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiCreatureGuid < 0x00FFFFFE && "Creature guid overflow!");
|
||||
return _hiCreatureGuid++;
|
||||
}
|
||||
case HIGHGUID_PET:
|
||||
if (_hiPetGuid >= 0x00FFFFFE)
|
||||
{
|
||||
sLog->outError("Pet guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiPetGuid < 0x00FFFFFE && "Pet guid overflow!");
|
||||
return _hiPetGuid++;
|
||||
}
|
||||
case HIGHGUID_VEHICLE:
|
||||
if (_hiVehicleGuid >= 0x00FFFFFF)
|
||||
{
|
||||
sLog->outError("Vehicle guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiVehicleGuid < 0x00FFFFFF && "Vehicle guid overflow!");
|
||||
return _hiVehicleGuid++;
|
||||
}
|
||||
case HIGHGUID_PLAYER:
|
||||
if (_hiCharGuid >= 0xFFFFFFFE)
|
||||
{
|
||||
sLog->outError("Players guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiCharGuid < 0xFFFFFFFE && "Player guid overflow!");
|
||||
return _hiCharGuid++;
|
||||
}
|
||||
case HIGHGUID_GAMEOBJECT:
|
||||
if (_hiGoGuid >= 0x00FFFFFE)
|
||||
{
|
||||
sLog->outError("Gameobject guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiGoGuid < 0x00FFFFFE && "Gameobject guid overflow!");
|
||||
return _hiGoGuid++;
|
||||
}
|
||||
case HIGHGUID_CORPSE:
|
||||
if (_hiCorpseGuid >= 0xFFFFFFFE)
|
||||
{
|
||||
sLog->outError("Corpse guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiCorpseGuid < 0xFFFFFFFE && "Corpse guid overflow!");
|
||||
return _hiCorpseGuid++;
|
||||
}
|
||||
case HIGHGUID_DYNAMICOBJECT:
|
||||
if (_hiDoGuid >= 0xFFFFFFFE)
|
||||
{
|
||||
sLog->outError("DynamicObject guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiDoGuid < 0xFFFFFFFE && "DynamicObject guid overflow!");
|
||||
return _hiDoGuid++;
|
||||
}
|
||||
case HIGHGUID_MO_TRANSPORT:
|
||||
if (_hiMoTransGuid >= 0xFFFFFFFE)
|
||||
{
|
||||
sLog->outError("MO Transport guid overflow!! Can't continue, shutting down server. ");
|
||||
World::StopNow(ERROR_EXIT_CODE);
|
||||
}
|
||||
{
|
||||
ASSERT(_hiMoTransGuid < 0xFFFFFFFE && "MO Transport guid overflow!");
|
||||
return _hiMoTransGuid++;
|
||||
}
|
||||
default:
|
||||
ASSERT(0);
|
||||
ASSERT(false && "ObjectMgr::GenerateLowGuid - Unknown HIGHGUID type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGameObjectLocales()
|
||||
|
||||
@@ -943,7 +943,7 @@ namespace Trinity
|
||||
if (u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->isTotem())
|
||||
return false;
|
||||
|
||||
if (i_funit->_IsValidAttackTarget(u, _spellInfo) && i_obj->IsWithinDistInMap(u, i_range))
|
||||
if (i_funit->_IsValidAttackTarget(u, _spellInfo,i_obj->GetTypeId() == TYPEID_DYNAMICOBJECT ? i_obj : NULL) && i_obj->IsWithinDistInMap(u, i_range))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
----- Opcodes Not Used yet -----
|
||||
|
||||
SMSG_CALENDAR_CLEAR_PENDING_ACTION SendCalendarClearPendingAction()
|
||||
SMSG_CALENDAR_RAID_LOCKOUT_UPDATED SendCalendarRaidLockoutUpdated(InstanceSave const* save) <--- Structure unknown, using LOCKOUT_ADDED
|
||||
SMSG_CALENDAR_RAID_LOCKOUT_UPDATED SendCalendarRaidLockoutUpdated(InstanceSave const* save)
|
||||
|
||||
----- Opcodes without Sniffs -----
|
||||
SMSG_CALENDAR_FILTER_GUILD [ for (... uint32(count) { packguid(???), uint8(???) } ]
|
||||
@@ -74,7 +74,11 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/)
|
||||
else
|
||||
{
|
||||
sLog->outError("SMSG_CALENDAR_SEND_CALENDAR: No Invite found with id [" UI64FMTD "]", *it);
|
||||
data << uint64(0) << uint64(0) << uint8(0) << uint8(0);
|
||||
data << uint64(0);
|
||||
data << uint64(0);
|
||||
data << uint8(0);
|
||||
data << uint8(0);
|
||||
data << uint8(0);
|
||||
data.appendPackGUID(0);
|
||||
}
|
||||
}
|
||||
@@ -96,8 +100,12 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/)
|
||||
else
|
||||
{
|
||||
sLog->outError("SMSG_CALENDAR_SEND_CALENDAR: No Event found with id [" UI64FMTD "]", *it);
|
||||
data << uint64(0) << uint8(0) << uint32(0)
|
||||
<< uint32(0) << uint32(0) << uint32(0);
|
||||
data << uint64(0);
|
||||
data << uint8(0);
|
||||
data << uint32(0);
|
||||
data << uint32(0);
|
||||
data << uint32(0);
|
||||
data << uint32(0);
|
||||
data.appendPackGUID(0);
|
||||
}
|
||||
}
|
||||
@@ -835,26 +843,6 @@ void WorldSession::SendCalendarClearPendingAction()
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
void WorldSession::SendCalendarRaidLockoutUpdated(InstanceSave const* save)
|
||||
{
|
||||
if (!save)
|
||||
return;
|
||||
|
||||
uint64 guid = _player->GetGUID();
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_RAID_LOCKOUT_UPDATED [" UI64FMTD
|
||||
"] Map: %u, Difficulty %u", guid, save->GetMapId(), save->GetDifficulty());
|
||||
|
||||
time_t cur_time = time_t(time(NULL));
|
||||
|
||||
WorldPacket data(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, 4 + 4 + 4 + 4 + 8);
|
||||
data << secsToTimeBitFields(cur_time);
|
||||
data << uint32(save->GetMapId());
|
||||
data << uint32(save->GetDifficulty());
|
||||
data << uint32(save->GetResetTime() - cur_time);
|
||||
data << uint64(save->GetInstanceId());
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
void WorldSession::SendCalendarCommandResult(CalendarError err, char const* param /*= NULL*/)
|
||||
{
|
||||
uint64 guid = _player->GetGUID();
|
||||
@@ -898,3 +886,23 @@ void WorldSession::SendCalendarRaidLockout(InstanceSave const* save, bool add)
|
||||
data << uint64(save->GetInstanceId());
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
void WorldSession::SendCalendarRaidLockoutUpdated(InstanceSave const* save)
|
||||
{
|
||||
if (!save)
|
||||
return;
|
||||
|
||||
uint64 guid = _player->GetGUID();
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_RAID_LOCKOUT_UPDATED [" UI64FMTD
|
||||
"] Map: %u, Difficulty %u", guid, save->GetMapId(), save->GetDifficulty());
|
||||
|
||||
time_t cur_time = time_t(time(NULL));
|
||||
|
||||
WorldPacket data(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, 4 + 4 + 4 + 4 + 8);
|
||||
data << secsToTimeBitFields(cur_time);
|
||||
data << uint32(save->GetMapId());
|
||||
data << uint32(save->GetDifficulty());
|
||||
data << uint32(0); // Amount of seconds that has changed to the reset time
|
||||
data << uint32(save->GetResetTime() - cur_time);
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#include "GameObjectAI.h"
|
||||
#include "Group.h"
|
||||
#include "AccountMgr.h"
|
||||
#include "Spell.h"
|
||||
|
||||
void WorldSession::HandleRepopRequestOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
@@ -429,6 +430,10 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPacket & /*recv_data*/)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_LOGOUT_CANCEL Message");
|
||||
|
||||
// Player have already logged out serverside, too late to cancel
|
||||
if (!GetPlayer())
|
||||
return;
|
||||
|
||||
LogoutRequest(0);
|
||||
|
||||
WorldPacket data(SMSG_LOGOUT_CANCEL_ACK, 0);
|
||||
@@ -1714,3 +1719,47 @@ void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket)
|
||||
|
||||
_player->SetPendingBind(0, 0);
|
||||
}
|
||||
|
||||
void WorldSession::HandleUpdateMissileTrajectory(WorldPacket& recvPacket)
|
||||
{
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_UPDATE_MISSILE_TRAJECTORY");
|
||||
|
||||
uint64 guid;
|
||||
uint32 spellId;
|
||||
float elevation, speed;
|
||||
float curX, curY, curZ;
|
||||
float targetX, targetY, targetZ;
|
||||
uint8 moveStop;
|
||||
|
||||
recvPacket >> guid >> spellId >> elevation >> speed;
|
||||
recvPacket >> curX >> curY >> curZ;
|
||||
recvPacket >> targetX >> targetY >> targetZ;
|
||||
recvPacket >> moveStop;
|
||||
|
||||
Unit* caster = ObjectAccessor::GetUnit(*_player, guid);
|
||||
Spell* spell = caster ? caster->GetCurrentSpell(CURRENT_GENERIC_SPELL) : NULL;
|
||||
if (!spell || spell->m_spellInfo->Id != spellId || !spell->m_targets.HasDst() || !spell->m_targets.HasSrc())
|
||||
{
|
||||
recvPacket.rfinish();
|
||||
return;
|
||||
}
|
||||
|
||||
Position pos = *spell->m_targets.GetSrcPos();
|
||||
pos.Relocate(curX, curY, curZ);
|
||||
spell->m_targets.ModSrc(pos);
|
||||
|
||||
pos = *spell->m_targets.GetDstPos();
|
||||
pos.Relocate(targetX, targetY, targetZ);
|
||||
spell->m_targets.ModDst(pos);
|
||||
|
||||
spell->m_targets.SetElevation(elevation);
|
||||
spell->m_targets.SetSpeed(speed);
|
||||
|
||||
if (moveStop)
|
||||
{
|
||||
uint32 opcode;
|
||||
recvPacket >> opcode;
|
||||
recvPacket.SetOpcode(opcode);
|
||||
HandleMovementOpcodes(recvPacket);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,10 +64,9 @@ void WorldSession::HandleMoveWorldportAckOpcode()
|
||||
GetPlayer()->m_InstanceValid = true;
|
||||
|
||||
Map* oldMap = GetPlayer()->GetMap();
|
||||
ASSERT(oldMap);
|
||||
if (GetPlayer()->IsInWorld())
|
||||
{
|
||||
sLog->outCrash("Player (Name %s) is still in world when teleported from map %u to new map %u", GetPlayer()->GetName(), oldMap->GetId(), loc.GetMapId());
|
||||
sLog->outError("Player (Name %s) is still in world when teleported from map %u to new map %u", GetPlayer()->GetName(), oldMap->GetId(), loc.GetMapId());
|
||||
oldMap->RemovePlayerFromMap(GetPlayer(), false);
|
||||
}
|
||||
|
||||
@@ -200,8 +199,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
|
||||
sLog->outStaticDebug("Guid " UI64FMTD, guid);
|
||||
sLog->outStaticDebug("Flags %u, time %u", flags, time/IN_MILLISECONDS);
|
||||
|
||||
Unit* mover = _player->m_mover;
|
||||
Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL;
|
||||
Player* plMover = _player->m_mover->ToPlayer();
|
||||
|
||||
if (!plMover || !plMover->IsBeingTeleportedNear())
|
||||
return;
|
||||
@@ -240,33 +238,33 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recv_data)
|
||||
GetPlayer()->ProcessDelayedOperations();
|
||||
}
|
||||
|
||||
void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
|
||||
void WorldSession::HandleMovementOpcodes(WorldPacket & recvData)
|
||||
{
|
||||
uint16 opcode = recv_data.GetOpcode();
|
||||
uint16 opcode = recvData.GetOpcode();
|
||||
|
||||
Unit* mover = _player->m_mover;
|
||||
|
||||
ASSERT(mover != NULL); // there must always be a mover
|
||||
ASSERT(mover != NULL); // there must always be a mover
|
||||
|
||||
Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL;
|
||||
Player* plrMover = mover->ToPlayer();
|
||||
|
||||
// ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck
|
||||
if (plMover && plMover->IsBeingTeleported())
|
||||
if (plrMover && plrMover->IsBeingTeleported())
|
||||
{
|
||||
recv_data.rfinish(); // prevent warnings spam
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
/* extract packet */
|
||||
uint64 guid;
|
||||
|
||||
recv_data.readPackGUID(guid);
|
||||
recvData.readPackGUID(guid);
|
||||
|
||||
MovementInfo movementInfo;
|
||||
movementInfo.guid = guid;
|
||||
ReadMovementInfo(recv_data, &movementInfo);
|
||||
ReadMovementInfo(recvData, &movementInfo);
|
||||
|
||||
recv_data.rfinish(); // prevent warnings spam
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
|
||||
// prevent tampered movement data
|
||||
if (guid != mover->GetGUID())
|
||||
@@ -274,7 +272,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
|
||||
|
||||
if (!movementInfo.pos.IsPositionValid())
|
||||
{
|
||||
recv_data.rfinish(); // prevent warnings spam
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -285,27 +283,27 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
|
||||
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
|
||||
if (movementInfo.t_pos.GetPositionX() > 50 || movementInfo.t_pos.GetPositionY() > 50 || movementInfo.t_pos.GetPositionZ() > 50)
|
||||
{
|
||||
recv_data.rfinish(); // prevent warnings spam
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Trinity::IsValidMapCoord(movementInfo.pos.GetPositionX() + movementInfo.t_pos.GetPositionX(), movementInfo.pos.GetPositionY() + movementInfo.t_pos.GetPositionY(),
|
||||
movementInfo.pos.GetPositionZ() + movementInfo.t_pos.GetPositionZ(), movementInfo.pos.GetOrientation() + movementInfo.t_pos.GetOrientation()))
|
||||
{
|
||||
recv_data.rfinish(); // prevent warnings spam
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
// if we boarded a transport, add us to it
|
||||
if (plMover && !plMover->GetTransport())
|
||||
if (plrMover && !plrMover->GetTransport())
|
||||
{
|
||||
// elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just dismount if the guid can be found in the transport list
|
||||
for (MapManager::TransportSet::const_iterator iter = sMapMgr->m_Transports.begin(); iter != sMapMgr->m_Transports.end(); ++iter)
|
||||
{
|
||||
if ((*iter)->GetGUID() == movementInfo.t_guid)
|
||||
{
|
||||
plMover->m_transport = (*iter);
|
||||
(*iter)->AddPassenger(plMover);
|
||||
plrMover->m_transport = (*iter);
|
||||
(*iter)->AddPassenger(plrMover);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -318,29 +316,29 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
|
||||
movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
|
||||
}
|
||||
}
|
||||
else if (plMover && plMover->GetTransport()) // if we were on a transport, leave
|
||||
else if (plrMover && plrMover->GetTransport()) // if we were on a transport, leave
|
||||
{
|
||||
plMover->m_transport->RemovePassenger(plMover);
|
||||
plMover->m_transport = NULL;
|
||||
plrMover->m_transport->RemovePassenger(plrMover);
|
||||
plrMover->m_transport = NULL;
|
||||
movementInfo.t_pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
movementInfo.t_time = 0;
|
||||
movementInfo.t_seat = -1;
|
||||
}
|
||||
|
||||
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
|
||||
if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->isInFlight())
|
||||
plMover->HandleFall(movementInfo);
|
||||
if (opcode == MSG_MOVE_FALL_LAND && plrMover && !plrMover->isInFlight())
|
||||
plrMover->HandleFall(movementInfo);
|
||||
|
||||
if (plMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plMover->IsInWater())
|
||||
if (plrMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plrMover->IsInWater())
|
||||
{
|
||||
// now client not include swimming flag in case jumping under water
|
||||
plMover->SetInWater(!plMover->IsInWater() || plMover->GetBaseMap()->IsUnderWater(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ()));
|
||||
plrMover->SetInWater(!plrMover->IsInWater() || plrMover->GetBaseMap()->IsUnderWater(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ()));
|
||||
}
|
||||
|
||||
/*----------------------*/
|
||||
|
||||
/* process position-change */
|
||||
WorldPacket data(opcode, recv_data.size());
|
||||
WorldPacket data(opcode, recvData.size());
|
||||
movementInfo.time = getMSTime();
|
||||
movementInfo.guid = mover->GetGUID();
|
||||
WriteMovementInfo(&data, &movementInfo);
|
||||
@@ -357,27 +355,25 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
|
||||
|
||||
mover->UpdatePosition(movementInfo.pos);
|
||||
|
||||
if (plMover) // nothing is charmed, or player charmed
|
||||
if (plrMover) // nothing is charmed, or player charmed
|
||||
{
|
||||
plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
|
||||
plrMover->UpdateFallInformationIfNeed(movementInfo, opcode);
|
||||
|
||||
if (movementInfo.pos.GetPositionZ() < -500.0f)
|
||||
{
|
||||
if (!(plMover->InBattleground()
|
||||
&& plMover->GetBattleground()
|
||||
&& plMover->GetBattleground()->HandlePlayerUnderMap(_player)))
|
||||
if (!(plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player)))
|
||||
{
|
||||
// NOTE: this is actually called many times while falling
|
||||
// even after the player has been teleported away
|
||||
// TODO: discard movement packets after the player is rooted
|
||||
if (plMover->isAlive())
|
||||
if (plrMover->isAlive())
|
||||
{
|
||||
plMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth());
|
||||
plrMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth());
|
||||
// player can be alive if GM/etc
|
||||
// change the death state to CORPSE to prevent the death timer from
|
||||
// starting in the next player update
|
||||
if (!plMover->isAlive())
|
||||
plMover->KillPlayer();
|
||||
if (!plrMover->isAlive())
|
||||
plrMover->KillPlayer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -650,13 +650,22 @@ void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket)
|
||||
uint8 castCount;
|
||||
float x, y, z; // Position of missile hit
|
||||
|
||||
recvPacket.readPackGUID(casterGuid);
|
||||
recvPacket >> casterGuid;
|
||||
recvPacket >> spellId;
|
||||
recvPacket >> castCount;
|
||||
recvPacket >> x;
|
||||
recvPacket >> y;
|
||||
recvPacket >> z;
|
||||
|
||||
Unit* caster = ObjectAccessor::GetUnit(*_player, casterGuid);
|
||||
Spell* spell = caster ? caster->FindCurrentSpellBySpellId(spellId) : NULL;
|
||||
if (spell && spell->m_targets.HasDst())
|
||||
{
|
||||
Position pos = *spell->m_targets.GetDstPos();
|
||||
pos.Relocate(x, y, z);
|
||||
spell->m_targets.ModDst(pos);
|
||||
}
|
||||
|
||||
WorldPacket data(SMSG_SET_PROJECTILE_POSITION, 21);
|
||||
data << uint64(casterGuid);
|
||||
data << uint8(castCount);
|
||||
|
||||
@@ -531,7 +531,7 @@ void WorldSession::HandleBeginTradeOpcode(WorldPacket& /*recvPacket*/)
|
||||
|
||||
void WorldSession::SendCancelTrade()
|
||||
{
|
||||
if (m_playerRecentlyLogout)
|
||||
if (PlayerRecentlyLoggedOut() || PlayerLogout())
|
||||
return;
|
||||
|
||||
SendTradeStatus(TRADE_STATUS_TRADE_CANCELED);
|
||||
|
||||
@@ -2470,7 +2470,7 @@ bool InstanceMap::AddPlayerToMap(Player* player)
|
||||
if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
|
||||
if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
|
||||
if (LFGDungeonEntry const* randomDungeon = sLFGDungeonStore.LookupEntry(*(sLFGMgr->GetSelectedDungeons(player->GetGUID()).begin())))
|
||||
if (uint32(dungeon->map) == GetId() && dungeon->difficulty == GetDifficulty() && randomDungeon->type == LFG_TYPE_RANDOM)
|
||||
if (uint32(dungeon->map) == GetId() && dungeon->difficulty == uint32(GetDifficulty()) && randomDungeon->type == uint32(LFG_TYPE_RANDOM))
|
||||
player->CastSpell(player, LFG_SPELL_LUCK_OF_THE_DRAW, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -937,6 +937,22 @@ void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player)
|
||||
tmpscript->OnDamaged(go, player);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit)
|
||||
{
|
||||
ASSERT(go);
|
||||
|
||||
GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
|
||||
tmpscript->OnLootStateChanged(go, state, unit);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state)
|
||||
{
|
||||
ASSERT(go);
|
||||
|
||||
GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
|
||||
tmpscript->OnGameObjectStateChanged(go, state);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff)
|
||||
{
|
||||
ASSERT(go);
|
||||
|
||||
@@ -473,6 +473,12 @@ class GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
|
||||
// Called when the game object is damaged (destructible buildings only).
|
||||
virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { }
|
||||
|
||||
// Called when the game object loot state is changed.
|
||||
virtual void OnLootStateChanged(GameObject* /*go*/, uint32 /*state*/, Unit* /*unit*/) { }
|
||||
|
||||
// Called when the game object state is changed.
|
||||
virtual void OnGameObjectStateChanged(GameObject* /*go*/, uint32 /*state*/) { }
|
||||
|
||||
// Called when a GameObjectAI object is needed for the gameobject.
|
||||
virtual GameObjectAI* GetAI(GameObject* /*go*/) const { return NULL; }
|
||||
};
|
||||
@@ -914,6 +920,8 @@ class ScriptMgr
|
||||
uint32 GetDialogStatus(Player* player, GameObject* go);
|
||||
void OnGameObjectDestroyed(GameObject* go, Player* player);
|
||||
void OnGameObjectDamaged(GameObject* go, Player* player);
|
||||
void OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit);
|
||||
void OnGameObjectStateChanged(GameObject* go, uint32 state);
|
||||
void OnGameObjectUpdate(GameObject* go, uint32 diff);
|
||||
GameObjectAI* GetGameObjectAI(GameObject* go);
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x04B*/ { "CMSG_LOGOUT_REQUEST", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutRequestOpcode },
|
||||
/*0x04C*/ { "SMSG_LOGOUT_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x04D*/ { "SMSG_LOGOUT_COMPLETE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x04E*/ { "CMSG_LOGOUT_CANCEL", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode },
|
||||
/*0x04E*/ { "CMSG_LOGOUT_CANCEL", STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode },
|
||||
/*0x04F*/ { "SMSG_LOGOUT_CANCEL_ACK", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x050*/ { "CMSG_NAME_QUERY", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNameQueryOpcode },
|
||||
/*0x051*/ { "SMSG_NAME_QUERY_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
@@ -270,8 +270,8 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x0F1*/ { "MSG_MOVE_KNOCK_BACK", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x0F2*/ { "SMSG_MOVE_FEATHER_FALL", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x0F3*/ { "SMSG_MOVE_NORMAL_FALL", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x0F6*/ { "CMSG_MOVE_HOVER_ACK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveHoverAck },
|
||||
/*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x0F8*/ { "CMSG_TRIGGER_CINEMATIC_CHEAT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
@@ -310,7 +310,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x119*/ { "CMSG_IGNORE_TRADE", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode },
|
||||
/*0x11A*/ { "CMSG_ACCEPT_TRADE", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode },
|
||||
/*0x11B*/ { "CMSG_UNACCEPT_TRADE", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode },
|
||||
/*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTradeOpcode},
|
||||
/*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTradeOpcode },
|
||||
/*0x11D*/ { "CMSG_SET_TRADE_ITEM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeItemOpcode },
|
||||
/*0x11E*/ { "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode },
|
||||
/*0x11F*/ { "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeGoldOpcode },
|
||||
@@ -970,7 +970,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x3AD*/ { "MSG_MOVE_UPDATE_CAN_FLY", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x3AE*/ { "MSG_RAID_READY_CHECK_CONFIRM", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x3AF*/ { "CMSG_VOICE_SESSION_ENABLE", STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleVoiceSessionEnableOpcode },
|
||||
/*0x3B0*/ { "SMSG_VOICE_SESSION_ENABLE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x3B0*/ { "SMSG_VOICE_SESSION_ENABLE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x3B1*/ { "SMSG_VOICE_PARENTAL_CONTROLS", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x3B2*/ { "CMSG_GM_WHISPER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x3B3*/ { "SMSG_GM_MESSAGECHAT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
@@ -1023,7 +1023,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x3E2*/ { "SMSG_COMSAT_CONNECT_FAIL", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x3E3*/ { "SMSG_VOICE_CHAT_STATUS", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x3E4*/ { "CMSG_REPORT_PVP_AFK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK },
|
||||
/*0x3E5*/ { "SMSG_REPORT_PVP_AFK_RESULT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x3E5*/ { "SMSG_REPORT_PVP_AFK_RESULT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x3E6*/ { "CMSG_GUILD_BANKER_ACTIVATE", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankerActivate },
|
||||
/*0x3E7*/ { "CMSG_GUILD_BANK_QUERY_TAB", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankQueryTab },
|
||||
/*0x3E8*/ { "SMSG_GUILD_BANK_LIST", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
@@ -1148,7 +1148,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
|
||||
/*0x45F*/ { "CMSG_CALENDAR_EVENT_INVITE_NOTES", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x460*/ { "SMSG_CALENDAR_EVENT_INVITE_NOTES", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x461*/ { "SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x462*/ { "CMSG_UPDATE_MISSILE_TRAJECTORY", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
/*0x462*/ { "CMSG_UPDATE_MISSILE_TRAJECTORY", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory },
|
||||
/*0x463*/ { "SMSG_UPDATE_ACCOUNT_DATA_COMPLETE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x464*/ { "SMSG_TRIGGER_MOVIE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide },
|
||||
/*0x465*/ { "CMSG_COMPLETE_MOVIE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL },
|
||||
|
||||
@@ -1248,8 +1248,8 @@ enum Opcodes
|
||||
SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x4BB,
|
||||
SMSG_EQUIPMENT_SET_LIST = 0x4BC, // equipment manager list?
|
||||
CMSG_EQUIPMENT_SET_SAVE = 0x4BD,
|
||||
CMSG_UPDATE_PROJECTILE_POSITION = 0x4BE, // uint64 caster, uint32 spellId, uint8 castId, vector3 position
|
||||
SMSG_SET_PROJECTILE_POSITION = 0x4BF, // uint64 caster, uint8 castId, vector3 position
|
||||
CMSG_UPDATE_PROJECTILE_POSITION = 0x4BE,
|
||||
SMSG_SET_PROJECTILE_POSITION = 0x4BF,
|
||||
SMSG_TALENTS_INFO = 0x4C0,
|
||||
CMSG_LEARN_PREVIEW_TALENTS = 0x4C1,
|
||||
CMSG_LEARN_PREVIEW_TALENTS_PET = 0x4C2,
|
||||
@@ -1354,7 +1354,7 @@ enum SessionStatus
|
||||
STATUS_AUTHED = 0, // Player authenticated (_player == NULL, m_playerRecentlyLogout = false or will be reset before handler call, m_GUID have garbage)
|
||||
STATUS_LOGGEDIN, // Player in game (_player != NULL, m_GUID == _player->GetGUID(), inWorld())
|
||||
STATUS_TRANSFER, // Player transferring to another map (_player != NULL, m_GUID == _player->GetGUID(), !inWorld())
|
||||
STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, // _player!= NULL or _player == NULL && m_playerRecentlyLogout, m_GUID store last _player guid)
|
||||
STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, // _player != NULL or _player == NULL && m_playerRecentlyLogout && m_playerLogout, m_GUID store last _player guid)
|
||||
STATUS_NEVER, // Opcode not accepted from client (deprecated or server side only)
|
||||
STATUS_UNHANDLED, // Opcode not handled yet
|
||||
};
|
||||
|
||||
@@ -290,7 +290,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
// lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer
|
||||
break;
|
||||
case STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT:
|
||||
if (!_player && !m_playerRecentlyLogout)
|
||||
if (!_player && !m_playerRecentlyLogout && !m_playerLogout) // There's a short delay between _player = null and m_playerRecentlyLogout = true during logout
|
||||
LogUnexpectedOpcode(packet, "STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT",
|
||||
"the player has not logged in yet and not recently logout");
|
||||
else
|
||||
@@ -323,9 +323,9 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
break;
|
||||
}
|
||||
|
||||
// single from authed time opcodes send in to after logout time
|
||||
// and before other STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT opcodes.
|
||||
if (packet->GetOpcode() != CMSG_SET_ACTIVE_VOICE_CHANNEL)
|
||||
// some auth opcodes can be recieved before STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT opcodes
|
||||
// however when we recieve CMSG_CHAR_ENUM we are surely no longer during the logout process.
|
||||
if (packet->GetOpcode() == CMSG_CHAR_ENUM)
|
||||
m_playerRecentlyLogout = false;
|
||||
|
||||
sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet));
|
||||
@@ -404,7 +404,7 @@ void WorldSession::LogoutPlayer(bool Save)
|
||||
|
||||
if (_player)
|
||||
{
|
||||
if (uint64 lguid = GetPlayer()->GetLootGUID())
|
||||
if (uint64 lguid = _player->GetLootGUID())
|
||||
DoLootRelease(lguid);
|
||||
|
||||
///- If the player just died before logging out, make him appear as a ghost
|
||||
@@ -518,21 +518,21 @@ void WorldSession::LogoutPlayer(bool Save)
|
||||
if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket)
|
||||
_player->RemoveFromGroup();
|
||||
|
||||
///- Send update to group and reset stored max enchanting level
|
||||
//! Send update to group and reset stored max enchanting level
|
||||
if (_player->GetGroup())
|
||||
{
|
||||
_player->GetGroup()->SendUpdate();
|
||||
_player->GetGroup()->ResetMaxEnchantingLevel();
|
||||
}
|
||||
|
||||
///- Broadcast a logout message to the player's friends
|
||||
//! Broadcast a logout message to the player's friends
|
||||
sSocialMgr->SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetGUIDLow(), true);
|
||||
sSocialMgr->RemovePlayerSocial(_player->GetGUIDLow());
|
||||
|
||||
// Call script hook before deletion
|
||||
sScriptMgr->OnPlayerLogout(GetPlayer());
|
||||
//! Call script hook before deletion
|
||||
sScriptMgr->OnPlayerLogout(_player);
|
||||
|
||||
///- Remove the player from the world
|
||||
//! Remove the player from the world
|
||||
// the player may not be in the world when logging out
|
||||
// e.g if he got disconnected during a transfer to another map
|
||||
// calls to GetMap in this case may cause crashes
|
||||
@@ -540,22 +540,19 @@ void WorldSession::LogoutPlayer(bool Save)
|
||||
sLog->outChar("Account: %d (IP: %s) Logout Character:[%s] (GUID: %u) Level: %d", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow(), _player->getLevel());
|
||||
if (Map* _map = _player->FindMap())
|
||||
_map->RemovePlayerFromMap(_player, true);
|
||||
SetPlayer(NULL); // deleted in Remove call
|
||||
|
||||
///- Send the 'logout complete' packet to the client
|
||||
SetPlayer(NULL); //! Pointer already deleted during RemovePlayerFromMap
|
||||
|
||||
//! Send the 'logout complete' packet to the client
|
||||
//! Client will respond by sending 3x CMSG_CANCEL_TRADE, which we currently dont handle
|
||||
WorldPacket data(SMSG_LOGOUT_COMPLETE, 0);
|
||||
SendPacket(&data);
|
||||
|
||||
///- Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
|
||||
//No SQL injection as AccountId is uint32
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
||||
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
|
||||
|
||||
//! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
||||
stmt->setUInt32(0, GetAccountId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
m_playerLogout = false;
|
||||
|
||||
@@ -221,6 +221,7 @@ class WorldSession
|
||||
bool PlayerLoading() const { return m_playerLoading; }
|
||||
bool PlayerLogout() const { return m_playerLogout; }
|
||||
bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; }
|
||||
bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; }
|
||||
|
||||
void SizeError(WorldPacket const& packet, uint32 size) const;
|
||||
|
||||
@@ -395,7 +396,7 @@ class WorldSession
|
||||
public: // opcodes handlers
|
||||
|
||||
void Handle_NULL(WorldPacket& recvPacket); // not used
|
||||
void Handle_EarlyProccess(WorldPacket& recvPacket);// just mark packets processed in WorldSocket::OnRead
|
||||
void Handle_EarlyProccess(WorldPacket& recvPacket); // just mark packets processed in WorldSocket::OnRead
|
||||
void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client
|
||||
void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client
|
||||
|
||||
@@ -785,6 +786,7 @@ class WorldSession
|
||||
void HandleResetInstancesOpcode(WorldPacket& recv_data);
|
||||
void HandleHearthAndResurrect(WorldPacket& recv_data);
|
||||
void HandleInstanceLockResponse(WorldPacket& recvPacket);
|
||||
void HandleUpdateMissileTrajectory(WorldPacket& recvPacket);
|
||||
|
||||
// Looking for Dungeon/Raid
|
||||
void HandleLfgSetCommentOpcode(WorldPacket& recv_data);
|
||||
|
||||
@@ -584,7 +584,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster)
|
||||
if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_MAGE && GetSpellInfo()->SpellFamilyFlags[0] & 0x8000 && m_spellInfo->SpellFamilyFlags[2] & 0x8)
|
||||
{
|
||||
// +80.53% from +spd bonus
|
||||
DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8053f;;
|
||||
DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8053f;
|
||||
}
|
||||
break;
|
||||
case SPELL_AURA_DUMMY:
|
||||
@@ -594,7 +594,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster)
|
||||
if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[1] & 0x400)
|
||||
{
|
||||
amount = caster->SpellHealingBonusDone(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE);
|
||||
amount = GetBase()->GetUnitOwner()->SpellHealingBonusTaken(GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE);
|
||||
amount = GetBase()->GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE);
|
||||
}
|
||||
break;
|
||||
case SPELL_AURA_PERIODIC_DAMAGE:
|
||||
@@ -660,19 +660,23 @@ int32 AuraEffect::CalculateAmount(Unit* caster)
|
||||
}
|
||||
break;
|
||||
case SPELL_AURA_PERIODIC_ENERGIZE:
|
||||
if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_GENERIC)
|
||||
switch (m_spellInfo->Id)
|
||||
{
|
||||
// Replenishment (0.25% from max)
|
||||
// Infinite Replenishment
|
||||
if (m_spellInfo->SpellIconID == 3184 && m_spellInfo->SpellVisual[0] == 12495)
|
||||
amount = GetBase()->GetUnitOwner()->GetMaxPower(POWER_MANA) * 25 / 10000;
|
||||
}
|
||||
// Innervate
|
||||
else if (m_spellInfo->Id == 29166)
|
||||
case 57669: // Replenishment (0.2% from max)
|
||||
amount = GetBase()->GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f;
|
||||
break;
|
||||
case 61782: // Infinite Replenishment
|
||||
amount = GetBase()->GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f;
|
||||
break;
|
||||
case 29166: // Innervate
|
||||
ApplyPctF(amount, float(GetBase()->GetUnitOwner()->GetCreatePowers(POWER_MANA)) / GetTotalTicks());
|
||||
// Owlkin Frenzy
|
||||
else if (m_spellInfo->Id == 48391)
|
||||
break;
|
||||
case 48391: // Owlkin Frenzy
|
||||
ApplyPctU(amount, GetBase()->GetUnitOwner()->GetCreatePowers(POWER_MANA));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SPELL_AURA_PERIODIC_HEAL:
|
||||
if (!caster)
|
||||
@@ -1240,7 +1244,7 @@ void AuraEffect::SendTickImmune(Unit* target, Unit* caster) const
|
||||
caster->SendSpellDamageImmune(target, m_spellInfo->Id);
|
||||
}
|
||||
|
||||
void AuraEffect::PeriodicTick(AuraApplication * aurApp, Unit* caster)
|
||||
void AuraEffect::PeriodicTick(AuraApplication * aurApp, Unit* caster) const
|
||||
{
|
||||
bool prevented = GetBase()->CallScriptEffectPeriodicHandlers(this, aurApp);
|
||||
if (prevented)
|
||||
@@ -5151,66 +5155,63 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod
|
||||
if (!(mode & AURA_EFFECT_HANDLE_REAL))
|
||||
return;
|
||||
|
||||
if (!apply)
|
||||
if (apply || aurApp->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
|
||||
return;
|
||||
|
||||
Unit* caster = GetCaster();
|
||||
|
||||
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
Player* plCaster = caster->ToPlayer();
|
||||
Unit* target = aurApp->GetTarget();
|
||||
|
||||
// Item amount
|
||||
if (GetAmount() <= 0)
|
||||
return;
|
||||
|
||||
if (GetSpellInfo()->Effects[m_effIndex].ItemType == 0)
|
||||
return;
|
||||
|
||||
// Soul Shard
|
||||
if (GetSpellInfo()->Effects[m_effIndex].ItemType == 6265)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
|
||||
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
|
||||
// Soul Shard only from units that grant XP or honor
|
||||
if (!plCaster->isHonorOrXPTarget(target) ||
|
||||
(target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(plCaster)))
|
||||
return;
|
||||
|
||||
Player* plCaster = caster->ToPlayer();
|
||||
Unit* target = aurApp->GetTarget();
|
||||
|
||||
if (target->getDeathState() != JUST_DIED)
|
||||
return;
|
||||
|
||||
// Item amount
|
||||
if (GetAmount() <= 0)
|
||||
return;
|
||||
|
||||
if (GetSpellInfo()->Effects[m_effIndex].ItemType == 0)
|
||||
return;
|
||||
|
||||
// Soul Shard
|
||||
if (GetSpellInfo()->Effects[m_effIndex].ItemType == 6265)
|
||||
// If this is Drain Soul, check for Glyph of Drain Soul
|
||||
if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000))
|
||||
{
|
||||
// Soul Shard only from units that grant XP or honor
|
||||
if (!plCaster->isHonorOrXPTarget(target) ||
|
||||
(target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(plCaster)))
|
||||
return;
|
||||
|
||||
// If this is Drain Soul, check for Glyph of Drain Soul
|
||||
if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000))
|
||||
{
|
||||
// Glyph of Drain Soul - chance to create an additional Soul Shard
|
||||
if (AuraEffect* aur = caster->GetAuraEffect(58070, 0))
|
||||
if (roll_chance_i(aur->GetMiscValue()))
|
||||
caster->CastSpell(caster, 58068, true, 0, aur); // We _could_ simply do ++count here, but Blizz does it this way :)
|
||||
}
|
||||
// Glyph of Drain Soul - chance to create an additional Soul Shard
|
||||
if (AuraEffect* aur = caster->GetAuraEffect(58070, 0))
|
||||
if (roll_chance_i(aur->GetMiscValue()))
|
||||
caster->CastSpell(caster, 58068, true, 0, aur); // We _could_ simply do ++count here, but Blizz does it this way :)
|
||||
}
|
||||
|
||||
//Adding items
|
||||
uint32 noSpaceForCount = 0;
|
||||
uint32 count = m_amount;
|
||||
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = plCaster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, GetSpellInfo()->Effects[m_effIndex].ItemType, count, &noSpaceForCount);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
count-=noSpaceForCount;
|
||||
plCaster->SendEquipError(msg, NULL, NULL, GetSpellInfo()->Effects[m_effIndex].ItemType);
|
||||
if (count == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
Item* newitem = plCaster->StoreNewItem(dest, GetSpellInfo()->Effects[m_effIndex].ItemType, true);
|
||||
if (!newitem)
|
||||
{
|
||||
plCaster->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
plCaster->SendNewItem(newitem, count, true, true);
|
||||
}
|
||||
|
||||
//Adding items
|
||||
uint32 noSpaceForCount = 0;
|
||||
uint32 count = m_amount;
|
||||
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = plCaster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, GetSpellInfo()->Effects[m_effIndex].ItemType, count, &noSpaceForCount);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
count-=noSpaceForCount;
|
||||
plCaster->SendEquipError(msg, NULL, NULL, GetSpellInfo()->Effects[m_effIndex].ItemType);
|
||||
if (count == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
Item* newitem = plCaster->StoreNewItem(dest, GetSpellInfo()->Effects[m_effIndex].ItemType, true);
|
||||
if (!newitem)
|
||||
{
|
||||
plCaster->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
plCaster->SendNewItem(newitem, count, true, true);
|
||||
}
|
||||
|
||||
void AuraEffect::HandleBindSight(AuraApplication const* aurApp, uint8 mode, bool apply) const
|
||||
@@ -6017,7 +6018,7 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*
|
||||
sLog->outDebug(LOG_FILTER_SPELLS_AURAS,"AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick: Spell %u has non-existent spell %u in EffectTriggered[%d] and is therefor not triggered.", GetId(), triggerSpellId, GetEffIndex());
|
||||
}
|
||||
|
||||
void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster)
|
||||
void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const
|
||||
{
|
||||
if (!caster || !target->isAlive())
|
||||
return;
|
||||
@@ -6069,7 +6070,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster)
|
||||
if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE)
|
||||
{
|
||||
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = target->SpellDamageBonusTaken(GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
|
||||
// Calculate armor mitigation
|
||||
if (Unit::IsDamageReducedByArmor(GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), GetEffIndex()))
|
||||
@@ -6159,7 +6160,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster)
|
||||
caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true);
|
||||
}
|
||||
|
||||
void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster)
|
||||
void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) const
|
||||
{
|
||||
if (!caster || !target->isAlive())
|
||||
return;
|
||||
@@ -6181,7 +6182,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster)
|
||||
uint32 damage = std::max(GetAmount(), 0);
|
||||
|
||||
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = target->SpellDamageBonusTaken(GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
|
||||
bool crit = IsPeriodicTickCrit(target, caster);
|
||||
if (crit)
|
||||
@@ -6224,7 +6225,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster)
|
||||
float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster);
|
||||
|
||||
uint32 heal = uint32(caster->SpellHealingBonusDone(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, GetBase()->GetStackAmount()));
|
||||
heal = uint32(caster->SpellHealingBonusTaken(GetSpellInfo(), heal, DOT, GetBase()->GetStackAmount()));
|
||||
heal = uint32(caster->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT, GetBase()->GetStackAmount()));
|
||||
|
||||
int32 gain = caster->HealBySpell(caster, GetSpellInfo(), heal);
|
||||
caster->getHostileRefManager().threatAssist(caster, gain * 0.5f, GetSpellInfo());
|
||||
@@ -6259,7 +6260,7 @@ void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster)
|
||||
caster->HealBySpell(target, GetSpellInfo(), damage);
|
||||
}
|
||||
|
||||
void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster)
|
||||
void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
|
||||
{
|
||||
if (!caster || !target->isAlive())
|
||||
return;
|
||||
@@ -6328,8 +6329,8 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster)
|
||||
damage += addition;
|
||||
}
|
||||
|
||||
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = target->SpellHealingBonusTaken(GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||
}
|
||||
|
||||
bool crit = IsPeriodicTickCrit(target, caster);
|
||||
@@ -6620,7 +6621,7 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv
|
||||
Unit* triggerTarget = eventInfo.GetProcTarget();
|
||||
SpellNonMeleeDamage damageInfo(target, triggerTarget, GetId(), GetSpellInfo()->SchoolMask);
|
||||
uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE);
|
||||
damage = triggerTarget->SpellDamageBonusTaken(GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
|
||||
target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo());
|
||||
target->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb);
|
||||
target->SendSpellNonMeleeDamageLog(&damageInfo);
|
||||
|
||||
@@ -83,7 +83,7 @@ class AuraEffect
|
||||
bool HasSpellClassMask() const { return m_spellInfo->Effects[m_effIndex].SpellClassMask; }
|
||||
|
||||
void SendTickImmune(Unit* target, Unit* caster) const;
|
||||
void PeriodicTick(AuraApplication * aurApp, Unit* caster);
|
||||
void PeriodicTick(AuraApplication * aurApp, Unit* caster) const;
|
||||
|
||||
void HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo);
|
||||
|
||||
@@ -285,10 +285,10 @@ class AuraEffect
|
||||
void HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicDamageAurasTick(Unit* target, Unit* caster);
|
||||
void HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster);
|
||||
void HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicHealAurasTick(Unit* target, Unit* caster);
|
||||
void HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandleObsModPowerAuraTick(Unit* target, Unit* caster) const;
|
||||
void HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) const;
|
||||
|
||||
@@ -1213,7 +1213,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
|
||||
if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 3790, 1))
|
||||
{
|
||||
uint32 damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), DOT);
|
||||
damage = target->SpellDamageBonusTaken(GetSpellInfo(), damage, DOT);
|
||||
damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT);
|
||||
int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * int32(damage) / 100;
|
||||
int32 heal = int32(CalculatePctN(basepoints0, 15));
|
||||
|
||||
@@ -1228,7 +1228,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
|
||||
if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 3021, 1))
|
||||
{
|
||||
uint32 damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), HEAL);
|
||||
damage = target->SpellHealingBonusTaken(GetSpellInfo(), damage, HEAL);
|
||||
damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, HEAL);
|
||||
|
||||
int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * int32(damage) / 100;
|
||||
caster->CastCustomSpell(target, 63544, &basepoints0, NULL, NULL, true, NULL, GetEffect(0));
|
||||
|
||||
@@ -2466,9 +2466,10 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
|
||||
caster->ToPlayer()->CastItemCombatSpell(unitTarget, m_attackType, procVictim, procEx);
|
||||
}
|
||||
|
||||
caster->DealSpellDamage(&damageInfo, true);
|
||||
|
||||
m_damage = damageInfo.damage;
|
||||
|
||||
caster->DealSpellDamage(&damageInfo, true);
|
||||
}
|
||||
// Passive spell hits/misses or active spells only misses (only triggers)
|
||||
else
|
||||
@@ -2489,7 +2490,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
|
||||
}
|
||||
}
|
||||
|
||||
if (missInfo != SPELL_MISS_EVADE && m_caster && !m_caster->IsFriendlyTo(unit) && !m_spellInfo->IsPositive())
|
||||
if (missInfo != SPELL_MISS_EVADE && m_caster && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)))
|
||||
{
|
||||
m_caster->CombatStart(unit, !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO));
|
||||
|
||||
@@ -3412,6 +3413,20 @@ void Spell::_handle_immediate_phase()
|
||||
// process items
|
||||
for (std::list<ItemTargetInfo>::iterator ihit= m_UniqueItemInfo.begin(); ihit != m_UniqueItemInfo.end(); ++ihit)
|
||||
DoAllEffectOnTarget(&(*ihit));
|
||||
|
||||
if (!m_originalCaster)
|
||||
return;
|
||||
// Handle procs on cast
|
||||
// TODO: finish new proc system:P
|
||||
if (m_UniqueTargetInfo.empty() && m_targets.HasDst())
|
||||
{
|
||||
uint32 procAttacker = m_procAttacker;
|
||||
if (!procAttacker)
|
||||
procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS;
|
||||
|
||||
// Proc the spells that have DEST target
|
||||
m_originalCaster->ProcDamageAndSpell(NULL, procAttacker, 0, m_procEx | PROC_EX_NORMAL_HIT, 0, BASE_ATTACK, m_spellInfo, m_triggeredByAuraSpell);
|
||||
}
|
||||
}
|
||||
|
||||
void Spell::_handle_finish_phase()
|
||||
@@ -4947,17 +4962,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||
{
|
||||
case SPELL_EFFECT_DUMMY:
|
||||
{
|
||||
if (m_spellInfo->Id == 51582) // Rocket Boots Engaged
|
||||
{
|
||||
if (m_caster->IsInWater())
|
||||
return SPELL_FAILED_ONLY_ABOVEWATER;
|
||||
}
|
||||
else if (m_spellInfo->Id == 52264) // Deliver Stolen Horse
|
||||
{
|
||||
if (!m_caster->FindNearestCreature(28653, 5))
|
||||
return SPELL_FAILED_OUT_OF_RANGE;
|
||||
}
|
||||
else if (m_spellInfo->Id == 31789) // Righteous Defense
|
||||
if (m_spellInfo->Id == 31789) // Righteous Defense
|
||||
{
|
||||
if (m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
|
||||
@@ -446,7 +446,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
|
||||
{
|
||||
uint32 pdamage = uint32(std::max(aura->GetAmount(), 0));
|
||||
pdamage = m_caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount());
|
||||
pdamage = unitTarget->SpellDamageBonusTaken(aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount());
|
||||
pdamage = unitTarget->SpellDamageBonusTaken(m_caster, aura->GetSpellInfo(), pdamage, DOT, aura->GetBase()->GetStackAmount());
|
||||
uint32 pct_dir = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, (effIndex + 1));
|
||||
uint8 baseTotalTicks = uint8(m_caster->CalcSpellDuration(aura->GetSpellInfo()) / aura->GetSpellInfo()->Effects[EFFECT_0].Amplitude);
|
||||
damage += int32(CalculatePctU(pdamage * baseTotalTicks, pct_dir));
|
||||
@@ -485,7 +485,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
|
||||
if (m_spellInfo->SpellFamilyFlags[1] & 0x2)
|
||||
{
|
||||
int32 back_damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE);
|
||||
back_damage = unitTarget->SpellDamageBonusTaken(m_spellInfo, (uint32)back_damage, SPELL_DIRECT_DAMAGE);
|
||||
back_damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, (uint32)back_damage, SPELL_DIRECT_DAMAGE);
|
||||
// Pain and Suffering reduces damage
|
||||
if (AuraEffect* aurEff = m_caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 2874, 0))
|
||||
AddPctN(back_damage, -aurEff->GetAmount());
|
||||
@@ -694,7 +694,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
|
||||
if (m_originalCaster && damage > 0 && apply_direct_bonus)
|
||||
{
|
||||
damage = m_originalCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = unitTarget->SpellDamageBonusTaken(m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE);
|
||||
damage = unitTarget->SpellDamageBonusTaken(m_originalCaster, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE);
|
||||
}
|
||||
|
||||
m_damage += damage;
|
||||
@@ -1375,7 +1375,7 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex)
|
||||
|
||||
// add spell damage bonus
|
||||
damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE);
|
||||
damage = unitTarget->SpellDamageBonusTaken(m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE);
|
||||
damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE);
|
||||
|
||||
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
|
||||
int32 power = damage;
|
||||
@@ -1538,10 +1538,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/)
|
||||
|
||||
int32 tickheal = targetAura->GetAmount();
|
||||
if (Unit* auraCaster = targetAura->GetCaster())
|
||||
{
|
||||
tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT);
|
||||
tickheal = unitTarget->SpellHealingBonusTaken(targetAura->GetSpellInfo(), tickheal, DOT);
|
||||
}
|
||||
//int32 tickheal = targetAura->GetSpellInfo()->EffectBasePoints[idx] + 1;
|
||||
//It is said that talent bonus should not be included
|
||||
|
||||
@@ -1562,12 +1559,12 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/)
|
||||
//addhealth += tickheal * tickcount;
|
||||
//addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth, HEAL, unitTarget);
|
||||
}
|
||||
// Glyph of Nourish
|
||||
// Nourish
|
||||
else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags[1] & 0x2000000)
|
||||
{
|
||||
addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL);
|
||||
addhealth = unitTarget->SpellHealingBonusTaken(m_spellInfo, addhealth, HEAL);
|
||||
|
||||
// Glyph of Nourish
|
||||
if (AuraEffect const* aurEff = m_caster->GetAuraEffect(62971, 0))
|
||||
{
|
||||
Unit::AuraEffectList const& Periodic = unitTarget->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HEAL);
|
||||
@@ -1584,7 +1581,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/)
|
||||
else
|
||||
addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL);
|
||||
|
||||
addhealth = unitTarget->SpellHealingBonusTaken(m_spellInfo, addhealth, HEAL);
|
||||
addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL);
|
||||
|
||||
// Remove Grievious bite if fully healed
|
||||
if (unitTarget->HasAura(48920) && (unitTarget->GetHealth() + addhealth >= unitTarget->GetMaxHealth()))
|
||||
@@ -1611,7 +1608,7 @@ void Spell::EffectHealPct(SpellEffIndex /*effIndex*/)
|
||||
return;
|
||||
|
||||
uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL);
|
||||
heal = unitTarget->SpellHealingBonusTaken(m_spellInfo, heal, HEAL);
|
||||
heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL);
|
||||
|
||||
m_healing += heal;
|
||||
}
|
||||
@@ -1630,7 +1627,7 @@ void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/)
|
||||
|
||||
uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL);
|
||||
|
||||
m_healing += unitTarget->SpellHealingBonusTaken(m_spellInfo, heal, HEAL);;
|
||||
m_healing += unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL);
|
||||
}
|
||||
|
||||
void Spell::EffectHealthLeech(SpellEffIndex effIndex)
|
||||
@@ -1642,7 +1639,7 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex)
|
||||
return;
|
||||
|
||||
damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE);
|
||||
damage = unitTarget->SpellDamageBonusTaken(m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE);
|
||||
damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE);
|
||||
|
||||
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "HealthLeech :%i", damage);
|
||||
|
||||
@@ -1655,7 +1652,7 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex)
|
||||
if (m_caster->isAlive())
|
||||
{
|
||||
healthGain = m_caster->SpellHealingBonusDone(m_caster, m_spellInfo, healthGain, HEAL);
|
||||
healthGain = m_caster->SpellHealingBonusTaken(m_spellInfo, healthGain, HEAL);
|
||||
healthGain = m_caster->SpellHealingBonusTaken(m_caster, m_spellInfo, healthGain, HEAL);
|
||||
|
||||
m_caster->HealBySpell(m_caster, m_spellInfo, uint32(healthGain));
|
||||
}
|
||||
@@ -3520,8 +3517,8 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
|
||||
|
||||
// Add melee damage bonuses (also check for negative)
|
||||
uint32 damage = m_caster->MeleeDamageBonusDone(unitTarget, eff_damage, m_attackType, m_spellInfo);
|
||||
|
||||
m_damage += unitTarget->MeleeDamageBonusTaken(damage, m_attackType, m_spellInfo);
|
||||
|
||||
m_damage += unitTarget->MeleeDamageBonusTaken(m_caster, damage, m_attackType, m_spellInfo);
|
||||
}
|
||||
|
||||
void Spell::EffectThreat(SpellEffIndex /*effIndex*/)
|
||||
@@ -3546,7 +3543,7 @@ void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/)
|
||||
if (!unitTarget || !unitTarget->isAlive())
|
||||
return;
|
||||
|
||||
int32 addhealth;
|
||||
int32 addhealth = 0;
|
||||
|
||||
// damage == 0 - heal for caster max health
|
||||
if (damage == 0)
|
||||
@@ -3554,11 +3551,7 @@ void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/)
|
||||
else
|
||||
addhealth = unitTarget->GetMaxHealth() - unitTarget->GetHealth();
|
||||
|
||||
if (m_originalCaster)
|
||||
{
|
||||
uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL);
|
||||
m_healing += unitTarget->SpellHealingBonusTaken(m_spellInfo, heal, HEAL);
|
||||
}
|
||||
m_healing += addhealth;
|
||||
}
|
||||
|
||||
void Spell::EffectInterruptCast(SpellEffIndex effIndex)
|
||||
|
||||
@@ -351,7 +351,7 @@ bool SpellEffectInfo::IsEffect() const
|
||||
|
||||
bool SpellEffectInfo::IsEffect(SpellEffects effectName) const
|
||||
{
|
||||
return Effect == effectName;
|
||||
return Effect == uint32(effectName);
|
||||
}
|
||||
|
||||
bool SpellEffectInfo::IsAura() const
|
||||
@@ -1982,22 +1982,20 @@ uint32 SpellInfo::GetMaxTicks() const
|
||||
if (DotDuration > 30000)
|
||||
DotDuration = 30000;
|
||||
|
||||
uint8 x = 0;
|
||||
for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
|
||||
for (uint8 x = 0; x < MAX_SPELL_EFFECTS; x++)
|
||||
{
|
||||
if (Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && (
|
||||
Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
|
||||
Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_HEAL ||
|
||||
Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
|
||||
{
|
||||
x = j;
|
||||
break;
|
||||
}
|
||||
if (Effects[x].Effect == SPELL_EFFECT_APPLY_AURA)
|
||||
switch (Effects[x].ApplyAuraName)
|
||||
{
|
||||
case SPELL_AURA_PERIODIC_DAMAGE:
|
||||
case SPELL_AURA_PERIODIC_HEAL:
|
||||
case SPELL_AURA_PERIODIC_LEECH:
|
||||
if (Effects[x].Amplitude != 0)
|
||||
return DotDuration / Effects[x].Amplitude;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Effects[x].Amplitude != 0)
|
||||
return DotDuration / Effects[x].Amplitude;
|
||||
|
||||
return 6;
|
||||
}
|
||||
|
||||
|
||||
@@ -555,7 +555,7 @@ public:
|
||||
|
||||
creature->AI()->SetData(data_1, data_2);
|
||||
std::string AIorScript = creature->GetAIName() != "" ? "AI type: " + creature->GetAIName() : (creature->GetScriptName() != "" ? "Script Name: " + creature->GetScriptName() : "No AI or Script Name Set");
|
||||
handler->PSendSysMessage(LANG_NPC_SETDATA, creature->GetGUID(), creature->GetEntry(), creature->GetName(), data_1, data_2, AIorScript);
|
||||
handler->PSendSysMessage(LANG_NPC_SETDATA, creature->GetGUID(), creature->GetEntry(), creature->GetName(), data_1, data_2, AIorScript.c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,8 @@ enum Data
|
||||
DATA_WARCHIEF_REND_BLACKHAND,
|
||||
DATA_GYTH,
|
||||
DATA_THE_BEAST,
|
||||
DATA_GENERAL_DRAKKISATH
|
||||
DATA_GENERAL_DRAKKISATH,
|
||||
DATA_DRAGONSPIRE_ROOM,
|
||||
};
|
||||
enum Npc
|
||||
{
|
||||
@@ -51,17 +52,51 @@ enum Npc
|
||||
NPC_GYTH = 10339,
|
||||
NPC_THE_BEAST = 10430,
|
||||
NPC_GENERAL_DRAKKISATH = 10363,
|
||||
NPC_BLACKHAND_DREADWEAVER = 9817,
|
||||
NPC_BLACKHAND_SUMMONER = 9818,
|
||||
NPC_BLACKHAND_VETERAN = 9819,
|
||||
};
|
||||
|
||||
enum AdditionalData
|
||||
{
|
||||
SPELL_SUMMON_ROOKERY_WHELP = 15745,
|
||||
MAX_ENCOUNTER = 14,
|
||||
MAX_DRAGONSPIRE_HALL_RUNES = 7,
|
||||
EVENT_PYROGUARD_EMBERSEER = 4884,
|
||||
AREATRIGGER_ENTER_UBRS = 2046,
|
||||
AREATRIGGER_STADIUM = 2026,
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
{
|
||||
GO_WHELP_SPAWNER = 175622, //trap spawned by go id 175124
|
||||
GO_WHELP_SPAWNER = 175622, // trap spawned by go id 175124
|
||||
|
||||
// Doors
|
||||
GO_EMBERSEER_IN = 175244, // First door to Pyroguard Emberseer
|
||||
GO_DOORS = 175705, // Second door to Pyroguard Emberseer
|
||||
GO_EMBERSEER_OUT = 175153, // Door after Pyroguard Emberseer event
|
||||
GO_GYTH_ENTRY_DOOR = 164726,
|
||||
GO_GYTH_COMBAT_DOOR = 175185,
|
||||
GO_GYTH_EXIT_DOOR = 175186,
|
||||
GO_DRAKKISATH_DOOR_1 = 175946,
|
||||
GO_DRAKKISATH_DOOR_2 = 175947,
|
||||
|
||||
// Runes
|
||||
GO_ROOM_1_RUNE = 175197,
|
||||
GO_ROOM_2_RUNE = 175199,
|
||||
GO_ROOM_3_RUNE = 175195,
|
||||
GO_ROOM_4_RUNE = 175200,
|
||||
GO_ROOM_5_RUNE = 175198,
|
||||
GO_ROOM_6_RUNE = 175196,
|
||||
GO_ROOM_7_RUNE = 175194,
|
||||
|
||||
GO_EMBERSEER_RUNE_1 = 175266,
|
||||
GO_EMBERSEER_RUNE_2 = 175267,
|
||||
GO_EMBERSEER_RUNE_3 = 175268,
|
||||
GO_EMBERSEER_RUNE_4 = 175269,
|
||||
GO_EMBERSEER_RUNE_5 = 175270,
|
||||
GO_EMBERSEER_RUNE_6 = 175271,
|
||||
GO_EMBERSEER_RUNE_7 = 175272,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -20,11 +20,24 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
enum Text
|
||||
{
|
||||
EMOTE_ONE_STACK = 0,
|
||||
EMOTE_TEN_STACK = 1,
|
||||
EMOTE_FREE_OF_BONDS = 2,
|
||||
YELL_FREE_OF_BONDS = 3,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FIRENOVA = 23462,
|
||||
SPELL_FLAMEBUFFET = 23341,
|
||||
SPELL_PYROBLAST = 17274,
|
||||
SPELL_ENCAGED_EMBERSEER = 15282, // Self on spawn
|
||||
SPELL_FIRE_SHIELD_TRIGGER = 13377, // Self on spawn missing from 335 dbc
|
||||
SPELL_FREEZE_ANIM = 16245, // Self on event start
|
||||
SPELL_EMBERSEER_GROWING = 16048, // Self on event start
|
||||
SPELL_EMBERSEER_FULL_STRENGTH = 16047, // Emberseer Full Strength
|
||||
SPELL_FIRENOVA = 23462, // Combat
|
||||
SPELL_FLAMEBUFFET = 23341, // Combat
|
||||
SPELL_PYROBLAST = 17274, // Combat
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -51,6 +64,12 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if(instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS)
|
||||
OpenDoors(false);
|
||||
instance->SetBossState(DATA_PYROGAURD_EMBERSEER,NOT_STARTED);
|
||||
// respawn any dead Blackhand Incarcerators
|
||||
DoCast(me, SPELL_ENCAGED_EMBERSEER);
|
||||
//DoCast(me, SPELL_FIRE_SHIELD_TRIGGER);
|
||||
_Reset();
|
||||
}
|
||||
|
||||
@@ -64,12 +83,26 @@ public:
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
instance->SetBossState(DATA_PYROGAURD_EMBERSEER,DONE);
|
||||
OpenDoors(true);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void OpenDoors(bool Boss_Killed)
|
||||
{
|
||||
if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN)))
|
||||
door1->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS)))
|
||||
door2->SetGoState(GO_STATE_ACTIVE);
|
||||
if (Boss_Killed)
|
||||
if (GameObject* door3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_OUT)))
|
||||
door3->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
@@ -49,6 +49,12 @@ public:
|
||||
uint64 Gyth;
|
||||
uint64 TheBeast;
|
||||
uint64 GeneralDrakkisath;
|
||||
uint64 go_emberseerin;
|
||||
uint64 go_doors;
|
||||
uint64 go_emberseerout;
|
||||
uint64 go_roomrunes[MAX_DRAGONSPIRE_HALL_RUNES];
|
||||
uint8 Runemaxprotectors[MAX_DRAGONSPIRE_HALL_RUNES];
|
||||
uint8 Runeprotectorsdead[MAX_DRAGONSPIRE_HALL_RUNES];
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
@@ -67,6 +73,9 @@ public:
|
||||
Gyth = 0;
|
||||
TheBeast = 0;
|
||||
GeneralDrakkisath = 0;
|
||||
go_emberseerin = 0;
|
||||
go_doors = 0;
|
||||
go_emberseerout = 0;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
@@ -125,7 +134,11 @@ public:
|
||||
case NPC_GENERAL_DRAKKISATH:
|
||||
GeneralDrakkisath = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
case NPC_BLACKHAND_DREADWEAVER:
|
||||
case NPC_BLACKHAND_SUMMONER:
|
||||
case NPC_BLACKHAND_VETERAN:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
@@ -135,6 +148,36 @@ public:
|
||||
case GO_WHELP_SPAWNER:
|
||||
go->CastSpell(NULL, SPELL_SUMMON_ROOKERY_WHELP);
|
||||
break;
|
||||
case GO_EMBERSEER_IN:
|
||||
go_emberseerin = go->GetGUID();
|
||||
break;
|
||||
case GO_DOORS:
|
||||
go_doors = go->GetGUID();
|
||||
break;
|
||||
case GO_EMBERSEER_OUT:
|
||||
go_emberseerout = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_1_RUNE:
|
||||
go_roomrunes[0] = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_2_RUNE:
|
||||
go_roomrunes[1] = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_3_RUNE:
|
||||
go_roomrunes[2] = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_4_RUNE:
|
||||
go_roomrunes[3] = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_5_RUNE:
|
||||
go_roomrunes[4] = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_6_RUNE:
|
||||
go_roomrunes[5] = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_7_RUNE:
|
||||
go_roomrunes[6] = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,6 +210,18 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PYROGUARD_EMBERSEER:
|
||||
SetBossState(DATA_PYROGAURD_EMBERSEER,IN_PROGRESS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type)
|
||||
{
|
||||
switch (type)
|
||||
@@ -199,6 +254,26 @@ public:
|
||||
return TheBeast;
|
||||
case DATA_GENERAL_DRAKKISATH:
|
||||
return GeneralDrakkisath;
|
||||
case GO_EMBERSEER_IN:
|
||||
return go_emberseerin;
|
||||
case GO_DOORS:
|
||||
return go_doors;
|
||||
case GO_EMBERSEER_OUT:
|
||||
return go_emberseerout;
|
||||
case GO_ROOM_1_RUNE:
|
||||
return go_roomrunes[0];
|
||||
case GO_ROOM_2_RUNE:
|
||||
return go_roomrunes[1];
|
||||
case GO_ROOM_3_RUNE:
|
||||
return go_roomrunes[2];
|
||||
case GO_ROOM_4_RUNE:
|
||||
return go_roomrunes[3];
|
||||
case GO_ROOM_5_RUNE:
|
||||
return go_roomrunes[4];
|
||||
case GO_ROOM_6_RUNE:
|
||||
return go_roomrunes[5];
|
||||
case GO_ROOM_7_RUNE:
|
||||
return go_roomrunes[6];
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -184,7 +184,7 @@ public:
|
||||
{
|
||||
if (Unit* victim = me->getVictim())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_BLACK_ARROW);
|
||||
DoCast(victim, SPELL_BLACK_ARROW);
|
||||
BlackArrowTimer = 15000 + rand()%5000;
|
||||
}
|
||||
} else BlackArrowTimer -= diff;
|
||||
@@ -193,7 +193,7 @@ public:
|
||||
{
|
||||
if (Unit* victim = me->getVictim())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SHOT);
|
||||
DoCast(victim, SPELL_SHOT);
|
||||
ShotTimer = 8000 + rand()%2000;
|
||||
}
|
||||
} else ShotTimer -= diff;
|
||||
@@ -202,7 +202,7 @@ public:
|
||||
{
|
||||
if (Unit* victim = me->getVictim())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MULTI_SHOT);
|
||||
DoCast(victim, SPELL_MULTI_SHOT);
|
||||
MultiShotTimer = 10000 + rand()%3000;
|
||||
}
|
||||
} else MultiShotTimer -= diff;
|
||||
|
||||
@@ -28,7 +28,8 @@ npc_torek
|
||||
npc_ruul_snowhoof
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
|
||||
/*####
|
||||
@@ -78,32 +79,31 @@ class npc_torek : public CreatureScript
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 1:
|
||||
Talk(SAY_MOVE, player->GetGUID());
|
||||
break;
|
||||
case 8:
|
||||
Talk(SAY_PREPARE, player->GetGUID());
|
||||
break;
|
||||
case 19:
|
||||
//TODO: verify location and creatures amount.
|
||||
me->SummonCreature(ENTRY_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(ENTRY_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(ENTRY_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
break;
|
||||
case 20:
|
||||
DoScriptText(SAY_WIN, me, player);
|
||||
Completed = true;
|
||||
player->GroupEventHappens(QUEST_TOREK_ASSULT, me);
|
||||
break;
|
||||
case 21:
|
||||
Talk(SAY_END, player->GetGUID());
|
||||
break;
|
||||
switch (waypointId)
|
||||
{
|
||||
case 1:
|
||||
Talk(SAY_MOVE, player->GetGUID());
|
||||
break;
|
||||
case 8:
|
||||
Talk(SAY_PREPARE, player->GetGUID());
|
||||
break;
|
||||
case 19:
|
||||
//TODO: verify location and creatures amount.
|
||||
me->SummonCreature(ENTRY_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(ENTRY_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(ENTRY_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
break;
|
||||
case 20:
|
||||
DoScriptText(SAY_WIN, me, player);
|
||||
Completed = true;
|
||||
player->GroupEventHappens(QUEST_TOREK_ASSULT, me);
|
||||
break;
|
||||
case 21:
|
||||
Talk(SAY_END, player->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,8 +169,26 @@ class npc_torek : public CreatureScript
|
||||
# npc_ruul_snowhoof
|
||||
####*/
|
||||
|
||||
#define QUEST_FREEDOM_TO_RUUL 6482
|
||||
#define GO_CAGE 178147
|
||||
enum RuulSnowhoof
|
||||
{
|
||||
NPC_THISTLEFUR_URSA = 3921,
|
||||
NPC_THISTLEFUR_TOTEMIC = 3922,
|
||||
NPC_THISTLEFUR_PATHFINDER = 3926,
|
||||
|
||||
QUEST_FREEDOM_TO_RUUL = 6482,
|
||||
|
||||
GO_CAGE = 178147
|
||||
};
|
||||
|
||||
Position const RuulSnowhoofSummonsCoord[6] =
|
||||
{
|
||||
{3449.218018f, -587.825073f, 174.978867f, 4.714445f},
|
||||
{3446.384521f, -587.830872f, 175.186279f, 4.714445f},
|
||||
{3444.218994f, -587.835327f, 175.380600f, 4.714445f},
|
||||
{3508.344482f, -492.024261f, 186.929031f, 4.145029f},
|
||||
{3506.265625f, -490.531006f, 186.740128f, 4.239277f},
|
||||
{3503.682373f, -489.393799f, 186.629684f, 4.349232f}
|
||||
};
|
||||
|
||||
class npc_ruul_snowhoof : public CreatureScript
|
||||
{
|
||||
@@ -195,14 +213,14 @@ class npc_ruul_snowhoof : public CreatureScript
|
||||
Cage->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case 13:
|
||||
me->SummonCreature(3922, 3449.218018f, -587.825073f, 174.978867f, 4.714445f, TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(3921, 3446.384521f, -587.830872f, 175.186279f, 4.714445f, TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(3926, 3444.218994f, -587.835327f, 175.380600f, 4.714445f, TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[0], TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[1], TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[2], TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
break;
|
||||
case 19:
|
||||
me->SummonCreature(3922, 3508.344482f, -492.024261f, 186.929031f, 4.145029f, TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(3921, 3506.265625f, -490.531006f, 186.740128f, 4.239277f, TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(3926, 3503.682373f, -489.393799f, 186.629684f, 4.349232f, TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[3], TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[4], TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[5], TEMPSUMMON_DEAD_DESPAWN, 60000);
|
||||
break;
|
||||
case 21:
|
||||
player->GroupEventHappens(QUEST_FREEDOM_TO_RUUL, me);
|
||||
@@ -214,8 +232,7 @@ class npc_ruul_snowhoof : public CreatureScript
|
||||
|
||||
void Reset()
|
||||
{
|
||||
GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20);
|
||||
if (Cage)
|
||||
if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20))
|
||||
Cage->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
@@ -249,7 +266,7 @@ class npc_ruul_snowhoof : public CreatureScript
|
||||
}
|
||||
};
|
||||
|
||||
enum eEnums
|
||||
enum Muglash
|
||||
{
|
||||
SAY_MUG_START1 = -1800054,
|
||||
SAY_MUG_START2 = -1800055,
|
||||
@@ -278,21 +295,21 @@ enum eEnums
|
||||
NPC_MUGLASH = 12717
|
||||
};
|
||||
|
||||
static float m_afFirstNagaCoord[3][3]=
|
||||
Position const FirstNagaCoord[3] =
|
||||
{
|
||||
{3603.504150f, 1122.631104f, 1.635f}, // rider
|
||||
{3589.293945f, 1148.664063f, 5.565f}, // sorceress
|
||||
{3609.925537f, 1168.759521f, -1.168f} // razortail
|
||||
{3603.504150f, 1122.631104f, 1.635f, 0.0f}, // rider
|
||||
{3589.293945f, 1148.664063f, 5.565f, 0.0f}, // sorceress
|
||||
{3609.925537f, 1168.759521f, -1.168f, 0.0f} // razortail
|
||||
};
|
||||
|
||||
static float m_afSecondNagaCoord[3][3]=
|
||||
Position const SecondNagaCoord[3] =
|
||||
{
|
||||
{3609.925537f, 1168.759521f, -1.168f}, // witch
|
||||
{3645.652100f, 1139.425415f, 1.322f}, // priest
|
||||
{3583.602051f, 1128.405762f, 2.347f} // myrmidon
|
||||
{3609.925537f, 1168.759521f, -1.168f, 0.0f}, // witch
|
||||
{3645.652100f, 1139.425415f, 1.322f, 0.0f}, // priest
|
||||
{3583.602051f, 1128.405762f, 2.347f, 0.0f} // myrmidon
|
||||
};
|
||||
|
||||
static float m_fVorshaCoord[]={3633.056885f, 1172.924072f, -5.388f};
|
||||
Position const VorshaCoord = {3633.056885f, 1172.924072f, -5.388f, 0.0f};
|
||||
|
||||
class npc_muglash : public CreatureScript
|
||||
{
|
||||
@@ -303,9 +320,9 @@ class npc_muglash : public CreatureScript
|
||||
{
|
||||
npc_muglashAI(Creature* creature) : npc_escortAI(creature) { }
|
||||
|
||||
uint32 m_uiWaveId;
|
||||
uint32 m_uiEventTimer;
|
||||
bool m_bIsBrazierExtinguished;
|
||||
uint8 WaveId;
|
||||
uint32 EventTimer;
|
||||
bool IsBrazierExtinguished;
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
{
|
||||
@@ -314,34 +331,33 @@ class npc_muglash : public CreatureScript
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 0:
|
||||
if (player)
|
||||
switch (waypointId)
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(SAY_MUG_START2, me, player);
|
||||
break;
|
||||
case 24:
|
||||
if (player)
|
||||
break;
|
||||
case 24:
|
||||
DoScriptText(SAY_MUG_BRAZIER, me, player);
|
||||
|
||||
if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE*2))
|
||||
{
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
SetEscortPaused(true);
|
||||
}
|
||||
break;
|
||||
case 25:
|
||||
DoScriptText(SAY_MUG_GRATITUDE, me);
|
||||
player->GroupEventHappens(QUEST_VORSHA, me);
|
||||
break;
|
||||
case 26:
|
||||
DoScriptText(SAY_MUG_PATROL, me);
|
||||
break;
|
||||
case 27:
|
||||
DoScriptText(SAY_MUG_RETURN, me);
|
||||
break;
|
||||
if (GameObject* go = GetClosestGameObjectWithEntry(me, GO_NAGA_BRAZIER, INTERACTION_DISTANCE*2))
|
||||
{
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
SetEscortPaused(true);
|
||||
}
|
||||
break;
|
||||
case 25:
|
||||
DoScriptText(SAY_MUG_GRATITUDE, me);
|
||||
player->GroupEventHappens(QUEST_VORSHA, me);
|
||||
break;
|
||||
case 26:
|
||||
DoScriptText(SAY_MUG_PATROL, me);
|
||||
break;
|
||||
case 27:
|
||||
DoScriptText(SAY_MUG_RETURN, me);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,9 +374,9 @@ class npc_muglash : public CreatureScript
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiEventTimer = 10000;
|
||||
m_uiWaveId = 0;
|
||||
m_bIsBrazierExtinguished = false;
|
||||
EventTimer = 10000;
|
||||
WaveId = 0;
|
||||
IsBrazierExtinguished = false;
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
@@ -372,20 +388,20 @@ class npc_muglash : public CreatureScript
|
||||
|
||||
void DoWaveSummon()
|
||||
{
|
||||
switch (m_uiWaveId)
|
||||
switch (WaveId)
|
||||
{
|
||||
case 1:
|
||||
me->SummonCreature(NPC_WRATH_RIDER, m_afFirstNagaCoord[0][0], m_afFirstNagaCoord[0][1], m_afFirstNagaCoord[0][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_SORCERESS, m_afFirstNagaCoord[1][0], m_afFirstNagaCoord[1][1], m_afFirstNagaCoord[1][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_RAZORTAIL, m_afFirstNagaCoord[2][0], m_afFirstNagaCoord[2][1], m_afFirstNagaCoord[2][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_RIDER, FirstNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_SORCERESS, FirstNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_RAZORTAIL, FirstNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
break;
|
||||
case 2:
|
||||
me->SummonCreature(NPC_WRATH_PRIESTESS, m_afSecondNagaCoord[0][0], m_afSecondNagaCoord[0][1], m_afSecondNagaCoord[0][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_MYRMIDON, m_afSecondNagaCoord[1][0], m_afSecondNagaCoord[1][1], m_afSecondNagaCoord[1][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_SEAWITCH, m_afSecondNagaCoord[2][0], m_afSecondNagaCoord[2][1], m_afSecondNagaCoord[2][2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_PRIESTESS, SecondNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_MYRMIDON, SecondNagaCoord[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_WRATH_SEAWITCH, SecondNagaCoord[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
break;
|
||||
case 3:
|
||||
me->SummonCreature(NPC_VORSHA, m_fVorshaCoord[0], m_fVorshaCoord[1], m_fVorshaCoord[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
me->SummonCreature(NPC_VORSHA, VorshaCoord, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
break;
|
||||
case 4:
|
||||
SetEscortPaused(false);
|
||||
@@ -400,16 +416,16 @@ class npc_muglash : public CreatureScript
|
||||
|
||||
if (!me->getVictim())
|
||||
{
|
||||
if (HasEscortState(STATE_ESCORT_PAUSED) && m_bIsBrazierExtinguished)
|
||||
if (HasEscortState(STATE_ESCORT_PAUSED) && IsBrazierExtinguished)
|
||||
{
|
||||
if (m_uiEventTimer < uiDiff)
|
||||
if (EventTimer < uiDiff)
|
||||
{
|
||||
++m_uiWaveId;
|
||||
++WaveId;
|
||||
DoWaveSummon();
|
||||
m_uiEventTimer = 10000;
|
||||
EventTimer = 10000;
|
||||
}
|
||||
else
|
||||
m_uiEventTimer -= uiDiff;
|
||||
EventTimer -= uiDiff;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -451,7 +467,7 @@ class go_naga_brazier : public GameObjectScript
|
||||
{
|
||||
DoScriptText(SAY_MUG_BRAZIER_WAIT, creature);
|
||||
|
||||
pEscortAI->m_bIsBrazierExtinguished = true;
|
||||
pEscortAI->IsBrazierExtinguished = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,9 +30,9 @@ mob_rizzle_sprysprocket
|
||||
mob_depth_charge
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "World.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## mobs_spitelashes
|
||||
@@ -179,9 +179,12 @@ public:
|
||||
# mob_rizzle_sprysprocket
|
||||
####*/
|
||||
|
||||
enum eRizzleSprysprocketData
|
||||
enum RizzleSprysprocketData
|
||||
{
|
||||
QUEST_CHASING_THE_MOONSTONE = 10994,
|
||||
|
||||
MOB_DEPTH_CHARGE = 23025,
|
||||
|
||||
SPELL_RIZZLE_BLACKJACK = 39865,
|
||||
SPELL_RIZZLE_ESCAPE = 39871,
|
||||
SPELL_RIZZLE_FROST_GRENADE = 40525,
|
||||
@@ -199,67 +202,66 @@ enum eRizzleSprysprocketData
|
||||
|
||||
#define GOSSIP_GET_MOONSTONE "Hand over the Southfury moonstone and I'll let you go."
|
||||
|
||||
float WPs[58][4] =
|
||||
Position const WPs[58] =
|
||||
{
|
||||
//pos_x pos_y pos_z orien
|
||||
{3691.97f, -3962.41f, 35.9118f, 3.67f},
|
||||
{3675.02f, -3960.49f, 35.9118f, 3.67f},
|
||||
{3653.19f, -3958.33f, 33.9118f, 3.59f},
|
||||
{3621.12f, -3958.51f, 29.9118f, 3.48f},
|
||||
{3604.86f, -3963, 29.9118f, 3.48f},
|
||||
{3569.94f, -3970.25f, 29.9118f, 3.44f},
|
||||
{3541.03f, -3975.64f, 29.9118f, 3.41f},
|
||||
{3510.84f, -3978.71f, 29.9118f, 3.41f},
|
||||
{3472.7f, -3997.07f, 29.9118f, 3.35f},
|
||||
{3439.15f, -4014.55f, 29.9118f, 3.29f},
|
||||
{3412.8f, -4025.87f, 29.9118f, 3.25f},
|
||||
{3384.95f, -4038.04f, 29.9118f, 3.24f},
|
||||
{3346.77f, -4052.93f, 29.9118f, 3.22f},
|
||||
{3299.56f, -4071.59f, 29.9118f, 3.20f},
|
||||
{3261.22f, -4080.38f, 30.9118f, 3.19f},
|
||||
{3220.68f, -4083.09f, 31.9118f, 3.18f},
|
||||
{3187.11f, -4070.45f, 33.9118f, 3.16f},
|
||||
{3162.78f, -4062.75f, 33.9118f, 3.15f},
|
||||
{3136.09f, -4050.32f, 33.9118f, 3.07f},
|
||||
{3119.47f, -4044.51f, 36.0363f, 3.07f},
|
||||
{3098.95f, -4019.8f, 33.9118f, 3.07f},
|
||||
{3073.07f, -4011.42f, 33.9118f, 3.07f},
|
||||
{3051.71f, -3993.37f, 33.9118f, 3.02f},
|
||||
{3027.52f, -3978.6f, 33.9118f, 3.00f},
|
||||
{3003.78f, -3960.14f, 33.9118f, 2.98f},
|
||||
{2977.99f, -3941.98f, 31.9118f, 2.96f},
|
||||
{2964.57f, -3932.07f, 30.9118f, 2.96f},
|
||||
{2947.9f, -3921.31f, 29.9118f, 2.96f},
|
||||
{2924.91f, -3910.8f, 29.9118f, 2.94f},
|
||||
{2903.04f, -3896.42f, 29.9118f, 2.93f},
|
||||
{2884.75f, -3874.03f, 29.9118f, 2.90f},
|
||||
{2868.19f, -3851.48f, 29.9118f, 2.82f},
|
||||
{2854.62f, -3819.72f, 29.9118f, 2.80f},
|
||||
{2825.53f, -3790.4f, 29.9118f, 2.744f},
|
||||
{2804.31f, -3773.05f, 29.9118f, 2.71f},
|
||||
{2769.78f, -3763.57f, 29.9118f, 2.70f},
|
||||
{2727.23f, -3745.92f, 30.9118f, 2.69f},
|
||||
{2680.12f, -3737.49f, 30.9118f, 2.67f},
|
||||
{2647.62f, -3739.94f, 30.9118f, 2.66f},
|
||||
{2616.6f, -3745.75f, 30.9118f, 2.64f},
|
||||
{2589.38f, -3731.97f, 30.9118f, 2.61f},
|
||||
{2562.94f, -3722.35f, 31.9118f, 2.56f},
|
||||
{2521.05f, -3716.6f, 31.9118f, 2.55f},
|
||||
{2485.26f, -3706.67f, 31.9118f, 2.51f},
|
||||
{2458.93f, -3696.67f, 31.9118f, 2.51f},
|
||||
{2432, -3692.03f, 31.9118f, 2.46f},
|
||||
{2399.59f, -3681.97f, 31.9118f, 2.45f},
|
||||
{2357.75f, -3666.6f, 31.9118f, 2.44f},
|
||||
{2311.99f, -3656.88f, 31.9118f, 2.94f},
|
||||
{2263.41f, -3649.55f, 31.9118f, 3.02f},
|
||||
{2209.05f, -3641.76f, 31.9118f, 2.99f},
|
||||
{2164.83f, -3637.64f, 31.9118f, 3.15f},
|
||||
{2122.42f, -3639, 31.9118f, 3.21f},
|
||||
{2075.73f, -3643.59f, 31.9118f, 3.22f},
|
||||
{2033.59f, -3649.52f, 31.9118f, 3.42f},
|
||||
{1985.22f, -3662.99f, 31.9118f, 3.42f},
|
||||
{1927.09f, -3679.56f, 33.9118f, 3.42f},
|
||||
{1873.57f, -3695.32f, 33.9118f, 3.44f}
|
||||
{3691.97f, -3962.41f, 35.9118f, 3.67f},
|
||||
{3675.02f, -3960.49f, 35.9118f, 3.67f},
|
||||
{3653.19f, -3958.33f, 33.9118f, 3.59f},
|
||||
{3621.12f, -3958.51f, 29.9118f, 3.48f},
|
||||
{3604.86f, -3963, 29.9118f, 3.48f},
|
||||
{3569.94f, -3970.25f, 29.9118f, 3.44f},
|
||||
{3541.03f, -3975.64f, 29.9118f, 3.41f},
|
||||
{3510.84f, -3978.71f, 29.9118f, 3.41f},
|
||||
{3472.7f, -3997.07f, 29.9118f, 3.35f},
|
||||
{3439.15f, -4014.55f, 29.9118f, 3.29f},
|
||||
{3412.8f, -4025.87f, 29.9118f, 3.25f},
|
||||
{3384.95f, -4038.04f, 29.9118f, 3.24f},
|
||||
{3346.77f, -4052.93f, 29.9118f, 3.22f},
|
||||
{3299.56f, -4071.59f, 29.9118f, 3.20f},
|
||||
{3261.22f, -4080.38f, 30.9118f, 3.19f},
|
||||
{3220.68f, -4083.09f, 31.9118f, 3.18f},
|
||||
{3187.11f, -4070.45f, 33.9118f, 3.16f},
|
||||
{3162.78f, -4062.75f, 33.9118f, 3.15f},
|
||||
{3136.09f, -4050.32f, 33.9118f, 3.07f},
|
||||
{3119.47f, -4044.51f, 36.0363f, 3.07f},
|
||||
{3098.95f, -4019.8f, 33.9118f, 3.07f},
|
||||
{3073.07f, -4011.42f, 33.9118f, 3.07f},
|
||||
{3051.71f, -3993.37f, 33.9118f, 3.02f},
|
||||
{3027.52f, -3978.6f, 33.9118f, 3.00f},
|
||||
{3003.78f, -3960.14f, 33.9118f, 2.98f},
|
||||
{2977.99f, -3941.98f, 31.9118f, 2.96f},
|
||||
{2964.57f, -3932.07f, 30.9118f, 2.96f},
|
||||
{2947.9f, -3921.31f, 29.9118f, 2.96f},
|
||||
{2924.91f, -3910.8f, 29.9118f, 2.94f},
|
||||
{2903.04f, -3896.42f, 29.9118f, 2.93f},
|
||||
{2884.75f, -3874.03f, 29.9118f, 2.90f},
|
||||
{2868.19f, -3851.48f, 29.9118f, 2.82f},
|
||||
{2854.62f, -3819.72f, 29.9118f, 2.80f},
|
||||
{2825.53f, -3790.4f, 29.9118f, 2.744f},
|
||||
{2804.31f, -3773.05f, 29.9118f, 2.71f},
|
||||
{2769.78f, -3763.57f, 29.9118f, 2.70f},
|
||||
{2727.23f, -3745.92f, 30.9118f, 2.69f},
|
||||
{2680.12f, -3737.49f, 30.9118f, 2.67f},
|
||||
{2647.62f, -3739.94f, 30.9118f, 2.66f},
|
||||
{2616.6f, -3745.75f, 30.9118f, 2.64f},
|
||||
{2589.38f, -3731.97f, 30.9118f, 2.61f},
|
||||
{2562.94f, -3722.35f, 31.9118f, 2.56f},
|
||||
{2521.05f, -3716.6f, 31.9118f, 2.55f},
|
||||
{2485.26f, -3706.67f, 31.9118f, 2.51f},
|
||||
{2458.93f, -3696.67f, 31.9118f, 2.51f},
|
||||
{2432, -3692.03f, 31.9118f, 2.46f},
|
||||
{2399.59f, -3681.97f, 31.9118f, 2.45f},
|
||||
{2357.75f, -3666.6f, 31.9118f, 2.44f},
|
||||
{2311.99f, -3656.88f, 31.9118f, 2.94f},
|
||||
{2263.41f, -3649.55f, 31.9118f, 3.02f},
|
||||
{2209.05f, -3641.76f, 31.9118f, 2.99f},
|
||||
{2164.83f, -3637.64f, 31.9118f, 3.15f},
|
||||
{2122.42f, -3639, 31.9118f, 3.21f},
|
||||
{2075.73f, -3643.59f, 31.9118f, 3.22f},
|
||||
{2033.59f, -3649.52f, 31.9118f, 3.42f},
|
||||
{1985.22f, -3662.99f, 31.9118f, 3.42f},
|
||||
{1927.09f, -3679.56f, 33.9118f, 3.42f},
|
||||
{1873.57f, -3695.32f, 33.9118f, 3.44f}
|
||||
};
|
||||
|
||||
class mob_rizzle_sprysprocket : public CreatureScript
|
||||
@@ -270,19 +272,19 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
|
||||
{
|
||||
player->PlayerTalkClass->ClearMenus();
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true);
|
||||
CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->Must_Die_Timer = 3000;
|
||||
CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->Must_Die = true;
|
||||
CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDieTimer = 3000;
|
||||
CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDie = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature)
|
||||
{
|
||||
if (player->GetQuestStatus(10994) != QUEST_STATUS_INCOMPLETE)
|
||||
if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE)
|
||||
return true;
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
player->SEND_GOSSIP_MENU(10811, creature->GetGUID());
|
||||
@@ -298,32 +300,32 @@ public:
|
||||
{
|
||||
mob_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 spellEscape_Timer;
|
||||
uint32 Teleport_Timer;
|
||||
uint32 Check_Timer;
|
||||
uint32 Grenade_Timer;
|
||||
uint32 Must_Die_Timer;
|
||||
uint32 SpellEscapeTimer;
|
||||
uint32 TeleportTimer;
|
||||
uint32 CheckTimer;
|
||||
uint32 GrenadeTimer;
|
||||
uint32 MustDieTimer;
|
||||
uint32 CurrWP;
|
||||
|
||||
uint64 PlayerGUID;
|
||||
|
||||
bool Must_Die;
|
||||
bool MustDie;
|
||||
bool Escape;
|
||||
bool ContinueWP;
|
||||
bool Reached;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
spellEscape_Timer = 1300;
|
||||
Teleport_Timer = 3500;
|
||||
Check_Timer = 10000;
|
||||
Grenade_Timer = 30000;
|
||||
Must_Die_Timer = 3000;
|
||||
SpellEscapeTimer = 1300;
|
||||
TeleportTimer = 3500;
|
||||
CheckTimer = 10000;
|
||||
GrenadeTimer = 30000;
|
||||
MustDieTimer = 3000;
|
||||
CurrWP = 0;
|
||||
|
||||
PlayerGUID = 0;
|
||||
|
||||
Must_Die = false;
|
||||
MustDie = false;
|
||||
Escape = false;
|
||||
ContinueWP = false;
|
||||
Reached = false;
|
||||
@@ -331,13 +333,13 @@ public:
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Must_Die)
|
||||
if (MustDie)
|
||||
{
|
||||
if (Must_Die_Timer <= diff)
|
||||
if (MustDieTimer <= diff)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
return;
|
||||
} else Must_Die_Timer -= diff;
|
||||
} else MustDieTimer -= diff;
|
||||
}
|
||||
|
||||
if (!Escape)
|
||||
@@ -345,17 +347,16 @@ public:
|
||||
if (!PlayerGUID)
|
||||
return;
|
||||
|
||||
if (spellEscape_Timer <= diff)
|
||||
if (SpellEscapeTimer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_RIZZLE_ESCAPE, false);
|
||||
spellEscape_Timer = 10000;
|
||||
} else spellEscape_Timer -= diff;
|
||||
SpellEscapeTimer = 10000;
|
||||
} else SpellEscapeTimer -= diff;
|
||||
|
||||
if (Teleport_Timer <= diff)
|
||||
if (TeleportTimer <= diff)
|
||||
{
|
||||
//temp solution - unit can't be teleported by core using spelleffect 5, only players
|
||||
Map* map = me->GetMap();
|
||||
if (map)
|
||||
if (me->GetMap())
|
||||
{
|
||||
me->SetPosition(3706.39f, -3969.15f, 35.9118f, 0);
|
||||
me->AI_SendMoveToPacket(3706.39f, -3969.15f, 35.9118f, 0, 0, 0);
|
||||
@@ -367,20 +368,20 @@ public:
|
||||
me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING);
|
||||
me->SetSpeed(MOVE_RUN, 0.85f, true);
|
||||
me->GetMotionMaster()->MovementExpired();
|
||||
me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]);
|
||||
me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]);
|
||||
Escape = true;
|
||||
} else Teleport_Timer -= diff;
|
||||
} else TeleportTimer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ContinueWP)
|
||||
{
|
||||
me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]);
|
||||
me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]);
|
||||
ContinueWP = false;
|
||||
}
|
||||
|
||||
if (Grenade_Timer <= diff)
|
||||
if (GrenadeTimer <= diff)
|
||||
{
|
||||
Player* player = Unit::GetPlayer(*me, PlayerGUID);
|
||||
if (player)
|
||||
@@ -388,10 +389,10 @@ public:
|
||||
DoScriptText(SAY_RIZZLE_GRENADE, me, player);
|
||||
DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true);
|
||||
}
|
||||
Grenade_Timer = 30000;
|
||||
} else Grenade_Timer -= diff;
|
||||
GrenadeTimer = 30000;
|
||||
} else GrenadeTimer -= diff;
|
||||
|
||||
if (Check_Timer <= diff)
|
||||
if (CheckTimer <= diff)
|
||||
{
|
||||
Player* player = Unit::GetPlayer(*me, PlayerGUID);
|
||||
if (!player)
|
||||
@@ -410,8 +411,8 @@ public:
|
||||
Reached = true;
|
||||
}
|
||||
|
||||
Check_Timer = 1000;
|
||||
} else Check_Timer -= diff;
|
||||
CheckTimer = 1000;
|
||||
} else CheckTimer -= diff;
|
||||
|
||||
}
|
||||
|
||||
@@ -427,7 +428,7 @@ public:
|
||||
if (!who || PlayerGUID)
|
||||
return;
|
||||
|
||||
if (who->GetTypeId() == TYPEID_PLAYER && CAST_PLR(who)->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE)
|
||||
if (who->GetTypeId() == TYPEID_PLAYER && CAST_PLR(who)->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
PlayerGUID = who->GetGUID();
|
||||
DoScriptText(SAY_RIZZLE_START, me);
|
||||
@@ -472,25 +473,25 @@ public:
|
||||
{
|
||||
mob_depth_chargeAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
bool we_must_die;
|
||||
uint32 must_die_timer;
|
||||
bool WeMustDie;
|
||||
uint32 WeMustDieTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
we_must_die = false;
|
||||
must_die_timer = 1000;
|
||||
WeMustDie = false;
|
||||
WeMustDieTimer = 1000;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (we_must_die)
|
||||
if (WeMustDie)
|
||||
{
|
||||
if (must_die_timer <= diff)
|
||||
{
|
||||
if (WeMustDieTimer <= diff)
|
||||
me->DespawnOrUnsummon();
|
||||
} else must_die_timer -= diff;
|
||||
else
|
||||
WeMustDieTimer -= diff;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -503,18 +504,14 @@ public:
|
||||
if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 5))
|
||||
{
|
||||
DoCast(who, SPELL_DEPTH_CHARGE_TRAP);
|
||||
we_must_die = true;
|
||||
WeMustDie = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* /*who*/)
|
||||
{
|
||||
}
|
||||
void AttackStart(Unit* /*who*/) {}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
}
|
||||
void EnterCombat(Unit* /*who*/) {}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -33,15 +33,19 @@ go_ravager_cage
|
||||
npc_death_ravager
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include <cmath>
|
||||
#include "ScriptedGossip.h"
|
||||
#include "Cell.h"
|
||||
#include "CellImpl.h"
|
||||
#include "GridNotifiers.h"
|
||||
|
||||
/*######
|
||||
## npc_draenei_survivor
|
||||
######*/
|
||||
|
||||
enum eEnums
|
||||
enum draeneiSurvivor
|
||||
{
|
||||
SAY_HEAL1 = -1000176,
|
||||
SAY_HEAL2 = -1000177,
|
||||
@@ -175,7 +179,7 @@ public:
|
||||
## npc_engineer_spark_overgrind
|
||||
######*/
|
||||
|
||||
enum eOvergrind
|
||||
enum Overgrind
|
||||
{
|
||||
SAY_TEXT = -1000184,
|
||||
SAY_EMOTE = -1000185,
|
||||
@@ -235,15 +239,15 @@ public:
|
||||
uint32 NormFaction;
|
||||
uint32 NpcFlags;
|
||||
|
||||
uint32 Dynamite_Timer;
|
||||
uint32 Emote_Timer;
|
||||
uint32 DynamiteTimer;
|
||||
uint32 EmoteTimer;
|
||||
|
||||
bool IsTreeEvent;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Dynamite_Timer = 8000;
|
||||
Emote_Timer = urand(120000, 150000);
|
||||
DynamiteTimer = 8000;
|
||||
EmoteTimer = urand(120000, 150000);
|
||||
|
||||
me->setFaction(NormFaction);
|
||||
me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags);
|
||||
@@ -260,12 +264,12 @@ public:
|
||||
{
|
||||
if (!me->isInCombat() && !IsTreeEvent)
|
||||
{
|
||||
if (Emote_Timer <= diff)
|
||||
if (EmoteTimer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_TEXT, me);
|
||||
DoScriptText(SAY_EMOTE, me);
|
||||
Emote_Timer = urand(120000, 150000);
|
||||
} else Emote_Timer -= diff;
|
||||
EmoteTimer = urand(120000, 150000);
|
||||
} else EmoteTimer -= diff;
|
||||
}
|
||||
else if (IsTreeEvent)
|
||||
return;
|
||||
@@ -273,11 +277,11 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (Dynamite_Timer <= diff)
|
||||
if (DynamiteTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_DYNAMITE);
|
||||
Dynamite_Timer = 8000;
|
||||
} else Dynamite_Timer -= diff;
|
||||
DynamiteTimer = 8000;
|
||||
} else DynamiteTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -307,7 +311,7 @@ public:
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
|
||||
me->SetHealth(me->CountPctFromMaxHealth(15));
|
||||
switch (rand()%2)
|
||||
switch (urand(0, 1))
|
||||
{
|
||||
case 0:
|
||||
me->SetStandState(UNIT_STAND_STATE_SIT);
|
||||
@@ -321,14 +325,9 @@ public:
|
||||
|
||||
void EnterCombat(Unit* /*who*/) {}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 /*diff*/)
|
||||
{
|
||||
}
|
||||
void MoveInLineOfSight(Unit* /*who*/) {}
|
||||
|
||||
void UpdateAI(const uint32 /*diff*/) {}
|
||||
};
|
||||
|
||||
};
|
||||
@@ -337,7 +336,7 @@ public:
|
||||
## npc_magwin
|
||||
######*/
|
||||
|
||||
enum eMagwin
|
||||
enum Magwin
|
||||
{
|
||||
SAY_START = -1000111,
|
||||
SAY_AGGRO = -1000112,
|
||||
@@ -376,26 +375,25 @@ public:
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(SAY_START, me, player);
|
||||
break;
|
||||
case 17:
|
||||
DoScriptText(SAY_PROGRESS, me, player);
|
||||
break;
|
||||
case 28:
|
||||
DoScriptText(SAY_END1, me, player);
|
||||
break;
|
||||
case 29:
|
||||
DoScriptText(EMOTE_HUG, me, player);
|
||||
DoScriptText(SAY_END2, me, player);
|
||||
player->GroupEventHappens(QUEST_A_CRY_FOR_SAY_HELP, me);
|
||||
break;
|
||||
switch (waypointId)
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(SAY_START, me, player);
|
||||
break;
|
||||
case 17:
|
||||
DoScriptText(SAY_PROGRESS, me, player);
|
||||
break;
|
||||
case 28:
|
||||
DoScriptText(SAY_END1, me, player);
|
||||
break;
|
||||
case 29:
|
||||
DoScriptText(EMOTE_HUG, me, player);
|
||||
DoScriptText(SAY_END2, me, player);
|
||||
player->GroupEventHappens(QUEST_A_CRY_FOR_SAY_HELP, me);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,7 +402,7 @@ public:
|
||||
DoScriptText(SAY_AGGRO, me, who);
|
||||
}
|
||||
|
||||
void Reset() { }
|
||||
void Reset() {}
|
||||
};
|
||||
|
||||
};
|
||||
@@ -413,7 +411,7 @@ public:
|
||||
## npc_geezle
|
||||
######*/
|
||||
|
||||
enum eGeezle
|
||||
enum Geezle
|
||||
{
|
||||
QUEST_TREES_COMPANY = 9531,
|
||||
|
||||
@@ -433,7 +431,7 @@ enum eGeezle
|
||||
GO_NAGA_FLAG = 181694
|
||||
};
|
||||
|
||||
static float SparkPos[3] = {-5029.91f, -11291.79f, 8.096f};
|
||||
Position const SparkPos = {-5029.91f, -11291.79f, 8.096f, 0.0f};
|
||||
|
||||
class npc_geezle : public CreatureScript
|
||||
{
|
||||
@@ -451,7 +449,7 @@ public:
|
||||
|
||||
uint64 SparkGUID;
|
||||
|
||||
uint32 Step;
|
||||
uint8 Step;
|
||||
uint32 SayTimer;
|
||||
|
||||
bool EventStarted;
|
||||
@@ -469,8 +467,7 @@ public:
|
||||
{
|
||||
Step = 0;
|
||||
EventStarted = true;
|
||||
Creature* Spark = me->SummonCreature(MOB_SPARK, SparkPos[0], SparkPos[1], SparkPos[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000);
|
||||
if (Spark)
|
||||
if (Creature* Spark = me->SummonCreature(MOB_SPARK, SparkPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000))
|
||||
{
|
||||
SparkGUID = Spark->GetGUID();
|
||||
Spark->setActive(true);
|
||||
@@ -479,47 +476,47 @@ public:
|
||||
SayTimer = 8000;
|
||||
}
|
||||
|
||||
uint32 NextStep(uint32 Step)
|
||||
uint32 NextStep(uint8 Step)
|
||||
{
|
||||
Creature* Spark = Unit::GetCreature(*me, SparkGUID);
|
||||
|
||||
switch (Step)
|
||||
{
|
||||
case 0:
|
||||
if (Spark)
|
||||
Spark->GetMotionMaster()->MovePoint(0, -5080.70f, -11253.61f, 0.56f);
|
||||
me->GetMotionMaster()->MovePoint(0, -5092.26f, -11252, 0.71f);
|
||||
return 9000; // NPCs are walking up to fire
|
||||
case 1:
|
||||
DespawnNagaFlag(true);
|
||||
DoScriptText(EMOTE_SPARK, Spark);
|
||||
return 1000;
|
||||
case 2:
|
||||
DoScriptText(GEEZLE_SAY_1, me, Spark);
|
||||
if (Spark)
|
||||
{
|
||||
Spark->SetInFront(me);
|
||||
me->SetInFront(Spark);
|
||||
}
|
||||
return 5000;
|
||||
case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000;
|
||||
case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000;
|
||||
case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000;
|
||||
case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000;
|
||||
case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000;
|
||||
case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000;
|
||||
case 9:
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
if (Spark)
|
||||
Spark->GetMotionMaster()->MovePoint(0, SparkPos[0], SparkPos[1], SparkPos[2]);
|
||||
CompleteQuest();
|
||||
return 9000;
|
||||
case 10:
|
||||
if (Spark)
|
||||
Spark->DisappearAndDie();
|
||||
DespawnNagaFlag(false);
|
||||
me->DisappearAndDie();
|
||||
default: return 99999999;
|
||||
case 0:
|
||||
if (Spark)
|
||||
Spark->GetMotionMaster()->MovePoint(0, -5080.70f, -11253.61f, 0.56f);
|
||||
me->GetMotionMaster()->MovePoint(0, -5092.26f, -11252, 0.71f);
|
||||
return 9000; // NPCs are walking up to fire
|
||||
case 1:
|
||||
DespawnNagaFlag(true);
|
||||
DoScriptText(EMOTE_SPARK, Spark);
|
||||
return 1000;
|
||||
case 2:
|
||||
DoScriptText(GEEZLE_SAY_1, me, Spark);
|
||||
if (Spark)
|
||||
{
|
||||
Spark->SetInFront(me);
|
||||
me->SetInFront(Spark);
|
||||
}
|
||||
return 5000;
|
||||
case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000;
|
||||
case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000;
|
||||
case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000;
|
||||
case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000;
|
||||
case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000;
|
||||
case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000;
|
||||
case 9:
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
if (Spark)
|
||||
Spark->GetMotionMaster()->MovePoint(0, SparkPos);
|
||||
CompleteQuest();
|
||||
return 9000;
|
||||
case 10:
|
||||
if (Spark)
|
||||
Spark->DisappearAndDie();
|
||||
DespawnNagaFlag(false);
|
||||
me->DisappearAndDie();
|
||||
default: return 99999999;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -533,13 +530,8 @@ public:
|
||||
me->VisitNearbyWorldObject(radius, searcher);
|
||||
|
||||
for (std::list<Player*>::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if ((*itr)->GetQuestStatus(QUEST_TREES_COMPANY) == QUEST_STATUS_INCOMPLETE
|
||||
&&(*itr)->HasAura(SPELL_TREE_DISGUISE))
|
||||
{
|
||||
if ((*itr)->GetQuestStatus(QUEST_TREES_COMPANY) == QUEST_STATUS_INCOMPLETE && (*itr)->HasAura(SPELL_TREE_DISGUISE))
|
||||
(*itr)->KilledMonsterCredit(MOB_SPARK, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DespawnNagaFlag(bool despawn)
|
||||
@@ -552,13 +544,13 @@ public:
|
||||
for (std::list<GameObject*>::const_iterator itr = FlagList.begin(); itr != FlagList.end(); ++itr)
|
||||
{
|
||||
if (despawn)
|
||||
{
|
||||
(*itr)->SetLootState(GO_JUST_DEACTIVATED);
|
||||
}
|
||||
else
|
||||
(*itr)->Respawn();
|
||||
}
|
||||
} else sLog->outError("SD2 ERROR: FlagList is empty!");
|
||||
}
|
||||
else
|
||||
sLog->outError("SD2 ERROR: FlagList is empty!");
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -566,16 +558,16 @@ public:
|
||||
if (SayTimer <= diff)
|
||||
{
|
||||
if (EventStarted)
|
||||
{
|
||||
SayTimer = NextStep(Step++);
|
||||
}
|
||||
} else SayTimer -= diff;
|
||||
}
|
||||
else
|
||||
SayTimer -= diff;
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
enum eRavegerCage
|
||||
enum RavegerCage
|
||||
{
|
||||
NPC_DEATH_RAVAGER = 17556,
|
||||
|
||||
|
||||
@@ -28,14 +28,16 @@ mob_webbed_creature
|
||||
npc_captured_sunhawk_agent
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## mob_webbed_creature
|
||||
######*/
|
||||
|
||||
//possible creatures to be spawned
|
||||
const uint32 possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17359, 17353, 17336, 17550, 17330, 17701, 17321, 17680, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327};
|
||||
uint32 const possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17359, 17353, 17336, 17550, 17330, 17701, 17321, 17680, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327};
|
||||
|
||||
class mob_webbed_creature : public CreatureScript
|
||||
{
|
||||
@@ -51,13 +53,9 @@ public:
|
||||
{
|
||||
mob_webbed_creatureAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
}
|
||||
void Reset() {}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
}
|
||||
void EnterCombat(Unit* /*who*/) {}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
@@ -153,7 +151,7 @@ public:
|
||||
## Quest 9667: Saving Princess Stillpine
|
||||
######*/
|
||||
|
||||
enum eStillpine
|
||||
enum Stillpine
|
||||
{
|
||||
QUEST_SAVING_PRINCESS_STILLPINE = 9667,
|
||||
NPC_PRINCESS_STILLPINE = 17682,
|
||||
|
||||
@@ -23,17 +23,24 @@ SDComment: Teleport not included, spell reflect not effecting dots (Core problem
|
||||
SDCategory: Azshara
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
#define SAY_TELEPORT -1000100
|
||||
enum Say
|
||||
{
|
||||
SAY_TELEPORT = -1000100
|
||||
};
|
||||
|
||||
#define SPELL_MARKOFFROST 23182
|
||||
#define SPELL_MANASTORM 21097
|
||||
#define SPELL_CHILL 21098
|
||||
#define SPELL_FROSTBREATH 21099
|
||||
#define SPELL_REFLECT 22067
|
||||
#define SPELL_CLEAVE 8255 //Perhaps not right ID
|
||||
#define SPELL_ENRAGE 23537
|
||||
enum Spells
|
||||
{
|
||||
SPELL_MARKOFFROST = 23182,
|
||||
SPELL_MANASTORM = 21097,
|
||||
SPELL_CHILL = 21098,
|
||||
SPELL_FROSTBREATH = 21099,
|
||||
SPELL_REFLECT = 22067,
|
||||
SPELL_CLEAVE = 8255, //Perhaps not right ID
|
||||
SPELL_ENRAGE = 23537
|
||||
};
|
||||
|
||||
class boss_azuregos : public CreatureScript
|
||||
{
|
||||
@@ -49,26 +56,26 @@ public:
|
||||
{
|
||||
boss_azuregosAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 MarkOfFrost_Timer;
|
||||
uint32 ManaStorm_Timer;
|
||||
uint32 Chill_Timer;
|
||||
uint32 Breath_Timer;
|
||||
uint32 Teleport_Timer;
|
||||
uint32 Reflect_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Enrage_Timer;
|
||||
uint32 MarkOfFrostTimer;
|
||||
uint32 ManaStormTimer;
|
||||
uint32 ChillTimer;
|
||||
uint32 BreathTimer;
|
||||
uint32 TeleportTimer;
|
||||
uint32 ReflectTimer;
|
||||
uint32 CleaveTimer;
|
||||
uint32 EnrageTimer;
|
||||
bool Enraged;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
MarkOfFrost_Timer = 35000;
|
||||
ManaStorm_Timer = urand(5000, 17000);
|
||||
Chill_Timer = urand(10000, 30000);
|
||||
Breath_Timer = urand(2000, 8000);
|
||||
Teleport_Timer = 30000;
|
||||
Reflect_Timer = urand(15000, 30000);
|
||||
Cleave_Timer = 7000;
|
||||
Enrage_Timer = 0;
|
||||
MarkOfFrostTimer = 35000;
|
||||
ManaStormTimer = urand(5000, 17000);
|
||||
ChillTimer = urand(10000, 30000);
|
||||
BreathTimer = urand(2000, 8000);
|
||||
TeleportTimer = 30000;
|
||||
ReflectTimer = urand(15000, 30000);
|
||||
CleaveTimer = 7000;
|
||||
EnrageTimer = 0;
|
||||
Enraged = false;
|
||||
}
|
||||
|
||||
@@ -80,12 +87,12 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (Teleport_Timer <= diff)
|
||||
if (TeleportTimer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_TELEPORT, me);
|
||||
std::list<HostileReference*>& m_threatlist = me->getThreatManager().getThreatList();
|
||||
std::list<HostileReference*>::const_iterator i = m_threatlist.begin();
|
||||
for (i = m_threatlist.begin(); i!= m_threatlist.end(); ++i)
|
||||
std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
|
||||
std::list<HostileReference*>::const_iterator i = threatlist.begin();
|
||||
for (i = threatlist.begin(); i!= threatlist.end(); ++i)
|
||||
{
|
||||
Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid());
|
||||
if (unit && (unit->GetTypeId() == TYPEID_PLAYER))
|
||||
@@ -95,53 +102,53 @@ public:
|
||||
}
|
||||
|
||||
DoResetThreat();
|
||||
Teleport_Timer = 30000;
|
||||
} else Teleport_Timer -= diff;
|
||||
TeleportTimer = 30000;
|
||||
} else TeleportTimer -= diff;
|
||||
|
||||
// //MarkOfFrost_Timer
|
||||
// if (MarkOfFrost_Timer <= diff)
|
||||
// //MarkOfFrostTimer
|
||||
// if (MarkOfFrostTimer <= diff)
|
||||
// {
|
||||
// DoCast(me->getVictim(), SPELL_MARKOFFROST);
|
||||
// MarkOfFrost_Timer = 25000;
|
||||
// } else MarkOfFrost_Timer -= diff;
|
||||
// MarkOfFrostTimer = 25000;
|
||||
// } else MarkOfFrostTimer -= diff;
|
||||
|
||||
//Chill_Timer
|
||||
if (Chill_Timer <= diff)
|
||||
//ChillTimer
|
||||
if (ChillTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CHILL);
|
||||
Chill_Timer = urand(13000, 25000);
|
||||
} else Chill_Timer -= diff;
|
||||
ChillTimer = urand(13000, 25000);
|
||||
} else ChillTimer -= diff;
|
||||
|
||||
//Breath_Timer
|
||||
if (Breath_Timer <= diff)
|
||||
//BreathTimer
|
||||
if (BreathTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FROSTBREATH);
|
||||
Breath_Timer = urand(10000, 15000);
|
||||
} else Breath_Timer -= diff;
|
||||
BreathTimer = urand(10000, 15000);
|
||||
} else BreathTimer -= diff;
|
||||
|
||||
//ManaStorm_Timer
|
||||
if (ManaStorm_Timer <= diff)
|
||||
//ManaStormTimer
|
||||
if (ManaStormTimer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_MANASTORM);
|
||||
ManaStorm_Timer = urand(7500, 12500);
|
||||
} else ManaStorm_Timer -= diff;
|
||||
ManaStormTimer = urand(7500, 12500);
|
||||
} else ManaStormTimer -= diff;
|
||||
|
||||
//Reflect_Timer
|
||||
if (Reflect_Timer <= diff)
|
||||
//ReflectTimer
|
||||
if (ReflectTimer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_REFLECT);
|
||||
Reflect_Timer = urand(20000, 35000);
|
||||
} else Reflect_Timer -= diff;
|
||||
ReflectTimer = urand(20000, 35000);
|
||||
} else ReflectTimer -= diff;
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
//CleaveTimer
|
||||
if (CleaveTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 7000;
|
||||
} else Cleave_Timer -= diff;
|
||||
CleaveTimer = 7000;
|
||||
} else CleaveTimer -= diff;
|
||||
|
||||
//Enrage_Timer
|
||||
//EnrageTimer
|
||||
if (HealthBelowPct(26) && !Enraged)
|
||||
{
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
|
||||
@@ -29,7 +29,9 @@ npc_prospector_remtravel
|
||||
npc_threshwackonator
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptedFollowerAI.h"
|
||||
|
||||
@@ -37,7 +39,7 @@ EndContentData */
|
||||
# npc_kerlonian
|
||||
####*/
|
||||
|
||||
enum eKerlonian
|
||||
enum Kerlonian
|
||||
{
|
||||
SAY_KER_START = -1000434,
|
||||
|
||||
@@ -94,11 +96,11 @@ public:
|
||||
{
|
||||
npc_kerlonianAI(Creature* creature) : FollowerAI(creature) { }
|
||||
|
||||
uint32 m_uiFallAsleepTimer;
|
||||
uint32 FallAsleepTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiFallAsleepTimer = urand(10000, 45000);
|
||||
FallAsleepTimer = urand(10000, 45000);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
@@ -150,7 +152,7 @@ public:
|
||||
SetFollowPaused(false);
|
||||
}
|
||||
|
||||
void UpdateFollowerAI(const uint32 uiDiff)
|
||||
void UpdateFollowerAI(const uint32 Diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
@@ -159,13 +161,13 @@ public:
|
||||
|
||||
if (!HasFollowState(STATE_FOLLOW_PAUSED))
|
||||
{
|
||||
if (m_uiFallAsleepTimer <= uiDiff)
|
||||
if (FallAsleepTimer <= Diff)
|
||||
{
|
||||
SetSleeping();
|
||||
m_uiFallAsleepTimer = urand(25000, 90000);
|
||||
FallAsleepTimer = urand(25000, 90000);
|
||||
}
|
||||
else
|
||||
m_uiFallAsleepTimer -= uiDiff;
|
||||
FallAsleepTimer -= Diff;
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -181,7 +183,7 @@ public:
|
||||
# npc_prospector_remtravel
|
||||
####*/
|
||||
|
||||
enum eRemtravel
|
||||
enum Remtravel
|
||||
{
|
||||
SAY_REM_START = -1000327,
|
||||
SAY_REM_AGGRO = -1000328,
|
||||
@@ -233,63 +235,62 @@ public:
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(SAY_REM_START, me, player);
|
||||
break;
|
||||
case 5:
|
||||
DoScriptText(SAY_REM_RAMP1_1, me, player);
|
||||
break;
|
||||
case 6:
|
||||
DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case 9:
|
||||
DoScriptText(SAY_REM_RAMP1_2, me, player);
|
||||
break;
|
||||
case 14:
|
||||
//depend quest rewarded?
|
||||
DoScriptText(SAY_REM_BOOK, me, player);
|
||||
break;
|
||||
case 15:
|
||||
DoScriptText(SAY_REM_TENT1_1, me, player);
|
||||
break;
|
||||
case 16:
|
||||
DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case 17:
|
||||
DoScriptText(SAY_REM_TENT1_2, me, player);
|
||||
break;
|
||||
case 26:
|
||||
DoScriptText(SAY_REM_MOSS, me, player);
|
||||
break;
|
||||
case 27:
|
||||
DoScriptText(EMOTE_REM_MOSS, me, player);
|
||||
break;
|
||||
case 28:
|
||||
DoScriptText(SAY_REM_MOSS_PROGRESS, me, player);
|
||||
break;
|
||||
case 29:
|
||||
DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case 31:
|
||||
DoScriptText(SAY_REM_PROGRESS, me, player);
|
||||
break;
|
||||
case 41:
|
||||
DoScriptText(SAY_REM_REMEMBER, me, player);
|
||||
break;
|
||||
case 42:
|
||||
DoScriptText(EMOTE_REM_END, me, player);
|
||||
player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me);
|
||||
break;
|
||||
switch (waypointId)
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(SAY_REM_START, me, player);
|
||||
break;
|
||||
case 5:
|
||||
DoScriptText(SAY_REM_RAMP1_1, me, player);
|
||||
break;
|
||||
case 6:
|
||||
DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case 9:
|
||||
DoScriptText(SAY_REM_RAMP1_2, me, player);
|
||||
break;
|
||||
case 14:
|
||||
//depend quest rewarded?
|
||||
DoScriptText(SAY_REM_BOOK, me, player);
|
||||
break;
|
||||
case 15:
|
||||
DoScriptText(SAY_REM_TENT1_1, me, player);
|
||||
break;
|
||||
case 16:
|
||||
DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case 17:
|
||||
DoScriptText(SAY_REM_TENT1_2, me, player);
|
||||
break;
|
||||
case 26:
|
||||
DoScriptText(SAY_REM_MOSS, me, player);
|
||||
break;
|
||||
case 27:
|
||||
DoScriptText(EMOTE_REM_MOSS, me, player);
|
||||
break;
|
||||
case 28:
|
||||
DoScriptText(SAY_REM_MOSS_PROGRESS, me, player);
|
||||
break;
|
||||
case 29:
|
||||
DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
break;
|
||||
case 31:
|
||||
DoScriptText(SAY_REM_PROGRESS, me, player);
|
||||
break;
|
||||
case 41:
|
||||
DoScriptText(SAY_REM_REMEMBER, me, player);
|
||||
break;
|
||||
case 42:
|
||||
DoScriptText(EMOTE_REM_END, me, player);
|
||||
player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,7 +298,7 @@ public:
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
if (rand()%2)
|
||||
if (urand(0, 1))
|
||||
DoScriptText(SAY_REM_AGGRO, me, who);
|
||||
}
|
||||
|
||||
@@ -314,7 +315,7 @@ public:
|
||||
# npc_threshwackonator
|
||||
####*/
|
||||
|
||||
enum eThreshwackonator
|
||||
enum Threshwackonator
|
||||
{
|
||||
EMOTE_START = -1000325, //signed for 4966
|
||||
SAY_AT_CLOSE = -1000326, //signed for 4966
|
||||
|
||||
@@ -30,10 +30,12 @@ npc_dalinda_malem
|
||||
go_demon_portal
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
|
||||
enum eDyingKodo
|
||||
enum DyingKodo
|
||||
{
|
||||
// signed for 9999
|
||||
SAY_SMEED_HOME_1 = -1000348,
|
||||
@@ -114,11 +116,11 @@ public:
|
||||
{
|
||||
npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { Reset(); }
|
||||
|
||||
uint32 m_uiDespawnTimer;
|
||||
uint32 DespawnTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiDespawnTimer = 0;
|
||||
DespawnTimer = 0;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
@@ -143,14 +145,14 @@ public:
|
||||
if (pSpell->Id == SPELL_KODO_KOMBO_GOSSIP)
|
||||
{
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
m_uiDespawnTimer = 60000;
|
||||
DespawnTimer = 60000;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
//timer should always be == 0 unless we already updated entry of creature. Then not expect this updated to ever be in combat.
|
||||
if (m_uiDespawnTimer && m_uiDespawnTimer <= diff)
|
||||
if (DespawnTimer && DespawnTimer <= diff)
|
||||
{
|
||||
if (!me->getVictim() && me->isAlive())
|
||||
{
|
||||
@@ -159,7 +161,7 @@ public:
|
||||
me->Respawn();
|
||||
return;
|
||||
}
|
||||
} else m_uiDespawnTimer -= diff;
|
||||
} else DespawnTimer -= diff;
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
@@ -175,7 +177,7 @@ public:
|
||||
## Hand of Iruxos
|
||||
######*/
|
||||
|
||||
enum
|
||||
enum Iruxos
|
||||
{
|
||||
QUEST_HAND_IRUXOS = 5381,
|
||||
NPC_DEMON_SPIRIT = 11876,
|
||||
@@ -199,7 +201,10 @@ class go_iruxos : public GameObjectScript
|
||||
## npc_dalinda_malem. Quest 1440
|
||||
######*/
|
||||
|
||||
#define QUEST_RETURN_TO_VAHLARRIEL 1440
|
||||
enum Dalinda
|
||||
{
|
||||
QUEST_RETURN_TO_VAHLARRIEL = 1440
|
||||
};
|
||||
|
||||
class npc_dalinda : public CreatureScript
|
||||
{
|
||||
@@ -255,9 +260,9 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
void UpdateAI(const uint32 Diff)
|
||||
{
|
||||
npc_escortAI::UpdateAI(uiDiff);
|
||||
npc_escortAI::UpdateAI(Diff);
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
@@ -15,8 +15,10 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Vehicle.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
/*######
|
||||
##Quest 5441: Lazy Peons
|
||||
@@ -50,15 +52,15 @@ public:
|
||||
{
|
||||
npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint64 uiPlayerGUID;
|
||||
uint64 PlayerGUID;
|
||||
|
||||
uint32 m_uiRebuffTimer;
|
||||
uint32 RebuffTimer;
|
||||
bool work;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiPlayerGUID = 0;
|
||||
m_uiRebuffTimer = 0;
|
||||
PlayerGUID = 0;
|
||||
RebuffTimer = 0;
|
||||
work = false;
|
||||
}
|
||||
|
||||
@@ -81,17 +83,17 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
void UpdateAI(const uint32 Diff)
|
||||
{
|
||||
if (work == true)
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_WORK_CHOPWOOD);
|
||||
if (m_uiRebuffTimer <= uiDiff)
|
||||
if (RebuffTimer <= Diff)
|
||||
{
|
||||
DoCast(me, SPELL_BUFF_SLEEP);
|
||||
m_uiRebuffTimer = 300000; //Rebuff agian in 5 minutes
|
||||
RebuffTimer = 300000; //Rebuff agian in 5 minutes
|
||||
}
|
||||
else
|
||||
m_uiRebuffTimer -= uiDiff;
|
||||
RebuffTimer -= Diff;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
@@ -32,8 +32,11 @@ npc_private_hendel
|
||||
npc_cassa_crimsonwing - handled by npc_taxi
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
/*######
|
||||
## mobs_risen_husk_spirit
|
||||
@@ -132,7 +135,7 @@ class mobs_risen_husk_spirit : public CreatureScript
|
||||
## npc_deserter_agitator
|
||||
######*/
|
||||
|
||||
enum eDeserter
|
||||
enum Deserter
|
||||
{
|
||||
QUEST_TRAITORS_AMONG_US = 11126,
|
||||
NPC_THERAMORE_DESERTER = 23602,
|
||||
@@ -203,12 +206,12 @@ public:
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiType, uint32 uiId)
|
||||
void MovementInform(uint32 Type, uint32 Id)
|
||||
{
|
||||
if (uiType != POINT_MOTION_TYPE)
|
||||
if (Type != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
if (uiId == 1)
|
||||
if (Id == 1)
|
||||
me->DisappearAndDie();
|
||||
}
|
||||
};
|
||||
@@ -218,7 +221,7 @@ public:
|
||||
## npc_deserter_agitator
|
||||
######*/
|
||||
|
||||
enum eTheramoreGuard
|
||||
enum TheramoreGuard
|
||||
{
|
||||
SAY_QUEST1 = -1000641,
|
||||
SAY_QUEST2 = -1000642,
|
||||
@@ -266,7 +269,7 @@ public:
|
||||
DoScriptText(SAY_QUEST1, creature);
|
||||
creature->CastSpell(creature, SPELL_DOCTORED_LEAFLET, false);
|
||||
creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->uiYellTimer = 4000;
|
||||
CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->YellTimer = 4000;
|
||||
CAST_AI(npc_theramore_guard::npc_theramore_guardAI, creature->AI())->bYellTimer = true;
|
||||
}
|
||||
|
||||
@@ -282,40 +285,40 @@ public:
|
||||
{
|
||||
npc_theramore_guardAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
uint32 uiYellTimer;
|
||||
uint32 uiStep;
|
||||
uint32 YellTimer;
|
||||
uint32 Step;
|
||||
bool bYellTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
bYellTimer = false;
|
||||
uiStep = 0;
|
||||
Step = 0;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
void UpdateAI(const uint32 Diff)
|
||||
{
|
||||
if (!me->HasAura(SPELL_PROPAGANDIZED))
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
|
||||
if (bYellTimer && uiYellTimer <= uiDiff)
|
||||
if (bYellTimer && YellTimer <= Diff)
|
||||
{
|
||||
switch (uiStep)
|
||||
switch (Step)
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(RAND(SAY_QUEST2, SAY_QUEST3, SAY_QUEST4, SAY_QUEST5, SAY_QUEST6), me);
|
||||
uiYellTimer = 3000;
|
||||
++uiStep;
|
||||
YellTimer = 3000;
|
||||
++Step;
|
||||
break;
|
||||
case 1:
|
||||
DoScriptText(RAND(SAY_QUEST7, SAY_QUEST8, SAY_QUEST9), me);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
|
||||
uiStep = 0;
|
||||
Step = 0;
|
||||
bYellTimer = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
uiYellTimer -= uiDiff;
|
||||
YellTimer -= Diff;
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -324,7 +327,7 @@ public:
|
||||
## npc_lady_jaina_proudmoore
|
||||
######*/
|
||||
|
||||
enum eLadyJaina
|
||||
enum LadyJaina
|
||||
{
|
||||
QUEST_JAINAS_AUTOGRAPH = 558,
|
||||
SPELL_JAINAS_AUTOGRAPH = 23122
|
||||
@@ -367,7 +370,7 @@ public:
|
||||
## npc_nat_pagle
|
||||
######*/
|
||||
|
||||
enum eNatPagle
|
||||
enum NatPagle
|
||||
{
|
||||
QUEST_NATS_MEASURING_TAPE = 8227
|
||||
};
|
||||
@@ -408,7 +411,7 @@ public:
|
||||
## npc_private_hendel
|
||||
######*/
|
||||
|
||||
enum eHendel
|
||||
enum Hendel
|
||||
{
|
||||
// looks like all this text ids are wrong.
|
||||
SAY_PROGRESS_1_TER = -1000411, // signed for 3568
|
||||
@@ -464,11 +467,11 @@ public:
|
||||
AttackStart(pAttacker);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* pDoneBy, uint32 &uiDamage)
|
||||
void DamageTaken(Unit* pDoneBy, uint32 &Damage)
|
||||
{
|
||||
if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(20, uiDamage))
|
||||
if (Damage > me->GetHealth() || me->HealthBelowPctDamaged(20, Damage))
|
||||
{
|
||||
uiDamage = 0;
|
||||
Damage = 0;
|
||||
|
||||
if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me);
|
||||
@@ -485,9 +488,9 @@ public:
|
||||
## npc_zelfrax
|
||||
######*/
|
||||
|
||||
const Position MovePosition = {-2967.030f, -3872.1799f, 35.620f, 0.0f};
|
||||
Position const MovePosition = {-2967.030f, -3872.1799f, 35.620f, 0.0f};
|
||||
|
||||
enum eZelfrax
|
||||
enum Zelfrax
|
||||
{
|
||||
SAY_ZELFRAX = -1000472,
|
||||
SAY_ZELFRAX_2 = -1000473
|
||||
@@ -525,9 +528,9 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiType, uint32 /*uiId*/)
|
||||
void MovementInform(uint32 Type, uint32 /*Id*/)
|
||||
{
|
||||
if (uiType != POINT_MOTION_TYPE)
|
||||
if (Type != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
@@ -547,7 +550,7 @@ public:
|
||||
DoScriptText(SAY_ZELFRAX_2, me);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const /*uiDiff*/)
|
||||
void UpdateAI(uint32 const /*Diff*/)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
@@ -562,7 +565,7 @@ public:
|
||||
## npc_stinky
|
||||
######*/
|
||||
|
||||
enum eStinky
|
||||
enum Stinky
|
||||
{
|
||||
QUEST_STINKYS_ESCAPE_H = 1270,
|
||||
QUEST_STINKYS_ESCAPE_A = 1222,
|
||||
|
||||
@@ -27,7 +27,9 @@ EndScriptData */
|
||||
npcs_riverbreeze_and_silversky
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## npcs_riverbreeze_and_silversky
|
||||
@@ -35,6 +37,17 @@ EndContentData */
|
||||
|
||||
#define GOSSIP_ITEM_BEACON "Please make me a Cenarion Beacon"
|
||||
|
||||
enum RiverbreezeAndSilversky
|
||||
{
|
||||
SPELL_CENARION_BEACON = 15120,
|
||||
|
||||
NPC_ARATHANDRIS_SILVERSKY = 9528,
|
||||
NPC_MAYBESS_RIVERBREEZE = 9529,
|
||||
|
||||
QUEST_CLEASING_FELWOOD_A = 4101,
|
||||
QUEST_CLEASING_FELWOOD_H = 4102
|
||||
};
|
||||
|
||||
class npcs_riverbreeze_and_silversky : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -46,7 +59,7 @@ public:
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+1)
|
||||
{
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
creature->CastSpell(player, 15120, false);
|
||||
creature->CastSpell(player, SPELL_CENARION_BEACON, false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -58,9 +71,9 @@ public:
|
||||
|
||||
uint32 creatureId = creature->GetEntry();
|
||||
|
||||
if (creatureId == 9528)
|
||||
if (creatureId == NPC_ARATHANDRIS_SILVERSKY)
|
||||
{
|
||||
if (player->GetQuestRewardStatus(4101))
|
||||
if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A))
|
||||
{
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
player->SEND_GOSSIP_MENU(2848, creature->GetGUID());
|
||||
@@ -70,9 +83,9 @@ public:
|
||||
player->SEND_GOSSIP_MENU(2844, creature->GetGUID());
|
||||
}
|
||||
|
||||
if (creatureId == 9529)
|
||||
if (creatureId == NPC_MAYBESS_RIVERBREEZE)
|
||||
{
|
||||
if (player->GetQuestRewardStatus(4102))
|
||||
if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H))
|
||||
{
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
player->SEND_GOSSIP_MENU(2849, creature->GetGUID());
|
||||
|
||||
@@ -23,8 +23,10 @@ SDComment: Quest support: 3520, 2767, Special vendor Gregan Brewspewer
|
||||
SDCategory: Feralas
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## npc_gregan_brewspewer
|
||||
@@ -68,7 +70,7 @@ public:
|
||||
## npc_oox22fe
|
||||
######*/
|
||||
|
||||
enum eOOX
|
||||
enum OOX
|
||||
{
|
||||
//signed for 7806
|
||||
SAY_OOX_START = -1000287,
|
||||
|
||||
@@ -31,14 +31,16 @@ npc_clintar_spirit
|
||||
npc_clintar_dreamwalker
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## npc_bunthen_plainswind
|
||||
######*/
|
||||
|
||||
enum eBunthen
|
||||
enum Bunthen
|
||||
{
|
||||
QUEST_SEA_LION_HORDE = 30,
|
||||
QUEST_SEA_LION_ALLY = 272,
|
||||
@@ -218,70 +220,68 @@ public:
|
||||
## npc_clintar_spirit
|
||||
######*/
|
||||
|
||||
float Clintar_spirit_WP[41][5] =
|
||||
float const Clintar_spirit_WP[41][5] =
|
||||
{
|
||||
//pos_x pos_y pos_z orien waitTime
|
||||
{7465.28f, -3115.46f, 439.327f, 0.83f, 4000},
|
||||
{7476.49f, -3101, 443.457f, 0.89f, 0},
|
||||
{7486.57f, -3085.59f, 439.478f, 1.07f, 0},
|
||||
{7472.19f, -3085.06f, 443.142f, 3.07f, 0},
|
||||
{7456.92f, -3085.91f, 438.862f, 3.24f, 0},
|
||||
{7446.68f, -3083.43f, 438.245f, 2.40f, 0},
|
||||
{7446.17f, -3080.21f, 439.826f, 1.10f, 6000},
|
||||
{7452.41f, -3085.8f, 438.984f, 5.78f, 0},
|
||||
{7469.11f, -3084.94f, 443.048f, 6.25f, 0},
|
||||
{7483.79f, -3085.44f, 439.607f, 6.25f, 0},
|
||||
{7491.14f, -3090.96f, 439.983f, 5.44f, 0},
|
||||
{7497.62f, -3098.22f, 436.854f, 5.44f, 0},
|
||||
{7498.72f, -3113.41f, 434.596f, 4.84f, 0},
|
||||
{7500.06f, -3122.51f, 434.749f, 5.17f, 0},
|
||||
{7504.96f, -3131.53f, 434.475f, 4.74f, 0},
|
||||
{7504.31f, -3133.53f, 435.693f, 3.84f, 6000},
|
||||
{7504.55f, -3133.27f, 435.476f, 0.68f, 15000},
|
||||
{7501.99f, -3126.01f, 434.93f, 1.83f, 0},
|
||||
{7490.76f, -3114.97f, 434.431f, 2.51f, 0},
|
||||
{7479.64f, -3105.51f, 431.123f, 1.83f, 0},
|
||||
{7474.63f, -3086.59f, 428.994f, 1.83f, 2000},
|
||||
{7472.96f, -3074.18f, 427.566f, 1.57f, 0},
|
||||
{7472.25f, -3063, 428.268f, 1.55f, 0},
|
||||
{7473.46f, -3054.22f, 427.588f, 0.36f, 0},
|
||||
{7475.08f, -3053.6f, 428.653f, 0.36f, 6000},
|
||||
{7474.66f, -3053.56f, 428.433f, 3.19f, 4000},
|
||||
{7471.81f, -3058.84f, 427.073f, 4.29f, 0},
|
||||
{7472.16f, -3064.91f, 427.772f, 4.95f, 0},
|
||||
{7471.56f, -3085.36f, 428.924f, 4.72f, 0},
|
||||
{7473.56f, -3093.48f, 429.294f, 5.04f, 0},
|
||||
{7478.94f, -3104.29f, 430.638f, 5.23f, 0},
|
||||
{7484.46f, -3109.61f, 432.769f, 5.79f, 0},
|
||||
{7490.23f, -3111.08f, 434.431f, 0.02f, 0},
|
||||
{7496.29f, -3108, 434.783f, 1.15f, 0},
|
||||
{7497.46f, -3100.66f, 436.191f, 1.50f, 0},
|
||||
{7495.64f, -3093.39f, 438.349f, 2.10f, 0},
|
||||
{7492.44f, -3086.01f, 440.267f, 1.38f, 0},
|
||||
{7498.26f, -3076.44f, 440.808f, 0.71f, 0},
|
||||
{7506.4f, -3067.35f, 443.64f, 0.77f, 0},
|
||||
{7518.37f, -3057.42f, 445.584f, 0.74f, 0},
|
||||
{7517.51f, -3056.3f, 444.568f, 2.49f, 4500}
|
||||
//pos_x pos_y pos_z orien waitTime
|
||||
{7465.28f, -3115.46f, 439.327f, 0.83f, 4000},
|
||||
{7476.49f, -3101, 443.457f, 0.89f, 0},
|
||||
{7486.57f, -3085.59f, 439.478f, 1.07f, 0},
|
||||
{7472.19f, -3085.06f, 443.142f, 3.07f, 0},
|
||||
{7456.92f, -3085.91f, 438.862f, 3.24f, 0},
|
||||
{7446.68f, -3083.43f, 438.245f, 2.40f, 0},
|
||||
{7446.17f, -3080.21f, 439.826f, 1.10f, 6000},
|
||||
{7452.41f, -3085.8f, 438.984f, 5.78f, 0},
|
||||
{7469.11f, -3084.94f, 443.048f, 6.25f, 0},
|
||||
{7483.79f, -3085.44f, 439.607f, 6.25f, 0},
|
||||
{7491.14f, -3090.96f, 439.983f, 5.44f, 0},
|
||||
{7497.62f, -3098.22f, 436.854f, 5.44f, 0},
|
||||
{7498.72f, -3113.41f, 434.596f, 4.84f, 0},
|
||||
{7500.06f, -3122.51f, 434.749f, 5.17f, 0},
|
||||
{7504.96f, -3131.53f, 434.475f, 4.74f, 0},
|
||||
{7504.31f, -3133.53f, 435.693f, 3.84f, 6000},
|
||||
{7504.55f, -3133.27f, 435.476f, 0.68f, 15000},
|
||||
{7501.99f, -3126.01f, 434.93f, 1.83f, 0},
|
||||
{7490.76f, -3114.97f, 434.431f, 2.51f, 0},
|
||||
{7479.64f, -3105.51f, 431.123f, 1.83f, 0},
|
||||
{7474.63f, -3086.59f, 428.994f, 1.83f, 2000},
|
||||
{7472.96f, -3074.18f, 427.566f, 1.57f, 0},
|
||||
{7472.25f, -3063, 428.268f, 1.55f, 0},
|
||||
{7473.46f, -3054.22f, 427.588f, 0.36f, 0},
|
||||
{7475.08f, -3053.6f, 428.653f, 0.36f, 6000},
|
||||
{7474.66f, -3053.56f, 428.433f, 3.19f, 4000},
|
||||
{7471.81f, -3058.84f, 427.073f, 4.29f, 0},
|
||||
{7472.16f, -3064.91f, 427.772f, 4.95f, 0},
|
||||
{7471.56f, -3085.36f, 428.924f, 4.72f, 0},
|
||||
{7473.56f, -3093.48f, 429.294f, 5.04f, 0},
|
||||
{7478.94f, -3104.29f, 430.638f, 5.23f, 0},
|
||||
{7484.46f, -3109.61f, 432.769f, 5.79f, 0},
|
||||
{7490.23f, -3111.08f, 434.431f, 0.02f, 0},
|
||||
{7496.29f, -3108, 434.783f, 1.15f, 0},
|
||||
{7497.46f, -3100.66f, 436.191f, 1.50f, 0},
|
||||
{7495.64f, -3093.39f, 438.349f, 2.10f, 0},
|
||||
{7492.44f, -3086.01f, 440.267f, 1.38f, 0},
|
||||
{7498.26f, -3076.44f, 440.808f, 0.71f, 0},
|
||||
{7506.4f, -3067.35f, 443.64f, 0.77f, 0},
|
||||
{7518.37f, -3057.42f, 445.584f, 0.74f, 0},
|
||||
{7517.51f, -3056.3f, 444.568f, 2.49f, 4500}
|
||||
};
|
||||
|
||||
#define ASPECT_RAVEN 22915
|
||||
Position const AspectRavenSummon = {7472.96f, -3074.18f, 427.566f, 0.0f};
|
||||
Position const ClintarSpiritSummon = {7459.2275f, -3122.5632f, 438.9842f, 0.8594f};
|
||||
|
||||
#define ASPECT_RAVEN_SUMMON_X 7472.96f
|
||||
#define ASPECT_RAVEN_SUMMON_Y -3074.18f
|
||||
#define ASPECT_RAVEN_SUMMON_Z 427.566f
|
||||
#define CLINTAR_SPIRIT_SUMMON_X 7459.2275f
|
||||
#define CLINTAR_SPIRIT_SUMMON_Y -3122.5632f
|
||||
#define CLINTAR_SPIRIT_SUMMON_Z 438.9842f
|
||||
#define CLINTAR_SPIRIT_SUMMON_O 0.8594f
|
||||
enum ClintarSpirit
|
||||
{
|
||||
ASPECT_RAVEN = 22915,
|
||||
|
||||
//from -1000292 to -1000287 are signed for 7806. but all this texts ids wrong.
|
||||
#define CLINTAR_SPIRIT_SAY_START -1000286
|
||||
#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 -1000287
|
||||
#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 -1000288
|
||||
#define CLINTAR_SPIRIT_SAY_GET_ONE -1000289
|
||||
#define CLINTAR_SPIRIT_SAY_GET_TWO -1000290
|
||||
#define CLINTAR_SPIRIT_SAY_GET_THREE -1000291
|
||||
#define CLINTAR_SPIRIT_SAY_GET_FINAL -1000292
|
||||
//from -1000292 to -1000287 are signed for 7806. but all this texts ids wrong.
|
||||
CLINTAR_SPIRIT_SAY_START = -1000286,
|
||||
CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 = -1000287,
|
||||
CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 = -1000288,
|
||||
CLINTAR_SPIRIT_SAY_GET_ONE = -1000289,
|
||||
CLINTAR_SPIRIT_SAY_GET_TWO = -1000290,
|
||||
CLINTAR_SPIRIT_SAY_GET_THREE = -1000291,
|
||||
CLINTAR_SPIRIT_SAY_GET_FINAL = -1000292
|
||||
};
|
||||
|
||||
class npc_clintar_spirit : public CreatureScript
|
||||
{
|
||||
@@ -298,14 +298,14 @@ public:
|
||||
public:
|
||||
npc_clintar_spiritAI(Creature* creature) : npc_escortAI(creature) {}
|
||||
|
||||
uint32 Step;
|
||||
uint8 Step;
|
||||
uint32 CurrWP;
|
||||
uint32 Event_Timer;
|
||||
uint32 checkPlayer_Timer;
|
||||
uint32 EventTimer;
|
||||
uint32 checkPlayerTimer;
|
||||
|
||||
uint64 PlayerGUID;
|
||||
|
||||
bool Event_onWait;
|
||||
bool EventOnWait;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
@@ -313,10 +313,10 @@ public:
|
||||
{
|
||||
Step = 0;
|
||||
CurrWP = 0;
|
||||
Event_Timer = 0;
|
||||
EventTimer = 0;
|
||||
PlayerGUID = 0;
|
||||
checkPlayer_Timer = 1000;
|
||||
Event_onWait = false;
|
||||
checkPlayerTimer = 1000;
|
||||
EventOnWait = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -347,8 +347,7 @@ public:
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
uint32 rnd = rand()%2;
|
||||
switch (rnd)
|
||||
switch (urand(0, 1))
|
||||
{
|
||||
case 0: DoScriptText(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1, me, who); break;
|
||||
case 1: DoScriptText(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2, me, who); break;
|
||||
@@ -357,9 +356,7 @@ public:
|
||||
|
||||
void StartEvent(Player* player)
|
||||
{
|
||||
if (!player)
|
||||
return;
|
||||
if (player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
for (uint8 i = 0; i < 41; ++i)
|
||||
{
|
||||
@@ -381,18 +378,18 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
if (!me->isInCombat() && !Event_onWait)
|
||||
if (!me->isInCombat() && !EventOnWait)
|
||||
{
|
||||
if (checkPlayer_Timer <= diff)
|
||||
if (checkPlayerTimer <= diff)
|
||||
{
|
||||
Player* player = Unit::GetPlayer(*me, PlayerGUID);
|
||||
if (player && player->isInCombat() && player->getAttackerForHelper())
|
||||
AttackStart(player->getAttackerForHelper());
|
||||
checkPlayer_Timer = 1000;
|
||||
} else checkPlayer_Timer -= diff;
|
||||
checkPlayerTimer = 1000;
|
||||
} else checkPlayerTimer -= diff;
|
||||
}
|
||||
|
||||
if (Event_onWait && Event_Timer <= diff)
|
||||
if (EventOnWait && EventTimer <= diff)
|
||||
{
|
||||
|
||||
Player* player = Unit::GetPlayer(*me, PlayerGUID);
|
||||
@@ -409,11 +406,11 @@ public:
|
||||
{
|
||||
case 0:
|
||||
me->Say(CLINTAR_SPIRIT_SAY_START, 0, PlayerGUID);
|
||||
Event_Timer = 8000;
|
||||
EventTimer = 8000;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -422,13 +419,13 @@ public:
|
||||
{
|
||||
case 0:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133);
|
||||
Event_Timer = 5000;
|
||||
EventTimer = 5000;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
DoScriptText(CLINTAR_SPIRIT_SAY_GET_ONE, me, player);
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -437,12 +434,12 @@ public:
|
||||
{
|
||||
case 0:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133);
|
||||
Event_Timer = 5000;
|
||||
EventTimer = 5000;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -451,11 +448,11 @@ public:
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(CLINTAR_SPIRIT_SAY_GET_TWO, me, player);
|
||||
Event_Timer = 15000;
|
||||
EventTimer = 15000;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -463,19 +460,16 @@ public:
|
||||
switch (Step)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
Creature* mob = me->SummonCreature(ASPECT_RAVEN, ASPECT_RAVEN_SUMMON_X, ASPECT_RAVEN_SUMMON_Y, ASPECT_RAVEN_SUMMON_Z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000);
|
||||
if (mob)
|
||||
if (Creature* mob = me->SummonCreature(ASPECT_RAVEN, AspectRavenSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000))
|
||||
{
|
||||
mob->AddThreat(me, 10000.0f);
|
||||
mob->AI()->AttackStart(me);
|
||||
}
|
||||
Event_Timer = 2000;
|
||||
EventTimer = 2000;
|
||||
Step = 1;
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -484,12 +478,12 @@ public:
|
||||
{
|
||||
case 0:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133);
|
||||
Event_Timer = 5000;
|
||||
EventTimer = 5000;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -498,11 +492,11 @@ public:
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(CLINTAR_SPIRIT_SAY_GET_THREE, me, player);
|
||||
Event_Timer = 4000;
|
||||
EventTimer = 4000;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -513,12 +507,12 @@ public:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2);
|
||||
DoScriptText(CLINTAR_SPIRIT_SAY_GET_FINAL, me, player);
|
||||
player->CompleteQuest(10965);
|
||||
Event_Timer = 1500;
|
||||
EventTimer = 1500;
|
||||
Step = 1;
|
||||
break;
|
||||
case 1:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
Event_Timer = 3000;
|
||||
EventTimer = 3000;
|
||||
Step = 2;
|
||||
break;
|
||||
case 2:
|
||||
@@ -530,19 +524,19 @@ public:
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Event_onWait = false;
|
||||
EventOnWait = false;
|
||||
break;
|
||||
}
|
||||
|
||||
} else if (Event_onWait) Event_Timer -= diff;
|
||||
} else if (EventOnWait) EventTimer -= diff;
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
CurrWP = waypointId;
|
||||
Event_Timer = 0;
|
||||
EventTimer = 0;
|
||||
Step = 0;
|
||||
Event_onWait = true;
|
||||
EventOnWait = true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -552,7 +546,10 @@ public:
|
||||
# npc_clintar_dreamwalker
|
||||
####*/
|
||||
|
||||
#define CLINTAR_SPIRIT 22916
|
||||
enum Clintar
|
||||
{
|
||||
CLINTAR_SPIRIT = 22916
|
||||
};
|
||||
|
||||
class npc_clintar_dreamwalker : public CreatureScript
|
||||
{
|
||||
@@ -562,11 +559,8 @@ public:
|
||||
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == 10965)
|
||||
{
|
||||
Creature* clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, CLINTAR_SPIRIT_SUMMON_X, CLINTAR_SPIRIT_SUMMON_Y, CLINTAR_SPIRIT_SUMMON_Z, CLINTAR_SPIRIT_SUMMON_O, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000);
|
||||
if (clintar_spirit)
|
||||
if (Creature* clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, ClintarSpiritSummon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000))
|
||||
CAST_AI(npc_clintar_spirit::npc_clintar_spiritAI, clintar_spirit->AI())->StartEvent(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,8 +29,9 @@ npc_kyle_frenzied
|
||||
npc_plains_vision
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
# npc_skorn_whitecloud
|
||||
@@ -71,7 +72,7 @@ public:
|
||||
# npc_kyle_frenzied
|
||||
######*/
|
||||
|
||||
enum eKyleFrenzied
|
||||
enum KyleFrenzied
|
||||
{
|
||||
//emote signed for 7780 but propably thats wrong id.
|
||||
EMOTE_SEE_LUNCH = -1000340,
|
||||
@@ -98,30 +99,30 @@ public:
|
||||
{
|
||||
npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
bool bEvent;
|
||||
bool m_bIsMovingToLunch;
|
||||
uint64 uiPlayerGUID;
|
||||
uint32 uiEventTimer;
|
||||
uint8 uiEventPhase;
|
||||
bool EventActive;
|
||||
bool IsMovingToLunch;
|
||||
uint64 PlayerGUID;
|
||||
uint32 EventTimer;
|
||||
uint8 EventPhase;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
bEvent = false;
|
||||
m_bIsMovingToLunch = false;
|
||||
uiPlayerGUID = 0;
|
||||
uiEventTimer = 5000;
|
||||
uiEventPhase = 0;
|
||||
EventActive = false;
|
||||
IsMovingToLunch = false;
|
||||
PlayerGUID = 0;
|
||||
EventTimer = 5000;
|
||||
EventPhase = 0;
|
||||
|
||||
if (me->GetEntry() == NPC_KYLE_FRIENDLY)
|
||||
me->UpdateEntry(NPC_KYLE_FRENZIED);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* pCaster, SpellInfo const* pSpell)
|
||||
void SpellHit(Unit* Caster, SpellInfo const* Spell)
|
||||
{
|
||||
if (!me->getVictim() && !bEvent && pSpell->Id == SPELL_LUNCH)
|
||||
if (!me->getVictim() && !EventActive && Spell->Id == SPELL_LUNCH)
|
||||
{
|
||||
if (pCaster->GetTypeId() == TYPEID_PLAYER)
|
||||
uiPlayerGUID = pCaster->GetGUID();
|
||||
if (Caster->GetTypeId() == TYPEID_PLAYER)
|
||||
PlayerGUID = Caster->GetGUID();
|
||||
|
||||
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
|
||||
{
|
||||
@@ -130,41 +131,41 @@ public:
|
||||
me->StopMoving();
|
||||
}
|
||||
|
||||
bEvent = true;
|
||||
EventActive = true;
|
||||
DoScriptText(EMOTE_SEE_LUNCH, me);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_CREATURE_SPECIAL);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiType, uint32 uiPointId)
|
||||
void MovementInform(uint32 Type, uint32 PointId)
|
||||
{
|
||||
if (uiType != POINT_MOTION_TYPE || !bEvent)
|
||||
if (Type != POINT_MOTION_TYPE || !EventActive)
|
||||
return;
|
||||
|
||||
if (uiPointId == POINT_ID)
|
||||
m_bIsMovingToLunch = false;
|
||||
if (PointId == POINT_ID)
|
||||
IsMovingToLunch = false;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (bEvent)
|
||||
if (EventActive)
|
||||
{
|
||||
if (m_bIsMovingToLunch)
|
||||
if (IsMovingToLunch)
|
||||
return;
|
||||
|
||||
if (uiEventTimer <= diff)
|
||||
if (EventTimer <= diff)
|
||||
{
|
||||
uiEventTimer = 5000;
|
||||
++uiEventPhase;
|
||||
EventTimer = 5000;
|
||||
++EventPhase;
|
||||
|
||||
switch (uiEventPhase)
|
||||
switch (EventPhase)
|
||||
{
|
||||
case 1:
|
||||
if (Unit* unit = Unit::GetUnit(*me, uiPlayerGUID))
|
||||
if (Unit* unit = Unit::GetUnit(*me, PlayerGUID))
|
||||
{
|
||||
if (GameObject* go = unit->GetGameObject(SPELL_LUNCH))
|
||||
{
|
||||
m_bIsMovingToLunch = true;
|
||||
IsMovingToLunch = true;
|
||||
me->GetMotionMaster()->MovePoint(POINT_ID, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ());
|
||||
}
|
||||
}
|
||||
@@ -174,13 +175,13 @@ public:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
|
||||
break;
|
||||
case 3:
|
||||
if (Player* unit = Unit::GetPlayer(*me, uiPlayerGUID))
|
||||
if (Player* unit = Unit::GetPlayer(*me, PlayerGUID))
|
||||
unit->TalkedToCreature(me->GetEntry(), me->GetGUID());
|
||||
|
||||
me->UpdateEntry(NPC_KYLE_FRIENDLY);
|
||||
break;
|
||||
case 4:
|
||||
uiEventTimer = 30000;
|
||||
EventTimer = 30000;
|
||||
DoScriptText(EMOTE_DANCE, me);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCESPECIAL);
|
||||
break;
|
||||
@@ -192,7 +193,7 @@ public:
|
||||
}
|
||||
}
|
||||
else
|
||||
uiEventTimer -= diff;
|
||||
EventTimer -= diff;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -203,58 +204,58 @@ public:
|
||||
# npc_plains_vision
|
||||
######*/
|
||||
|
||||
float wp_plain_vision[50][3] =
|
||||
Position const wpPlainVision[50] =
|
||||
{
|
||||
{-2226.32f, -408.095f, -9.36235f},
|
||||
{-2203.04f, -437.212f, -5.72498f},
|
||||
{-2163.91f, -457.851f, -7.09049f},
|
||||
{-2123.87f, -448.137f, -9.29591f},
|
||||
{-2104.66f, -427.166f, -6.49513f},
|
||||
{-2101.48f, -422.826f, -5.3567f},
|
||||
{-2097.56f, -417.083f, -7.16716f},
|
||||
{-2084.87f, -398.626f, -9.88973f},
|
||||
{-2072.71f, -382.324f, -10.2488f},
|
||||
{-2054.05f, -356.728f, -6.22468f},
|
||||
{-2051.8f, -353.645f, -5.35791f},
|
||||
{-2049.08f, -349.912f, -6.15723f},
|
||||
{-2030.6f, -310.724f, -9.59302f},
|
||||
{-2002.15f, -249.308f, -10.8124f},
|
||||
{-1972.85f, -195.811f, -10.6316f},
|
||||
{-1940.93f, -147.652f, -11.7055f},
|
||||
{-1888.06f, -81.943f, -11.4404f},
|
||||
{-1837.05f, -34.0109f, -12.258f},
|
||||
{-1796.12f, -14.6462f, -10.3581f},
|
||||
{-1732.61f, -4.27746f, -10.0213f},
|
||||
{-1688.94f, -0.829945f, -11.7103f},
|
||||
{-1681.32f, 13.0313f, -9.48056f},
|
||||
{-1677.04f, 36.8349f, -7.10318f},
|
||||
{-1675.2f, 68.559f, -8.95384f},
|
||||
{-1676.57f, 89.023f, -9.65104f},
|
||||
{-1678.16f, 110.939f, -10.1782f},
|
||||
{-1677.86f, 128.681f, -5.73869f},
|
||||
{-1675.27f, 144.324f, -3.47916f},
|
||||
{-1671.7f, 163.169f, -1.23098f},
|
||||
{-1666.61f, 181.584f, 5.26145f},
|
||||
{-1661.51f, 196.154f, 8.95252f},
|
||||
{-1655.47f, 210.811f, 8.38727f},
|
||||
{-1647.07f, 226.947f, 5.27755f},
|
||||
{-1621.65f, 232.91f, 2.69579f},
|
||||
{-1600.23f, 237.641f, 2.98539f},
|
||||
{-1576.07f, 242.546f, 4.66541f},
|
||||
{-1554.57f, 248.494f, 6.60377f},
|
||||
{-1547.53f, 259.302f, 10.6741f},
|
||||
{-1541.7f, 269.847f, 16.4418f},
|
||||
{-1539.83f, 278.989f, 21.0597f},
|
||||
{-1540.16f, 290.219f, 27.8247f},
|
||||
{-1538.99f, 298.983f, 34.0032f},
|
||||
{-1540.38f, 307.337f, 41.3557f},
|
||||
{-1536.61f, 314.884f, 48.0179f},
|
||||
{-1532.42f, 323.277f, 55.6667f},
|
||||
{-1528.77f, 329.774f, 61.1525f},
|
||||
{-1525.65f, 333.18f, 63.2161f},
|
||||
{-1517.01f, 350.713f, 62.4286f},
|
||||
{-1511.39f, 362.537f, 62.4539f},
|
||||
{-1508.68f, 366.822f, 62.733f}
|
||||
{-2226.32f, -408.095f, -9.36235f, 0.0f},
|
||||
{-2203.04f, -437.212f, -5.72498f, 0.0f},
|
||||
{-2163.91f, -457.851f, -7.09049f, 0.0f},
|
||||
{-2123.87f, -448.137f, -9.29591f, 0.0f},
|
||||
{-2104.66f, -427.166f, -6.49513f, 0.0f},
|
||||
{-2101.48f, -422.826f, -5.3567f, 0.0f},
|
||||
{-2097.56f, -417.083f, -7.16716f, 0.0f},
|
||||
{-2084.87f, -398.626f, -9.88973f, 0.0f},
|
||||
{-2072.71f, -382.324f, -10.2488f, 0.0f},
|
||||
{-2054.05f, -356.728f, -6.22468f, 0.0f},
|
||||
{-2051.8f, -353.645f, -5.35791f, 0.0f},
|
||||
{-2049.08f, -349.912f, -6.15723f, 0.0f},
|
||||
{-2030.6f, -310.724f, -9.59302f, 0.0f},
|
||||
{-2002.15f, -249.308f, -10.8124f, 0.0f},
|
||||
{-1972.85f, -195.811f, -10.6316f, 0.0f},
|
||||
{-1940.93f, -147.652f, -11.7055f, 0.0f},
|
||||
{-1888.06f, -81.943f, -11.4404f, 0.0f},
|
||||
{-1837.05f, -34.0109f, -12.258f, 0.0f},
|
||||
{-1796.12f, -14.6462f, -10.3581f, 0.0f},
|
||||
{-1732.61f, -4.27746f, -10.0213f, 0.0f},
|
||||
{-1688.94f, -0.829945f, -11.7103f, 0.0f},
|
||||
{-1681.32f, 13.0313f, -9.48056f, 0.0f},
|
||||
{-1677.04f, 36.8349f, -7.10318f, 0.0f},
|
||||
{-1675.2f, 68.559f, -8.95384f, 0.0f},
|
||||
{-1676.57f, 89.023f, -9.65104f, 0.0f},
|
||||
{-1678.16f, 110.939f, -10.1782f, 0.0f},
|
||||
{-1677.86f, 128.681f, -5.73869f, 0.0f},
|
||||
{-1675.27f, 144.324f, -3.47916f, 0.0f},
|
||||
{-1671.7f, 163.169f, -1.23098f, 0.0f},
|
||||
{-1666.61f, 181.584f, 5.26145f, 0.0f},
|
||||
{-1661.51f, 196.154f, 8.95252f, 0.0f},
|
||||
{-1655.47f, 210.811f, 8.38727f, 0.0f},
|
||||
{-1647.07f, 226.947f, 5.27755f, 0.0f},
|
||||
{-1621.65f, 232.91f, 2.69579f, 0.0f},
|
||||
{-1600.23f, 237.641f, 2.98539f, 0.0f},
|
||||
{-1576.07f, 242.546f, 4.66541f, 0.0f},
|
||||
{-1554.57f, 248.494f, 6.60377f, 0.0f},
|
||||
{-1547.53f, 259.302f, 10.6741f, 0.0f},
|
||||
{-1541.7f, 269.847f, 16.4418f, 0.0f},
|
||||
{-1539.83f, 278.989f, 21.0597f, 0.0f},
|
||||
{-1540.16f, 290.219f, 27.8247f, 0.0f},
|
||||
{-1538.99f, 298.983f, 34.0032f, 0.0f},
|
||||
{-1540.38f, 307.337f, 41.3557f, 0.0f},
|
||||
{-1536.61f, 314.884f, 48.0179f, 0.0f},
|
||||
{-1532.42f, 323.277f, 55.6667f, 0.0f},
|
||||
{-1528.77f, 329.774f, 61.1525f, 0.0f},
|
||||
{-1525.65f, 333.18f, 63.2161f, 0.0f},
|
||||
{-1517.01f, 350.713f, 62.4286f, 0.0f},
|
||||
{-1511.39f, 362.537f, 62.4539f, 0.0f},
|
||||
{-1508.68f, 366.822f, 62.733f, 0.0f}
|
||||
};
|
||||
|
||||
class npc_plains_vision : public CreatureScript
|
||||
@@ -305,7 +306,7 @@ public:
|
||||
{
|
||||
if (newWaypoint)
|
||||
{
|
||||
me->GetMotionMaster()->MovePoint(WayPointId, wp_plain_vision[WayPointId][0], wp_plain_vision[WayPointId][1], wp_plain_vision[WayPointId][2]);
|
||||
me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]);
|
||||
newWaypoint = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,13 +28,15 @@ npc_shenthul
|
||||
npc_thrall_warchief
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## npc_shenthul
|
||||
######*/
|
||||
|
||||
enum eShenthul
|
||||
enum Shenthul
|
||||
{
|
||||
QUEST_SHATTERED_SALUTE = 2460
|
||||
};
|
||||
@@ -65,16 +67,16 @@ public:
|
||||
|
||||
bool CanTalk;
|
||||
bool CanEmote;
|
||||
uint32 Salute_Timer;
|
||||
uint32 Reset_Timer;
|
||||
uint32 SaluteTimer;
|
||||
uint32 ResetTimer;
|
||||
uint64 PlayerGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
CanTalk = false;
|
||||
CanEmote = false;
|
||||
Salute_Timer = 6000;
|
||||
Reset_Timer = 0;
|
||||
SaluteTimer = 6000;
|
||||
ResetTimer = 0;
|
||||
PlayerGUID = 0;
|
||||
}
|
||||
|
||||
@@ -84,7 +86,7 @@ public:
|
||||
{
|
||||
if (CanEmote)
|
||||
{
|
||||
if (Reset_Timer <= diff)
|
||||
if (ResetTimer <= diff)
|
||||
{
|
||||
if (Player* player = Unit::GetPlayer(*me, PlayerGUID))
|
||||
{
|
||||
@@ -92,17 +94,17 @@ public:
|
||||
player->FailQuest(QUEST_SHATTERED_SALUTE);
|
||||
}
|
||||
Reset();
|
||||
} else Reset_Timer -= diff;
|
||||
} else ResetTimer -= diff;
|
||||
}
|
||||
|
||||
if (CanTalk && !CanEmote)
|
||||
{
|
||||
if (Salute_Timer <= diff)
|
||||
if (SaluteTimer <= diff)
|
||||
{
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
|
||||
CanEmote = true;
|
||||
Reset_Timer = 60000;
|
||||
} else Salute_Timer -= diff;
|
||||
ResetTimer = 60000;
|
||||
} else SaluteTimer -= diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
@@ -130,10 +132,13 @@ public:
|
||||
## npc_thrall_warchief
|
||||
######*/
|
||||
|
||||
#define QUEST_6566 6566
|
||||
enum ThrallWarchief
|
||||
{
|
||||
QUEST_6566 = 6566,
|
||||
|
||||
#define SPELL_CHAIN_LIGHTNING 16033
|
||||
#define SPELL_SHOCK 16034
|
||||
SPELL_CHAIN_LIGHTNING = 16033,
|
||||
SPELL_SHOCK = 16034
|
||||
};
|
||||
|
||||
#define GOSSIP_HTW "Please share your wisdom with me, Warchief."
|
||||
#define GOSSIP_STW1 "What discoveries?"
|
||||
@@ -207,13 +212,13 @@ public:
|
||||
{
|
||||
npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 ChainLightning_Timer;
|
||||
uint32 Shock_Timer;
|
||||
uint32 ChainLightningTimer;
|
||||
uint32 ShockTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ChainLightning_Timer = 2000;
|
||||
Shock_Timer = 8000;
|
||||
ChainLightningTimer = 2000;
|
||||
ShockTimer = 8000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) {}
|
||||
@@ -223,17 +228,17 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (ChainLightning_Timer <= diff)
|
||||
if (ChainLightningTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CHAIN_LIGHTNING);
|
||||
ChainLightning_Timer = 9000;
|
||||
} else ChainLightning_Timer -= diff;
|
||||
ChainLightningTimer = 9000;
|
||||
} else ChainLightningTimer -= diff;
|
||||
|
||||
if (Shock_Timer <= diff)
|
||||
if (ShockTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SHOCK);
|
||||
Shock_Timer = 15000;
|
||||
} else Shock_Timer -= diff;
|
||||
ShockTimer = 15000;
|
||||
} else ShockTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -29,7 +29,9 @@ npcs_rutgar_and_frankal
|
||||
quest_a_pawn_on_the_eternal_pawn
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "Group.h"
|
||||
|
||||
/*###
|
||||
@@ -125,9 +127,11 @@ public:
|
||||
#define GOSSIP_ITEM14 "I should ask the monkey about this"
|
||||
#define GOSSIP_ITEM15 "Then what..."
|
||||
|
||||
//trigger creatures to kill
|
||||
#define TRIGGER_RUTGAR 15222
|
||||
#define TRIGGER_FRANKAL 15221
|
||||
enum RutgarAndFrankal //trigger creatures to kill
|
||||
{
|
||||
TRIGGER_FRANKAL = 15221,
|
||||
TRIGGER_RUTGAR = 15222
|
||||
};
|
||||
|
||||
class npcs_rutgar_and_frankal : public CreatureScript
|
||||
{
|
||||
@@ -223,7 +227,7 @@ public:
|
||||
/*####
|
||||
# quest_a_pawn_on_the_eternal_board (Defines)
|
||||
####*/
|
||||
enum eEternalBoard
|
||||
enum EternalBoard
|
||||
{
|
||||
QUEST_A_PAWN_ON_THE_ETERNAL_BOARD = 8519,
|
||||
|
||||
@@ -290,7 +294,6 @@ TO DO: get correct spell IDs and timings for spells cast upon dragon transformat
|
||||
TO DO: Dragons should use the HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF) after transformation, but for some unknown reason it doesnt work.
|
||||
EndContentData */
|
||||
|
||||
#define QUEST_A_PAWN_ON_THE_ETERNAL_BOARD 8519
|
||||
#define EVENT_AREA_RADIUS 65 //65yds
|
||||
#define EVENT_COOLDOWN 500000 //in ms. appear after event completed or failed (should be = Adds despawn time)
|
||||
|
||||
@@ -373,13 +376,8 @@ static QuestCinematic EventAnim[]=
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
struct Location
|
||||
{
|
||||
float x, y, z, o;
|
||||
};
|
||||
|
||||
//Cordinates for Spawns
|
||||
static Location SpawnLocation[]=
|
||||
Position const SpawnLocation[] =
|
||||
{
|
||||
{-8085.0f, 1528.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
|
||||
{-8080.0f, 1526.0f, 2.61f, 3.141592f}, //Kaldorei Infantry
|
||||
@@ -460,7 +458,7 @@ struct WaveData
|
||||
int32 WaveTextId;
|
||||
};
|
||||
|
||||
static WaveData WavesInfo[] =
|
||||
static WaveData WavesInfo[5] =
|
||||
{
|
||||
{30, 0, 15423, 0, 0, 24000, 0}, // Kaldorei Soldier
|
||||
{ 3, 35, 15424, 0, 0, 24000, 0}, // Anubisath Conqueror
|
||||
@@ -475,7 +473,7 @@ struct SpawnSpells
|
||||
uint32 Timer1, Timer2, SpellId;
|
||||
};
|
||||
|
||||
static SpawnSpells SpawnCast[]=//
|
||||
static SpawnSpells SpawnCast[4] =
|
||||
{
|
||||
{100000, 2000, 33652}, // Stop Time
|
||||
{38500, 300000, 28528}, // Poison Cloud
|
||||
@@ -977,13 +975,9 @@ public:
|
||||
|
||||
for (uint8 i = locIndex; i <= count; ++i)
|
||||
{
|
||||
float x = SpawnLocation[i].x;
|
||||
float y = SpawnLocation[i].y;
|
||||
float z = SpawnLocation[i].z;
|
||||
float o = SpawnLocation[i].o;
|
||||
uint32 desptimer = WavesInfo[WaveCount].DespTimer;
|
||||
|
||||
if (Creature* spawn = me->SummonCreature(WavesInfo[WaveCount].CreatureId, x, y, z, o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, desptimer))
|
||||
if (Creature* spawn = me->SummonCreature(WavesInfo[WaveCount].CreatureId, SpawnLocation[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, desptimer))
|
||||
{
|
||||
if (spawn->GetEntry() == 15423)
|
||||
spawn->SetUInt32Value(UNIT_FIELD_DISPLAYID, 15427+rand()%4);
|
||||
|
||||
@@ -28,7 +28,9 @@ npc_braug_dimspirit
|
||||
npc_kaya_flathoof
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
|
||||
/*######
|
||||
@@ -90,7 +92,7 @@ public:
|
||||
## npc_kaya_flathoof
|
||||
######*/
|
||||
|
||||
enum eKaya
|
||||
enum Kaya
|
||||
{
|
||||
FACTION_ESCORTEE_H = 775,
|
||||
|
||||
|
||||
@@ -33,7 +33,9 @@ npc_OOX17
|
||||
npc_tooga
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptedFollowerAI.h"
|
||||
|
||||
@@ -41,10 +43,13 @@ EndContentData */
|
||||
## mob_aquementas
|
||||
######*/
|
||||
|
||||
#define AGGRO_YELL_AQUE -1000350
|
||||
enum Aquementas
|
||||
{
|
||||
AGGRO_YELL_AQUE = -1000350,
|
||||
|
||||
#define SPELL_AQUA_JET 13586
|
||||
#define SPELL_FROST_SHOCK 15089
|
||||
SPELL_AQUA_JET = 13586,
|
||||
SPELL_FROST_SHOCK = 15089
|
||||
};
|
||||
|
||||
class mob_aquementas : public CreatureScript
|
||||
{
|
||||
@@ -60,22 +65,22 @@ public:
|
||||
{
|
||||
mob_aquementasAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 SendItem_Timer;
|
||||
uint32 SwitchFaction_Timer;
|
||||
uint32 SendItemTimer;
|
||||
uint32 SwitchFactionTimer;
|
||||
bool isFriendly;
|
||||
|
||||
uint32 FrostShock_Timer;
|
||||
uint32 AquaJet_Timer;
|
||||
uint32 FrostShockTimer;
|
||||
uint32 AquaJetTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
SendItem_Timer = 0;
|
||||
SwitchFaction_Timer = 10000;
|
||||
SendItemTimer = 0;
|
||||
SwitchFactionTimer = 10000;
|
||||
me->setFaction(35);
|
||||
isFriendly = true;
|
||||
|
||||
AquaJet_Timer = 5000;
|
||||
FrostShock_Timer = 1000;
|
||||
AquaJetTimer = 5000;
|
||||
FrostShockTimer = 1000;
|
||||
}
|
||||
|
||||
void SendItem(Unit* receiver)
|
||||
@@ -101,11 +106,11 @@ public:
|
||||
{
|
||||
if (isFriendly)
|
||||
{
|
||||
if (SwitchFaction_Timer <= diff)
|
||||
if (SwitchFactionTimer <= diff)
|
||||
{
|
||||
me->setFaction(91);
|
||||
isFriendly = false;
|
||||
} else SwitchFaction_Timer -= diff;
|
||||
} else SwitchFactionTimer -= diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
@@ -113,25 +118,25 @@ public:
|
||||
|
||||
if (!isFriendly)
|
||||
{
|
||||
if (SendItem_Timer <= diff)
|
||||
if (SendItemTimer <= diff)
|
||||
{
|
||||
if (me->getVictim()->GetTypeId() == TYPEID_PLAYER)
|
||||
SendItem(me->getVictim());
|
||||
SendItem_Timer = 5000;
|
||||
} else SendItem_Timer -= diff;
|
||||
SendItemTimer = 5000;
|
||||
} else SendItemTimer -= diff;
|
||||
}
|
||||
|
||||
if (FrostShock_Timer <= diff)
|
||||
if (FrostShockTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FROST_SHOCK);
|
||||
FrostShock_Timer = 15000;
|
||||
} else FrostShock_Timer -= diff;
|
||||
FrostShockTimer = 15000;
|
||||
} else FrostShockTimer -= diff;
|
||||
|
||||
if (AquaJet_Timer <= diff)
|
||||
if (AquaJetTimer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_AQUA_JET);
|
||||
AquaJet_Timer = 15000;
|
||||
} else AquaJet_Timer -= diff;
|
||||
AquaJetTimer = 15000;
|
||||
} else AquaJetTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -143,20 +148,23 @@ public:
|
||||
## npc_custodian_of_time
|
||||
######*/
|
||||
|
||||
#define WHISPER_CUSTODIAN_1 -1000217
|
||||
#define WHISPER_CUSTODIAN_2 -1000218
|
||||
#define WHISPER_CUSTODIAN_3 -1000219
|
||||
#define WHISPER_CUSTODIAN_4 -1000220
|
||||
#define WHISPER_CUSTODIAN_5 -1000221
|
||||
#define WHISPER_CUSTODIAN_6 -1000222
|
||||
#define WHISPER_CUSTODIAN_7 -1000223
|
||||
#define WHISPER_CUSTODIAN_8 -1000224
|
||||
#define WHISPER_CUSTODIAN_9 -1000225
|
||||
#define WHISPER_CUSTODIAN_10 -1000226
|
||||
#define WHISPER_CUSTODIAN_11 -1000227
|
||||
#define WHISPER_CUSTODIAN_12 -1000228
|
||||
#define WHISPER_CUSTODIAN_13 -1000229
|
||||
#define WHISPER_CUSTODIAN_14 -1000230
|
||||
enum CustodianOfTime
|
||||
{
|
||||
WHISPER_CUSTODIAN_1 = -1000217,
|
||||
WHISPER_CUSTODIAN_2 = -1000218,
|
||||
WHISPER_CUSTODIAN_3 = -1000219,
|
||||
WHISPER_CUSTODIAN_4 = -1000220,
|
||||
WHISPER_CUSTODIAN_5 = -1000221,
|
||||
WHISPER_CUSTODIAN_6 = -1000222,
|
||||
WHISPER_CUSTODIAN_7 = -1000223,
|
||||
WHISPER_CUSTODIAN_8 = -1000224,
|
||||
WHISPER_CUSTODIAN_9 = -1000225,
|
||||
WHISPER_CUSTODIAN_10 = -1000226,
|
||||
WHISPER_CUSTODIAN_11 = -1000227,
|
||||
WHISPER_CUSTODIAN_12 = -1000228,
|
||||
WHISPER_CUSTODIAN_13 = -1000229,
|
||||
WHISPER_CUSTODIAN_14 = -1000230
|
||||
};
|
||||
|
||||
class npc_custodian_of_time : public CreatureScript
|
||||
{
|
||||
@@ -174,69 +182,68 @@ public:
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(WHISPER_CUSTODIAN_1, me, player);
|
||||
break;
|
||||
case 1:
|
||||
DoScriptText(WHISPER_CUSTODIAN_2, me, player);
|
||||
break;
|
||||
case 2:
|
||||
DoScriptText(WHISPER_CUSTODIAN_3, me, player);
|
||||
break;
|
||||
case 3:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 5:
|
||||
DoScriptText(WHISPER_CUSTODIAN_5, me, player);
|
||||
break;
|
||||
case 6:
|
||||
DoScriptText(WHISPER_CUSTODIAN_6, me, player);
|
||||
break;
|
||||
case 7:
|
||||
DoScriptText(WHISPER_CUSTODIAN_7, me, player);
|
||||
break;
|
||||
case 8:
|
||||
DoScriptText(WHISPER_CUSTODIAN_8, me, player);
|
||||
break;
|
||||
case 9:
|
||||
DoScriptText(WHISPER_CUSTODIAN_9, me, player);
|
||||
break;
|
||||
case 10:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 13:
|
||||
DoScriptText(WHISPER_CUSTODIAN_10, me, player);
|
||||
break;
|
||||
case 14:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 16:
|
||||
DoScriptText(WHISPER_CUSTODIAN_11, me, player);
|
||||
break;
|
||||
case 17:
|
||||
DoScriptText(WHISPER_CUSTODIAN_12, me, player);
|
||||
break;
|
||||
case 18:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 22:
|
||||
DoScriptText(WHISPER_CUSTODIAN_13, me, player);
|
||||
break;
|
||||
case 23:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 24:
|
||||
DoScriptText(WHISPER_CUSTODIAN_14, me, player);
|
||||
DoCast(player, 34883);
|
||||
// below here is temporary workaround, to be removed when spell works properly
|
||||
player->AreaExploredOrEventHappens(10277);
|
||||
break;
|
||||
switch (waypointId)
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(WHISPER_CUSTODIAN_1, me, player);
|
||||
break;
|
||||
case 1:
|
||||
DoScriptText(WHISPER_CUSTODIAN_2, me, player);
|
||||
break;
|
||||
case 2:
|
||||
DoScriptText(WHISPER_CUSTODIAN_3, me, player);
|
||||
break;
|
||||
case 3:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 5:
|
||||
DoScriptText(WHISPER_CUSTODIAN_5, me, player);
|
||||
break;
|
||||
case 6:
|
||||
DoScriptText(WHISPER_CUSTODIAN_6, me, player);
|
||||
break;
|
||||
case 7:
|
||||
DoScriptText(WHISPER_CUSTODIAN_7, me, player);
|
||||
break;
|
||||
case 8:
|
||||
DoScriptText(WHISPER_CUSTODIAN_8, me, player);
|
||||
break;
|
||||
case 9:
|
||||
DoScriptText(WHISPER_CUSTODIAN_9, me, player);
|
||||
break;
|
||||
case 10:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 13:
|
||||
DoScriptText(WHISPER_CUSTODIAN_10, me, player);
|
||||
break;
|
||||
case 14:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 16:
|
||||
DoScriptText(WHISPER_CUSTODIAN_11, me, player);
|
||||
break;
|
||||
case 17:
|
||||
DoScriptText(WHISPER_CUSTODIAN_12, me, player);
|
||||
break;
|
||||
case 18:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 22:
|
||||
DoScriptText(WHISPER_CUSTODIAN_13, me, player);
|
||||
break;
|
||||
case 23:
|
||||
DoScriptText(WHISPER_CUSTODIAN_4, me, player);
|
||||
break;
|
||||
case 24:
|
||||
DoScriptText(WHISPER_CUSTODIAN_14, me, player);
|
||||
DoCast(player, 34883);
|
||||
// below here is temporary workaround, to be removed when spell works properly
|
||||
player->AreaExploredOrEventHappens(10277);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,7 +266,7 @@ public:
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) {}
|
||||
void Reset() { }
|
||||
void Reset() {}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
@@ -416,7 +423,7 @@ public:
|
||||
## npc_OOX17
|
||||
######*/
|
||||
|
||||
enum e00X17
|
||||
enum Npc00X17
|
||||
{
|
||||
//texts are signed for 7806
|
||||
SAY_OOX_START = -1000287,
|
||||
@@ -464,30 +471,29 @@ public:
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 23:
|
||||
me->SummonCreature(SPAWN_FIRST, -8350.96f, -4445.79f, 10.10f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_FIRST, -8355.96f, -4447.79f, 10.10f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_FIRST, -8353.96f, -4442.79f, 10.10f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_OOX_AMBUSH, me);
|
||||
break;
|
||||
case 56:
|
||||
me->SummonCreature(SPAWN_SECOND_1, -7510.07f, -4795.50f, 9.35f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_SECOND_2, -7515.07f, -4797.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_SECOND_2, -7518.07f, -4792.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_OOX_AMBUSH, me);
|
||||
if (Unit* scoff = me->FindNearestCreature(SPAWN_SECOND_2, 30))
|
||||
DoScriptText(SAY_OOX17_AMBUSH_REPLY, scoff);
|
||||
break;
|
||||
case 86:
|
||||
DoScriptText(SAY_OOX_END, me);
|
||||
player->GroupEventHappens(Q_OOX17, me);
|
||||
break;
|
||||
switch (waypointId)
|
||||
{
|
||||
case 23:
|
||||
me->SummonCreature(SPAWN_FIRST, -8350.96f, -4445.79f, 10.10f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_FIRST, -8355.96f, -4447.79f, 10.10f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_FIRST, -8353.96f, -4442.79f, 10.10f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_OOX_AMBUSH, me);
|
||||
break;
|
||||
case 56:
|
||||
me->SummonCreature(SPAWN_SECOND_1, -7510.07f, -4795.50f, 9.35f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_SECOND_2, -7515.07f, -4797.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(SPAWN_SECOND_2, -7518.07f, -4792.50f, 9.35f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_OOX_AMBUSH, me);
|
||||
if (Unit* scoff = me->FindNearestCreature(SPAWN_SECOND_2, 30))
|
||||
DoScriptText(SAY_OOX17_AMBUSH_REPLY, scoff);
|
||||
break;
|
||||
case 86:
|
||||
DoScriptText(SAY_OOX_END, me);
|
||||
player->GroupEventHappens(Q_OOX17, me);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -509,7 +515,7 @@ public:
|
||||
# npc_tooga
|
||||
####*/
|
||||
|
||||
enum eTooga
|
||||
enum Tooga
|
||||
{
|
||||
SAY_TOOG_THIRST = -1000391,
|
||||
SAY_TOOG_WORRIED = -1000392,
|
||||
@@ -527,7 +533,7 @@ enum eTooga
|
||||
FACTION_TOOG_ESCORTEE = 113
|
||||
};
|
||||
|
||||
const float m_afToWaterLoc[] = {-7032.664551f, -4906.199219f, -1.606446f};
|
||||
Position const ToWaterLoc = {-7032.664551f, -4906.199219f, -1.606446f, 0.0f};
|
||||
|
||||
class npc_tooga : public CreatureScript
|
||||
{
|
||||
@@ -554,17 +560,17 @@ public:
|
||||
{
|
||||
npc_toogaAI(Creature* creature) : FollowerAI(creature) { }
|
||||
|
||||
uint32 m_uiCheckSpeechTimer;
|
||||
uint32 m_uiPostEventTimer;
|
||||
uint32 m_uiPhasePostEvent;
|
||||
uint32 CheckSpeechTimer;
|
||||
uint32 PostEventTimer;
|
||||
uint32 PhasePostEvent;
|
||||
|
||||
uint64 TortaGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiCheckSpeechTimer = 2500;
|
||||
m_uiPostEventTimer = 1000;
|
||||
m_uiPhasePostEvent = 0;
|
||||
CheckSpeechTimer = 2500;
|
||||
PostEventTimer = 1000;
|
||||
PhasePostEvent = 0;
|
||||
|
||||
TortaGUID = 0;
|
||||
}
|
||||
@@ -577,11 +583,9 @@ public:
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE))
|
||||
{
|
||||
if (Player* player = GetLeaderForFollower())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE)
|
||||
player->GroupEventHappens(QUEST_TOOGA, me);
|
||||
}
|
||||
Player* player = GetLeaderForFollower();
|
||||
if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE)
|
||||
player->GroupEventHappens(QUEST_TOOGA, me);
|
||||
|
||||
TortaGUID = who->GetGUID();
|
||||
SetFollowComplete(true);
|
||||
@@ -589,27 +593,27 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiMotionType, uint32 uiPointId)
|
||||
void MovementInform(uint32 MotionType, uint32 PointId)
|
||||
{
|
||||
FollowerAI::MovementInform(uiMotionType, uiPointId);
|
||||
FollowerAI::MovementInform(MotionType, PointId);
|
||||
|
||||
if (uiMotionType != POINT_MOTION_TYPE)
|
||||
if (MotionType != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
if (uiPointId == POINT_ID_TO_WATER)
|
||||
if (PointId == POINT_ID_TO_WATER)
|
||||
SetFollowComplete();
|
||||
}
|
||||
|
||||
void UpdateFollowerAI(const uint32 uiDiff)
|
||||
void UpdateFollowerAI(const uint32 Diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
//we are doing the post-event, or...
|
||||
if (HasFollowState(STATE_FOLLOW_POSTEVENT))
|
||||
{
|
||||
if (m_uiPostEventTimer <= uiDiff)
|
||||
if (PostEventTimer <= Diff)
|
||||
{
|
||||
m_uiPostEventTimer = 5000;
|
||||
PostEventTimer = 5000;
|
||||
|
||||
Unit* pTorta = Unit::GetUnit(*me, TortaGUID);
|
||||
if (!pTorta || !pTorta->isAlive())
|
||||
@@ -619,7 +623,7 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
switch (m_uiPhasePostEvent)
|
||||
switch (PhasePostEvent)
|
||||
{
|
||||
case 1:
|
||||
DoScriptText(SAY_TOOG_POST_1, me);
|
||||
@@ -638,27 +642,27 @@ public:
|
||||
break;
|
||||
case 6:
|
||||
DoScriptText(SAY_TORT_POST_6, pTorta);
|
||||
me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, m_afToWaterLoc[0], m_afToWaterLoc[1], m_afToWaterLoc[2]);
|
||||
me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc);
|
||||
break;
|
||||
}
|
||||
|
||||
++m_uiPhasePostEvent;
|
||||
++PhasePostEvent;
|
||||
}
|
||||
else
|
||||
m_uiPostEventTimer -= uiDiff;
|
||||
PostEventTimer -= Diff;
|
||||
}
|
||||
//...we are doing regular speech check
|
||||
else if (HasFollowState(STATE_FOLLOW_INPROGRESS))
|
||||
{
|
||||
if (m_uiCheckSpeechTimer <= uiDiff)
|
||||
if (CheckSpeechTimer <= Diff)
|
||||
{
|
||||
m_uiCheckSpeechTimer = 5000;
|
||||
CheckSpeechTimer = 5000;
|
||||
|
||||
if (urand(0, 9) > 8)
|
||||
DoScriptText(RAND(SAY_TOOG_THIRST, SAY_TOOG_WORRIED), me);
|
||||
}
|
||||
else
|
||||
m_uiCheckSpeechTimer -= uiDiff;
|
||||
CheckSpeechTimer -= Diff;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -27,14 +27,15 @@ EndScriptData */
|
||||
npc_mist
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedFollowerAI.h"
|
||||
|
||||
/*####
|
||||
# npc_mist
|
||||
####*/
|
||||
|
||||
enum eMist
|
||||
enum Mist
|
||||
{
|
||||
SAY_AT_HOME = -1000323,
|
||||
EMOTE_AT_HOME = -1000324,
|
||||
@@ -51,10 +52,8 @@ public:
|
||||
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_MIST)
|
||||
{
|
||||
if (npc_mistAI* pMistAI = CAST_AI(npc_mist::npc_mistAI, creature->AI()))
|
||||
pMistAI->StartFollow(player, FACTION_DARNASSUS, quest);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -88,18 +87,16 @@ public:
|
||||
{
|
||||
DoScriptText(EMOTE_AT_HOME, me);
|
||||
|
||||
if (Player* player = GetLeaderForFollower())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_MIST) == QUEST_STATUS_INCOMPLETE)
|
||||
player->GroupEventHappens(QUEST_MIST, me);
|
||||
}
|
||||
Player* player = GetLeaderForFollower();
|
||||
if (player && player->GetQuestStatus(QUEST_MIST) == QUEST_STATUS_INCOMPLETE)
|
||||
player->GroupEventHappens(QUEST_MIST, me);
|
||||
|
||||
//The follow is over (and for later development, run off to the woods before really end)
|
||||
SetFollowComplete();
|
||||
}
|
||||
|
||||
//call not needed here, no known abilities
|
||||
/*void UpdateFollowerAI(const uint32 uiDiff)
|
||||
/*void UpdateFollowerAI(const uint32 Diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
@@ -32,7 +32,9 @@ npc_twiggy_flathead
|
||||
npc_wizzlecrank_shredder
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
|
||||
/*######
|
||||
@@ -41,7 +43,7 @@ EndContentData */
|
||||
|
||||
#define GOSSIP_CORPSE "Examine corpse in detail..."
|
||||
|
||||
enum eQuests
|
||||
enum BeatenCorpse
|
||||
{
|
||||
QUEST_LOST_IN_BATTLE = 4921
|
||||
};
|
||||
@@ -77,7 +79,7 @@ public:
|
||||
# npc_gilthares
|
||||
######*/
|
||||
|
||||
enum eGilthares
|
||||
enum Gilthares
|
||||
{
|
||||
SAY_GIL_START = -1000370,
|
||||
SAY_GIL_AT_LAST = -1000371,
|
||||
@@ -214,7 +216,7 @@ public:
|
||||
## npc_taskmaster_fizzule
|
||||
######*/
|
||||
|
||||
enum eEnums
|
||||
enum TaskmasterFizzule
|
||||
{
|
||||
FACTION_FRIENDLY_F = 35,
|
||||
SPELL_FLARE = 10113,
|
||||
@@ -240,13 +242,13 @@ public:
|
||||
|
||||
uint32 factionNorm;
|
||||
bool IsFriend;
|
||||
uint32 Reset_Timer;
|
||||
uint32 ResetTimer;
|
||||
uint8 FlareCount;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
IsFriend = false;
|
||||
Reset_Timer = 120000;
|
||||
ResetTimer = 120000;
|
||||
FlareCount = 0;
|
||||
me->setFaction(factionNorm);
|
||||
}
|
||||
@@ -281,11 +283,11 @@ public:
|
||||
{
|
||||
if (IsFriend)
|
||||
{
|
||||
if (Reset_Timer <= diff)
|
||||
if (ResetTimer <= diff)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
} else Reset_Timer -= diff;
|
||||
} else ResetTimer -= diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
@@ -315,7 +317,7 @@ public:
|
||||
## npc_twiggy_flathead
|
||||
#####*/
|
||||
|
||||
enum eTwiggyFlathead
|
||||
enum TwiggyFlathead
|
||||
{
|
||||
NPC_BIG_WILL = 6238,
|
||||
NPC_AFFRAY_CHALLENGER = 6240,
|
||||
@@ -327,7 +329,7 @@ enum eTwiggyFlathead
|
||||
SAY_TWIGGY_FLATHEAD_OVER = -1000127,
|
||||
};
|
||||
|
||||
float AffrayChallengerLoc[6][4]=
|
||||
Position const AffrayChallengerLoc[6] =
|
||||
{
|
||||
{-1683.0f, -4326.0f, 2.79f, 0.0f},
|
||||
{-1682.0f, -4329.0f, 2.79f, 0.0f},
|
||||
@@ -354,10 +356,10 @@ public:
|
||||
bool EventInProgress;
|
||||
bool EventGrate;
|
||||
bool EventBigWill;
|
||||
bool Challenger_down[6];
|
||||
uint32 Wave;
|
||||
uint32 Wave_Timer;
|
||||
uint32 Challenger_checker;
|
||||
bool ChallengerDown[6];
|
||||
uint8 Wave;
|
||||
uint32 WaveTimer;
|
||||
uint32 ChallengerChecker;
|
||||
uint64 PlayerGUID;
|
||||
uint64 AffrayChallenger[6];
|
||||
uint64 BigWill;
|
||||
@@ -367,15 +369,15 @@ public:
|
||||
EventInProgress = false;
|
||||
EventGrate = false;
|
||||
EventBigWill = false;
|
||||
Wave_Timer = 600000;
|
||||
Challenger_checker = 0;
|
||||
WaveTimer = 600000;
|
||||
ChallengerChecker = 0;
|
||||
Wave = 0;
|
||||
PlayerGUID = 0;
|
||||
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
AffrayChallenger[i] = 0;
|
||||
Challenger_down[i] = false;
|
||||
ChallengerDown[i] = false;
|
||||
}
|
||||
BigWill = 0;
|
||||
}
|
||||
@@ -408,42 +410,26 @@ public:
|
||||
return;
|
||||
|
||||
if (!pWarrior->isAlive() && pWarrior->GetQuestStatus(1719) == QUEST_STATUS_INCOMPLETE) {
|
||||
EventInProgress = false;
|
||||
DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me);
|
||||
pWarrior->FailQuest(1719);
|
||||
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
for (uint8 i = 0; i < 6; ++i) // unsummon challengers
|
||||
{
|
||||
if (AffrayChallenger[i])
|
||||
{
|
||||
Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]);
|
||||
if (creature) {
|
||||
if (creature->isAlive())
|
||||
{
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
|
||||
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
creature->setDeathState(JUST_DIED);
|
||||
}
|
||||
}
|
||||
if (creature && creature->isAlive())
|
||||
creature->DisappearAndDie();
|
||||
}
|
||||
AffrayChallenger[i] = 0;
|
||||
Challenger_down[i] = false;
|
||||
}
|
||||
|
||||
if (BigWill)
|
||||
if (BigWill) // unsummon bigWill
|
||||
{
|
||||
Creature* creature = Unit::GetCreature((*me), BigWill);
|
||||
if (creature)
|
||||
{
|
||||
if (creature->isAlive())
|
||||
{
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
|
||||
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
creature->setDeathState(JUST_DIED);
|
||||
}
|
||||
}
|
||||
if (creature && creature->isAlive())
|
||||
creature->DisappearAndDie();
|
||||
}
|
||||
BigWill = 0;
|
||||
Reset();
|
||||
}
|
||||
|
||||
if (!EventGrate && EventInProgress)
|
||||
@@ -453,11 +439,11 @@ public:
|
||||
|
||||
if (x >= -1684 && x <= -1674 && y >= -4334 && y <= -4324) {
|
||||
pWarrior->AreaExploredOrEventHappens(1719);
|
||||
DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, me);
|
||||
DoScriptText(SAY_TWIGGY_FLATHEAD_BEGIN, me, pWarrior);
|
||||
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
Creature* creature = me->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i][0], AffrayChallengerLoc[i][1], AffrayChallengerLoc[i][2], AffrayChallengerLoc[i][3], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
|
||||
Creature* creature = me->SummonCreature(NPC_AFFRAY_CHALLENGER, AffrayChallengerLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
|
||||
if (!creature)
|
||||
continue;
|
||||
creature->setFaction(35);
|
||||
@@ -466,31 +452,31 @@ public:
|
||||
creature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
|
||||
AffrayChallenger[i] = creature->GetGUID();
|
||||
}
|
||||
Wave_Timer = 5000;
|
||||
Challenger_checker = 1000;
|
||||
WaveTimer = 5000;
|
||||
ChallengerChecker = 1000;
|
||||
EventGrate = true;
|
||||
}
|
||||
}
|
||||
else if (EventInProgress)
|
||||
{
|
||||
if (Challenger_checker <= diff)
|
||||
if (ChallengerChecker <= diff)
|
||||
{
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
if (AffrayChallenger[i])
|
||||
{
|
||||
Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]);
|
||||
if ((!creature || (!creature->isAlive())) && !Challenger_down[i])
|
||||
if ((!creature || (!creature->isAlive())) && !ChallengerDown[i])
|
||||
{
|
||||
DoScriptText(SAY_TWIGGY_FLATHEAD_DOWN, me);
|
||||
Challenger_down[i] = true;
|
||||
ChallengerDown[i] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Challenger_checker = 1000;
|
||||
} else Challenger_checker -= diff;
|
||||
ChallengerChecker = 1000;
|
||||
} else ChallengerChecker -= diff;
|
||||
|
||||
if (Wave_Timer <= diff)
|
||||
if (WaveTimer <= diff)
|
||||
{
|
||||
if (Wave < 6 && AffrayChallenger[Wave] && !EventBigWill)
|
||||
{
|
||||
@@ -504,7 +490,7 @@ public:
|
||||
creature->setFaction(14);
|
||||
creature->AI()->AttackStart(pWarrior);
|
||||
++Wave;
|
||||
Wave_Timer = 20000;
|
||||
WaveTimer = 20000;
|
||||
}
|
||||
}
|
||||
else if (Wave >= 6 && !EventBigWill) {
|
||||
@@ -516,7 +502,7 @@ public:
|
||||
creature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79f);
|
||||
creature->HandleEmoteCommand(EMOTE_STATE_READY_UNARMED);
|
||||
EventBigWill = true;
|
||||
Wave_Timer = 1000;
|
||||
WaveTimer = 1000;
|
||||
}
|
||||
}
|
||||
else if (Wave >= 6 && EventBigWill && BigWill)
|
||||
@@ -525,14 +511,10 @@ public:
|
||||
if (!creature || !creature->isAlive())
|
||||
{
|
||||
DoScriptText(SAY_TWIGGY_FLATHEAD_OVER, me);
|
||||
EventInProgress = false;
|
||||
EventBigWill = false;
|
||||
EventGrate = false;
|
||||
PlayerGUID = 0;
|
||||
Wave = 0;
|
||||
Reset();
|
||||
}
|
||||
}
|
||||
} else Wave_Timer -= diff;
|
||||
} else WaveTimer -= diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -544,7 +526,7 @@ public:
|
||||
## npc_wizzlecrank_shredder
|
||||
#####*/
|
||||
|
||||
enum eEnums_Wizzlecrank
|
||||
enum Wizzlecrank
|
||||
{
|
||||
SAY_START = -1000298,
|
||||
SAY_STARTUP1 = -1000299,
|
||||
@@ -570,14 +552,14 @@ public:
|
||||
{
|
||||
npc_wizzlecrank_shredderAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
m_bIsPostEvent = false;
|
||||
m_uiPostEventTimer = 1000;
|
||||
m_uiPostEventCount = 0;
|
||||
IsPostEvent = false;
|
||||
PostEventTimer = 1000;
|
||||
PostEventCount = 0;
|
||||
}
|
||||
|
||||
bool m_bIsPostEvent;
|
||||
uint32 m_uiPostEventTimer;
|
||||
uint32 m_uiPostEventCount;
|
||||
bool IsPostEvent;
|
||||
uint32 PostEventTimer;
|
||||
uint32 PostEventCount;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
@@ -586,9 +568,9 @@ public:
|
||||
if (me->getStandState() == UNIT_STAND_STATE_DEAD)
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
|
||||
m_bIsPostEvent = false;
|
||||
m_uiPostEventTimer = 1000;
|
||||
m_uiPostEventCount = 0;
|
||||
IsPostEvent = false;
|
||||
PostEventTimer = 1000;
|
||||
PostEventCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -610,19 +592,19 @@ public:
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
m_bIsPostEvent = true;
|
||||
IsPostEvent = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointStart(uint32 uiPointId)
|
||||
void WaypointStart(uint32 PointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (uiPointId)
|
||||
switch (PointId)
|
||||
{
|
||||
case 9:
|
||||
DoScriptText(SAY_STARTUP2, me, player);
|
||||
@@ -643,15 +625,15 @@ public:
|
||||
summoned->AI()->AttackStart(me);
|
||||
}
|
||||
|
||||
void UpdateEscortAI(const uint32 uiDiff)
|
||||
void UpdateEscortAI(const uint32 Diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (m_bIsPostEvent)
|
||||
if (IsPostEvent)
|
||||
{
|
||||
if (m_uiPostEventTimer <= uiDiff)
|
||||
if (PostEventTimer <= Diff)
|
||||
{
|
||||
switch (m_uiPostEventCount)
|
||||
switch (PostEventCount)
|
||||
{
|
||||
case 0:
|
||||
DoScriptText(SAY_PROGRESS_2, me);
|
||||
@@ -671,11 +653,11 @@ public:
|
||||
break;
|
||||
}
|
||||
|
||||
++m_uiPostEventCount;
|
||||
m_uiPostEventTimer = 5000;
|
||||
++PostEventCount;
|
||||
PostEventTimer = 5000;
|
||||
}
|
||||
else
|
||||
m_uiPostEventTimer -= uiDiff;
|
||||
PostEventTimer -= Diff;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -32,14 +32,16 @@ npc_enraged_panther
|
||||
go_panther_cage
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
|
||||
/*#####
|
||||
# npc_kanati
|
||||
######*/
|
||||
|
||||
enum eKanati
|
||||
enum Kanati
|
||||
{
|
||||
SAY_KAN_START = -1000410,
|
||||
|
||||
@@ -47,7 +49,7 @@ enum eKanati
|
||||
NPC_GALAK_ASS = 10720
|
||||
};
|
||||
|
||||
const float m_afGalakLoc[]= {-4867.387695f, -1357.353760f, -48.226f };
|
||||
Position const GalakLoc = {-4867.387695f, -1357.353760f, -48.226f, 0.0f};
|
||||
|
||||
class npc_kanati : public CreatureScript
|
||||
{
|
||||
@@ -57,10 +59,9 @@ public:
|
||||
bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
|
||||
{
|
||||
if (quest->GetQuestId() == QUEST_PROTECT_KANATI)
|
||||
{
|
||||
if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI()))
|
||||
pEscortAI->Start(false, false, player->GetGUID(), quest, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -73,7 +74,7 @@ public:
|
||||
{
|
||||
npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { }
|
||||
|
||||
void Reset() { }
|
||||
void Reset() {}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
@@ -93,9 +94,7 @@ public:
|
||||
void DoSpawnGalak()
|
||||
{
|
||||
for (int i = 0; i < 3; ++i)
|
||||
me->SummonCreature(NPC_GALAK_ASS,
|
||||
m_afGalakLoc[0], m_afGalakLoc[1], m_afGalakLoc[2], 0.0f,
|
||||
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
me->SummonCreature(NPC_GALAK_ASS, GalakLoc, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
@@ -110,7 +109,7 @@ public:
|
||||
# npc_lakota_windsong
|
||||
######*/
|
||||
|
||||
enum eLakota
|
||||
enum Lakota
|
||||
{
|
||||
SAY_LAKO_START = -1000365,
|
||||
SAY_LAKO_LOOK_OUT = -1000366,
|
||||
@@ -127,14 +126,14 @@ enum eLakota
|
||||
ID_AMBUSH_3 = 4
|
||||
};
|
||||
|
||||
float m_afBanditLoc[6][6]=
|
||||
Position const BanditLoc[6] =
|
||||
{
|
||||
{-4905.479492f, -2062.732666f, 84.352f},
|
||||
{-4915.201172f, -2073.528320f, 84.733f},
|
||||
{-4878.883301f, -1986.947876f, 91.966f},
|
||||
{-4877.503906f, -1966.113403f, 91.859f},
|
||||
{-4767.985352f, -1873.169189f, 90.192f},
|
||||
{-4788.861328f, -1888.007813f, 89.888f}
|
||||
{-4905.479492f, -2062.732666f, 84.352f, 0.0f},
|
||||
{-4915.201172f, -2073.528320f, 84.733f, 0.0f},
|
||||
{-4878.883301f, -1986.947876f, 91.966f, 0.0f},
|
||||
{-4877.503906f, -1966.113403f, 91.859f, 0.0f},
|
||||
{-4767.985352f, -1873.169189f, 90.192f, 0.0f},
|
||||
{-4788.861328f, -1888.007813f, 89.888f, 0.0f}
|
||||
};
|
||||
|
||||
class npc_lakota_windsong : public CreatureScript
|
||||
@@ -164,7 +163,7 @@ public:
|
||||
{
|
||||
npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { }
|
||||
|
||||
void Reset() { }
|
||||
void Reset() {}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
@@ -189,12 +188,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void DoSpawnBandits(int uiAmbushId)
|
||||
void DoSpawnBandits(int AmbushId)
|
||||
{
|
||||
for (int i = 0; i < 2; ++i)
|
||||
me->SummonCreature(NPC_GRIM_BANDIT,
|
||||
m_afBanditLoc[i+uiAmbushId][0], m_afBanditLoc[i+uiAmbushId][1], m_afBanditLoc[i+uiAmbushId][2], 0.0f,
|
||||
TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -204,7 +201,7 @@ public:
|
||||
# npc_paoka_swiftmountain
|
||||
######*/
|
||||
|
||||
enum ePacka
|
||||
enum Packa
|
||||
{
|
||||
SAY_START = -1000362,
|
||||
SAY_WYVERN = -1000363,
|
||||
@@ -215,11 +212,11 @@ enum ePacka
|
||||
FACTION_ESCORTEE = 232 //guessed
|
||||
};
|
||||
|
||||
float m_afWyvernLoc[3][3]=
|
||||
Position const WyvernLoc[3] =
|
||||
{
|
||||
{-4990.606f, -906.057f, -5.343f},
|
||||
{-4970.241f, -927.378f, -4.951f},
|
||||
{-4985.364f, -952.528f, -5.199f}
|
||||
{-4990.606f, -906.057f, -5.343f, 0.0f},
|
||||
{-4970.241f, -927.378f, -4.951f, 0.0f},
|
||||
{-4985.364f, -952.528f, -5.199f, 0.0f}
|
||||
};
|
||||
|
||||
class npc_paoka_swiftmountain : public CreatureScript
|
||||
@@ -249,7 +246,7 @@ public:
|
||||
{
|
||||
npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { }
|
||||
|
||||
void Reset() { }
|
||||
void Reset() {}
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
@@ -272,9 +269,7 @@ public:
|
||||
void DoSpawnWyvern()
|
||||
{
|
||||
for (int i = 0; i < 3; ++i)
|
||||
me->SummonCreature(NPC_WYVERN,
|
||||
m_afWyvernLoc[i][0], m_afWyvernLoc[i][1], m_afWyvernLoc[i][2], 0.0f,
|
||||
TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -285,7 +280,7 @@ public:
|
||||
|
||||
#define GOSSIP_P "Please tell me the Phrase.."
|
||||
|
||||
enum ePlucky
|
||||
enum Plucky
|
||||
{
|
||||
FACTION_FRIENDLY = 35,
|
||||
QUEST_SCOOP = 1950,
|
||||
@@ -328,17 +323,17 @@ public:
|
||||
|
||||
struct npc_pluckyAI : public ScriptedAI
|
||||
{
|
||||
npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { m_uiNormFaction = creature->getFaction(); }
|
||||
npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { NormFaction = creature->getFaction(); }
|
||||
|
||||
uint32 m_uiNormFaction;
|
||||
uint32 m_uiResetTimer;
|
||||
uint32 NormFaction;
|
||||
uint32 ResetTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiResetTimer = 120000;
|
||||
ResetTimer = 120000;
|
||||
|
||||
if (me->getFaction() != m_uiNormFaction)
|
||||
me->setFaction(m_uiNormFaction);
|
||||
if (me->getFaction() != NormFaction)
|
||||
me->setFaction(NormFaction);
|
||||
|
||||
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
@@ -346,11 +341,11 @@ public:
|
||||
DoCast(me, SPELL_PLUCKY_CHICKEN, false);
|
||||
}
|
||||
|
||||
void ReceiveEmote(Player* player, uint32 uiTextEmote)
|
||||
void ReceiveEmote(Player* player, uint32 TextEmote)
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
if (uiTextEmote == TEXT_EMOTE_BECKON)
|
||||
if (TextEmote == TEXT_EMOTE_BECKON)
|
||||
{
|
||||
me->setFaction(FACTION_FRIENDLY);
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
@@ -358,7 +353,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
if (uiTextEmote == TEXT_EMOTE_CHICKEN)
|
||||
if (TextEmote == TEXT_EMOTE_CHICKEN)
|
||||
{
|
||||
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
|
||||
return;
|
||||
@@ -372,11 +367,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
void UpdateAI(const uint32 Diff)
|
||||
{
|
||||
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
|
||||
{
|
||||
if (m_uiResetTimer <= uiDiff)
|
||||
if (ResetTimer <= Diff)
|
||||
{
|
||||
if (!me->getVictim())
|
||||
EnterEvadeMode();
|
||||
@@ -386,7 +381,7 @@ public:
|
||||
return;
|
||||
}
|
||||
else
|
||||
m_uiResetTimer -= uiDiff;
|
||||
ResetTimer -= Diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
@@ -398,7 +393,7 @@ public:
|
||||
|
||||
};
|
||||
|
||||
enum ePantherCage
|
||||
enum PantherCage
|
||||
{
|
||||
ENRAGED_PANTHER = 10992
|
||||
};
|
||||
|
||||
@@ -23,17 +23,22 @@ SDComment: Quest support: 925
|
||||
SDCategory: Thunder Bluff
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*#####
|
||||
# npc_cairne_bloodhoof
|
||||
######*/
|
||||
|
||||
#define SPELL_BERSERKER_CHARGE 16636
|
||||
#define SPELL_CLEAVE 16044
|
||||
#define SPELL_MORTAL_STRIKE 16856
|
||||
#define SPELL_THUNDERCLAP 23931
|
||||
#define SPELL_UPPERCUT 22916
|
||||
enum CairneBloodhoof
|
||||
{
|
||||
SPELL_BERSERKER_CHARGE = 16636,
|
||||
SPELL_CLEAVE = 16044,
|
||||
SPELL_MORTAL_STRIKE = 16856,
|
||||
SPELL_THUNDERCLAP = 23931,
|
||||
SPELL_UPPERCUT = 22916
|
||||
};
|
||||
|
||||
#define GOSSIP_HCB "I know this is rather silly but a young ward who is a bit shy would like your hoofprint."
|
||||
//TODO: verify abilities/timers
|
||||
@@ -75,19 +80,19 @@ public:
|
||||
{
|
||||
npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
uint32 BerserkerCharge_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 MortalStrike_Timer;
|
||||
uint32 Thunderclap_Timer;
|
||||
uint32 Uppercut_Timer;
|
||||
uint32 BerserkerChargeTimer;
|
||||
uint32 CleaveTimer;
|
||||
uint32 MortalStrikeTimer;
|
||||
uint32 ThunderclapTimer;
|
||||
uint32 UppercutTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BerserkerCharge_Timer = 30000;
|
||||
Cleave_Timer = 5000;
|
||||
MortalStrike_Timer = 10000;
|
||||
Thunderclap_Timer = 15000;
|
||||
Uppercut_Timer = 10000;
|
||||
BerserkerChargeTimer = 30000;
|
||||
CleaveTimer = 5000;
|
||||
MortalStrikeTimer = 10000;
|
||||
ThunderclapTimer = 15000;
|
||||
UppercutTimer = 10000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) {}
|
||||
@@ -97,37 +102,37 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (BerserkerCharge_Timer <= diff)
|
||||
if (BerserkerChargeTimer <= diff)
|
||||
{
|
||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (target)
|
||||
DoCast(target, SPELL_BERSERKER_CHARGE);
|
||||
BerserkerCharge_Timer = 25000;
|
||||
} else BerserkerCharge_Timer -= diff;
|
||||
BerserkerChargeTimer = 25000;
|
||||
} else BerserkerChargeTimer -= diff;
|
||||
|
||||
if (Uppercut_Timer <= diff)
|
||||
if (UppercutTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_UPPERCUT);
|
||||
Uppercut_Timer = 20000;
|
||||
} else Uppercut_Timer -= diff;
|
||||
UppercutTimer = 20000;
|
||||
} else UppercutTimer -= diff;
|
||||
|
||||
if (Thunderclap_Timer <= diff)
|
||||
if (ThunderclapTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_THUNDERCLAP);
|
||||
Thunderclap_Timer = 15000;
|
||||
} else Thunderclap_Timer -= diff;
|
||||
ThunderclapTimer = 15000;
|
||||
} else ThunderclapTimer -= diff;
|
||||
|
||||
if (MortalStrike_Timer <= diff)
|
||||
if (MortalStrikeTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MORTAL_STRIKE);
|
||||
MortalStrike_Timer = 15000;
|
||||
} else MortalStrike_Timer -= diff;
|
||||
MortalStrikeTimer = 15000;
|
||||
} else MortalStrikeTimer -= diff;
|
||||
|
||||
if (Cleave_Timer <= diff)
|
||||
if (CleaveTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 7000;
|
||||
} else Cleave_Timer -= diff;
|
||||
CleaveTimer = 7000;
|
||||
} else CleaveTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -28,11 +28,12 @@ npc_a-me
|
||||
npc_ringo
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "ScriptedFollowerAI.h"
|
||||
|
||||
enum eAMeData
|
||||
enum AmeData
|
||||
{
|
||||
SAY_READY = -1000517,
|
||||
SAY_AGGRO1 = -1000518,
|
||||
@@ -76,41 +77,40 @@ public:
|
||||
{
|
||||
npc_ameAI(Creature* creature) : npc_escortAI(creature) {}
|
||||
|
||||
uint32 DEMORALIZINGSHOUT_Timer;
|
||||
uint32 DemoralizingShoutTimer;
|
||||
|
||||
void WaypointReached(uint32 waypointId)
|
||||
{
|
||||
Player* player = GetPlayerForEscort();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
switch (waypointId)
|
||||
if (Player* player = GetPlayerForEscort())
|
||||
{
|
||||
case 19:
|
||||
me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_AGGRO1, me, player);
|
||||
break;
|
||||
case 28:
|
||||
DoScriptText(SAY_SEARCH, me, player);
|
||||
break;
|
||||
case 38:
|
||||
me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_AGGRO2, me, player);
|
||||
break;
|
||||
case 49:
|
||||
me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_AGGRO3, me, player);
|
||||
break;
|
||||
case 55:
|
||||
DoScriptText(SAY_FINISH, me, player);
|
||||
player->GroupEventHappens(QUEST_CHASING_AME, me);
|
||||
break;
|
||||
switch (waypointId)
|
||||
{
|
||||
case 19:
|
||||
me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_AGGRO1, me, player);
|
||||
break;
|
||||
case 28:
|
||||
DoScriptText(SAY_SEARCH, me, player);
|
||||
break;
|
||||
case 38:
|
||||
me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_AGGRO2, me, player);
|
||||
break;
|
||||
case 49:
|
||||
me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
|
||||
DoScriptText(SAY_AGGRO3, me, player);
|
||||
break;
|
||||
case 55:
|
||||
DoScriptText(SAY_FINISH, me, player);
|
||||
player->GroupEventHappens(QUEST_CHASING_AME, me);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
DEMORALIZINGSHOUT_Timer = 5000;
|
||||
DemoralizingShoutTimer = 5000;
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned)
|
||||
@@ -130,11 +130,11 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (DEMORALIZINGSHOUT_Timer <= diff)
|
||||
if (DemoralizingShoutTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_DEMORALIZINGSHOUT);
|
||||
DEMORALIZINGSHOUT_Timer = 70000;
|
||||
} else DEMORALIZINGSHOUT_Timer -= diff;
|
||||
DemoralizingShoutTimer = 70000;
|
||||
} else DemoralizingShoutTimer -= diff;
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -143,7 +143,7 @@ public:
|
||||
# npc_ringo
|
||||
####*/
|
||||
|
||||
enum eRingo
|
||||
enum Ringo
|
||||
{
|
||||
SAY_RIN_START_1 = -1000416,
|
||||
SAY_RIN_START_2 = -1000417,
|
||||
@@ -201,17 +201,17 @@ public:
|
||||
{
|
||||
npc_ringoAI(Creature* creature) : FollowerAI(creature) { }
|
||||
|
||||
uint32 m_uiFaintTimer;
|
||||
uint32 m_uiEndEventProgress;
|
||||
uint32 m_uiEndEventTimer;
|
||||
uint32 FaintTimer;
|
||||
uint32 EndEventProgress;
|
||||
uint32 EndEventTimer;
|
||||
|
||||
uint64 SpraggleGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiFaintTimer = urand(30000, 60000);
|
||||
m_uiEndEventProgress = 0;
|
||||
m_uiEndEventTimer = 1000;
|
||||
FaintTimer = urand(30000, 60000);
|
||||
EndEventProgress = 0;
|
||||
EndEventTimer = 1000;
|
||||
SpraggleGUID = 0;
|
||||
}
|
||||
|
||||
@@ -266,13 +266,13 @@ public:
|
||||
SetFollowPaused(false);
|
||||
}
|
||||
|
||||
void UpdateFollowerAI(const uint32 uiDiff)
|
||||
void UpdateFollowerAI(const uint32 Diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (HasFollowState(STATE_FOLLOW_POSTEVENT))
|
||||
{
|
||||
if (m_uiEndEventTimer <= uiDiff)
|
||||
if (EndEventTimer <= Diff)
|
||||
{
|
||||
Unit* pSpraggle = Unit::GetUnit(*me, SpraggleGUID);
|
||||
if (!pSpraggle || !pSpraggle->isAlive())
|
||||
@@ -281,64 +281,61 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
switch (m_uiEndEventProgress)
|
||||
switch (EndEventProgress)
|
||||
{
|
||||
case 1:
|
||||
DoScriptText(SAY_RIN_END_1, me);
|
||||
m_uiEndEventTimer = 3000;
|
||||
EndEventTimer = 3000;
|
||||
break;
|
||||
case 2:
|
||||
DoScriptText(SAY_SPR_END_2, pSpraggle);
|
||||
m_uiEndEventTimer = 5000;
|
||||
EndEventTimer = 5000;
|
||||
break;
|
||||
case 3:
|
||||
DoScriptText(SAY_RIN_END_3, me);
|
||||
m_uiEndEventTimer = 1000;
|
||||
EndEventTimer = 1000;
|
||||
break;
|
||||
case 4:
|
||||
DoScriptText(EMOTE_RIN_END_4, me);
|
||||
SetFaint();
|
||||
m_uiEndEventTimer = 9000;
|
||||
EndEventTimer = 9000;
|
||||
break;
|
||||
case 5:
|
||||
DoScriptText(EMOTE_RIN_END_5, me);
|
||||
ClearFaint();
|
||||
m_uiEndEventTimer = 1000;
|
||||
EndEventTimer = 1000;
|
||||
break;
|
||||
case 6:
|
||||
DoScriptText(SAY_RIN_END_6, me);
|
||||
m_uiEndEventTimer = 3000;
|
||||
EndEventTimer = 3000;
|
||||
break;
|
||||
case 7:
|
||||
DoScriptText(SAY_SPR_END_7, pSpraggle);
|
||||
m_uiEndEventTimer = 10000;
|
||||
EndEventTimer = 10000;
|
||||
break;
|
||||
case 8:
|
||||
DoScriptText(EMOTE_RIN_END_8, me);
|
||||
m_uiEndEventTimer = 5000;
|
||||
EndEventTimer = 5000;
|
||||
break;
|
||||
case 9:
|
||||
SetFollowComplete();
|
||||
break;
|
||||
}
|
||||
|
||||
++m_uiEndEventProgress;
|
||||
++EndEventProgress;
|
||||
}
|
||||
else
|
||||
m_uiEndEventTimer -= uiDiff;
|
||||
EndEventTimer -= Diff;
|
||||
}
|
||||
else if (HasFollowState(STATE_FOLLOW_INPROGRESS))
|
||||
else if (HasFollowState(STATE_FOLLOW_INPROGRESS) && !HasFollowState(STATE_FOLLOW_PAUSED))
|
||||
{
|
||||
if (!HasFollowState(STATE_FOLLOW_PAUSED))
|
||||
if (FaintTimer <= Diff)
|
||||
{
|
||||
if (m_uiFaintTimer <= uiDiff)
|
||||
{
|
||||
SetFaint();
|
||||
m_uiFaintTimer = urand(60000, 120000);
|
||||
}
|
||||
else
|
||||
m_uiFaintTimer -= uiDiff;
|
||||
SetFaint();
|
||||
FaintTimer = urand(60000, 120000);
|
||||
}
|
||||
else
|
||||
FaintTimer -= Diff;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -29,7 +29,9 @@ npc_rivern_frostwind
|
||||
npc_witch_doctor_mauari
|
||||
EndContentData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
|
||||
/*######
|
||||
## npc_lorax
|
||||
|
||||
@@ -20,14 +20,15 @@
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1658001,
|
||||
SAY_SLAY_1 = -1658002,
|
||||
SAY_SLAY_2 = -1658003,
|
||||
SAY_DEATH = -1658004,
|
||||
SAY_PHASE2 = -1658005,
|
||||
SAY_PHASE3 = -1658006,
|
||||
SAY_AGGRO = 0,
|
||||
SAY_PHASE2 = 1,
|
||||
SAY_PHASE3 = 2,
|
||||
SAY_DEATH = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_THROW_SARONITE = 5,
|
||||
SAY_CAST_DEEP_FREEZE = 6,
|
||||
|
||||
SAY_TYRANNUS_DEATH = -1658007,
|
||||
SAY_TYRANNUS_DEATH = -1658007, // todo
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -107,8 +108,9 @@ class boss_garfrost : public CreatureScript
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
Talk(SAY_AGGRO);
|
||||
DoCast(me, SPELL_PERMAFROST);
|
||||
me->CallForHelp(70.0f);
|
||||
events.ScheduleEvent(EVENT_THROW_SARONITE, 7000);
|
||||
|
||||
instance->SetBossState(DATA_GARFROST, IN_PROGRESS);
|
||||
@@ -117,12 +119,13 @@ class boss_garfrost : public CreatureScript
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS)))
|
||||
DoScriptText(SAY_TYRANNUS_DEATH, tyrannus);
|
||||
|
||||
@@ -134,6 +137,7 @@ class boss_garfrost : public CreatureScript
|
||||
if (events.GetPhaseMask() & PHASE_ONE_MASK && !HealthAbovePct(66))
|
||||
{
|
||||
events.SetPhase(PHASE_TWO);
|
||||
Talk(SAY_PHASE2);
|
||||
events.DelayEvents(8000);
|
||||
DoCast(me, SPELL_THUNDERING_STOMP);
|
||||
events.ScheduleEvent(EVENT_JUMP, 1500);
|
||||
@@ -143,6 +147,7 @@ class boss_garfrost : public CreatureScript
|
||||
if (events.GetPhaseMask() & PHASE_TWO_MASK && !HealthAbovePct(33))
|
||||
{
|
||||
events.SetPhase(PHASE_THREE);
|
||||
Talk(SAY_PHASE3);
|
||||
events.DelayEvents(8000);
|
||||
DoCast(me, SPELL_THUNDERING_STOMP);
|
||||
events.ScheduleEvent(EVENT_JUMP, 1500);
|
||||
@@ -199,7 +204,10 @@ class boss_garfrost : public CreatureScript
|
||||
{
|
||||
case EVENT_THROW_SARONITE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
Talk(SAY_THROW_SARONITE);
|
||||
DoCast(target, SPELL_THROW_SARONITE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_THROW_SARONITE, urand(12500, 20000));
|
||||
break;
|
||||
case EVENT_CHILLING_WAVE:
|
||||
@@ -208,7 +216,10 @@ class boss_garfrost : public CreatureScript
|
||||
break;
|
||||
case EVENT_DEEP_FREEZE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
Talk(SAY_CAST_DEEP_FREEZE);
|
||||
DoCast(target, SPELL_DEEP_FREEZE);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_DEEP_FREEZE, 35000, 0, PHASE_THREE);
|
||||
break;
|
||||
case EVENT_JUMP:
|
||||
|
||||
@@ -23,6 +23,13 @@ Position const SlaveLeaderPos = {689.7158f, -104.8736f, 513.7360f, 0.0f};
|
||||
// position for Jaina and Sylvanas
|
||||
Position const EventLeaderPos2 = {1054.368f, 107.14620f, 628.4467f, 0.0f};
|
||||
|
||||
DoorData const Doors[] =
|
||||
{
|
||||
{GO_ICE_WALL, DATA_GARFROST, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
|
||||
{GO_ICE_WALL, DATA_ICK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
|
||||
{GO_HALLS_OF_REFLECTION_PORTCULLIS, DATA_TYRANNUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
|
||||
};
|
||||
|
||||
class instance_pit_of_saron : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
@@ -33,6 +40,7 @@ class instance_pit_of_saron : public InstanceMapScript
|
||||
instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadDoorData(Doors);
|
||||
_garfrostGUID = 0;
|
||||
_krickGUID = 0;
|
||||
_ickGUID = 0;
|
||||
@@ -154,6 +162,28 @@ class instance_pit_of_saron : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_ICE_WALL:
|
||||
case GO_HALLS_OF_REFLECTION_PORTCULLIS:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_ICE_WALL:
|
||||
case GO_HALLS_OF_REFLECTION_PORTCULLIS:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
|
||||
@@ -90,6 +90,8 @@ enum CreatureIds
|
||||
enum GameObjectIds
|
||||
{
|
||||
GO_SARONITE_ROCK = 196485,
|
||||
GO_ICE_WALL = 201885,
|
||||
GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -149,7 +149,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30500, EVENT_GROUP_NORMAL);
|
||||
events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL);
|
||||
events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0));
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY);
|
||||
CleanAuras();
|
||||
me->SetSpeed(MOVE_FLIGHT, 0.642857f, true);
|
||||
_offtank = NULL;
|
||||
_vampires.clear();
|
||||
@@ -170,6 +170,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
|
||||
DoZoneInCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS);
|
||||
CleanAuras();
|
||||
|
||||
DoCast(me, SPELL_SHROUD_OF_SORROW, true);
|
||||
DoCast(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true);
|
||||
@@ -180,15 +181,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
|
||||
CleanAuras();
|
||||
// Blah, credit the quest
|
||||
if (_creditBloodQuickening)
|
||||
{
|
||||
@@ -207,6 +200,19 @@ class boss_blood_queen_lana_thel : public CreatureScript
|
||||
}
|
||||
}
|
||||
|
||||
void CleanAuras()
|
||||
{
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
|
||||
}
|
||||
|
||||
void DoAction(int32 const action)
|
||||
{
|
||||
if (action != ACTION_KILL_MINCHAR)
|
||||
@@ -227,6 +233,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
_EnterEvadeMode();
|
||||
CleanAuras();
|
||||
if (_killMinchar)
|
||||
{
|
||||
_killMinchar = false;
|
||||
|
||||
@@ -631,9 +631,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
|
||||
_events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 24000); // cast
|
||||
_events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30000); // move
|
||||
me->SetDisableGravity(false);
|
||||
me->SendMovementFlagUpdate();
|
||||
me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f);
|
||||
me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 0.0f);
|
||||
me->GetMotionMaster()->MoveFall();
|
||||
for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
|
||||
(*itr)->AI()->DoAction(ACTION_DESPAWN);
|
||||
break;
|
||||
@@ -838,9 +836,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
|
||||
me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY);
|
||||
Talk(SAY_OUTRO_ALLIANCE_1);
|
||||
me->SetDisableGravity(false);
|
||||
me->SendMovementFlagUpdate();
|
||||
me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f);
|
||||
me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 0.0f);
|
||||
me->GetMotionMaster()->MoveFall();
|
||||
for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
|
||||
(*itr)->AI()->DoAction(ACTION_DESPAWN);
|
||||
|
||||
|
||||
@@ -1290,7 +1290,7 @@ struct npc_argent_captainAI : public ScriptedAI
|
||||
if (spell->Id == SPELL_REVIVE_CHAMPION && !IsUndead)
|
||||
{
|
||||
IsUndead = true;
|
||||
me->setDeathState(JUST_ALIVED);
|
||||
me->setDeathState(JUST_RESPAWNED);
|
||||
uint32 newEntry = 0;
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
|
||||
@@ -1044,7 +1044,7 @@ class spell_algalon_phase_punch : public SpellScriptLoader
|
||||
{
|
||||
PrepareAuraScript(spell_algalon_phase_punch_AuraScript);
|
||||
|
||||
void HandlePeriodic(AuraEffect const* aurEff)
|
||||
void HandlePeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (GetStackAmount() != 1)
|
||||
|
||||
@@ -18,18 +18,27 @@
|
||||
#include "ScriptMgr.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
enum Sara_Yells
|
||||
enum Sara
|
||||
{
|
||||
SAY_SARA_PREFIGHT_1 = -1603310,
|
||||
SAY_SARA_PREFIGHT_2 = -1603311,
|
||||
SAY_SARA_AGGRO_1 = -1603312,
|
||||
SAY_SARA_AGGRO_2 = -1603313,
|
||||
SAY_SARA_AGGRO_3 = -1603314,
|
||||
SAY_SARA_SLAY_1 = -1603315,
|
||||
SAY_SARA_SLAY_2 = -1603316,
|
||||
WHISP_SARA_INSANITY = -1603317,
|
||||
SAY_SARA_PHASE2_1 = -1603318,
|
||||
SAY_SARA_PHASE2_2 = -1603319,
|
||||
// text
|
||||
YELL_SARA_PREFIGHT = 0,
|
||||
YELL_COMBAT_PHASE_1 = 1,
|
||||
YELL_COMBAT_PHASE_2 = 2,
|
||||
YELL_SLAY = 3,
|
||||
|
||||
// Phase 1 spells
|
||||
SPELL_SARAS_ANGER_1 = 63147, // Target Entry 33136
|
||||
SPELL_SARAS_ANGER_2 = 63744, // Target Entry 33136
|
||||
SPELL_SARAS_FEVOR_1 = 63138, // Target Player
|
||||
SPELL_SARAS_FEVOR_2 = 63747, // Target Player
|
||||
SPELL_SARAS_BLESSING_1 = 63134, // Target Player
|
||||
SPELL_SARAS_BLESSING_2 = 63745, // Target Self
|
||||
|
||||
// Phase 2 spells
|
||||
SPELL_PHYCHOSIS = 63795, // Target Self
|
||||
SPELL_MALADY_OF_THE_MIND = 63830, // Target Self
|
||||
SPELL_DEATH_RAY = 63891, // Target Self
|
||||
SPELL_BRAIN_LINK = 63802, // Target Self
|
||||
};
|
||||
|
||||
enum YoggSaron_Yells
|
||||
|
||||
@@ -690,7 +690,8 @@ public:
|
||||
{
|
||||
AddWave();
|
||||
bActive = false;
|
||||
uiActivationTimer = 5000;
|
||||
// 1 minute waiting time after each boss fight
|
||||
uiActivationTimer = (uiWaveCount == 6 || uiWaveCount == 12) ? 60000 : 5000;
|
||||
} else uiActivationTimer -= diff;
|
||||
}
|
||||
|
||||
|
||||
@@ -761,6 +761,23 @@ class spell_dk_death_coil : public SpellScriptLoader
|
||||
}
|
||||
}
|
||||
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
if (Unit* target = GetExplTargetUnit())
|
||||
{
|
||||
if (!caster->IsFriendlyTo(target) && !caster->isInFront(target))
|
||||
return SPELL_FAILED_UNIT_NOT_INFRONT;
|
||||
|
||||
if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
}
|
||||
else
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast);
|
||||
|
||||
@@ -1513,7 +1513,7 @@ class spell_gen_luck_of_the_draw : public SpellScriptLoader
|
||||
if (group->isLFGGroup())
|
||||
if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
|
||||
if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
|
||||
if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty())
|
||||
if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == uint32(map->GetDifficulty()))
|
||||
if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM)
|
||||
return; // in correct dungeon
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ class spell_hun_chimera_shot : public SpellScriptLoader
|
||||
spellId = HUNTER_SPELL_CHIMERA_SHOT_SERPENT;
|
||||
basePoint = caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), aurEff->GetAmount(), DOT, aura->GetStackAmount());
|
||||
ApplyPctN(basePoint, TickCount * 40);
|
||||
basePoint = unitTarget->SpellDamageBonusTaken(aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount());
|
||||
basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount());
|
||||
}
|
||||
// Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting.
|
||||
else if (familyFlag[1] & 0x00000080)
|
||||
|
||||
@@ -1095,7 +1095,7 @@ class spell_item_shimmering_vessel : public SpellScriptLoader
|
||||
void HandleDummy(SpellEffIndex /* effIndex */)
|
||||
{
|
||||
if (Creature* target = GetHitCreature())
|
||||
target->setDeathState(JUST_ALIVED);
|
||||
target->setDeathState(JUST_RESPAWNED);
|
||||
}
|
||||
|
||||
void Register()
|
||||
@@ -1535,7 +1535,7 @@ class spell_item_impale_leviroth : public SpellScriptLoader
|
||||
void HandleDummy(SpellEffIndex /* effIndex */)
|
||||
{
|
||||
if (Unit* target = GetHitCreature())
|
||||
if (target->GetEntry() == NPC_LEVIROTH && target->HealthBelowPct(95))
|
||||
if (target->GetEntry() == NPC_LEVIROTH && !target->HealthBelowPct(95))
|
||||
target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true);
|
||||
}
|
||||
|
||||
@@ -1748,8 +1748,16 @@ class spell_item_rocket_boots : public SpellScriptLoader
|
||||
caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, NULL);
|
||||
}
|
||||
|
||||
SpellCastResult CheckCast()
|
||||
{
|
||||
if (GetCaster()->IsInWater())
|
||||
return SPELL_FAILED_ONLY_ABOVEWATER;
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnCheckCast += SpellCheckCastFn(spell_item_rocket_boots_SpellScript::CheckCast);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_item_rocket_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
@@ -2036,7 +2044,7 @@ public:
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
if (GetHitUnit())
|
||||
GetCaster()->CastSpell(GetCaster(),SPELL_FORCE_CAST_SUMMON_GNOME_SOUL);
|
||||
}
|
||||
|
||||
|
||||
@@ -297,13 +297,15 @@ class spell_pal_holy_shock : public SpellScriptLoader
|
||||
{
|
||||
if (!caster->IsFriendlyTo(target))
|
||||
{
|
||||
if (!caster->HasInArc(static_cast<float>(M_PI), target))
|
||||
return SPELL_FAILED_UNIT_NOT_INFRONT;
|
||||
|
||||
if (!caster->IsValidAttackTarget(target))
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
|
||||
if (!caster->isInFront(target))
|
||||
return SPELL_FAILED_UNIT_NOT_INFRONT;
|
||||
}
|
||||
}
|
||||
else
|
||||
return SPELL_FAILED_BAD_TARGETS;
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -1105,6 +1105,63 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
enum LeaveNothingToChance
|
||||
{
|
||||
NPC_UPPER_MINE_SHAFT = 27436,
|
||||
NPC_LOWER_MINE_SHAFT = 27437,
|
||||
|
||||
SPELL_UPPER_MINE_SHAFT_CREDIT = 48744,
|
||||
SPELL_LOWER_MINE_SHAFT_CREDIT = 48745,
|
||||
};
|
||||
|
||||
class spell_q12277_wintergarde_mine_explosion : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_q12277_wintergarde_mine_explosion() : SpellScriptLoader("spell_q12277_wintergarde_mine_explosion") { }
|
||||
|
||||
class spell_q12277_wintergarde_mine_explosion_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_q12277_wintergarde_mine_explosion_SpellScript);
|
||||
|
||||
void HandleDummy(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Creature* unitTarget = GetHitCreature())
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
if (caster->GetTypeId() == TYPEID_UNIT)
|
||||
{
|
||||
if (Unit* owner = caster->GetOwner())
|
||||
{
|
||||
switch (unitTarget->GetEntry())
|
||||
{
|
||||
case NPC_UPPER_MINE_SHAFT:
|
||||
caster->CastSpell(owner, SPELL_UPPER_MINE_SHAFT_CREDIT, true);
|
||||
break;
|
||||
case NPC_LOWER_MINE_SHAFT:
|
||||
caster->CastSpell(owner, SPELL_LOWER_MINE_SHAFT_CREDIT, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_q12277_wintergarde_mine_explosion_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_q12277_wintergarde_mine_explosion_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_quest_spell_scripts()
|
||||
{
|
||||
new spell_q55_sacred_cleansing();
|
||||
@@ -1131,4 +1188,5 @@ void AddSC_quest_spell_scripts()
|
||||
new spell_q14112_14145_chum_the_water();
|
||||
new spell_q9452_cast_net();
|
||||
new spell_q12987_read_pronouncement();
|
||||
new spell_q12277_wintergarde_mine_explosion();
|
||||
}
|
||||
|
||||
@@ -217,7 +217,7 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const* aurEff)
|
||||
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
if (!GetCaster())
|
||||
return;
|
||||
@@ -502,7 +502,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
|
||||
if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0))
|
||||
AddPctN(damage, aurEff->GetAmount());
|
||||
|
||||
damage = int32(target->SpellHealingBonusTaken(triggeringSpell, damage, HEAL));
|
||||
damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL));
|
||||
}
|
||||
caster->CastCustomSpell(target, SPELL_HEALING_STREAM_TOTEM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
|
||||
}
|
||||
|
||||
@@ -177,27 +177,27 @@ class spell_warr_deep_wounds : public SpellScriptLoader
|
||||
void HandleDummy(SpellEffIndex /* effIndex */)
|
||||
{
|
||||
int32 damage = GetEffectValue();
|
||||
Unit* caster = GetCaster();
|
||||
if (Unit* target = GetHitUnit())
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
// apply percent damage mods
|
||||
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
|
||||
{
|
||||
// apply percent damage mods
|
||||
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
|
||||
|
||||
ApplyPctN(damage, 16 * sSpellMgr->GetSpellRank(GetSpellInfo()->Id));
|
||||
ApplyPctN(damage, 16 * sSpellMgr->GetSpellRank(GetSpellInfo()->Id));
|
||||
|
||||
damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
|
||||
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC);
|
||||
uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude;
|
||||
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC);
|
||||
uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude;
|
||||
// Add remaining ticks to damage done
|
||||
if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID()))
|
||||
damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber());
|
||||
|
||||
// Add remaining ticks to damage done
|
||||
if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID()))
|
||||
damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber());
|
||||
damage = damage / ticks;
|
||||
|
||||
damage = damage / ticks;
|
||||
|
||||
damage = target->SpellDamageBonusTaken(GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
|
||||
|
||||
caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true);
|
||||
}
|
||||
caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
#include <ace/Stack_Trace.h>
|
||||
#include <ace/OS_NS_unistd.h>
|
||||
|
||||
#define WPAssert( assertion ) { if (!(assertion)) { ACE_Stack_Trace st; sLog->outError( "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); assert( #assertion &&0 ); ((void(*)())NULL)();} }
|
||||
#define WPError( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "%\n%s:%i in %s ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); assert( false ); }
|
||||
#define WPWarning( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s WARNING:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); }
|
||||
#define WPFatal( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); ACE_OS::sleep(10); assert( #assertion &&0 ); abort(); }
|
||||
#define WPAssert(assertion) { if (!(assertion)) { ACE_Stack_Trace st; sLog->outError("\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); *((volatile int*)NULL) = 0; } }
|
||||
#define WPError(assertion, errmsg) { if (!(assertion)) { sLog->outError("%\n%s:%i in %s ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg); *((volatile int*)NULL) = 0; } }
|
||||
#define WPWarning(assertion, errmsg) { if (!(assertion)) { sLog->outError("\n%s:%i in %s WARNING:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg); } }
|
||||
#define WPFatal(assertion, errmsg) { if (!(assertion)) { sLog->outError("\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg); ACE_OS::sleep(10); *((volatile int*)NULL) = 0; } }
|
||||
|
||||
#define ASSERT WPAssert
|
||||
#endif
|
||||
|
||||
@@ -259,15 +259,15 @@ void ReadLiquidTypeTableDBC()
|
||||
exit(1);
|
||||
}
|
||||
|
||||
size_t LiqType_count = dbc.getRecordCount();
|
||||
size_t LiqType_maxid = dbc.getMaxId();
|
||||
LiqType = new uint16[LiqType_maxid + 1];
|
||||
memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16));
|
||||
size_t liqTypeCount = dbc.getRecordCount();
|
||||
size_t liqTypeMaxId = dbc.getMaxId();
|
||||
LiqType = new uint16[liqTypeMaxId + 1];
|
||||
memset(LiqType, 0xff, (liqTypeMaxId + 1) * sizeof(uint16));
|
||||
|
||||
for(uint32 x = 0; x < LiqType_count; ++x)
|
||||
for(uint32 x = 0; x < liqTypeCount; ++x)
|
||||
LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
|
||||
|
||||
printf("Done! (%u LiqTypes loaded)\n", LiqType_count);
|
||||
printf("Done! (%u LiqTypes loaded)\n", liqTypeCount);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -364,7 +364,7 @@ uint8 liquid_flags[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
|
||||
bool liquid_show[ADT_GRID_SIZE][ADT_GRID_SIZE];
|
||||
float liquid_height[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1];
|
||||
|
||||
bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x, uint32 build)
|
||||
bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/, uint32 build)
|
||||
{
|
||||
ADT_file adt;
|
||||
|
||||
|
||||
@@ -60,8 +60,8 @@ class MPQFile
|
||||
libmpq__off_t pointer,size;
|
||||
|
||||
// disable copying
|
||||
MPQFile(const MPQFile &f) {}
|
||||
void operator=(const MPQFile &f) {}
|
||||
MPQFile(const MPQFile& /*f*/) {}
|
||||
void operator=(const MPQFile& /*f*/) {}
|
||||
|
||||
public:
|
||||
MPQFile(const char* filename); // filenames are not case sensitive
|
||||
|
||||
Reference in New Issue
Block a user