mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-17 17:24:33 +00:00
refactor(Core/Scripts): restyle scripts lib with astyle (#3467)
This commit is contained in:
@@ -17,116 +17,116 @@
|
||||
|
||||
class achievement_resilient_victory : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { }
|
||||
public:
|
||||
achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB && bg->ToBattlegroundAB()->IsTeamScores500Disadvantage(source->GetTeamId());
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB && bg->ToBattlegroundAB()->IsTeamScores500Disadvantage(source->GetTeamId());
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_bg_control_all_nodes : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_bg_control_all_nodes() : AchievementCriteriaScript("achievement_bg_control_all_nodes") { }
|
||||
public:
|
||||
achievement_bg_control_all_nodes() : AchievementCriteriaScript("achievement_bg_control_all_nodes") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->AllNodesConrolledByTeam(source->GetTeamId());
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->AllNodesConrolledByTeam(source->GetTeamId());
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_save_the_day : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_save_the_day() : AchievementCriteriaScript("achievement_save_the_day") { }
|
||||
public:
|
||||
achievement_save_the_day() : AchievementCriteriaScript("achievement_save_the_day") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* target)
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
|
||||
if (Player const* player = target->ToPlayer())
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS && bg->ToBattlegroundWS()->GetFlagState(player->GetTeamId()) == BG_WS_FLAG_STATE_ON_BASE;
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* target)
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
|
||||
if (Player const* player = target->ToPlayer())
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS && bg->ToBattlegroundWS()->GetFlagState(player->GetTeamId()) == BG_WS_FLAG_STATE_ON_BASE;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_bg_ic_resource_glut : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_bg_ic_resource_glut() : AchievementCriteriaScript("achievement_bg_ic_resource_glut") { }
|
||||
public:
|
||||
achievement_bg_ic_resource_glut() : AchievementCriteriaScript("achievement_bg_ic_resource_glut") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC && bg->ToBattlegroundIC()->IsResourceGlutAllowed(source->GetTeamId());
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC && bg->ToBattlegroundIC()->IsResourceGlutAllowed(source->GetTeamId());
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_bg_ic_glaive_grave : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_bg_ic_glaive_grave() : AchievementCriteriaScript("achievement_bg_ic_glaive_grave") { }
|
||||
public:
|
||||
achievement_bg_ic_glaive_grave() : AchievementCriteriaScript("achievement_bg_ic_glaive_grave") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (Creature* vehicle = source->GetVehicleCreatureBase())
|
||||
return vehicle->GetEntry() == NPC_GLAIVE_THROWER_H || vehicle->GetEntry() == NPC_GLAIVE_THROWER_A;
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (Creature* vehicle = source->GetVehicleCreatureBase())
|
||||
return vehicle->GetEntry() == NPC_GLAIVE_THROWER_H || vehicle->GetEntry() == NPC_GLAIVE_THROWER_A;
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_bg_ic_mowed_down : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_bg_ic_mowed_down() : AchievementCriteriaScript("achievement_bg_ic_mowed_down") { }
|
||||
public:
|
||||
achievement_bg_ic_mowed_down() : AchievementCriteriaScript("achievement_bg_ic_mowed_down") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (Creature* vehicle = source->GetVehicleCreatureBase())
|
||||
return vehicle->GetEntry() == NPC_KEEP_CANNON;
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (Creature* vehicle = source->GetVehicleCreatureBase())
|
||||
return vehicle->GetEntry() == NPC_KEEP_CANNON;
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_bg_sa_artillery : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_bg_sa_artillery() : AchievementCriteriaScript("achievement_bg_sa_artillery") { }
|
||||
public:
|
||||
achievement_bg_sa_artillery() : AchievementCriteriaScript("achievement_bg_sa_artillery") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (Creature* vehicle = source->GetVehicleCreatureBase())
|
||||
return vehicle->GetEntry() == NPC_ANTI_PERSONNAL_CANNON;
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (Creature* vehicle = source->GetVehicleCreatureBase())
|
||||
return vehicle->GetEntry() == NPC_ANTI_PERSONNAL_CANNON;
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_arena_by_type : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_arena_by_type(char const* name, uint8 arenaType) : AchievementCriteriaScript(name),
|
||||
_arenaType(arenaType)
|
||||
{
|
||||
}
|
||||
public:
|
||||
achievement_arena_by_type(char const* name, uint8 arenaType) : AchievementCriteriaScript(name),
|
||||
_arenaType(arenaType)
|
||||
{
|
||||
}
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
return source->InArena() && source->GetBattleground()->GetArenaType() == _arenaType;
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
return source->InArena() && source->GetBattleground()->GetArenaType() == _arenaType;
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 const _arenaType;
|
||||
private:
|
||||
uint8 const _arenaType;
|
||||
};
|
||||
|
||||
class achievement_sickly_gazelle : public AchievementCriteriaScript
|
||||
@@ -149,38 +149,38 @@ public:
|
||||
|
||||
class achievement_everything_counts : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { }
|
||||
public:
|
||||
achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsBothMinesControlledByTeam(source->GetTeamId());
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsBothMinesControlledByTeam(source->GetTeamId());
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_bg_av_perfection : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { }
|
||||
public:
|
||||
achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsAllTowersControlledAndCaptainAlive(source->GetTeamId());
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV && bg->ToBattlegroundAV()->IsAllTowersControlledAndCaptainAlive(source->GetTeamId());
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_sa_defense_of_the_ancients : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_sa_defense_of_the_ancients() : AchievementCriteriaScript("achievement_sa_defense_of_the_ancients") { }
|
||||
public:
|
||||
achievement_sa_defense_of_the_ancients() : AchievementCriteriaScript("achievement_sa_defense_of_the_ancients") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA && bg->ToBattlegroundSA()->AllowDefenseOfTheAncients(source);
|
||||
}
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
return bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA && bg->ToBattlegroundSA()->AllowDefenseOfTheAncients(source);
|
||||
}
|
||||
};
|
||||
|
||||
enum ArgentTournamentAreas
|
||||
@@ -195,50 +195,50 @@ enum ArgentTournamentAreas
|
||||
|
||||
class achievement_tilted : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_tilted() : AchievementCriteriaScript("achievement_tilted") {}
|
||||
public:
|
||||
achievement_tilted() : AchievementCriteriaScript("achievement_tilted") {}
|
||||
|
||||
bool OnCheck(Player* player, Unit* /*target*/)
|
||||
{
|
||||
if (!player)
|
||||
return false;
|
||||
bool OnCheck(Player* player, Unit* /*target*/)
|
||||
{
|
||||
if (!player)
|
||||
return false;
|
||||
|
||||
uint32 areaid = player->GetAreaId();
|
||||
bool checkArea = areaid == AREA_ARGENT_TOURNAMENT_FIELDS ||
|
||||
areaid == AREA_RING_OF_ASPIRANTS ||
|
||||
areaid == AREA_RING_OF_ARGENT_VALIANTS ||
|
||||
areaid == AREA_RING_OF_ALLIANCE_VALIANTS ||
|
||||
areaid == AREA_RING_OF_HORDE_VALIANTS ||
|
||||
areaid == AREA_RING_OF_CHAMPIONS;
|
||||
uint32 areaid = player->GetAreaId();
|
||||
bool checkArea = areaid == AREA_ARGENT_TOURNAMENT_FIELDS ||
|
||||
areaid == AREA_RING_OF_ASPIRANTS ||
|
||||
areaid == AREA_RING_OF_ARGENT_VALIANTS ||
|
||||
areaid == AREA_RING_OF_ALLIANCE_VALIANTS ||
|
||||
areaid == AREA_RING_OF_HORDE_VALIANTS ||
|
||||
areaid == AREA_RING_OF_CHAMPIONS;
|
||||
|
||||
return checkArea && player->duel && player->duel->isMounted;
|
||||
}
|
||||
return checkArea && player->duel && player->duel->isMounted;
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_not_even_a_scratch : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_not_even_a_scratch() : AchievementCriteriaScript("achievement_not_even_a_scratch") { }
|
||||
public:
|
||||
achievement_not_even_a_scratch() : AchievementCriteriaScript("achievement_not_even_a_scratch") { }
|
||||
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (!source)
|
||||
return false;
|
||||
bool OnCheck(Player* source, Unit* /*target*/)
|
||||
{
|
||||
if (!source)
|
||||
return false;
|
||||
|
||||
Battleground* battleground = source->GetBattleground();
|
||||
return battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA && battleground->ToBattlegroundSA()->notEvenAScratch(source->GetTeamId());
|
||||
}
|
||||
Battleground* battleground = source->GetBattleground();
|
||||
return battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA && battleground->ToBattlegroundSA()->notEvenAScratch(source->GetTeamId());
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_killed_exp_or_honor_target : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_killed_exp_or_honor_target() : AchievementCriteriaScript("achievement_killed_exp_or_honor_target") { }
|
||||
public:
|
||||
achievement_killed_exp_or_honor_target() : AchievementCriteriaScript("achievement_killed_exp_or_honor_target") { }
|
||||
|
||||
bool OnCheck(Player* player, Unit* target)
|
||||
{
|
||||
return target && player->isHonorOrXPTarget(target);
|
||||
}
|
||||
bool OnCheck(Player* player, Unit* target)
|
||||
{
|
||||
return target && player->isHonorOrXPTarget(target);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_achievement_scripts()
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
}
|
||||
|
||||
// Registration Email can NOT be changed apart from GM level users. Thus, we do not require to log them...
|
||||
// ACCOUNT_CHANGE_EMAIL = 4
|
||||
// ACCOUNT_CHANGE_EMAIL = 4
|
||||
void OnEmailChange(uint32 accountId) override
|
||||
{
|
||||
AccountIPLogAction(accountId, ACCOUNT_CHANGE_EMAIL); // ... they get logged by gm command logger anyway
|
||||
@@ -76,7 +76,7 @@ public:
|
||||
|
||||
/* It's impossible to log the account logout process out of character selection - shouldn't matter anyway,
|
||||
* as ip doesn't change through playing (obviously).*/
|
||||
// ACCOUNT_LOGOUT = 6
|
||||
// ACCOUNT_LOGOUT = 6
|
||||
void AccountIPLogAction(uint32 accountId, IPLoggingTypes aType)
|
||||
{
|
||||
if (!sWorld->getBoolConfig(CONFIG_IP_BASED_ACTION_LOGGING))
|
||||
@@ -94,32 +94,32 @@ public:
|
||||
// Avoids Magicnumbers in SQL table
|
||||
switch (aType)
|
||||
{
|
||||
case ACCOUNT_LOGIN:
|
||||
systemNote = "Logged on Successful AccountLogin";
|
||||
break;
|
||||
case ACCOUNT_FAIL_LOGIN:
|
||||
systemNote = "Logged on Failed AccountLogin";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_PW:
|
||||
systemNote = "Logged on Successful Account Password Change";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_PW_FAIL:
|
||||
systemNote = "Logged on Failed Account Password Change";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_EMAIL:
|
||||
systemNote = "Logged on Successful Account Email Change";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_EMAIL_FAIL:
|
||||
systemNote = "Logged on Failed Account Email Change";
|
||||
break;
|
||||
case ACCOUNT_LOGIN:
|
||||
systemNote = "Logged on Successful AccountLogin";
|
||||
break;
|
||||
case ACCOUNT_FAIL_LOGIN:
|
||||
systemNote = "Logged on Failed AccountLogin";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_PW:
|
||||
systemNote = "Logged on Successful Account Password Change";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_PW_FAIL:
|
||||
systemNote = "Logged on Failed Account Password Change";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_EMAIL:
|
||||
systemNote = "Logged on Successful Account Email Change";
|
||||
break;
|
||||
case ACCOUNT_CHANGE_EMAIL_FAIL:
|
||||
systemNote = "Logged on Failed Account Email Change";
|
||||
break;
|
||||
/*case ACCOUNT_LOGOUT:
|
||||
systemNote = "Logged on AccountLogout"; //Can not be logged
|
||||
break;*/
|
||||
// Neither should happen. Ever. Period. If it does, call Ghostbusters and all your local software defences to investigate.
|
||||
case UNKNOWN_ACTION:
|
||||
default:
|
||||
systemNote = "ERROR! Unknown action!";
|
||||
break;
|
||||
// Neither should happen. Ever. Period. If it does, call Ghostbusters and all your local software defences to investigate.
|
||||
case UNKNOWN_ACTION:
|
||||
default:
|
||||
systemNote = "ERROR! Unknown action!";
|
||||
break;
|
||||
}
|
||||
|
||||
// Once we have done everything, we can insert the new log.
|
||||
@@ -202,26 +202,26 @@ public:
|
||||
// ... with this switch, so that we have a more accurate phrasing of what type it is
|
||||
switch (aType)
|
||||
{
|
||||
case CHARACTER_CREATE:
|
||||
systemNote = "Logged on CharacterCreate";
|
||||
break;
|
||||
case CHARACTER_LOGIN:
|
||||
systemNote = "Logged on CharacterLogin";
|
||||
break;
|
||||
case CHARACTER_LOGOUT:
|
||||
systemNote = "Logged on CharacterLogout";
|
||||
break;
|
||||
case CHARACTER_DELETE:
|
||||
systemNote = "Logged on CharacterDelete";
|
||||
break;
|
||||
case CHARACTER_FAILED_DELETE:
|
||||
systemNote = "Logged on Failed CharacterDelete";
|
||||
break;
|
||||
case CHARACTER_CREATE:
|
||||
systemNote = "Logged on CharacterCreate";
|
||||
break;
|
||||
case CHARACTER_LOGIN:
|
||||
systemNote = "Logged on CharacterLogin";
|
||||
break;
|
||||
case CHARACTER_LOGOUT:
|
||||
systemNote = "Logged on CharacterLogout";
|
||||
break;
|
||||
case CHARACTER_DELETE:
|
||||
systemNote = "Logged on CharacterDelete";
|
||||
break;
|
||||
case CHARACTER_FAILED_DELETE:
|
||||
systemNote = "Logged on Failed CharacterDelete";
|
||||
break;
|
||||
// Neither should happen. Ever. Period. If it does, call Mythbusters.
|
||||
case UNKNOWN_ACTION:
|
||||
default:
|
||||
systemNote = "ERROR! Unknown action!";
|
||||
break;
|
||||
case UNKNOWN_ACTION:
|
||||
default:
|
||||
systemNote = "ERROR! Unknown action!";
|
||||
break;
|
||||
}
|
||||
|
||||
// Once we have done everything, we can insert the new log.
|
||||
@@ -274,17 +274,17 @@ public:
|
||||
// Avoids Magicnumbers in SQL table
|
||||
switch (aType)
|
||||
{
|
||||
case CHARACTER_DELETE:
|
||||
systemNote = "Logged on CharacterDelete";
|
||||
break;
|
||||
case CHARACTER_FAILED_DELETE:
|
||||
systemNote = "Logged on Failed CharacterDelete";
|
||||
break;
|
||||
case CHARACTER_DELETE:
|
||||
systemNote = "Logged on CharacterDelete";
|
||||
break;
|
||||
case CHARACTER_FAILED_DELETE:
|
||||
systemNote = "Logged on Failed CharacterDelete";
|
||||
break;
|
||||
// Neither should happen. Ever. Period. If it does, call to whatever god you have for mercy and guidance.
|
||||
case UNKNOWN_ACTION:
|
||||
default:
|
||||
systemNote = "ERROR! Unknown action!";
|
||||
break;
|
||||
case UNKNOWN_ACTION:
|
||||
default:
|
||||
systemNote = "ERROR! Unknown action!";
|
||||
break;
|
||||
}
|
||||
|
||||
// Once we have done everything, we can insert the new log.
|
||||
|
||||
@@ -31,24 +31,24 @@ EndContentData */
|
||||
// Ours
|
||||
class AreaTrigger_at_voltarus_middle : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_voltarus_middle()
|
||||
: AreaTriggerScript("at_voltarus_middle")
|
||||
{
|
||||
}
|
||||
AreaTrigger_at_voltarus_middle()
|
||||
: AreaTriggerScript("at_voltarus_middle")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (player->IsAlive() && !player->IsInCombat())
|
||||
if (player->HasItemCount(39319)) // Scepter of Domination
|
||||
{
|
||||
player->TeleportTo(571, 6242.67f, -1972.10f, 484.783f, 0.6f);
|
||||
return true;
|
||||
}
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (player->IsAlive() && !player->IsInCombat())
|
||||
if (player->HasItemCount(39319)) // Scepter of Domination
|
||||
{
|
||||
player->TeleportTo(571, 6242.67f, -1972.10f, 484.783f, 0.6f);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -64,21 +64,21 @@ enum CoilfangGOs
|
||||
|
||||
class AreaTrigger_at_coilfang_waterfall : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_coilfang_waterfall()
|
||||
: AreaTriggerScript("at_coilfang_waterfall")
|
||||
{
|
||||
}
|
||||
AreaTrigger_at_coilfang_waterfall()
|
||||
: AreaTriggerScript("at_coilfang_waterfall")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (GameObject* go = GetClosestGameObjectWithEntry(player, GO_COILFANG_WATERFALL, 35.0f))
|
||||
if (go->getLootState() == GO_READY)
|
||||
go->UseDoorOrButton();
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (GameObject* go = GetClosestGameObjectWithEntry(player, GO_COILFANG_WATERFALL, 35.0f))
|
||||
if (go->getLootState() == GO_READY)
|
||||
go->UseDoorOrButton();
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/*#####
|
||||
@@ -96,33 +96,33 @@ enum LegionTeleporter
|
||||
|
||||
class AreaTrigger_at_legion_teleporter : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_legion_teleporter()
|
||||
: AreaTriggerScript("at_legion_teleporter")
|
||||
{
|
||||
}
|
||||
AreaTrigger_at_legion_teleporter()
|
||||
: AreaTriggerScript("at_legion_teleporter")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (player->IsAlive() && !player->IsInCombat())
|
||||
{
|
||||
if (player->IsAlive() && !player->IsInCombat())
|
||||
if (player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_A))
|
||||
{
|
||||
if (player->GetTeamId() == TEAM_ALLIANCE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_A))
|
||||
{
|
||||
player->CastSpell(player, SPELL_TELE_A_TO, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player->GetTeamId() == TEAM_HORDE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_H))
|
||||
{
|
||||
player->CastSpell(player, SPELL_TELE_H_TO, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
player->CastSpell(player, SPELL_TELE_A_TO, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (player->GetTeamId() == TEAM_HORDE && player->GetQuestRewardStatus(QUEST_GAINING_ACCESS_H))
|
||||
{
|
||||
player->CastSpell(player, SPELL_TELE_H_TO, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -138,20 +138,20 @@ enum StormwrightShelf
|
||||
|
||||
class AreaTrigger_at_stormwright_shelf : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_stormwright_shelf()
|
||||
: AreaTriggerScript("at_stormwright_shelf")
|
||||
{
|
||||
}
|
||||
AreaTrigger_at_stormwright_shelf()
|
||||
: AreaTriggerScript("at_stormwright_shelf")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (!player->isDead() && player->GetQuestStatus(QUEST_STRENGTH_OF_THE_TEMPEST) == QUEST_STATUS_INCOMPLETE)
|
||||
player->CastSpell(player, SPELL_CREATE_TRUE_POWER_OF_THE_TEMPEST, false);
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (!player->isDead() && player->GetQuestStatus(QUEST_STRENGTH_OF_THE_TEMPEST) == QUEST_STATUS_INCOMPLETE)
|
||||
player->CastSpell(player, SPELL_CREATE_TRUE_POWER_OF_THE_TEMPEST, false);
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -166,23 +166,23 @@ enum ScentLarkorwi
|
||||
|
||||
class AreaTrigger_at_scent_larkorwi : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_scent_larkorwi()
|
||||
: AreaTriggerScript("at_scent_larkorwi")
|
||||
AreaTrigger_at_scent_larkorwi()
|
||||
: AreaTriggerScript("at_scent_larkorwi")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (!player->isDead() && player->GetQuestStatus(QUEST_SCENT_OF_LARKORWI) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
if (!player->FindNearestCreature(NPC_LARKORWI_MATE, 15))
|
||||
player->SummonCreature(NPC_LARKORWI_MATE, player->GetPositionX() + 5, player->GetPositionY(), player->GetPositionZ(), 3.3f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000);
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (!player->isDead() && player->GetQuestStatus(QUEST_SCENT_OF_LARKORWI) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
if (!player->FindNearestCreature(NPC_LARKORWI_MATE, 15))
|
||||
player->SummonCreature(NPC_LARKORWI_MATE, player->GetPositionX()+5, player->GetPositionY(), player->GetPositionZ(), 3.3f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/*#####
|
||||
@@ -197,47 +197,47 @@ enum AtLastRites
|
||||
|
||||
class AreaTrigger_at_last_rites : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_last_rites()
|
||||
: AreaTriggerScript("at_last_rites")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
QuestStatus QLR = player->GetQuestStatus(QUEST_LAST_RITES);
|
||||
QuestStatus QBT = player->GetQuestStatus(QUEST_BREAKING_THROUGH);
|
||||
if (!(QLR == QUEST_STATUS_INCOMPLETE || QLR == QUEST_STATUS_COMPLETE ||
|
||||
QBT == QUEST_STATUS_INCOMPLETE || QBT == QUEST_STATUS_COMPLETE))
|
||||
return false;
|
||||
|
||||
WorldLocation pPosition;
|
||||
|
||||
switch (trigger->entry)
|
||||
{
|
||||
case 5332:
|
||||
case 5338:
|
||||
case 5339:
|
||||
pPosition = WorldLocation(571, 3733.68f, 3563.25f, 290.812f, 3.665192f);
|
||||
break;
|
||||
case 5334:
|
||||
pPosition = WorldLocation(571, 3802.38f, 3585.95f, 49.5765f, 0.0f);
|
||||
break;
|
||||
case 5340:
|
||||
if (QBT == QUEST_STATUS_INCOMPLETE)
|
||||
pPosition = WorldLocation(571, 3758, 3562, 345.51f, 0.0f);
|
||||
else
|
||||
pPosition = WorldLocation(571, 3687.91f, 3577.28f, 473.342f, 0.0f);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
player->TeleportTo(pPosition);
|
||||
AreaTrigger_at_last_rites()
|
||||
: AreaTriggerScript("at_last_rites")
|
||||
{
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
QuestStatus QLR = player->GetQuestStatus(QUEST_LAST_RITES);
|
||||
QuestStatus QBT = player->GetQuestStatus(QUEST_BREAKING_THROUGH);
|
||||
if (!(QLR == QUEST_STATUS_INCOMPLETE || QLR == QUEST_STATUS_COMPLETE ||
|
||||
QBT == QUEST_STATUS_INCOMPLETE || QBT == QUEST_STATUS_COMPLETE))
|
||||
return false;
|
||||
|
||||
WorldLocation pPosition;
|
||||
|
||||
switch (trigger->entry)
|
||||
{
|
||||
case 5332:
|
||||
case 5338:
|
||||
case 5339:
|
||||
pPosition = WorldLocation(571, 3733.68f, 3563.25f, 290.812f, 3.665192f);
|
||||
break;
|
||||
case 5334:
|
||||
pPosition = WorldLocation(571, 3802.38f, 3585.95f, 49.5765f, 0.0f);
|
||||
break;
|
||||
case 5340:
|
||||
if (QBT == QUEST_STATUS_INCOMPLETE)
|
||||
pPosition = WorldLocation(571, 3758, 3562, 345.51f, 0.0f);
|
||||
else
|
||||
pPosition = WorldLocation(571, 3687.91f, 3577.28f, 473.342f, 0.0f);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
player->TeleportTo(pPosition);
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -259,29 +259,29 @@ enum Waygate
|
||||
|
||||
class AreaTrigger_at_sholazar_waygate : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
AreaTrigger_at_sholazar_waygate() : AreaTriggerScript("at_sholazar_waygate") { }
|
||||
AreaTrigger_at_sholazar_waygate() : AreaTriggerScript("at_sholazar_waygate") { }
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
if (!player->isDead() && (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) != QUEST_STATUS_NONE ||
|
||||
(player->GetQuestStatus(QUEST_THE_MAKERS_OVERLOOK) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_THE_MAKERS_PERCH) == QUEST_STATUS_REWARDED)))
|
||||
{
|
||||
if (!player->isDead() && (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) != QUEST_STATUS_NONE ||
|
||||
(player->GetQuestStatus(QUEST_THE_MAKERS_OVERLOOK) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_THE_MAKERS_PERCH) == QUEST_STATUS_REWARDED)))
|
||||
switch (trigger->entry)
|
||||
{
|
||||
switch (trigger->entry)
|
||||
{
|
||||
case AT_SHOLAZAR:
|
||||
player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, true);
|
||||
break;
|
||||
case AT_SHOLAZAR:
|
||||
player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, true);
|
||||
break;
|
||||
|
||||
case AT_UNGORO:
|
||||
player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, true);
|
||||
break;
|
||||
}
|
||||
case AT_UNGORO:
|
||||
player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, true);
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -297,26 +297,26 @@ enum NatsLanding
|
||||
|
||||
class AreaTrigger_at_nats_landing : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
AreaTrigger_at_nats_landing() : AreaTriggerScript("at_nats_landing") { }
|
||||
public:
|
||||
AreaTrigger_at_nats_landing() : AreaTriggerScript("at_nats_landing") { }
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
if (!player->IsAlive() || !player->HasAura(SPELL_FISH_PASTE))
|
||||
return false;
|
||||
|
||||
if (player->GetQuestStatus(QUEST_NATS_BARGAIN) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
if (!player->IsAlive() || !player->HasAura(SPELL_FISH_PASTE))
|
||||
return false;
|
||||
|
||||
if (player->GetQuestStatus(QUEST_NATS_BARGAIN) == QUEST_STATUS_INCOMPLETE)
|
||||
if (!player->FindNearestCreature(NPC_LURKING_SHARK, 20.0f))
|
||||
{
|
||||
if (!player->FindNearestCreature(NPC_LURKING_SHARK, 20.0f))
|
||||
{
|
||||
if (Creature* shark = player->SummonCreature(NPC_LURKING_SHARK, -4246.243f, -3922.356f, -7.488f, 5.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000))
|
||||
shark->AI()->AttackStart(player);
|
||||
if (Creature* shark = player->SummonCreature(NPC_LURKING_SHARK, -4246.243f, -3922.356f, -7.488f, 5.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 100000))
|
||||
shark->AI()->AttackStart(player);
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -332,23 +332,23 @@ enum SentryPoint
|
||||
|
||||
class AreaTrigger_at_sentry_point : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
AreaTrigger_at_sentry_point() : AreaTriggerScript("at_sentry_point") { }
|
||||
public:
|
||||
AreaTrigger_at_sentry_point() : AreaTriggerScript("at_sentry_point") { }
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/)
|
||||
{
|
||||
auto quest_status = player->GetQuestStatus(QUEST_MISSING_DIPLO_PT14);
|
||||
if (!player->IsAlive() || quest_status == QUEST_STATUS_NONE || quest_status == QUEST_STATUS_REWARDED)
|
||||
return false;
|
||||
|
||||
if (!player->FindNearestCreature(NPC_TERVOSH, 100.0f))
|
||||
{
|
||||
auto quest_status = player->GetQuestStatus(QUEST_MISSING_DIPLO_PT14);
|
||||
if (!player->IsAlive() || quest_status == QUEST_STATUS_NONE || quest_status == QUEST_STATUS_REWARDED)
|
||||
return false;
|
||||
|
||||
if (!player->FindNearestCreature(NPC_TERVOSH, 100.0f))
|
||||
{
|
||||
if(Creature* tervosh = player->SummonCreature(NPC_TERVOSH, -3476.51f, -4105.94f, 17.1f, 5.3816f, TEMPSUMMON_TIMED_DESPAWN, 60000))
|
||||
tervosh->CastSpell(tervosh, SPELL_TELEPORT_VISUAL, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
if(Creature* tervosh = player->SummonCreature(NPC_TERVOSH, -3476.51f, -4105.94f, 17.1f, 5.3816f, TEMPSUMMON_TIMED_DESPAWN, 60000))
|
||||
tervosh->CastSpell(tervosh, SPELL_TELEPORT_VISUAL, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -371,40 +371,40 @@ enum Brewfest
|
||||
|
||||
class AreaTrigger_at_brewfest : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
AreaTrigger_at_brewfest() : AreaTriggerScript("at_brewfest")
|
||||
{
|
||||
// Initialize for cooldown
|
||||
_triggerTimes[AT_BREWFEST_DUROTAR] = _triggerTimes[AT_BREWFEST_DUN_MOROGH] = 0;
|
||||
}
|
||||
public:
|
||||
AreaTrigger_at_brewfest() : AreaTriggerScript("at_brewfest")
|
||||
{
|
||||
// Initialize for cooldown
|
||||
_triggerTimes[AT_BREWFEST_DUROTAR] = _triggerTimes[AT_BREWFEST_DUN_MOROGH] = 0;
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
uint32 triggerId = trigger->entry;
|
||||
// Second trigger happened too early after first, skip for now
|
||||
if (sWorld->GetGameTime() - _triggerTimes[triggerId] < AREATRIGGER_TALK_COOLDOWN)
|
||||
return false;
|
||||
|
||||
switch (triggerId)
|
||||
{
|
||||
case AT_BREWFEST_DUROTAR:
|
||||
if (Creature* tapper = player->FindNearestCreature(NPC_TAPPER_SWINDLEKEG, 20.0f))
|
||||
tapper->AI()->Talk(SAY_WELCOME, player);
|
||||
break;
|
||||
case AT_BREWFEST_DUN_MOROGH:
|
||||
if (Creature* ipfelkofer = player->FindNearestCreature(NPC_IPFELKOFER_IRONKEG, 20.0f))
|
||||
ipfelkofer->AI()->Talk(SAY_WELCOME, player);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
_triggerTimes[triggerId] = sWorld->GetGameTime();
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
uint32 triggerId = trigger->entry;
|
||||
// Second trigger happened too early after first, skip for now
|
||||
if (sWorld->GetGameTime() - _triggerTimes[triggerId] < AREATRIGGER_TALK_COOLDOWN)
|
||||
return false;
|
||||
|
||||
switch (triggerId)
|
||||
{
|
||||
case AT_BREWFEST_DUROTAR:
|
||||
if (Creature* tapper = player->FindNearestCreature(NPC_TAPPER_SWINDLEKEG, 20.0f))
|
||||
tapper->AI()->Talk(SAY_WELCOME, player);
|
||||
break;
|
||||
case AT_BREWFEST_DUN_MOROGH:
|
||||
if (Creature* ipfelkofer = player->FindNearestCreature(NPC_IPFELKOFER_IRONKEG, 20.0f))
|
||||
ipfelkofer->AI()->Talk(SAY_WELCOME, player);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
private:
|
||||
std::map<uint32, time_t> _triggerTimes;
|
||||
_triggerTimes[triggerId] = sWorld->GetGameTime();
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
std::map<uint32, time_t> _triggerTimes;
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -425,55 +425,55 @@ enum Area52Entrance
|
||||
|
||||
class AreaTrigger_at_area_52_entrance : public AreaTriggerScript
|
||||
{
|
||||
public:
|
||||
AreaTrigger_at_area_52_entrance() : AreaTriggerScript("at_area_52_entrance")
|
||||
{
|
||||
_triggerTimes[AT_AREA_52_SOUTH] = _triggerTimes[AT_AREA_52_NORTH] = _triggerTimes[AT_AREA_52_WEST] = _triggerTimes[AT_AREA_52_EAST] = 0;
|
||||
}
|
||||
public:
|
||||
AreaTrigger_at_area_52_entrance() : AreaTriggerScript("at_area_52_entrance")
|
||||
{
|
||||
_triggerTimes[AT_AREA_52_SOUTH] = _triggerTimes[AT_AREA_52_NORTH] = _triggerTimes[AT_AREA_52_WEST] = _triggerTimes[AT_AREA_52_EAST] = 0;
|
||||
}
|
||||
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
float x = 0.0f, y = 0.0f, z = 0.0f;
|
||||
bool OnTrigger(Player* player, AreaTrigger const* trigger)
|
||||
{
|
||||
float x = 0.0f, y = 0.0f, z = 0.0f;
|
||||
|
||||
if (!player->IsAlive())
|
||||
return false;
|
||||
|
||||
uint32 triggerId = trigger->entry;
|
||||
if (sWorld->GetGameTime() - _triggerTimes[trigger->entry] < SUMMON_COOLDOWN)
|
||||
return false;
|
||||
|
||||
switch (triggerId)
|
||||
{
|
||||
case AT_AREA_52_EAST:
|
||||
x = 3044.176f;
|
||||
y = 3610.692f;
|
||||
z = 143.61f;
|
||||
break;
|
||||
case AT_AREA_52_NORTH:
|
||||
x = 3114.87f;
|
||||
y = 3687.619f;
|
||||
z = 143.62f;
|
||||
break;
|
||||
case AT_AREA_52_WEST:
|
||||
x = 3017.79f;
|
||||
y = 3746.806f;
|
||||
z = 144.27f;
|
||||
break;
|
||||
case AT_AREA_52_SOUTH:
|
||||
x = 2950.63f;
|
||||
y = 3719.905f;
|
||||
z = 143.33f;
|
||||
break;
|
||||
}
|
||||
|
||||
player->SummonCreature(NPC_SPOTLIGHT, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 5000);
|
||||
player->AddAura(SPELL_A52_NEURALYZER, player);
|
||||
_triggerTimes[trigger->entry] = sWorld->GetGameTime();
|
||||
if (!player->IsAlive())
|
||||
return false;
|
||||
|
||||
uint32 triggerId = trigger->entry;
|
||||
if (sWorld->GetGameTime() - _triggerTimes[trigger->entry] < SUMMON_COOLDOWN)
|
||||
return false;
|
||||
|
||||
switch (triggerId)
|
||||
{
|
||||
case AT_AREA_52_EAST:
|
||||
x = 3044.176f;
|
||||
y = 3610.692f;
|
||||
z = 143.61f;
|
||||
break;
|
||||
case AT_AREA_52_NORTH:
|
||||
x = 3114.87f;
|
||||
y = 3687.619f;
|
||||
z = 143.62f;
|
||||
break;
|
||||
case AT_AREA_52_WEST:
|
||||
x = 3017.79f;
|
||||
y = 3746.806f;
|
||||
z = 144.27f;
|
||||
break;
|
||||
case AT_AREA_52_SOUTH:
|
||||
x = 2950.63f;
|
||||
y = 3719.905f;
|
||||
z = 143.33f;
|
||||
break;
|
||||
}
|
||||
|
||||
private:
|
||||
std::map<uint32, time_t> _triggerTimes;
|
||||
player->SummonCreature(NPC_SPOTLIGHT, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 5000);
|
||||
player->AddAura(SPELL_A52_NEURALYZER, player);
|
||||
_triggerTimes[trigger->entry] = sWorld->GetGameTime();
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
std::map<uint32, time_t> _triggerTimes;
|
||||
};
|
||||
|
||||
void AddSC_areatrigger_scripts()
|
||||
|
||||
@@ -152,56 +152,56 @@ struct emerald_dragonAI : public WorldBossAI
|
||||
|
||||
class npc_dream_fog : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_dream_fog() : CreatureScript("npc_dream_fog") { }
|
||||
public:
|
||||
npc_dream_fog() : CreatureScript("npc_dream_fog") { }
|
||||
|
||||
struct npc_dream_fogAI : public ScriptedAI
|
||||
struct npc_dream_fogAI : public ScriptedAI
|
||||
{
|
||||
npc_dream_fogAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
npc_dream_fogAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_roamTimer = 0;
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
_roamTimer = 0;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (!_roamTimer)
|
||||
if (!_roamTimer)
|
||||
{
|
||||
// Chase target, but don't attack - otherwise just roam around
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
{
|
||||
// Chase target, but don't attack - otherwise just roam around
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
{
|
||||
_roamTimer = urand(15000, 30000);
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->GetMotionMaster()->MoveChase(target, 0.2f);
|
||||
}
|
||||
else
|
||||
{
|
||||
_roamTimer = 2500;
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->GetMotionMaster()->MoveRandom(25.0f);
|
||||
}
|
||||
// Seeping fog movement is slow enough for a player to be able to walk backwards and still outpace it
|
||||
me->SetWalk(true);
|
||||
me->SetSpeed(MOVE_WALK, 0.75f);
|
||||
_roamTimer = urand(15000, 30000);
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->GetMotionMaster()->MoveChase(target, 0.2f);
|
||||
}
|
||||
else
|
||||
_roamTimer -= diff;
|
||||
{
|
||||
_roamTimer = 2500;
|
||||
me->GetMotionMaster()->Clear(false);
|
||||
me->GetMotionMaster()->MoveRandom(25.0f);
|
||||
}
|
||||
// Seeping fog movement is slow enough for a player to be able to walk backwards and still outpace it
|
||||
me->SetWalk(true);
|
||||
me->SetSpeed(MOVE_WALK, 0.75f);
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _roamTimer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_dream_fogAI(creature);
|
||||
else
|
||||
_roamTimer -= diff;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _roamTimer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_dream_fogAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -229,63 +229,63 @@ enum YsondreSpells
|
||||
|
||||
class boss_ysondre : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_ysondre() : CreatureScript("boss_ysondre") { }
|
||||
public:
|
||||
boss_ysondre() : CreatureScript("boss_ysondre") { }
|
||||
|
||||
struct boss_ysondreAI : public emerald_dragonAI
|
||||
struct boss_ysondreAI : public emerald_dragonAI
|
||||
{
|
||||
boss_ysondreAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
boss_ysondreAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_stage = 1;
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_YSONDRE_AGGRO);
|
||||
WorldBossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
// Summon druid spirits on 75%, 50% and 25% health
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
Talk(SAY_YSONDRE_SUMMON_DRUIDS);
|
||||
|
||||
for (uint8 i = 0; i < 10; ++i)
|
||||
DoCast(me, SPELL_SUMMON_DRUID_SPIRITS, true);
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_LIGHTNING_WAVE:
|
||||
DoCastVictim(SPELL_LIGHTNING_WAVE);
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WAVE, urand(10000, 20000));
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _stage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_ysondreAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_stage = 1;
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_YSONDRE_AGGRO);
|
||||
WorldBossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
// Summon druid spirits on 75%, 50% and 25% health
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
Talk(SAY_YSONDRE_SUMMON_DRUIDS);
|
||||
|
||||
for (uint8 i = 0; i < 10; ++i)
|
||||
DoCast(me, SPELL_SUMMON_DRUID_SPIRITS, true);
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_LIGHTNING_WAVE:
|
||||
DoCastVictim(SPELL_LIGHTNING_WAVE);
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WAVE, urand(10000, 20000));
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _stage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_ysondreAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -317,109 +317,109 @@ enum LethonCreatures
|
||||
|
||||
class boss_lethon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_lethon() : CreatureScript("boss_lethon") { }
|
||||
public:
|
||||
boss_lethon() : CreatureScript("boss_lethon") { }
|
||||
|
||||
struct boss_lethonAI : public emerald_dragonAI
|
||||
struct boss_lethonAI : public emerald_dragonAI
|
||||
{
|
||||
boss_lethonAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
boss_lethonAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_stage = 1;
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, 10000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_LETHON_AGGRO);
|
||||
WorldBossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
Talk(SAY_LETHON_DRAW_SPIRIT);
|
||||
DoCast(me, SPELL_DRAW_SPIRIT);
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* target, SpellInfo const* spell)
|
||||
{
|
||||
if (spell->Id == SPELL_DRAW_SPIRIT && target->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Position targetPos;
|
||||
target->GetPosition(&targetPos);
|
||||
me->SummonCreature(NPC_SPIRIT_SHADE, targetPos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_BOLT_WHIRL:
|
||||
me->CastSpell((Unit*)NULL, SPELL_SHADOW_BOLT_WHIRL, false);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, urand(15000, 30000));
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _stage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_lethonAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_stage = 1;
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, 10000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_LETHON_AGGRO);
|
||||
WorldBossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
Talk(SAY_LETHON_DRAW_SPIRIT);
|
||||
DoCast(me, SPELL_DRAW_SPIRIT);
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* target, SpellInfo const* spell)
|
||||
{
|
||||
if (spell->Id == SPELL_DRAW_SPIRIT && target->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
Position targetPos;
|
||||
target->GetPosition(&targetPos);
|
||||
me->SummonCreature(NPC_SPIRIT_SHADE, targetPos, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000);
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_BOLT_WHIRL:
|
||||
me->CastSpell((Unit*)NULL, SPELL_SHADOW_BOLT_WHIRL, false);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, urand(15000, 30000));
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _stage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_lethonAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_spirit_shade : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_spirit_shade() : CreatureScript("npc_spirit_shade") { }
|
||||
public:
|
||||
npc_spirit_shade() : CreatureScript("npc_spirit_shade") { }
|
||||
|
||||
struct npc_spirit_shadeAI : public PassiveAI
|
||||
struct npc_spirit_shadeAI : public PassiveAI
|
||||
{
|
||||
npc_spirit_shadeAI(Creature* creature) : PassiveAI(creature), _summonerGuid(0)
|
||||
{
|
||||
npc_spirit_shadeAI(Creature* creature) : PassiveAI(creature), _summonerGuid(0)
|
||||
{
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner)
|
||||
{
|
||||
if (!summoner)
|
||||
return;
|
||||
|
||||
_summonerGuid = summoner->GetGUID();
|
||||
me->GetMotionMaster()->MoveFollow(summoner, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 moveType, uint32 data)
|
||||
{
|
||||
if (moveType == FOLLOW_MOTION_TYPE && data == _summonerGuid)
|
||||
{
|
||||
me->CastSpell((Unit*)NULL, SPELL_DARK_OFFERING, false);
|
||||
me->DespawnOrUnsummon(1000);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _summonerGuid;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_spirit_shadeAI(creature);
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner)
|
||||
{
|
||||
if (!summoner)
|
||||
return;
|
||||
|
||||
_summonerGuid = summoner->GetGUID();
|
||||
me->GetMotionMaster()->MoveFollow(summoner, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 moveType, uint32 data)
|
||||
{
|
||||
if (moveType == FOLLOW_MOTION_TYPE && data == _summonerGuid)
|
||||
{
|
||||
me->CastSpell((Unit*)NULL, SPELL_DARK_OFFERING, false);
|
||||
me->DespawnOrUnsummon(1000);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _summonerGuid;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_spirit_shadeAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -443,67 +443,67 @@ enum EmerissSpells
|
||||
|
||||
class boss_emeriss : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_emeriss() : CreatureScript("boss_emeriss") { }
|
||||
public:
|
||||
boss_emeriss() : CreatureScript("boss_emeriss") { }
|
||||
|
||||
struct boss_emerissAI : public emerald_dragonAI
|
||||
struct boss_emerissAI : public emerald_dragonAI
|
||||
{
|
||||
boss_emerissAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
boss_emerissAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_stage = 1;
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
DoCast(who, SPELL_PUTRID_MUSHROOM, true);
|
||||
emerald_dragonAI::KilledUnit(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_EMERISS_AGGRO);
|
||||
WorldBossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
Talk(SAY_EMERISS_CAST_CORRUPTION);
|
||||
DoCast(me, SPELL_CORRUPTION_OF_EARTH, true);
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_VOLATILE_INFECTION:
|
||||
DoCastVictim(SPELL_VOLATILE_INFECTION);
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 120000);
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _stage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_emerissAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_stage = 1;
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
DoCast(who, SPELL_PUTRID_MUSHROOM, true);
|
||||
emerald_dragonAI::KilledUnit(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_EMERISS_AGGRO);
|
||||
WorldBossAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (!HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
Talk(SAY_EMERISS_CAST_CORRUPTION);
|
||||
DoCast(me, SPELL_CORRUPTION_OF_EARTH, true);
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_VOLATILE_INFECTION:
|
||||
DoCastVictim(SPELL_VOLATILE_INFECTION);
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 120000);
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _stage;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_emerissAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -535,125 +535,125 @@ uint32 const TaerarShadeSpells[] =
|
||||
|
||||
class boss_taerar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_taerar() : CreatureScript("boss_taerar") { }
|
||||
public:
|
||||
boss_taerar() : CreatureScript("boss_taerar") { }
|
||||
|
||||
struct boss_taerarAI : public emerald_dragonAI
|
||||
struct boss_taerarAI : public emerald_dragonAI
|
||||
{
|
||||
boss_taerarAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
boss_taerarAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADE);
|
||||
_stage = 1;
|
||||
|
||||
_shades = 0;
|
||||
_banished = false;
|
||||
_banishedTimer = 0;
|
||||
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000);
|
||||
events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_TAERAR_AGGRO);
|
||||
emerald_dragonAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit*)
|
||||
{
|
||||
--_shades;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
// At 75, 50 or 25 percent health, we need to activate the shades and go "banished"
|
||||
// Note: _stage holds the amount of times they have been summoned
|
||||
if (!_banished && !HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
_banished = true;
|
||||
_banishedTimer = 60000;
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
DoStopAttack();
|
||||
|
||||
Talk(SAY_TAERAR_SUMMON_SHADES);
|
||||
|
||||
uint32 count = sizeof(TaerarShadeSpells) / sizeof(uint32);
|
||||
for (uint32 i = 0; i < count; ++i)
|
||||
DoCastVictim(TaerarShadeSpells[i], true);
|
||||
_shades += count;
|
||||
|
||||
DoCast(SPELL_SHADE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ARCANE_BLAST:
|
||||
DoCast(SPELL_ARCANE_BLAST);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(7000, 12000));
|
||||
break;
|
||||
case EVENT_BELLOWING_ROAR:
|
||||
DoCast(SPELL_BELLOWING_ROAR);
|
||||
events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 30000));
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!me->IsInCombat())
|
||||
return;
|
||||
|
||||
if (_banished)
|
||||
{
|
||||
// If all three shades are dead, OR it has taken too long, end the current event and get Taerar back into business
|
||||
if (_banishedTimer <= diff || !_shades)
|
||||
{
|
||||
_banished = false;
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
// _banishtimer has not expired, and we still have active shades:
|
||||
else
|
||||
_banishedTimer -= diff;
|
||||
|
||||
// Update the events before we return (handled under emerald_dragonAI::UpdateAI(diff); if we're not inside this check)
|
||||
events.Update(diff);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
emerald_dragonAI::UpdateAI(diff);
|
||||
}
|
||||
|
||||
private:
|
||||
bool _banished; // used for shades activation testing
|
||||
uint32 _banishedTimer; // counter for banishment timeout
|
||||
uint8 _shades; // keep track of how many shades are dead
|
||||
uint8 _stage; // check which "shade phase" we're at (75-50-25 percentage counters)
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_taerarAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADE);
|
||||
_stage = 1;
|
||||
|
||||
_shades = 0;
|
||||
_banished = false;
|
||||
_banishedTimer = 0;
|
||||
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000);
|
||||
events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
Talk(SAY_TAERAR_AGGRO);
|
||||
emerald_dragonAI::EnterCombat(who);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit*)
|
||||
{
|
||||
--_shades;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
// At 75, 50 or 25 percent health, we need to activate the shades and go "banished"
|
||||
// Note: _stage holds the amount of times they have been summoned
|
||||
if (!_banished && !HealthAbovePct(100 - 25 * _stage))
|
||||
{
|
||||
_banished = true;
|
||||
_banishedTimer = 60000;
|
||||
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
DoStopAttack();
|
||||
|
||||
Talk(SAY_TAERAR_SUMMON_SHADES);
|
||||
|
||||
uint32 count = sizeof(TaerarShadeSpells) / sizeof(uint32);
|
||||
for (uint32 i = 0; i < count; ++i)
|
||||
DoCastVictim(TaerarShadeSpells[i], true);
|
||||
_shades += count;
|
||||
|
||||
DoCast(SPELL_SHADE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
|
||||
++_stage;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ARCANE_BLAST:
|
||||
DoCast(SPELL_ARCANE_BLAST);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(7000, 12000));
|
||||
break;
|
||||
case EVENT_BELLOWING_ROAR:
|
||||
DoCast(SPELL_BELLOWING_ROAR);
|
||||
events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 30000));
|
||||
break;
|
||||
default:
|
||||
emerald_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!me->IsInCombat())
|
||||
return;
|
||||
|
||||
if (_banished)
|
||||
{
|
||||
// If all three shades are dead, OR it has taken too long, end the current event and get Taerar back into business
|
||||
if (_banishedTimer <= diff || !_shades)
|
||||
{
|
||||
_banished = false;
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
// _banishtimer has not expired, and we still have active shades:
|
||||
else
|
||||
_banishedTimer -= diff;
|
||||
|
||||
// Update the events before we return (handled under emerald_dragonAI::UpdateAI(diff); if we're not inside this check)
|
||||
events.Update(diff);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
emerald_dragonAI::UpdateAI(diff);
|
||||
}
|
||||
|
||||
private:
|
||||
bool _banished; // used for shades activation testing
|
||||
uint32 _banishedTimer; // counter for banishment timeout
|
||||
uint8 _shades; // keep track of how many shades are dead
|
||||
uint8 _stage; // check which "shade phase" we're at (75-50-25 percentage counters)
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_taerarAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -662,28 +662,28 @@ class boss_taerar : public CreatureScript
|
||||
|
||||
class spell_dream_fog_sleep : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_dream_fog_sleep() : SpellScriptLoader("spell_dream_fog_sleep") { }
|
||||
public:
|
||||
spell_dream_fog_sleep() : SpellScriptLoader("spell_dream_fog_sleep") { }
|
||||
|
||||
class spell_dream_fog_sleep_SpellScript : public SpellScript
|
||||
class spell_dream_fog_sleep_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_dream_fog_sleep_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
PrepareSpellScript(spell_dream_fog_sleep_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(acore::UnitAuraCheck(true, SPELL_SLEEP));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_dream_fog_sleep_SpellScript();
|
||||
targets.remove_if(acore::UnitAuraCheck(true, SPELL_SLEEP));
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_dream_fog_sleep_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -692,58 +692,58 @@ class spell_dream_fog_sleep : public SpellScriptLoader
|
||||
|
||||
class MarkOfNatureTargetSelector
|
||||
{
|
||||
public:
|
||||
MarkOfNatureTargetSelector() { }
|
||||
public:
|
||||
MarkOfNatureTargetSelector() { }
|
||||
|
||||
bool operator()(WorldObject* object)
|
||||
{
|
||||
// return those not tagged or already under the influence of Aura of Nature
|
||||
if (Unit* unit = object->ToUnit())
|
||||
return !(unit->HasAura(SPELL_MARK_OF_NATURE) && !unit->HasAura(SPELL_AURA_OF_NATURE));
|
||||
return true;
|
||||
}
|
||||
bool operator()(WorldObject* object)
|
||||
{
|
||||
// return those not tagged or already under the influence of Aura of Nature
|
||||
if (Unit* unit = object->ToUnit())
|
||||
return !(unit->HasAura(SPELL_MARK_OF_NATURE) && !unit->HasAura(SPELL_AURA_OF_NATURE));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mark_of_nature : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mark_of_nature() : SpellScriptLoader("spell_mark_of_nature") { }
|
||||
public:
|
||||
spell_mark_of_nature() : SpellScriptLoader("spell_mark_of_nature") { }
|
||||
|
||||
class spell_mark_of_nature_SpellScript : public SpellScript
|
||||
class spell_mark_of_nature_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_mark_of_nature_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/)
|
||||
{
|
||||
PrepareSpellScript(spell_mark_of_nature_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/)
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_NATURE))
|
||||
return false;
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_AURA_OF_NATURE))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(MarkOfNatureTargetSelector());
|
||||
}
|
||||
|
||||
void HandleEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_AURA_OF_NATURE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_nature_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mark_of_nature_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mark_of_nature_SpellScript();
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_NATURE))
|
||||
return false;
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_AURA_OF_NATURE))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(MarkOfNatureTargetSelector());
|
||||
}
|
||||
|
||||
void HandleEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_AURA_OF_NATURE, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_nature_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mark_of_nature_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mark_of_nature_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_emerald_dragons()
|
||||
|
||||
@@ -26,26 +26,26 @@ public:
|
||||
switch (player->getClass())
|
||||
{
|
||||
// Only two classes posses an aura on creation;
|
||||
case CLASS_WARRIOR:
|
||||
player->CastSpell(player, WARRIOR_CREATION_BATTLE_STANCE, true);
|
||||
return;
|
||||
case CLASS_DEATH_KNIGHT:
|
||||
player->CastSpell(player, DEATH_KNIGHT_CREATION_BLOOD_PRESENCE, true);
|
||||
return;
|
||||
case CLASS_WARRIOR:
|
||||
player->CastSpell(player, WARRIOR_CREATION_BATTLE_STANCE, true);
|
||||
return;
|
||||
case CLASS_DEATH_KNIGHT:
|
||||
player->CastSpell(player, DEATH_KNIGHT_CREATION_BLOOD_PRESENCE, true);
|
||||
return;
|
||||
// We include, but do not change the other classes
|
||||
case CLASS_NONE:
|
||||
case CLASS_PALADIN:
|
||||
case CLASS_HUNTER:
|
||||
case CLASS_ROGUE:
|
||||
case CLASS_PRIEST:
|
||||
case CLASS_SHAMAN:
|
||||
case CLASS_MAGE:
|
||||
case CLASS_WARLOCK:
|
||||
case CLASS_NONE:
|
||||
case CLASS_PALADIN:
|
||||
case CLASS_HUNTER:
|
||||
case CLASS_ROGUE:
|
||||
case CLASS_PRIEST:
|
||||
case CLASS_SHAMAN:
|
||||
case CLASS_MAGE:
|
||||
case CLASS_WARLOCK:
|
||||
// case CLASS_UNK: // Does not exist!
|
||||
case CLASS_DRUID:
|
||||
default:
|
||||
// Can be modified based on personal needs;
|
||||
return;
|
||||
case CLASS_DRUID:
|
||||
default:
|
||||
// Can be modified based on personal needs;
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -21,25 +21,25 @@ public:
|
||||
case CHAT_MSG_ADDON:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
|
||||
sLog->outChat("[ADDON] Player %s sends: %s",
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_SAY:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC))
|
||||
sLog->outChat("[SAY] Player %s says (language %u): %s",
|
||||
player->GetName().c_str(), lang, msg.c_str());
|
||||
player->GetName().c_str(), lang, msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_EMOTE:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC))
|
||||
sLog->outChat("[TEXTEMOTE] Player %s emotes: %s",
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_YELL:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_PUBLIC))
|
||||
sLog->outChat("[YELL] Player %s yells (language %u): %s",
|
||||
player->GetName().c_str(), lang, msg.c_str());
|
||||
player->GetName().c_str(), lang, msg.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -48,10 +48,10 @@ public:
|
||||
{
|
||||
if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_WHISPER))
|
||||
sLog->outChat("[WHISPER] Player %s tells %s: %s",
|
||||
player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
|
||||
sLog->outChat("[ADDON] Player %s tells %s: %s",
|
||||
player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), receiver ? receiver->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
}
|
||||
|
||||
void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group)
|
||||
@@ -63,52 +63,52 @@ public:
|
||||
case CHAT_MSG_PARTY:
|
||||
if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_PARTY))
|
||||
sLog->outChat("[PARTY] Player %s tells group with leader %s: %s",
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
|
||||
sLog->outChat("[ADDON] Player %s tells group with leader %s: %s",
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_PARTY_LEADER:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_PARTY))
|
||||
sLog->outChat("[PARTY] Leader %s tells group: %s",
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_RAID:
|
||||
if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_RAID))
|
||||
sLog->outChat("[RAID] Player %s tells raid with leader %s: %s",
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
|
||||
sLog->outChat("[ADDON] Player %s tells raid with leader %s: %s",
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_RAID_LEADER:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_RAID))
|
||||
sLog->outChat("[RAID] Leader player %s tells raid: %s",
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_RAID_WARNING:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_RAID))
|
||||
sLog->outChat("[RAID] Leader player %s warns raid with: %s",
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_BATTLEGROUND:
|
||||
if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_BGROUND))
|
||||
sLog->outChat("[BATTLEGROUND] Player %s tells battleground with leader %s: %s",
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
|
||||
sLog->outChat("[ADDON] Player %s tells battleground with leader %s: %s",
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), group ? group->GetLeaderName() : "<unknown>", msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_BATTLEGROUND_LEADER:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_BGROUND))
|
||||
sLog->outChat("[BATTLEGROUND] Leader player %s tells battleground: %s",
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), msg.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -120,16 +120,16 @@ public:
|
||||
case CHAT_MSG_GUILD:
|
||||
if (lang != LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_GUILD))
|
||||
sLog->outChat("[GUILD] Player %s tells guild %s: %s",
|
||||
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
else if (lang == LANG_ADDON && sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
|
||||
sLog->outChat("[ADDON] Player %s sends to guild %s: %s",
|
||||
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
break;
|
||||
|
||||
case CHAT_MSG_OFFICER:
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_GUILD))
|
||||
sLog->outChat("[OFFICER] Player %s tells guild %s officers: %s",
|
||||
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), guild ? guild->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -144,10 +144,10 @@ public:
|
||||
|
||||
if (sWorld->getBoolConfig(CONFIG_CHATLOG_SYSCHAN) && isSystem)
|
||||
sLog->outChat("[SYSCHAN] Player %s tells channel %s: %s",
|
||||
player->GetName().c_str(), channel->GetName().c_str(), msg.c_str());
|
||||
player->GetName().c_str(), channel->GetName().c_str(), msg.c_str());
|
||||
else if (sWorld->getBoolConfig(CONFIG_CHATLOG_CHANNEL))
|
||||
sLog->outChat("[CHANNEL] Player %s tells channel %s: %s",
|
||||
player->GetName().c_str(), channel ? channel->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
player->GetName().c_str(), channel ? channel->GetName().c_str() : "<unknown>", msg.c_str());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -75,11 +75,11 @@ class go_mistwhisper_treasure : public GameObjectScript
|
||||
public:
|
||||
go_mistwhisper_treasure() : GameObjectScript("go_mistwhisper_treasure") { }
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, GameObject *go) override
|
||||
bool OnGossipHello(Player* pPlayer, GameObject* go) override
|
||||
{
|
||||
if (!go->FindNearestCreature(28105, 30.0f)) // Tartek
|
||||
{
|
||||
if (Creature *cr = go->SummonCreature(28105, 6708.7f, 5115.45f, -18.3f, 0.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
if (Creature* cr = go->SummonCreature(28105, 6708.7f, 5115.45f, -18.3f, 0.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
{
|
||||
cr->MonsterYell("My treasure! You no steal from Tartek, dumb big-tongue traitor thing. Tartek and nasty dragon going to kill you! You so dumb.", LANG_UNIVERSAL, 0);
|
||||
cr->AI()->AttackStart(pPlayer);
|
||||
@@ -91,37 +91,37 @@ public:
|
||||
|
||||
class go_witherbark_totem_bundle : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_witherbark_totem_bundle() : GameObjectScript("go_witherbark_totem_bundle") { }
|
||||
public:
|
||||
go_witherbark_totem_bundle() : GameObjectScript("go_witherbark_totem_bundle") { }
|
||||
|
||||
struct go_witherbark_totem_bundleAI : public GameObjectAI
|
||||
struct go_witherbark_totem_bundleAI : public GameObjectAI
|
||||
{
|
||||
go_witherbark_totem_bundleAI(GameObject* gameObject) : GameObjectAI(gameObject)
|
||||
{
|
||||
go_witherbark_totem_bundleAI(GameObject* gameObject) : GameObjectAI(gameObject)
|
||||
{
|
||||
_timer = 1;
|
||||
}
|
||||
_timer = 1;
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (_timer)
|
||||
{
|
||||
if (_timer)
|
||||
_timer += diff;
|
||||
if (_timer > 5000)
|
||||
{
|
||||
_timer += diff;
|
||||
if (_timer > 5000)
|
||||
{
|
||||
go->CastSpell(nullptr, 9056);
|
||||
go->DestroyForNearbyPlayers();
|
||||
_timer = 0;
|
||||
}
|
||||
go->CastSpell(nullptr, 9056);
|
||||
go->DestroyForNearbyPlayers();
|
||||
_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 _timer;
|
||||
};
|
||||
|
||||
GameObjectAI* GetAI(GameObject* go) const
|
||||
{
|
||||
return new go_witherbark_totem_bundleAI(go);
|
||||
}
|
||||
|
||||
uint32 _timer;
|
||||
};
|
||||
|
||||
GameObjectAI* GetAI(GameObject* go) const
|
||||
{
|
||||
return new go_witherbark_totem_bundleAI(go);
|
||||
}
|
||||
};
|
||||
|
||||
class go_arena_ready_marker : public GameObjectScript
|
||||
@@ -129,7 +129,7 @@ class go_arena_ready_marker : public GameObjectScript
|
||||
public:
|
||||
go_arena_ready_marker() : GameObjectScript("go_arena_ready_marker") { }
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject * /*go*/) override
|
||||
bool OnGossipHello(Player* player, GameObject* /*go*/) override
|
||||
{
|
||||
if (Battleground* bg = player->GetBattleground())
|
||||
bg->ReadyMarkerClicked(player);
|
||||
@@ -168,7 +168,7 @@ public:
|
||||
int Random = rand() % (sizeof(NpcPrisonEntry) / sizeof(uint32));
|
||||
|
||||
if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player),
|
||||
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
{
|
||||
if (!creature->IsHostileTo(player))
|
||||
{
|
||||
@@ -176,12 +176,24 @@ public:
|
||||
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case 22811: Spell = SPELL_REP_LC; break;
|
||||
case 22812: Spell = SPELL_REP_SHAT; break;
|
||||
case 22810: Spell = SPELL_REP_CE; break;
|
||||
case 22813: Spell = SPELL_REP_CON; break;
|
||||
case 22815: Spell = SPELL_REP_KT; break;
|
||||
case 22814: Spell = SPELL_REP_SPOR; break;
|
||||
case 22811:
|
||||
Spell = SPELL_REP_LC;
|
||||
break;
|
||||
case 22812:
|
||||
Spell = SPELL_REP_SHAT;
|
||||
break;
|
||||
case 22810:
|
||||
Spell = SPELL_REP_CE;
|
||||
break;
|
||||
case 22813:
|
||||
Spell = SPELL_REP_CON;
|
||||
break;
|
||||
case 22815:
|
||||
Spell = SPELL_REP_KT;
|
||||
break;
|
||||
case 22814:
|
||||
Spell = SPELL_REP_SPOR;
|
||||
break;
|
||||
}
|
||||
|
||||
if (Spell)
|
||||
@@ -212,7 +224,7 @@ public:
|
||||
int Random = rand() % (sizeof(NpcStasisEntry) / sizeof(uint32));
|
||||
|
||||
player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player),
|
||||
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -234,7 +246,7 @@ public:
|
||||
|
||||
bool OnGossipHello(Player* /*player*/, GameObject* go) override
|
||||
{
|
||||
// xinef: prevent spawning hundreds of them
|
||||
// xinef: prevent spawning hundreds of them
|
||||
if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER && !go->FindNearestCreature(NPC_GOGGEROC, 20.0f))
|
||||
go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000);
|
||||
|
||||
@@ -272,7 +284,7 @@ public:
|
||||
requireSummon = 0;
|
||||
int8 count = urand(1, 3);
|
||||
for (int8 i = 0; i < count; ++i)
|
||||
go->SummonCreature(NPC_WINTERFIN_TADPOLE, go->GetPositionX()+cos(2*M_PI*i/3.0f)*0.60f, go->GetPositionY()+sin(2*M_PI*i/3.0f)*0.60f, go->GetPositionZ()+0.5f, go->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
|
||||
go->SummonCreature(NPC_WINTERFIN_TADPOLE, go->GetPositionX() + cos(2 * M_PI * i / 3.0f) * 0.60f, go->GetPositionY() + sin(2 * M_PI * i / 3.0f) * 0.60f, go->GetPositionZ() + 0.5f, go->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
|
||||
}
|
||||
|
||||
void OnStateChanged(uint32 state, Unit* /*unit*/)
|
||||
@@ -301,7 +313,7 @@ public:
|
||||
{
|
||||
player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE, 0);
|
||||
(*itr)->DespawnOrUnsummon(urand(45000, 60000));
|
||||
(*itr)->GetMotionMaster()->MoveFollow(player, 1.0f, frand(0.0f, 2*M_PI), MOTION_SLOT_CONTROLLED);
|
||||
(*itr)->GetMotionMaster()->MoveFollow(player, 1.0f, frand(0.0f, 2 * M_PI), MOTION_SLOT_CONTROLLED);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -417,7 +429,7 @@ public:
|
||||
enum BrewfestMusic
|
||||
{
|
||||
EVENT_BREWFESTDWARF01 = 11810, // 1.35 min
|
||||
EVENT_BREWFESTDWARF02 = 11812, // 1.55 min
|
||||
EVENT_BREWFESTDWARF02 = 11812, // 1.55 min
|
||||
EVENT_BREWFESTDWARF03 = 11813, // 0.23 min
|
||||
EVENT_BREWFESTGOBLIN01 = 11811, // 1.08 min
|
||||
EVENT_BREWFESTGOBLIN02 = 11814, // 1.33 min
|
||||
@@ -477,104 +489,104 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_BM_SELECT_MUSIC:
|
||||
{
|
||||
if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active
|
||||
case EVENT_BM_SELECT_MUSIC:
|
||||
{
|
||||
if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active
|
||||
break;
|
||||
// Select random music sample
|
||||
uint32 rnd = urand(0, 2);
|
||||
uint32 musicTime = 1000;
|
||||
//Restart the current selected music
|
||||
_currentMusicEvent = 0;
|
||||
//Check zone to play correct music
|
||||
if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF)
|
||||
{
|
||||
switch (rnd)
|
||||
{
|
||||
case 0:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN01;
|
||||
musicTime = EVENT_BREWFESTGOBLIN01_TIME;
|
||||
break;
|
||||
case 1:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN02;
|
||||
musicTime = EVENT_BREWFESTGOBLIN02_TIME;
|
||||
break;
|
||||
case 2:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN03;
|
||||
musicTime = EVENT_BREWFESTGOBLIN03_TIME;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS)
|
||||
{
|
||||
switch (rnd)
|
||||
{
|
||||
case 0:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF01;
|
||||
musicTime = EVENT_BREWFESTDWARF01_TIME;
|
||||
break;
|
||||
case 1:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF02;
|
||||
musicTime = EVENT_BREWFESTDWARF02_TIME;
|
||||
break;
|
||||
case 2:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF03;
|
||||
musicTime = EVENT_BREWFESTDWARF03_TIME;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (go->GetAreaId() == SHATTRATH)
|
||||
{
|
||||
rnd = urand(0, 5);
|
||||
switch (rnd)
|
||||
{
|
||||
case 0:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN01;
|
||||
musicTime = EVENT_BREWFESTGOBLIN01_TIME;
|
||||
break;
|
||||
case 1:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN02;
|
||||
musicTime = EVENT_BREWFESTGOBLIN02_TIME;
|
||||
break;
|
||||
case 2:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN03;
|
||||
musicTime = EVENT_BREWFESTGOBLIN03_TIME;
|
||||
break;
|
||||
case 3:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF01;
|
||||
musicTime = EVENT_BREWFESTDWARF01_TIME;
|
||||
break;
|
||||
case 4:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF02;
|
||||
musicTime = EVENT_BREWFESTDWARF02_TIME;
|
||||
break;
|
||||
case 5:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF03;
|
||||
musicTime = EVENT_BREWFESTDWARF03_TIME;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, musicTime); // Select new song music after play time is over
|
||||
break;
|
||||
}
|
||||
case EVENT_BM_START_MUSIC:
|
||||
if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active
|
||||
break;
|
||||
// Play selected music
|
||||
if (_currentMusicEvent != 0)
|
||||
{
|
||||
go->PlayDirectMusic(_currentMusicEvent);
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_BM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client
|
||||
break;
|
||||
// Select random music sample
|
||||
uint32 rnd = urand(0, 2);
|
||||
uint32 musicTime = 1000;
|
||||
//Restart the current selected music
|
||||
_currentMusicEvent = 0;
|
||||
//Check zone to play correct music
|
||||
if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF)
|
||||
{
|
||||
switch (rnd)
|
||||
{
|
||||
case 0:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN01;
|
||||
musicTime = EVENT_BREWFESTGOBLIN01_TIME;
|
||||
break;
|
||||
case 1:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN02;
|
||||
musicTime = EVENT_BREWFESTGOBLIN02_TIME;
|
||||
break;
|
||||
case 2:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN03;
|
||||
musicTime = EVENT_BREWFESTGOBLIN03_TIME;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS)
|
||||
{
|
||||
switch (rnd)
|
||||
{
|
||||
case 0:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF01;
|
||||
musicTime = EVENT_BREWFESTDWARF01_TIME;
|
||||
break;
|
||||
case 1:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF02;
|
||||
musicTime = EVENT_BREWFESTDWARF02_TIME;
|
||||
break;
|
||||
case 2:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF03;
|
||||
musicTime = EVENT_BREWFESTDWARF03_TIME;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (go->GetAreaId() == SHATTRATH)
|
||||
{
|
||||
rnd = urand(0, 5);
|
||||
switch (rnd)
|
||||
{
|
||||
case 0:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN01;
|
||||
musicTime = EVENT_BREWFESTGOBLIN01_TIME;
|
||||
break;
|
||||
case 1:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN02;
|
||||
musicTime = EVENT_BREWFESTGOBLIN02_TIME;
|
||||
break;
|
||||
case 2:
|
||||
_currentMusicEvent = EVENT_BREWFESTGOBLIN03;
|
||||
musicTime = EVENT_BREWFESTGOBLIN03_TIME;
|
||||
break;
|
||||
case 3:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF01;
|
||||
musicTime = EVENT_BREWFESTDWARF01_TIME;
|
||||
break;
|
||||
case 4:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF02;
|
||||
musicTime = EVENT_BREWFESTDWARF02_TIME;
|
||||
break;
|
||||
case 5:
|
||||
_currentMusicEvent = EVENT_BREWFESTDWARF03;
|
||||
musicTime = EVENT_BREWFESTDWARF03_TIME;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, musicTime); // Select new song music after play time is over
|
||||
break;
|
||||
}
|
||||
case EVENT_BM_START_MUSIC:
|
||||
if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active
|
||||
default:
|
||||
break;
|
||||
// Play selected music
|
||||
if (_currentMusicEvent != 0)
|
||||
{
|
||||
go->PlayDirectMusic(_currentMusicEvent);
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_BM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -624,14 +636,14 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PDM_START_MUSIC:
|
||||
if (!IsHolidayActive(HOLIDAY_PIRATES_DAY))
|
||||
case EVENT_PDM_START_MUSIC:
|
||||
if (!IsHolidayActive(HOLIDAY_PIRATES_DAY))
|
||||
break;
|
||||
go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC);
|
||||
_events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC);
|
||||
_events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -679,14 +691,14 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_DFM_START_MUSIC:
|
||||
if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH))
|
||||
case EVENT_DFM_START_MUSIC:
|
||||
if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH))
|
||||
break;
|
||||
go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC);
|
||||
_events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC);
|
||||
_events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -707,7 +719,7 @@ public:
|
||||
enum MidsummerMusic
|
||||
{
|
||||
EVENTMIDSUMMERFIREFESTIVAL_A = 12319, // 1.08 min
|
||||
EVENTMIDSUMMERFIREFESTIVAL_H = 12325, // 1.12 min
|
||||
EVENTMIDSUMMERFIREFESTIVAL_H = 12325, // 1.12 min
|
||||
};
|
||||
|
||||
enum MidsummerMusicEvents
|
||||
@@ -734,32 +746,32 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_MM_START_MUSIC:
|
||||
{
|
||||
if (!IsHolidayActive(HOLIDAY_FIRE_FESTIVAL))
|
||||
break;
|
||||
|
||||
Map::PlayerList const& players = go->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if (Player* player = itr->GetSource())
|
||||
case EVENT_MM_START_MUSIC:
|
||||
{
|
||||
if (player->GetTeamId() == TEAM_HORDE)
|
||||
{
|
||||
go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player);
|
||||
}
|
||||
else
|
||||
{
|
||||
go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!IsHolidayActive(HOLIDAY_FIRE_FESTIVAL))
|
||||
break;
|
||||
|
||||
_events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
Map::PlayerList const& players = go->GetMap()->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if (Player* player = itr->GetSource())
|
||||
{
|
||||
if (player->GetTeamId() == TEAM_HORDE)
|
||||
{
|
||||
go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player);
|
||||
}
|
||||
else
|
||||
{
|
||||
go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1064,12 +1076,12 @@ public:
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF:
|
||||
player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
@@ -1123,12 +1135,12 @@ public:
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF:
|
||||
player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
@@ -1291,27 +1303,27 @@ enum InconspicuousLandmark
|
||||
|
||||
class go_inconspicuous_landmark : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark")
|
||||
{
|
||||
_lastUsedTime = time(nullptr);
|
||||
}
|
||||
public:
|
||||
go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark")
|
||||
{
|
||||
_lastUsedTime = time(nullptr);
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject* /*go*/) override
|
||||
{
|
||||
if (player->HasItemCount(ITEM_CUERGOS_KEY))
|
||||
return true;
|
||||
|
||||
if (_lastUsedTime > time(nullptr))
|
||||
return true;
|
||||
|
||||
_lastUsedTime = time(nullptr) + MINUTE;
|
||||
player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true);
|
||||
bool OnGossipHello(Player* player, GameObject* /*go*/) override
|
||||
{
|
||||
if (player->HasItemCount(ITEM_CUERGOS_KEY))
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _lastUsedTime;
|
||||
if (_lastUsedTime > time(nullptr))
|
||||
return true;
|
||||
|
||||
_lastUsedTime = time(nullptr) + MINUTE;
|
||||
player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _lastUsedTime;
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -1337,98 +1349,98 @@ enum SoulWellData
|
||||
|
||||
class go_soulwell : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_soulwell() : GameObjectScript("go_soulwell") { }
|
||||
public:
|
||||
go_soulwell() : GameObjectScript("go_soulwell") { }
|
||||
|
||||
struct go_soulwellAI : public GameObjectAI
|
||||
struct go_soulwellAI : public GameObjectAI
|
||||
{
|
||||
go_soulwellAI(GameObject* go) : GameObjectAI(go)
|
||||
{
|
||||
go_soulwellAI(GameObject* go) : GameObjectAI(go)
|
||||
_stoneSpell = 0;
|
||||
_stoneId = 0;
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
_stoneSpell = 0;
|
||||
_stoneId = 0;
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_SOUL_WELL_R1:
|
||||
_stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R0;
|
||||
if (Unit* owner = go->GetOwner())
|
||||
{
|
||||
if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1))
|
||||
_stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R1;
|
||||
else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2))
|
||||
_stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R2;
|
||||
}
|
||||
break;
|
||||
case GO_SOUL_WELL_R2:
|
||||
_stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R0;
|
||||
if (Unit* owner = go->GetOwner())
|
||||
{
|
||||
if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1))
|
||||
_stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R1;
|
||||
else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2))
|
||||
_stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (_stoneSpell == 0) // Should never happen
|
||||
return;
|
||||
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(_stoneSpell);
|
||||
if (!spellInfo)
|
||||
return;
|
||||
|
||||
_stoneId = spellInfo->Effects[EFFECT_0].ItemType;
|
||||
case GO_SOUL_WELL_R1:
|
||||
_stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R0;
|
||||
if (Unit* owner = go->GetOwner())
|
||||
{
|
||||
if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1))
|
||||
_stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R1;
|
||||
else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2))
|
||||
_stoneSpell = SPELL_CREATE_MASTER_HEALTH_STONE_R2;
|
||||
}
|
||||
break;
|
||||
case GO_SOUL_WELL_R2:
|
||||
_stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R0;
|
||||
if (Unit* owner = go->GetOwner())
|
||||
{
|
||||
if (owner->HasAura(SPELL_IMPROVED_HEALTH_STONE_R1))
|
||||
_stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R1;
|
||||
else if (owner->HasAura(SPELL_CREATE_MASTER_HEALTH_STONE_R2))
|
||||
_stoneSpell = SPELL_CREATE_FEL_HEALTH_STONE_R2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (_stoneSpell == 0) // Should never happen
|
||||
return;
|
||||
|
||||
/// Due to the fact that this GameObject triggers CMSG_GAMEOBJECT_USE
|
||||
/// _and_ CMSG_GAMEOBJECT_REPORT_USE, this GossipHello hook is called
|
||||
/// twice. The script's handling is fine as it won't remove two charges
|
||||
/// on the well. We have to find how to segregate REPORT_USE and USE.
|
||||
bool GossipHello(Player* player, bool reportUse)
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(_stoneSpell);
|
||||
if (!spellInfo)
|
||||
return;
|
||||
|
||||
_stoneId = spellInfo->Effects[EFFECT_0].ItemType;
|
||||
}
|
||||
|
||||
/// Due to the fact that this GameObject triggers CMSG_GAMEOBJECT_USE
|
||||
/// _and_ CMSG_GAMEOBJECT_REPORT_USE, this GossipHello hook is called
|
||||
/// twice. The script's handling is fine as it won't remove two charges
|
||||
/// on the well. We have to find how to segregate REPORT_USE and USE.
|
||||
bool GossipHello(Player* player, bool reportUse)
|
||||
{
|
||||
if (reportUse)
|
||||
return false;
|
||||
|
||||
Unit* owner = go->GetOwner();
|
||||
if (_stoneSpell == 0 || _stoneId == 0)
|
||||
{
|
||||
if (reportUse)
|
||||
return false;
|
||||
|
||||
Unit* owner = go->GetOwner();
|
||||
if (_stoneSpell == 0 || _stoneId == 0)
|
||||
{
|
||||
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
|
||||
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_ERROR);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer()))
|
||||
{
|
||||
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
|
||||
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TARGET_NOT_IN_RAID);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Don't try to add a stone if we already have one.
|
||||
if (player->HasItemCount(_stoneId))
|
||||
{
|
||||
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
|
||||
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TOO_MANY_OF_ITEM);
|
||||
return true;
|
||||
}
|
||||
|
||||
player->CastSpell(player, _stoneSpell, false);
|
||||
|
||||
// Item has to actually be created to remove a charge on the well.
|
||||
if (player->HasItemCount(_stoneId))
|
||||
go->AddUse();
|
||||
|
||||
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
|
||||
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_ERROR);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _stoneSpell;
|
||||
uint32 _stoneId;
|
||||
};
|
||||
if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer()))
|
||||
{
|
||||
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
|
||||
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TARGET_NOT_IN_RAID);
|
||||
return true;
|
||||
}
|
||||
|
||||
GameObjectAI* GetAI(GameObject* go) const
|
||||
{
|
||||
return new go_soulwellAI(go);
|
||||
// Don't try to add a stone if we already have one.
|
||||
if (player->HasItemCount(_stoneId))
|
||||
{
|
||||
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
|
||||
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TOO_MANY_OF_ITEM);
|
||||
return true;
|
||||
}
|
||||
|
||||
player->CastSpell(player, _stoneSpell, false);
|
||||
|
||||
// Item has to actually be created to remove a charge on the well.
|
||||
if (player->HasItemCount(_stoneId))
|
||||
go->AddUse();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 _stoneSpell;
|
||||
uint32 _stoneId;
|
||||
};
|
||||
|
||||
GameObjectAI* GetAI(GameObject* go) const
|
||||
{
|
||||
return new go_soulwellAI(go);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -1523,7 +1535,7 @@ public:
|
||||
bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF +1)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
{
|
||||
CloseGossipMenuFor(player);
|
||||
Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f);
|
||||
@@ -1570,22 +1582,22 @@ public:
|
||||
if (go->FindNearestCreature(NPC_HIVE_AMBUSHER, 20.0f))
|
||||
return true;
|
||||
|
||||
go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX() + 1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY() + 1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class go_massive_seaforium_charge : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { }
|
||||
public:
|
||||
go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { }
|
||||
|
||||
bool OnGossipHello(Player* /*player*/, GameObject* go) override
|
||||
{
|
||||
go->SetLootState(GO_JUST_DEACTIVATED);
|
||||
return true;
|
||||
}
|
||||
bool OnGossipHello(Player* /*player*/, GameObject* go) override
|
||||
{
|
||||
go->SetLootState(GO_JUST_DEACTIVATED);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*########
|
||||
@@ -1594,9 +1606,9 @@ class go_massive_seaforium_charge : public GameObjectScript
|
||||
|
||||
enum MissingFriends
|
||||
{
|
||||
QUEST_MISSING_FRIENDS = 10852,
|
||||
NPC_CAPTIVE_CHILD = 22314,
|
||||
SAY_FREE_0 = 0,
|
||||
QUEST_MISSING_FRIENDS = 10852,
|
||||
NPC_CAPTIVE_CHILD = 22314,
|
||||
SAY_FREE_0 = 0,
|
||||
};
|
||||
|
||||
class go_veil_skith_cage : public GameObjectScript
|
||||
@@ -1615,7 +1627,7 @@ public:
|
||||
{
|
||||
player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID());
|
||||
(*itr)->DespawnOrUnsummon(5000);
|
||||
(*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
|
||||
(*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 5, go->GetPositionY(), go->GetPositionZ());
|
||||
(*itr)->AI()->Talk(SAY_FREE_0);
|
||||
(*itr)->GetMotionMaster()->Clear();
|
||||
}
|
||||
|
||||
@@ -65,7 +65,8 @@ public:
|
||||
playerGUID = 0;
|
||||
exileTimer = 8500;
|
||||
canTeleport = false;
|
||||
} else exileTimer -= diff;
|
||||
}
|
||||
else exileTimer -= diff;
|
||||
}
|
||||
else if (banishTimer <= diff)
|
||||
{
|
||||
@@ -78,7 +79,8 @@ public:
|
||||
if (playerGUID)
|
||||
canTeleport = true;
|
||||
}
|
||||
} else banishTimer -= diff;
|
||||
}
|
||||
else banishTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
@@ -130,7 +132,8 @@ public:
|
||||
playerGUID = 0;
|
||||
exileTimer = 8500;
|
||||
canTeleport = false;
|
||||
} else exileTimer -= diff;
|
||||
}
|
||||
else exileTimer -= diff;
|
||||
}
|
||||
else if (banishTimer <= diff)
|
||||
{
|
||||
@@ -143,7 +146,8 @@ public:
|
||||
if (playerGUID)
|
||||
canTeleport = true;
|
||||
}
|
||||
} else banishTimer -= diff;
|
||||
}
|
||||
else banishTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -45,15 +45,15 @@ public:
|
||||
//for special scripts
|
||||
switch (itemId)
|
||||
{
|
||||
case 24538:
|
||||
case 24538:
|
||||
if (player->GetAreaId() != 3628)
|
||||
disabled = true;
|
||||
break;
|
||||
case 34489:
|
||||
case 34489:
|
||||
if (player->GetZoneId() != 4080)
|
||||
disabled = true;
|
||||
break;
|
||||
case 34475:
|
||||
case 34475:
|
||||
if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES))
|
||||
Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_ON_GROUND);
|
||||
break;
|
||||
@@ -82,10 +82,10 @@ public:
|
||||
{
|
||||
if (player->GetQuestStatus(10832) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY()+20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000))
|
||||
if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY() + 20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000))
|
||||
nether->AI()->AttackStart(player);
|
||||
|
||||
if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY()-20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000))
|
||||
if (Creature* nether = player->SummonCreature(22408, player->GetPositionX(), player->GetPositionY() - 20, player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000))
|
||||
nether->AI()->AttackStart(player);
|
||||
}
|
||||
return false;
|
||||
@@ -104,7 +104,7 @@ public:
|
||||
bool OnUse(Player* player, Item* item, SpellCastTargets const& targets)
|
||||
{
|
||||
if (targets.GetUnitTarget() && targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT &&
|
||||
targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578))
|
||||
targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578))
|
||||
return false;
|
||||
|
||||
player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr);
|
||||
@@ -121,7 +121,7 @@ class item_incendiary_explosives : public ItemScript
|
||||
public:
|
||||
item_incendiary_explosives() : ItemScript("item_incendiary_explosives") { }
|
||||
|
||||
bool OnUse(Player* player, Item* item, SpellCastTargets const & /*targets*/)
|
||||
bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/)
|
||||
{
|
||||
if (player->FindNearestCreature(26248, 15) || player->FindNearestCreature(26249, 15))
|
||||
return false;
|
||||
@@ -189,7 +189,7 @@ class item_petrov_cluster_bombs : public ItemScript
|
||||
public:
|
||||
item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { }
|
||||
|
||||
bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/)
|
||||
bool OnUse(Player* player, Item* item, const SpellCastTargets& /*targets*/)
|
||||
{
|
||||
if (player->GetZoneId() != ZONE_ID_HOWLING)
|
||||
return false;
|
||||
|
||||
@@ -70,7 +70,8 @@ public:
|
||||
BuffTimer = 600000;
|
||||
}//Try agian in 30 seconds
|
||||
else BuffTimer = 30000;
|
||||
} else BuffTimer -= diff;
|
||||
}
|
||||
else BuffTimer -= diff;
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICKED_OR_TREATED))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Trick or Treat!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Trick or Treat!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + HALLOWEEN_EVENTID);
|
||||
|
||||
if (creature->IsQuestGiver())
|
||||
player->PrepareQuestMenu(creature->GetGUID());
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
if (action == GOSSIP_ACTION_INFO_DEF+HALLOWEEN_EVENTID && IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICKED_OR_TREATED))
|
||||
if (action == GOSSIP_ACTION_INFO_DEF + HALLOWEEN_EVENTID && IsEventActive(HALLOWEEN_EVENTID) && !player->HasAura(SPELL_TRICKED_OR_TREATED))
|
||||
{
|
||||
player->CastSpell(player, SPELL_TRICKED_OR_TREATED, true);
|
||||
creature->CastSpell(player, roll_chance_i(50) ? SPELL_TRICK : SPELL_TREAT, true);
|
||||
@@ -54,8 +54,12 @@ public:
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break;
|
||||
case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break;
|
||||
case GOSSIP_ACTION_TRADE:
|
||||
player->GetSession()->SendListInventory(creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INN:
|
||||
player->SetBindPoint(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -487,7 +487,7 @@ public:
|
||||
case GOSSIP_ACTION_TRAIN:
|
||||
player->GetSession()->SendTrainerList(creature->GetGUID());
|
||||
break;
|
||||
//Learn Alchemy
|
||||
//Learn Alchemy
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
ProcessCastaction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player));
|
||||
break;
|
||||
@@ -497,7 +497,7 @@ public:
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
ProcessCastaction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player));
|
||||
break;
|
||||
//Unlearn Alchemy
|
||||
//Unlearn Alchemy
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
ProcessUnlearnAction(player, creature, S_UNLEARN_TRANSMUTE, 0, DoHighUnlearnCost(player));
|
||||
break;
|
||||
@@ -518,17 +518,17 @@ public:
|
||||
{
|
||||
case N_TRAINER_TRANSMUTE:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_ELIXIR:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_POTION:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
@@ -543,17 +543,17 @@ public:
|
||||
{
|
||||
case N_TRAINER_TRANSMUTE: //Zarevhi
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_ELIXIR: //Lorokeem
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_POTION: //Lauranna Thar'well
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
@@ -678,14 +678,14 @@ public:
|
||||
case GOSSIP_ACTION_TRAIN:
|
||||
player->GetSession()->SendTrainerList(creature->GetGUID());
|
||||
break;
|
||||
//Learn Armor/Weapon
|
||||
//Learn Armor/Weapon
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
ProcessCastaction(player, creature, S_ARMOR, S_LEARN_ARMOR, 0);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
ProcessCastaction(player, creature, S_WEAPON, S_LEARN_WEAPON, 0);
|
||||
break;
|
||||
//Unlearn Armor/Weapon
|
||||
//Unlearn Armor/Weapon
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
if (HasWeaponSub(player))
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
@@ -695,7 +695,7 @@ public:
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
ProcessUnlearnAction(player, creature, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player));
|
||||
break;
|
||||
//Learn Hammer/Axe/Sword
|
||||
//Learn Hammer/Axe/Sword
|
||||
case GOSSIP_ACTION_INFO_DEF + 5:
|
||||
ProcessCastaction(player, creature, S_HAMMER, S_LEARN_HAMMER, 0);
|
||||
break;
|
||||
@@ -705,7 +705,7 @@ public:
|
||||
case GOSSIP_ACTION_INFO_DEF + 7:
|
||||
ProcessCastaction(player, creature, S_SWORD, S_LEARN_SWORD, 0);
|
||||
break;
|
||||
//Unlearn Hammer/Axe/Sword
|
||||
//Unlearn Hammer/Axe/Sword
|
||||
case GOSSIP_ACTION_INFO_DEF + 8:
|
||||
ProcessUnlearnAction(player, creature, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player));
|
||||
break;
|
||||
@@ -726,17 +726,17 @@ public:
|
||||
{
|
||||
case N_TRAINER_HAMMER:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID (TALK_HAMMER_LEARN)
|
||||
//unknown textID (TALK_HAMMER_LEARN)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_AXE:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID (TALK_AXE_LEARN)
|
||||
//unknown textID (TALK_AXE_LEARN)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_SWORD:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID (TALK_SWORD_LEARN)
|
||||
//unknown textID (TALK_SWORD_LEARN)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
@@ -754,23 +754,23 @@ public:
|
||||
case N_TRAINER_ARMOR1: //Grumnus Steelshaper
|
||||
case N_TRAINER_ARMOR2: //Okothos Ironrager
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false);
|
||||
//unknown textID (TALK_UNLEARN_AXEORWEAPON)
|
||||
//unknown textID (TALK_UNLEARN_AXEORWEAPON)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
|
||||
case N_TRAINER_HAMMER:
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
|
||||
//unknown textID (TALK_HAMMER_UNLEARN)
|
||||
//unknown textID (TALK_HAMMER_UNLEARN)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_AXE:
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
|
||||
//unknown textID (TALK_AXE_UNLEARN)
|
||||
//unknown textID (TALK_AXE_UNLEARN)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_SWORD:
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
|
||||
//unknown textID (TALK_SWORD_UNLEARN)
|
||||
//unknown textID (TALK_SWORD_UNLEARN)
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
@@ -1031,7 +1031,7 @@ public:
|
||||
if (creature->IsTrainer())
|
||||
AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
|
||||
|
||||
//TAILORING SPEC
|
||||
//TAILORING SPEC
|
||||
if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59)
|
||||
{
|
||||
if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833))
|
||||
@@ -1074,7 +1074,7 @@ public:
|
||||
case GOSSIP_ACTION_TRAIN:
|
||||
player->GetSession()->SendTrainerList(creature->GetGUID());
|
||||
break;
|
||||
//Learn Tailor
|
||||
//Learn Tailor
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player));
|
||||
break;
|
||||
@@ -1084,7 +1084,7 @@ public:
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player));
|
||||
break;
|
||||
//Unlearn Tailor
|
||||
//Unlearn Tailor
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
ProcessUnlearnAction(player, creature, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player));
|
||||
break;
|
||||
@@ -1105,17 +1105,17 @@ public:
|
||||
{
|
||||
case N_TRAINER_SPELLFIRE:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_MOONCLOTH:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_SHADOWEAVE:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
@@ -1130,17 +1130,17 @@ public:
|
||||
{
|
||||
case N_TRAINER_SPELLFIRE: //Gidge Spellweaver
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_MOONCLOTH: //Nasmara Moonsong
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case N_TRAINER_SHADOWEAVE: //Andrion Darkspinner
|
||||
AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
|
||||
//unknown textID ()
|
||||
//unknown textID ()
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
@@ -1178,7 +1178,8 @@ public:
|
||||
go_evil_book_for_dummies() : GameObjectScript("go_evil_book_for_dummies") { }
|
||||
|
||||
bool OnGossipHello(Player* player, GameObject* gameobject) override
|
||||
{ //TAILORING SPEC
|
||||
{
|
||||
//TAILORING SPEC
|
||||
if (player->HasSkill(SKILL_ENGINEERING) && player->GetBaseSkillValue(SKILL_ENGINEERING) >= 225 && player->getLevel() >= 35)
|
||||
{
|
||||
if (player->GetQuestRewardStatus(3643) || player->GetQuestRewardStatus(3641) || player->GetQuestRewardStatus(3639))
|
||||
@@ -1265,8 +1266,12 @@ public:
|
||||
ClearGossipMenuFor(player);
|
||||
switch(uiSender)
|
||||
{
|
||||
case GOSSIP_SENDER_LEARN: SendActionMenu(player, gameobject, uiAction); break;
|
||||
case GOSSIP_SENDER_UNLEARN: SendActionMenu(player, gameobject, uiAction); break;
|
||||
case GOSSIP_SENDER_LEARN:
|
||||
SendActionMenu(player, gameobject, uiAction);
|
||||
break;
|
||||
case GOSSIP_SENDER_UNLEARN:
|
||||
SendActionMenu(player, gameobject, uiAction);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -55,90 +55,90 @@ public:
|
||||
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case 17435: // Azuremyst Isle - Susurrus
|
||||
if (player->HasItemCount(23843, 1, true))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SUSURRUS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
break;
|
||||
case 20903: // Netherstorm - Protectorate Nether Drake
|
||||
if (player->GetQuestStatus(10438) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(29778))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_NETHER_DRAKE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
break;
|
||||
case 29154: // Stormwind City - Thargold Ironwing
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
break;
|
||||
case 19409: // Hellfire Peninsula - Wing Commander Dabir'ee
|
||||
//Mission: The Murketh and Shaadraz Gateways
|
||||
if (player->GetQuestStatus(10146) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
case 17435: // Azuremyst Isle - Susurrus
|
||||
if (player->HasItemCount(23843, 1, true))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SUSURRUS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
|
||||
break;
|
||||
case 20903: // Netherstorm - Protectorate Nether Drake
|
||||
if (player->GetQuestStatus(10438) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(29778))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_NETHER_DRAKE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
break;
|
||||
case 29154: // Stormwind City - Thargold Ironwing
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
break;
|
||||
case 19409: // Hellfire Peninsula - Wing Commander Dabir'ee
|
||||
//Mission: The Murketh and Shaadraz Gateways
|
||||
if (player->GetQuestStatus(10146) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
|
||||
//Shatter Point
|
||||
if (!player->GetQuestRewardStatus(10340))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
|
||||
break;
|
||||
case 19401: // Hellfire Peninsula - Wing Commander Brack
|
||||
//Mission: The Murketh and Shaadraz Gateways
|
||||
if (player->GetQuestStatus(10129) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
|
||||
//Shatter Point
|
||||
if (!player->GetQuestRewardStatus(10340))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DABIREE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
|
||||
break;
|
||||
case 19401: // Hellfire Peninsula - Wing Commander Brack
|
||||
//Mission: The Murketh and Shaadraz Gateways
|
||||
if (player->GetQuestStatus(10129) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
|
||||
|
||||
//Mission: The Abyssal Shelf || Return to the Abyssal Shelf
|
||||
if (player->GetQuestStatus(10162) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10347) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
|
||||
//Mission: The Abyssal Shelf || Return to the Abyssal Shelf
|
||||
if (player->GetQuestStatus(10162) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10347) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
|
||||
|
||||
//Spinebreaker Post
|
||||
if (player->GetQuestStatus(10242) == QUEST_STATUS_COMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
|
||||
break;
|
||||
case 23413: // Blade's Edge Mountains - Skyguard Handler Irena
|
||||
if (player->GetReputationRank(1031) >= REP_HONORED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRENA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
|
||||
break;
|
||||
case 25059: // Isle of Quel'Danas - Ayren Cloudbreaker
|
||||
if (player->GetQuestStatus(11532) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11533) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
|
||||
//Spinebreaker Post
|
||||
if (player->GetQuestStatus(10242) == QUEST_STATUS_COMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BRACK3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
|
||||
break;
|
||||
case 23413: // Blade's Edge Mountains - Skyguard Handler Irena
|
||||
if (player->GetReputationRank(1031) >= REP_HONORED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_IRENA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
|
||||
break;
|
||||
case 25059: // Isle of Quel'Danas - Ayren Cloudbreaker
|
||||
if (player->GetQuestStatus(11532) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11533) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
|
||||
|
||||
if (player->GetQuestStatus(11542) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
|
||||
break;
|
||||
case 25236: // Isle of Quel'Danas - Unrestrained Dragonhawk
|
||||
if (player->GetQuestStatus(11542) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_COMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DRAGONHAWK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
|
||||
break;
|
||||
case 20162: // Netherstorm - Veronia
|
||||
//Behind Enemy Lines
|
||||
if (player->GetQuestStatus(10652) != QUEST_STATUS_REWARDED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VERONIA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
|
||||
break;
|
||||
case 23415: // Terokkar Forest - Skyguard Handler Deesak
|
||||
if (player->GetReputationRank(1031) >= REP_HONORED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DEESAK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 16);
|
||||
break;
|
||||
case 27575: // Dragonblight - Lord Afrasastrasz
|
||||
// middle -> ground
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 17);
|
||||
// middle -> top
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 18);
|
||||
break;
|
||||
case 26443: // Dragonblight - Tariolstrasz //need to check if quests are required before gossip available (12123, 12124)
|
||||
// ground -> top
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 19);
|
||||
// ground -> middle
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20);
|
||||
break;
|
||||
case 26949: // Dragonblight - Torastrasza
|
||||
// top -> middle
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21);
|
||||
// top -> ground
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
|
||||
break;
|
||||
case 23704: // Dustwallow Marsh - Cassa Crimsonwing
|
||||
if (player->GetQuestStatus(11142) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CRIMSONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+25);
|
||||
break;
|
||||
case 17209:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 26);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 27);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 28);
|
||||
break;
|
||||
if (player->GetQuestStatus(11542) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
|
||||
break;
|
||||
case 25236: // Isle of Quel'Danas - Unrestrained Dragonhawk
|
||||
if (player->GetQuestStatus(11542) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_COMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DRAGONHAWK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
|
||||
break;
|
||||
case 20162: // Netherstorm - Veronia
|
||||
//Behind Enemy Lines
|
||||
if (player->GetQuestStatus(10652) != QUEST_STATUS_REWARDED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VERONIA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
|
||||
break;
|
||||
case 23415: // Terokkar Forest - Skyguard Handler Deesak
|
||||
if (player->GetReputationRank(1031) >= REP_HONORED)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DEESAK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 16);
|
||||
break;
|
||||
case 27575: // Dragonblight - Lord Afrasastrasz
|
||||
// middle -> ground
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 17);
|
||||
// middle -> top
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 18);
|
||||
break;
|
||||
case 26443: // Dragonblight - Tariolstrasz //need to check if quests are required before gossip available (12123, 12124)
|
||||
// ground -> top
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 19);
|
||||
// ground -> middle
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20);
|
||||
break;
|
||||
case 26949: // Dragonblight - Torastrasza
|
||||
// top -> middle
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21);
|
||||
// top -> ground
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
|
||||
break;
|
||||
case 23704: // Dustwallow Marsh - Cassa Crimsonwing
|
||||
if (player->GetQuestStatus(11142) == QUEST_STATUS_INCOMPLETE)
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_CRIMSONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 25);
|
||||
break;
|
||||
case 17209:
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 26);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 27);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 28);
|
||||
break;
|
||||
}
|
||||
|
||||
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
|
||||
@@ -150,112 +150,112 @@ public:
|
||||
ClearGossipMenuFor(player);
|
||||
switch (action)
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF:
|
||||
//spellId is correct, however it gives flight a somewhat funny effect //TaxiPath 506.
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 32474, true);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(627); //TaxiPath 627 (possibly 627+628(152->153->154->155))
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 53335, true); //TaxiPath 1041 (Stormwind Harbor)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 33768, true); //TaxiPath 585 (Gateways Murket and Shaadraz)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 35069, true); //TaxiPath 612 (Taxi - Hellfire Peninsula - Expedition Point to Shatter Point)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 8:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 33659, true); //TaxiPath 584 (Gateways Murket and Shaadraz)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 9:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 33825, true); //TaxiPath 587 (Aerial Assault Flight (Horde))
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 10:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 34578, true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 11:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 41278, true); //TaxiPath 706
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 12:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 45071, true); //TaxiPath 779
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 13:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 45113, true); //TaxiPath 784
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 14:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 45353, true); //TaxiPath 788
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 15:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 34905, true); //TaxiPath 606
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 16:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 41279, true); //TaxiPath 705 (Taxi - Skettis to Skyguard Outpost)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 17:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(882);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 18:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(881);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 19:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(878);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 20:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(883);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 21:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(880);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 22:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(879);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 23:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 43074, true); //TaxiPath 736
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 24:
|
||||
CloseGossipMenuFor(player);
|
||||
//player->ActivateTaxiPathTo(738);
|
||||
player->CastSpell(player, 43136, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 25:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 42295, true);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 26:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(494);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 27:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(495);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 28:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(496);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF:
|
||||
//spellId is correct, however it gives flight a somewhat funny effect //TaxiPath 506.
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 32474, true);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(627); //TaxiPath 627 (possibly 627+628(152->153->154->155))
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 53335, true); //TaxiPath 1041 (Stormwind Harbor)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 33768, true); //TaxiPath 585 (Gateways Murket and Shaadraz)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 35069, true); //TaxiPath 612 (Taxi - Hellfire Peninsula - Expedition Point to Shatter Point)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 8:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 33659, true); //TaxiPath 584 (Gateways Murket and Shaadraz)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 9:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 33825, true); //TaxiPath 587 (Aerial Assault Flight (Horde))
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 10:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 34578, true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 11:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 41278, true); //TaxiPath 706
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 12:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 45071, true); //TaxiPath 779
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 13:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 45113, true); //TaxiPath 784
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 14:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 45353, true); //TaxiPath 788
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 15:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 34905, true); //TaxiPath 606
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 16:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 41279, true); //TaxiPath 705 (Taxi - Skettis to Skyguard Outpost)
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 17:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(882);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 18:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(881);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 19:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(878);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 20:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(883);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 21:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(880);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 22:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(879);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 23:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 43074, true); //TaxiPath 736
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 24:
|
||||
CloseGossipMenuFor(player);
|
||||
//player->ActivateTaxiPathTo(738);
|
||||
player->CastSpell(player, 43136, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 25:
|
||||
CloseGossipMenuFor(player);
|
||||
player->CastSpell(player, 42295, true);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 26:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(494);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 27:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(495);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 28:
|
||||
CloseGossipMenuFor(player);
|
||||
player->ActivateTaxiPathTo(496);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
|
||||
struct npc_elder_clearwaterAI : public ScriptedAI
|
||||
{
|
||||
npc_elder_clearwaterAI(Creature *c) : ScriptedAI(c)
|
||||
npc_elder_clearwaterAI(Creature* c) : ScriptedAI(c)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CLEARWATER_ANNOUNCE, 1000, 1, 0);
|
||||
@@ -107,37 +107,37 @@ public:
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_CLEARWATER_ANNOUNCE:
|
||||
{
|
||||
time_t curtime = time(nullptr);
|
||||
tm strdate;
|
||||
localtime_r(&curtime, &strdate);
|
||||
{
|
||||
time_t curtime = time(nullptr);
|
||||
tm strdate;
|
||||
localtime_r(&curtime, &strdate);
|
||||
|
||||
if (!preWarning && strdate.tm_hour == 13 && strdate.tm_min == 55)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_PRE, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP);
|
||||
preWarning = true;
|
||||
}
|
||||
if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP);
|
||||
startWarning = true;
|
||||
}
|
||||
if (!finishWarning && strdate.tm_hour == 15 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP);
|
||||
finishWarning = true;
|
||||
// no one won - despawn
|
||||
if (!finished)
|
||||
if (!preWarning && strdate.tm_hour == 13 && strdate.tm_min == 55)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
events.PopEvent();
|
||||
break;
|
||||
sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_PRE, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP);
|
||||
preWarning = true;
|
||||
}
|
||||
if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP);
|
||||
startWarning = true;
|
||||
}
|
||||
if (!finishWarning && strdate.tm_hour == 15 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, CLEARWATER_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_MAP);
|
||||
finishWarning = true;
|
||||
// no one won - despawn
|
||||
if (!finished)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -156,7 +156,7 @@ public:
|
||||
else
|
||||
return true;
|
||||
|
||||
QuestMenu &qm = player->PlayerTalkClass->GetQuestMenu();
|
||||
QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu();
|
||||
qm.ClearMenu();
|
||||
|
||||
for (QuestRelations::const_iterator i = pObjectQIR.first; i != pObjectQIR.second; ++i)
|
||||
@@ -218,7 +218,7 @@ public:
|
||||
|
||||
struct npc_riggle_bassbaitAI : public ScriptedAI
|
||||
{
|
||||
npc_riggle_bassbaitAI(Creature *c) : ScriptedAI(c)
|
||||
npc_riggle_bassbaitAI(Creature* c) : ScriptedAI(c)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_RIGGLE_ANNOUNCE, 1000, 1, 0);
|
||||
@@ -252,31 +252,31 @@ public:
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_RIGGLE_ANNOUNCE:
|
||||
{
|
||||
time_t curtime = time(nullptr);
|
||||
tm strdate;
|
||||
localtime_r(&curtime, &strdate);
|
||||
if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, RIGGLE_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE);
|
||||
startWarning = true;
|
||||
}
|
||||
if (!finishWarning && strdate.tm_hour == 16 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, RIGGLE_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE);
|
||||
finishWarning = true;
|
||||
// no one won - despawn
|
||||
if (!finished)
|
||||
time_t curtime = time(nullptr);
|
||||
tm strdate;
|
||||
localtime_r(&curtime, &strdate);
|
||||
if (!startWarning && strdate.tm_hour == 14 && strdate.tm_min == 0)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
events.PopEvent();
|
||||
break;
|
||||
sCreatureTextMgr->SendChat(me, RIGGLE_SAY_START, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE);
|
||||
startWarning = true;
|
||||
}
|
||||
if (!finishWarning && strdate.tm_hour == 16 && strdate.tm_min == 0)
|
||||
{
|
||||
sCreatureTextMgr->SendChat(me, RIGGLE_SAY_END, 0, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, TEXT_RANGE_ZONE);
|
||||
finishWarning = true;
|
||||
// no one won - despawn
|
||||
if (!finished)
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -578,55 +578,55 @@ public:
|
||||
switch (SpawnAssoc->spawnType)
|
||||
{
|
||||
case SPAWNTYPE_ALARMBOT:
|
||||
{
|
||||
if (!who->IsWithinDistInMap(me, RANGE_GUARDS_MARK))
|
||||
return;
|
||||
|
||||
Aura* markAura = who->GetAura(SPELL_GUARDS_MARK);
|
||||
if (markAura)
|
||||
{
|
||||
// the target wasn't able to move out of our range within 25 seconds
|
||||
if (!lastSpawnedGuard)
|
||||
if (!who->IsWithinDistInMap(me, RANGE_GUARDS_MARK))
|
||||
return;
|
||||
|
||||
Aura* markAura = who->GetAura(SPELL_GUARDS_MARK);
|
||||
if (markAura)
|
||||
{
|
||||
lastSpawnedGuard = SummonGuard();
|
||||
// the target wasn't able to move out of our range within 25 seconds
|
||||
if (!lastSpawnedGuard)
|
||||
{
|
||||
lastSpawnedGuard = SummonGuard();
|
||||
|
||||
if (!lastSpawnedGuard)
|
||||
return;
|
||||
}
|
||||
|
||||
if (markAura->GetDuration() < AURA_DURATION_TIME_LEFT)
|
||||
if (!lastSpawnedGuard->GetVictim())
|
||||
lastSpawnedGuard->AI()->AttackStart(who);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!lastSpawnedGuard)
|
||||
lastSpawnedGuard = SummonGuard();
|
||||
|
||||
if (!lastSpawnedGuard)
|
||||
return;
|
||||
}
|
||||
|
||||
if (markAura->GetDuration() < AURA_DURATION_TIME_LEFT)
|
||||
if (!lastSpawnedGuard->GetVictim())
|
||||
lastSpawnedGuard->AI()->AttackStart(who);
|
||||
lastSpawnedGuard->CastSpell(who, SPELL_GUARDS_MARK, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
case SPAWNTYPE_TRIPWIRE_ROOFTOP:
|
||||
{
|
||||
if (!who->IsWithinDistInMap(me, RANGE_TRIPWIRE))
|
||||
return;
|
||||
|
||||
if (!lastSpawnedGuard)
|
||||
lastSpawnedGuard = SummonGuard();
|
||||
|
||||
if (!lastSpawnedGuard)
|
||||
return;
|
||||
|
||||
lastSpawnedGuard->CastSpell(who, SPELL_GUARDS_MARK, true);
|
||||
// ROOFTOP only triggers if the player is on the ground
|
||||
if (!playerTarget->IsFlying() && !lastSpawnedGuard->GetVictim())
|
||||
lastSpawnedGuard->AI()->AttackStart(who);
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPAWNTYPE_TRIPWIRE_ROOFTOP:
|
||||
{
|
||||
if (!who->IsWithinDistInMap(me, RANGE_TRIPWIRE))
|
||||
return;
|
||||
|
||||
if (!lastSpawnedGuard)
|
||||
lastSpawnedGuard = SummonGuard();
|
||||
|
||||
if (!lastSpawnedGuard)
|
||||
return;
|
||||
|
||||
// ROOFTOP only triggers if the player is on the ground
|
||||
if (!playerTarget->IsFlying() && !lastSpawnedGuard->GetVictim())
|
||||
lastSpawnedGuard->AI()->AttackStart(who);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -885,7 +885,7 @@ struct Location
|
||||
float x, y, z, o;
|
||||
};
|
||||
|
||||
static Location AllianceCoords[]=
|
||||
static Location AllianceCoords[] =
|
||||
{
|
||||
{-3757.38f, -4533.05f, 14.16f, 3.62f}, // Top-far-right bunk as seen from entrance
|
||||
{-3754.36f, -4539.13f, 14.16f, 5.13f}, // Top-far-left bunk
|
||||
@@ -901,7 +901,7 @@ static Location AllianceCoords[]=
|
||||
#define A_RUNTOY -4531.52f
|
||||
#define A_RUNTOZ 11.91f
|
||||
|
||||
static Location HordeCoords[]=
|
||||
static Location HordeCoords[] =
|
||||
{
|
||||
{-1013.75f, -3492.59f, 62.62f, 4.34f}, // Left, Behind
|
||||
{-1017.72f, -3490.92f, 62.62f, 4.34f}, // Right, Behind
|
||||
@@ -1107,7 +1107,8 @@ public:
|
||||
uint32 mobId = me->GetEntry();
|
||||
|
||||
switch (mobId)
|
||||
{ //lower max health
|
||||
{
|
||||
//lower max health
|
||||
case 12923:
|
||||
case 12938: //Injured Soldier
|
||||
me->SetHealth(me->CountPctFromMaxHealth(75));
|
||||
@@ -1557,13 +1558,13 @@ public:
|
||||
player->PrepareQuestMenu(creature->GetGUID());
|
||||
|
||||
if (player->HasSpellCooldown(SPELL_INT) ||
|
||||
player->HasSpellCooldown(SPELL_ARM) ||
|
||||
player->HasSpellCooldown(SPELL_DMG) ||
|
||||
player->HasSpellCooldown(SPELL_RES) ||
|
||||
player->HasSpellCooldown(SPELL_STR) ||
|
||||
player->HasSpellCooldown(SPELL_AGI) ||
|
||||
player->HasSpellCooldown(SPELL_STM) ||
|
||||
player->HasSpellCooldown(SPELL_SPI))
|
||||
player->HasSpellCooldown(SPELL_ARM) ||
|
||||
player->HasSpellCooldown(SPELL_DMG) ||
|
||||
player->HasSpellCooldown(SPELL_RES) ||
|
||||
player->HasSpellCooldown(SPELL_STR) ||
|
||||
player->HasSpellCooldown(SPELL_AGI) ||
|
||||
player->HasSpellCooldown(SPELL_STM) ||
|
||||
player->HasSpellCooldown(SPELL_SPI))
|
||||
SendGossipMenuFor(player, 7393, creature->GetGUID());
|
||||
else
|
||||
{
|
||||
@@ -1630,42 +1631,42 @@ public:
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 1:
|
||||
creature->CastSpell(player, SPELL_DMG, false);
|
||||
player->AddSpellCooldown(SPELL_DMG, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_DMG, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 2:
|
||||
creature->CastSpell(player, SPELL_RES, false);
|
||||
player->AddSpellCooldown(SPELL_RES, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_RES, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 3:
|
||||
creature->CastSpell(player, SPELL_ARM, false);
|
||||
player->AddSpellCooldown(SPELL_ARM, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_ARM, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 4:
|
||||
creature->CastSpell(player, SPELL_SPI, false);
|
||||
player->AddSpellCooldown(SPELL_SPI, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_SPI, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 5:
|
||||
creature->CastSpell(player, SPELL_INT, false);
|
||||
player->AddSpellCooldown(SPELL_INT, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_INT, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 6:
|
||||
creature->CastSpell(player, SPELL_STM, false);
|
||||
player->AddSpellCooldown(SPELL_STM, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_STM, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 7:
|
||||
creature->CastSpell(player, SPELL_STR, false);
|
||||
player->AddSpellCooldown(SPELL_STR, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_STR, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
case GOSSIP_SENDER_MAIN + 8:
|
||||
creature->CastSpell(player, SPELL_AGI, false);
|
||||
player->AddSpellCooldown(SPELL_AGI, 0, 2*HOUR*IN_MILLISECONDS);
|
||||
player->AddSpellCooldown(SPELL_AGI, 0, 2 * HOUR * IN_MILLISECONDS);
|
||||
SendAction(player, creature, action);
|
||||
break;
|
||||
}
|
||||
@@ -1733,88 +1734,88 @@ enum WormholeSpells
|
||||
|
||||
class npc_wormhole : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_wormhole() : CreatureScript("npc_wormhole") { }
|
||||
public:
|
||||
npc_wormhole() : CreatureScript("npc_wormhole") { }
|
||||
|
||||
struct npc_wormholeAI : public PassiveAI
|
||||
struct npc_wormholeAI : public PassiveAI
|
||||
{
|
||||
npc_wormholeAI(Creature* creature) : PassiveAI(creature) { }
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
npc_wormholeAI(Creature* creature) : PassiveAI(creature) { }
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
_showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
bool _showUnderground;
|
||||
};
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (creature->IsSummon())
|
||||
{
|
||||
if (player == creature->ToTempSummon()->GetSummoner())
|
||||
{
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
|
||||
|
||||
if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
|
||||
|
||||
SendGossipMenuFor(player, TEXT_WORMHOLE, creature);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
_showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0;
|
||||
}
|
||||
|
||||
switch (action)
|
||||
private:
|
||||
bool _showUnderground;
|
||||
};
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (creature->IsSummon())
|
||||
{
|
||||
if (player == creature->ToTempSummon()->GetSummoner())
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_HOWLING_FJORD, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_ICECROWN, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_STORM_PEAKS, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 6: // Underground
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_UNDERGROUND, false);
|
||||
break;
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
|
||||
|
||||
if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ENGINEERING6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
|
||||
|
||||
SendGossipMenuFor(player, TEXT_WORMHOLE, creature);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
ClearGossipMenuFor(player);
|
||||
|
||||
switch (action)
|
||||
{
|
||||
return new npc_wormholeAI(creature);
|
||||
case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_HOWLING_FJORD, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_ICECROWN, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_STORM_PEAKS, false);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 6: // Underground
|
||||
CloseGossipMenuFor(player);
|
||||
creature->CastSpell(player, SPELL_UNDERGROUND, false);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_wormholeAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -1917,12 +1918,12 @@ public:
|
||||
|
||||
// Skeleton Key
|
||||
if ((player->GetQuestRewardStatus(QUEST_THE_KEY_TO_SCHOLOMANCE_A) || player->GetQuestRewardStatus(QUEST_THE_KEY_TO_SCHOLOMANCE_H)) &&
|
||||
!player->HasItemCount(ITEM_SKELETON_KEY, 1, true))
|
||||
!player->HasItemCount(ITEM_SKELETON_KEY, 1, true))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LOST_SKELETON_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
|
||||
// Shatered Halls Key
|
||||
if ((player->GetQuestRewardStatus(QUEST_HOTTER_THAN_HELL_A) || player->GetQuestRewardStatus(QUEST_HOTTER_THAN_HELL_H)) &&
|
||||
!player->HasItemCount(ITEM_SHATTERED_HALLS_KEY, 1, true))
|
||||
!player->HasItemCount(ITEM_SHATTERED_HALLS_KEY, 1, true))
|
||||
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LOST_SHATTERED_HALLS_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
|
||||
// Master's Key
|
||||
@@ -2292,7 +2293,7 @@ public:
|
||||
if (GameObject* launcher = FindNearestLauncher())
|
||||
{
|
||||
launcher->SendCustomAnim(ANIM_GO_LAUNCH_FIREWORK);
|
||||
me->SetOrientation(launcher->GetOrientation() + M_PI/2);
|
||||
me->SetOrientation(launcher->GetOrientation() + M_PI / 2);
|
||||
}
|
||||
else
|
||||
return;
|
||||
@@ -2310,7 +2311,7 @@ public:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
if (Creature* minion = me->SummonCreature(NPC_MINION_OF_OMEN, me->GetPositionX()+frand(-5.0f, 5.0f), me->GetPositionY()+frand(-5.0f, 5.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
if (Creature* minion = me->SummonCreature(NPC_MINION_OF_OMEN, me->GetPositionX() + frand(-5.0f, 5.0f), me->GetPositionY() + frand(-5.0f, 5.0f), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
minion->AI()->AttackStart(me->SelectNearestPlayer(20.0f));
|
||||
break;
|
||||
case 9:
|
||||
@@ -2324,7 +2325,7 @@ public:
|
||||
|
||||
float displacement = 0.7f;
|
||||
for (uint8 i = 0; i < 4; i++)
|
||||
me->SummonGameObject(GetFireworkGameObjectId(), me->GetPositionX() + (i%2 == 0 ? displacement : -displacement), me->GetPositionY() + (i > 1 ? displacement : -displacement), me->GetPositionZ() + 4.0f, me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 1);
|
||||
me->SummonGameObject(GetFireworkGameObjectId(), me->GetPositionX() + (i % 2 == 0 ? displacement : -displacement), me->GetPositionY() + (i > 1 ? displacement : -displacement), me->GetPositionZ() + 4.0f, me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 1);
|
||||
}
|
||||
else
|
||||
//me->CastSpell(me, GetFireworkSpell(me->GetEntry()), true);
|
||||
@@ -2401,13 +2402,15 @@ public:
|
||||
if (Unit* rabbit = ObjectAccessor::GetUnit(*me, rabbitGUID))
|
||||
DoCast(rabbit, SPELL_SPRING_RABBIT_JUMP);
|
||||
jumpTimer = urand(5000, 10000);
|
||||
} else jumpTimer -= diff;
|
||||
}
|
||||
else jumpTimer -= diff;
|
||||
|
||||
if (bunnyTimer <= diff)
|
||||
{
|
||||
DoCast(SPELL_SUMMON_BABY_BUNNY);
|
||||
bunnyTimer = urand(20000, 40000);
|
||||
} else bunnyTimer -= diff;
|
||||
}
|
||||
else bunnyTimer -= diff;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2426,7 +2429,8 @@ public:
|
||||
rabbitGUID = rabbit->GetGUID();
|
||||
}
|
||||
searchTimer = urand(5000, 10000);
|
||||
} else searchTimer -= diff;
|
||||
}
|
||||
else searchTimer -= diff;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -2447,54 +2451,54 @@ enum StableMasters
|
||||
|
||||
class npc_stable_master : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_stable_master() : CreatureScript("npc_stable_master") { }
|
||||
public:
|
||||
npc_stable_master() : CreatureScript("npc_stable_master") { }
|
||||
|
||||
struct npc_stable_masterAI : public SmartAI
|
||||
struct npc_stable_masterAI : public SmartAI
|
||||
{
|
||||
npc_stable_masterAI(Creature* creature) : SmartAI(creature) { }
|
||||
|
||||
void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId)
|
||||
{
|
||||
npc_stable_masterAI(Creature* creature) : SmartAI(creature) { }
|
||||
SmartAI::sGossipSelect(player, menuId, gossipListId);
|
||||
if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU)
|
||||
return;
|
||||
|
||||
void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId)
|
||||
switch (gossipListId)
|
||||
{
|
||||
SmartAI::sGossipSelect(player, menuId, gossipListId);
|
||||
if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU)
|
||||
case 0:
|
||||
player->CastSpell(player, SPELL_MINIWING, false);
|
||||
break;
|
||||
case 1:
|
||||
player->CastSpell(player, SPELL_JUBLING, false);
|
||||
break;
|
||||
case 2:
|
||||
player->CastSpell(player, SPELL_DARTER, false);
|
||||
break;
|
||||
case 3:
|
||||
player->CastSpell(player, SPELL_WORG, false);
|
||||
break;
|
||||
case 4:
|
||||
player->CastSpell(player, SPELL_SMOLDERWEB, false);
|
||||
break;
|
||||
case 5:
|
||||
player->CastSpell(player, SPELL_CHIKEN, false);
|
||||
break;
|
||||
case 6:
|
||||
player->CastSpell(player, SPELL_WOLPERTINGER, false);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
|
||||
switch (gossipListId)
|
||||
{
|
||||
case 0:
|
||||
player->CastSpell(player, SPELL_MINIWING, false);
|
||||
break;
|
||||
case 1:
|
||||
player->CastSpell(player, SPELL_JUBLING, false);
|
||||
break;
|
||||
case 2:
|
||||
player->CastSpell(player, SPELL_DARTER, false);
|
||||
break;
|
||||
case 3:
|
||||
player->CastSpell(player, SPELL_WORG, false);
|
||||
break;
|
||||
case 4:
|
||||
player->CastSpell(player, SPELL_SMOLDERWEB, false);
|
||||
break;
|
||||
case 5:
|
||||
player->CastSpell(player, SPELL_CHIKEN, false);
|
||||
break;
|
||||
case 6:
|
||||
player->CastSpell(player, SPELL_WOLPERTINGER, false);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
player->PlayerTalkClass->SendCloseGossip();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_stable_masterAI(creature);
|
||||
player->PlayerTalkClass->SendCloseGossip();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_stable_masterAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_npcs_special()
|
||||
|
||||
Reference in New Issue
Block a user