converted all tabs to 4 spaces

This commit is contained in:
Yehonal
2016-06-26 19:23:57 +02:00
parent 52f305111c
commit f6eefedcd5
717 changed files with 132388 additions and 132388 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -284,7 +284,7 @@ public:
if (!target)
{
targetGuid = sWorld->GetGlobalPlayerGUID(name);
targetGuid = sWorld->GetGlobalPlayerGUID(name);
if (!targetGuid)
{
handler->PSendSysMessage(LANG_BANINFO_NOCHARACTER);

View File

@@ -88,7 +88,7 @@ public:
SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spellId);
uint32 spellDifficultyId = sSpellMgr->GetSpellDifficultyId(spellId);
if (handler->GetSession()->GetSecurity() < SEC_CONSOLE && (bounds.first != bounds.second || spellDifficultyId || spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP) || spellInfo->HasEffect(SPELL_EFFECT_TRADE_SKILL)))
if (handler->GetSession()->GetSecurity() < SEC_CONSOLE && (bounds.first != bounds.second || spellDifficultyId || spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP) || spellInfo->HasEffect(SPELL_EFFECT_TRADE_SKILL)))
{
handler->PSendSysMessage("Spell %u cannot be casted using a command!", spellId);
handler->SetSentErrorMessage(true);

View File

@@ -102,8 +102,8 @@ public:
stmt->setUInt32(1, GUID_LOPART(playerGuid));
CharacterDatabase.Execute(stmt);
// xinef: update global storage
sWorld->UpdateGlobalPlayerData(GUID_LOPART(playerGuid), PLAYER_UPDATE_DATA_LEVEL, "", newLevel);
// xinef: update global storage
sWorld->UpdateGlobalPlayerData(GUID_LOPART(playerGuid), PLAYER_UPDATE_DATA_LEVEL, "", newLevel);
}
}
@@ -117,7 +117,7 @@ public:
return false;
LocaleConstant loc = handler->GetSessionDbcLocale();
char const* targetName = target->GetName().c_str();
char const* targetName = target->GetName().c_str();
char const* knownStr = handler->GetTrinityString(LANG_KNOWN);
// Search in CharTitles.dbc
@@ -512,35 +512,35 @@ public:
char* fileStr = strtok((char*)args, " ");
char* playerStr = strtok(NULL, " ");
if (!fileStr && !playerStr)
{
QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM characters");
if (!result)
return true;
do{
uint64 _guid = result->Fetch()[0].GetUInt64();
char buff[20];
sprintf(buff,"%u.dump", _guid);
switch(PlayerDumpWriter().WriteDump(buff, uint32(_guid)))
{
case DUMP_SUCCESS:
handler->PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS);
break;
case DUMP_FILE_OPEN_ERROR:
handler->PSendSysMessage(LANG_FILE_OPEN_FAIL, buff);
handler->SetSentErrorMessage(true);
return false;
case DUMP_CHARACTER_DELETED:
handler->PSendSysMessage(LANG_COMMAND_EXPORT_DELETED_CHAR);
handler->SetSentErrorMessage(true);
return false;
default:
handler->PSendSysMessage(LANG_COMMAND_EXPORT_FAILED);
handler->SetSentErrorMessage(true);
return false;
}
}while(result->NextRow());
}
if (!fileStr && !playerStr)
{
QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM characters");
if (!result)
return true;
do{
uint64 _guid = result->Fetch()[0].GetUInt64();
char buff[20];
sprintf(buff,"%u.dump", _guid);
switch(PlayerDumpWriter().WriteDump(buff, uint32(_guid)))
{
case DUMP_SUCCESS:
handler->PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS);
break;
case DUMP_FILE_OPEN_ERROR:
handler->PSendSysMessage(LANG_FILE_OPEN_FAIL, buff);
handler->SetSentErrorMessage(true);
return false;
case DUMP_CHARACTER_DELETED:
handler->PSendSysMessage(LANG_COMMAND_EXPORT_DELETED_CHAR);
handler->SetSentErrorMessage(true);
return false;
default:
handler->PSendSysMessage(LANG_COMMAND_EXPORT_FAILED);
handler->SetSentErrorMessage(true);
return false;
}
}while(result->NextRow());
}
if (!fileStr || !playerStr)
return false;

View File

@@ -91,13 +91,13 @@ public:
{ "areatriggers", SEC_ADMINISTRATOR, false, &HandleDebugAreaTriggersCommand, "", NULL },
{ "los", SEC_GAMEMASTER, false, &HandleDebugLoSCommand, "", NULL },
{ "moveflags", SEC_ADMINISTRATOR, false, &HandleDebugMoveflagsCommand, "", NULL },
{ "unitstate", SEC_ADMINISTRATOR, false, &HandleDebugUnitStateCommand, "", NULL },
{ "unitstate", SEC_ADMINISTRATOR, false, &HandleDebugUnitStateCommand, "", NULL },
{ NULL, SEC_PLAYER, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
{ "debug", SEC_GAMEMASTER, true, NULL, "", debugCommandTable },
{ "wpgps", SEC_ADMINISTRATOR, false, &HandleWPGPSCommand, "", NULL },
{ "wpgps", SEC_ADMINISTRATOR, false, &HandleWPGPSCommand, "", NULL },
{ NULL, SEC_PLAYER, false, NULL, "", NULL }
};
return commandTable;
@@ -839,7 +839,7 @@ public:
while (ref)
{
if (Unit* unit = ref->GetSource()->GetOwner())
handler->PSendSysMessage(" %u. %s %s (guid %u) - threat %f", ++count, (ref->isOnline() ? "" : "[offline]"), unit->GetName().c_str(), unit->GetGUIDLow(), ref->getThreat());
handler->PSendSysMessage(" %u. %s %s (guid %u) - threat %f", ++count, (ref->isOnline() ? "" : "[offline]"), unit->GetName().c_str(), unit->GetGUIDLow(), ref->getThreat());
else
handler->PSendSysMessage(" %u. No Owner - threat %f", ++count, ref->getThreat());
ref = ref->next();
@@ -1344,19 +1344,19 @@ public:
if (!*args)
{
handler->PSendSysMessage("Unit States: %u, React State: %u", target->GetUnitState(), target->ToCreature() ? target->ToCreature()->GetReactState() : 10);
handler->PSendSysMessage("Unit States: %u, React State: %u", target->GetUnitState(), target->ToCreature() ? target->ToCreature()->GetReactState() : 10);
}
else
{
uint32 unitState = atoi((char*)args);
target->ClearUnitState(target->GetUnitState());
target->AddUnitState(unitState);
target->ClearUnitState(target->GetUnitState());
target->AddUnitState(unitState);
}
return true;
}
static bool HandleWPGPSCommand(ChatHandler* handler, char const* /*args*/)
static bool HandleWPGPSCommand(ChatHandler* handler, char const* /*args*/)
{
Player* player = handler->GetSession()->GetPlayer();

View File

@@ -113,7 +113,7 @@ public:
data << uint32(0); // unknown
target->SendMessageToSet(&data, true);
handler->PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, handler->GetNameLink(target).c_str(), args);
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}
@@ -200,7 +200,7 @@ public:
if (!*args)
{
handler->PSendSysMessage(LANG_YOU_ARE, _player->isGMVisible() ? handler->GetTrinityString(LANG_VISIBLE) : handler->GetTrinityString(LANG_INVISIBLE));
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}
@@ -215,7 +215,7 @@ public:
_player->SetGMVisible(true);
//_player->UpdateObjectVisibility();
handler->GetSession()->SendNotification(LANG_INVISIBLE_VISIBLE);
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}
@@ -225,7 +225,7 @@ public:
_player->SetGMVisible(false);
//_player->UpdateObjectVisibility();
handler->GetSession()->SendNotification(LANG_INVISIBLE_INVISIBLE);
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}
@@ -242,7 +242,7 @@ public:
if (!*args)
{
handler->GetSession()->SendNotification(_player->IsGameMaster() ? LANG_GM_ON : LANG_GM_OFF);
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}
@@ -253,7 +253,7 @@ public:
_player->SetGameMaster(true);
handler->GetSession()->SendNotification(LANG_GM_ON);
_player->UpdateTriggerVisibility();
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}
@@ -262,7 +262,7 @@ public:
_player->SetGameMaster(false);
handler->GetSession()->SendNotification(LANG_GM_OFF);
_player->UpdateTriggerVisibility();
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}

View File

@@ -600,17 +600,17 @@ public:
uint32 displayId = 0;
std::string name;
uint32 lootId = 0;
GameObject* gameObject = NULL;
GameObject* gameObject = NULL;
if (!*args)
{
if (WorldObject* object = handler->getSelectedObject())
{
{
entry = object->GetEntry();
if (object->GetTypeId() == TYPEID_GAMEOBJECT)
gameObject = object->ToGameObject();
}
}
if (object->GetTypeId() == TYPEID_GAMEOBJECT)
gameObject = object->ToGameObject();
}
}
else
entry = atoi((char*)args);
@@ -631,15 +631,15 @@ public:
handler->PSendSysMessage(LANG_GOINFO_TYPE, type);
handler->PSendSysMessage(LANG_GOINFO_LOOTID, lootId);
handler->PSendSysMessage(LANG_GOINFO_DISPLAYID, displayId);
if (gameObject)
{
handler->PSendSysMessage("LootMode: %u", gameObject->GetLootMode());
handler->PSendSysMessage("LootState: %u", gameObject->getLootState());
handler->PSendSysMessage("GOState: %u", gameObject->GetGoState());
handler->PSendSysMessage("PhaseMask: %u", gameObject->GetPhaseMask());
handler->PSendSysMessage("IsLootEmpty: %u", gameObject->loot.empty());
handler->PSendSysMessage("IsLootLooted: %u", gameObject->loot.isLooted());
}
if (gameObject)
{
handler->PSendSysMessage("LootMode: %u", gameObject->GetLootMode());
handler->PSendSysMessage("LootState: %u", gameObject->getLootState());
handler->PSendSysMessage("GOState: %u", gameObject->GetGoState());
handler->PSendSysMessage("PhaseMask: %u", gameObject->GetPhaseMask());
handler->PSendSysMessage("IsLootEmpty: %u", gameObject->loot.empty());
handler->PSendSysMessage("IsLootLooted: %u", gameObject->loot.isLooted());
}
handler->PSendSysMessage(LANG_GOINFO_NAME, name.c_str());
@@ -659,20 +659,20 @@ public:
GameObject* object = NULL;
if (guidLow > 0)
{
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
}
else
object = handler->GetSession()->GetPlayer()->FindNearestGameObject(-guidLow, 30.0f);
if (guidLow > 0)
{
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
}
else
object = handler->GetSession()->GetPlayer()->FindNearestGameObject(-guidLow, 30.0f);
if (!object)
{
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, abs(guidLow));
handler->SetSentErrorMessage(true);
return false;
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, abs(guidLow));
handler->SetSentErrorMessage(true);
return false;
}
char* type = strtok(NULL, " ");
@@ -704,10 +704,10 @@ public:
data << (uint32)(objectState);
object->SendMessageToSet(&data, true);
}
else if (objectType == 5)
object->SetUInt32Value(GAMEOBJECT_FLAGS, (uint32)(objectState));
else if (objectType == 6)
object->SetGoArtKit((uint32)(objectState));
else if (objectType == 5)
object->SetUInt32Value(GAMEOBJECT_FLAGS, (uint32)(objectState));
else if (objectType == 6)
object->SetGoArtKit((uint32)(objectState));
handler->PSendSysMessage("Set gobject type %d state %d", objectType, objectState);
return true;

View File

@@ -90,7 +90,7 @@ public:
}
// check online security
if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0))
if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0))
return false;
handler->GetSession()->GetPlayer()->RewardHonor(target, 1);

View File

@@ -76,14 +76,14 @@ public:
uint32 counter = 0;
for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
{
BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(player->GetGUIDLow(), Difficulty(i));
BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(player->GetGUIDLow(), Difficulty(i));
for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
{
InstanceSave* save = itr->second.save;
uint32 resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
uint32 ttr = (resetTime >= time(NULL) ? resetTime - time(NULL) : 0);
uint32 resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
uint32 ttr = (resetTime >= time(NULL) ? resetTime - time(NULL) : 0);
std::string timeleft = GetTimeString(ttr);
handler->PSendSysMessage("map: %d, inst: %d, perm: %s, diff: %d, canReset: %s, TTR: %s%s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str(), (itr->second.extended ? " (extended)" : ""));
handler->PSendSysMessage("map: %d, inst: %d, perm: %s, diff: %d, canReset: %s, TTR: %s%s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str(), (itr->second.extended ? " (extended)" : ""));
counter++;
}
}
@@ -124,12 +124,12 @@ public:
InstanceSave* save = itr->second.save;
if (itr->first != player->GetMapId() && (!MapId || MapId == itr->first) && (diff == -1 || diff == save->GetDifficulty()))
{
uint32 resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
uint32 ttr = (resetTime >= time(NULL) ? resetTime - time(NULL) : 0);
uint32 resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
uint32 ttr = (resetTime >= time(NULL) ? resetTime - time(NULL) : 0);
std::string timeleft = GetTimeString(ttr);
handler->PSendSysMessage("unbinding map: %d, inst: %d, perm: %s, diff: %d, canReset: %s, TTR: %s%s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str(), (itr->second.extended ? " (extended)" : ""));
sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUIDLow(), itr->first, Difficulty(i), true, player);
itr = m_boundInstances.begin();
sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUIDLow(), itr->first, Difficulty(i), true, player);
itr = m_boundInstances.begin();
counter++;
}
else
@@ -143,14 +143,14 @@ public:
static bool HandleInstanceStatsCommand(ChatHandler* handler, char const* /*args*/)
{
uint32 dungeon = 0, battleground = 0, arena = 0, spectators = 0;
sMapMgr->GetNumInstances(dungeon, battleground, arena);
uint32 dungeon = 0, battleground = 0, arena = 0, spectators = 0;
sMapMgr->GetNumInstances(dungeon, battleground, arena);
handler->PSendSysMessage("instances loaded: dungeons (%d), battlegrounds (%d), arenas (%d)", dungeon, battleground, arena);
dungeon = 0; battleground = 0; arena = 0; spectators = 0;
sMapMgr->GetNumPlayersInInstances(dungeon, battleground, arena, spectators);
dungeon = 0; battleground = 0; arena = 0; spectators = 0;
sMapMgr->GetNumPlayersInInstances(dungeon, battleground, arena, spectators);
handler->PSendSysMessage("players in instances: dungeons (%d), battlegrounds (%d), arenas (%d + %d spect)", dungeon, battleground, arena, spectators);
handler->SetSentErrorMessage(true);
handler->SetSentErrorMessage(true);
return false;
}

View File

@@ -229,18 +229,18 @@ public:
// xinef: search highest talent rank
uint32 spellId = 0;
uint8 rankId = MAX_TALENT_RANK;
uint8 rankId = MAX_TALENT_RANK;
for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
{
if (talentInfo->RankID[rank] != 0)
{
rankId = rank;
rankId = rank;
spellId = talentInfo->RankID[rank];
break;
}
}
// xinef: some errors?
// xinef: some errors?
if (!spellId || rankId == MAX_TALENT_RANK)
continue;
@@ -248,7 +248,7 @@ public:
if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo))
continue;
player->LearnTalent(talentInfo->TalentID, rankId);
player->LearnTalent(talentInfo->TalentID, rankId);
}
handler->SendSysMessage(LANG_COMMAND_LEARN_CLASS_TALENTS);

View File

@@ -85,7 +85,7 @@ public:
handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, playerName.c_str());
return true;
}
/*
/*
uint64 guid = grp->GetGUID();
std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid));
handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(),
@@ -93,7 +93,7 @@ public:
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
GetPlayerInfo(handler, itr->GetSource());
*/
*/
return true;
}

View File

@@ -449,8 +449,8 @@ public:
GUID_LOPART(aura->GetCasterGUID()));
}
if (!args || std::string(args) != "all")
return true;
if (!args || std::string(args) != "all")
return true;
for (uint16 i = 0; i < TOTAL_AURAS; ++i)
{

View File

@@ -1263,8 +1263,8 @@ public:
uint32 count = 0;
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
const char* name_races[RACE_DRAENEI] = {"Human", "Orc", "Dwarf", "Night Elf", "Undead", "Tauren", "Gnome", "Troll", "", "Blood Elf", "Draenei"};
const char* name_classes[CLASS_DRUID] = {"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "", "Druid"};
const char* name_races[RACE_DRAENEI] = {"Human", "Orc", "Dwarf", "Night Elf", "Undead", "Tauren", "Gnome", "Troll", "", "Blood Elf", "Draenei"};
const char* name_classes[CLASS_DRUID] = {"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "", "Druid"};
do
{
@@ -1291,20 +1291,20 @@ public:
Field* characterFields = result2->Fetch();
uint32 guid = characterFields[0].GetUInt32();
std::string name = characterFields[1].GetString();
uint8 plevel = 0, prace = 0, pclass = 0;
bool online = (ObjectAccessor::FindPlayerInOrOutOfWorld(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)) != NULL);
uint8 plevel = 0, prace = 0, pclass = 0;
bool online = (ObjectAccessor::FindPlayerInOrOutOfWorld(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)) != NULL);
if (const GlobalPlayerData* gpd = sWorld->GetGlobalPlayerData(guid))
{
plevel = gpd->level;
prace = gpd->race;
pclass = gpd->playerClass;
}
if (const GlobalPlayerData* gpd = sWorld->GetGlobalPlayerData(guid))
{
plevel = gpd->level;
prace = gpd->race;
pclass = gpd->playerClass;
}
if (plevel > 0 && prace > 0 && prace <= RACE_DRAENEI && pclass > 0 && pclass <= CLASS_DRUID)
handler->PSendSysMessage(" %s (GUID %u) - %s - %s - %u%s", name.c_str(), guid, name_races[prace-1], name_classes[pclass-1], plevel, (online ? " - online" : ""));
else
handler->PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER, name.c_str(), guid);
if (plevel > 0 && prace > 0 && prace <= RACE_DRAENEI && pclass > 0 && pclass <= CLASS_DRUID)
handler->PSendSysMessage(" %s (GUID %u) - %s - %s - %u%s", name.c_str(), guid, name_races[prace-1], name_classes[pclass-1], plevel, (online ? " - online" : ""));
else
handler->PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER, name.c_str(), guid);
++counter;
}
while (result2->NextRow() && (limit == -1 || counter < limit));

View File

@@ -133,220 +133,220 @@ public:
return commandTable;
}
static bool HandleSkirmishCommand(ChatHandler* handler, char const* args)
{
Tokenizer tokens(args, ' ');
static bool HandleSkirmishCommand(ChatHandler* handler, char const* args)
{
Tokenizer tokens(args, ' ');
if (!*args || !tokens.size())
{
handler->PSendSysMessage("Usage: .skirmish [arena] [XvX] [Nick1] [Nick2] ... [NickN]");
handler->PSendSysMessage("[arena] can be \"all\" or comma-separated list of possible arenas (NA,BE,RL,DS,RV).");
handler->PSendSysMessage("[XvX] can be 1v1, 2v2, 3v3, 5v5. After [XvX] specify enough nicknames for that mode.");
handler->SetSentErrorMessage(true);
return false;
}
Tokenizer::const_iterator i = tokens.begin();
std::set<BattlegroundTypeId> allowedArenas;
std::string arenasStr = *(i++);
std::string tmpStr;
Tokenizer arenaTokens(arenasStr, ',');
for (Tokenizer::const_iterator itr = arenaTokens.begin(); itr != arenaTokens.end(); ++itr)
{
tmpStr = std::string(*itr);
if (tmpStr == "all")
{
if (arenaTokens.size() > 1)
{
handler->PSendSysMessage("Invalid [arena] specified.");
handler->SetSentErrorMessage(true);
return false;
}
allowedArenas.insert(BATTLEGROUND_NA);
allowedArenas.insert(BATTLEGROUND_BE);
allowedArenas.insert(BATTLEGROUND_RL);
allowedArenas.insert(BATTLEGROUND_DS);
allowedArenas.insert(BATTLEGROUND_RV);
}
else if (tmpStr == "NA")
allowedArenas.insert(BATTLEGROUND_NA);
else if (tmpStr == "BE")
allowedArenas.insert(BATTLEGROUND_BE);
else if (tmpStr == "RL")
allowedArenas.insert(BATTLEGROUND_RL);
else if (tmpStr == "DS")
allowedArenas.insert(BATTLEGROUND_DS);
else if (tmpStr == "RV")
allowedArenas.insert(BATTLEGROUND_RV);
else
{
handler->PSendSysMessage("Invalid [arena] specified.");
handler->SetSentErrorMessage(true);
return false;
}
}
ASSERT(!allowedArenas.empty());
BattlegroundTypeId randomizedArenaBgTypeId = Trinity::Containers::SelectRandomContainerElement(allowedArenas);
uint8 count = 0;
if (i != tokens.end())
{
std::string mode = *(i++);
if (mode == "1v1") count = 2;
else if (mode == "2v2") count = 4;
else if (mode == "3v3") count = 6;
else if (mode == "5v5") count = 10;
}
if (!count)
{
handler->PSendSysMessage("Invalid bracket. Can be 1v1, 2v2, 3v3, 5v5");
handler->SetSentErrorMessage(true);
return false;
}
if (tokens.size() != count+2)
{
handler->PSendSysMessage("Invalid number of nicknames for this bracket.");
handler->SetSentErrorMessage(true);
return false;
}
uint8 hcnt = count / 2;
uint8 error = 0;
std::string last_name;
Player* plr = NULL;
Player* players[10] = {NULL};
uint8 cnt = 0;
for (; i != tokens.end(); ++i)
if (!*args || !tokens.size())
{
last_name = std::string(*i);
plr = ObjectAccessor::FindPlayerByName(last_name, false);
if (!plr) { error = 1; break; }
if (!plr->IsInWorld() || !plr->FindMap() || plr->IsBeingTeleported()) { error = 2; break; }
if (plr->GetMap()->GetEntry()->Instanceable()) { error = 3; break; }
if (plr->isUsingLfg()) { error = 4; break; }
if (plr->InBattlegroundQueue()) { error = 5; break; }
if (plr->IsInFlight()) { error = 10; break; }
if (!plr->IsAlive()) { error = 11; break; }
const Group* g = plr->GetGroup();
if (hcnt > 1)
{
if (!g) { error = 6; break; }
if (g->isRaidGroup() || g->isBGGroup() || g->isBFGroup() || g->isLFGGroup()) { error = 7; break; }
if (g->GetMembersCount() != hcnt) { error = 8; break; }
uint8 sti = (cnt < hcnt ? 0 : hcnt);
if (sti != cnt)
if (players[sti]->GetGroup() != plr->GetGroup()) { error = 9; last_name += " and " + players[sti]->GetName(); break; }
}
else // 1v1
{
if (g) { error = 12; break; }
}
players[cnt++] = plr;
handler->PSendSysMessage("Usage: .skirmish [arena] [XvX] [Nick1] [Nick2] ... [NickN]");
handler->PSendSysMessage("[arena] can be \"all\" or comma-separated list of possible arenas (NA,BE,RL,DS,RV).");
handler->PSendSysMessage("[XvX] can be 1v1, 2v2, 3v3, 5v5. After [XvX] specify enough nicknames for that mode.");
handler->SetSentErrorMessage(true);
return false;
}
for (uint8 i=0; i<cnt && !error; ++i)
for (uint8 j=i+1; j<cnt; ++j)
if (players[i]->GetGUID() == players[j]->GetGUID())
{
last_name = players[i]->GetName();
error = 13;
break;
}
Tokenizer::const_iterator i = tokens.begin();
switch (error)
{
case 1:
handler->PSendSysMessage("Player %s not found.", last_name.c_str());
break;
case 2:
handler->PSendSysMessage("Player %s is being teleported.", last_name.c_str());
break;
case 3:
handler->PSendSysMessage("Player %s is in instance/battleground/arena.", last_name.c_str());
break;
case 4:
handler->PSendSysMessage("Player %s is in LFG system.", last_name.c_str());
break;
case 5:
handler->PSendSysMessage("Player %s is queued for battleground/arena.", last_name.c_str());
break;
case 6:
handler->PSendSysMessage("Player %s is not in group.", last_name.c_str());
break;
case 7:
handler->PSendSysMessage("Player %s is not in normal group.", last_name.c_str());
break;
case 8:
handler->PSendSysMessage("Group of player %s has invalid member count.", last_name.c_str());
break;
case 9:
handler->PSendSysMessage("Players %s are not in the same group.", last_name.c_str());
break;
case 10:
handler->PSendSysMessage("Player %s is in flight.", last_name.c_str());
break;
case 11:
handler->PSendSysMessage("Player %s is dead.", last_name.c_str());
break;
case 12:
handler->PSendSysMessage("Player %s is in a group.", last_name.c_str());
break;
case 13:
handler->PSendSysMessage("Player %s occurs more than once.", last_name.c_str());
break;
}
std::set<BattlegroundTypeId> allowedArenas;
std::string arenasStr = *(i++);
std::string tmpStr;
Tokenizer arenaTokens(arenasStr, ',');
for (Tokenizer::const_iterator itr = arenaTokens.begin(); itr != arenaTokens.end(); ++itr)
{
tmpStr = std::string(*itr);
if (tmpStr == "all")
{
if (arenaTokens.size() > 1)
{
handler->PSendSysMessage("Invalid [arena] specified.");
handler->SetSentErrorMessage(true);
return false;
}
allowedArenas.insert(BATTLEGROUND_NA);
allowedArenas.insert(BATTLEGROUND_BE);
allowedArenas.insert(BATTLEGROUND_RL);
allowedArenas.insert(BATTLEGROUND_DS);
allowedArenas.insert(BATTLEGROUND_RV);
}
else if (tmpStr == "NA")
allowedArenas.insert(BATTLEGROUND_NA);
else if (tmpStr == "BE")
allowedArenas.insert(BATTLEGROUND_BE);
else if (tmpStr == "RL")
allowedArenas.insert(BATTLEGROUND_RL);
else if (tmpStr == "DS")
allowedArenas.insert(BATTLEGROUND_DS);
else if (tmpStr == "RV")
allowedArenas.insert(BATTLEGROUND_RV);
else
{
handler->PSendSysMessage("Invalid [arena] specified.");
handler->SetSentErrorMessage(true);
return false;
}
}
ASSERT(!allowedArenas.empty());
BattlegroundTypeId randomizedArenaBgTypeId = Trinity::Containers::SelectRandomContainerElement(allowedArenas);
if (error)
{
handler->SetSentErrorMessage(true);
return false;
}
uint8 count = 0;
if (i != tokens.end())
{
std::string mode = *(i++);
if (mode == "1v1") count = 2;
else if (mode == "2v2") count = 4;
else if (mode == "3v3") count = 6;
else if (mode == "5v5") count = 10;
}
Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
if (!bgt)
{
handler->PSendSysMessage("Couldn't create arena map!");
handler->SetSentErrorMessage(true);
return false;
}
if (!count)
{
handler->PSendSysMessage("Invalid bracket. Can be 1v1, 2v2, 3v3, 5v5");
handler->SetSentErrorMessage(true);
return false;
}
Battleground* bg = sBattlegroundMgr->CreateNewBattleground(randomizedArenaBgTypeId, 80, 80, ArenaType(hcnt >= 2 ? hcnt : 2), false);
if (!bg)
{
handler->PSendSysMessage("Couldn't create arena map!");
handler->SetSentErrorMessage(true);
return false;
}
if (tokens.size() != count+2)
{
handler->PSendSysMessage("Invalid number of nicknames for this bracket.");
handler->SetSentErrorMessage(true);
return false;
}
bg->StartBattleground();
uint8 hcnt = count / 2;
uint8 error = 0;
std::string last_name;
Player* plr = NULL;
Player* players[10] = {NULL};
uint8 cnt = 0;
for (; i != tokens.end(); ++i)
{
last_name = std::string(*i);
plr = ObjectAccessor::FindPlayerByName(last_name, false);
if (!plr) { error = 1; break; }
if (!plr->IsInWorld() || !plr->FindMap() || plr->IsBeingTeleported()) { error = 2; break; }
if (plr->GetMap()->GetEntry()->Instanceable()) { error = 3; break; }
if (plr->isUsingLfg()) { error = 4; break; }
if (plr->InBattlegroundQueue()) { error = 5; break; }
if (plr->IsInFlight()) { error = 10; break; }
if (!plr->IsAlive()) { error = 11; break; }
const Group* g = plr->GetGroup();
if (hcnt > 1)
{
if (!g) { error = 6; break; }
if (g->isRaidGroup() || g->isBGGroup() || g->isBFGroup() || g->isLFGGroup()) { error = 7; break; }
if (g->GetMembersCount() != hcnt) { error = 8; break; }
BattlegroundTypeId bgTypeId = bg->GetBgTypeID();
uint8 sti = (cnt < hcnt ? 0 : hcnt);
if (sti != cnt)
if (players[sti]->GetGroup() != plr->GetGroup()) { error = 9; last_name += " and " + players[sti]->GetName(); break; }
}
else // 1v1
{
if (g) { error = 12; break; }
}
players[cnt++] = plr;
}
TeamId teamId1 = Player::TeamIdForRace(players[0]->getRace());
TeamId teamId2 = (teamId1 == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE);
for (uint8 i=0; i<cnt; ++i)
{
Player* player = players[i];
for (uint8 i=0; i<cnt && !error; ++i)
for (uint8 j=i+1; j<cnt; ++j)
if (players[i]->GetGUID() == players[j]->GetGUID())
{
last_name = players[i]->GetName();
error = 13;
break;
}
TeamId teamId = (i < hcnt ? teamId1 : teamId2);
player->SetEntryPoint();
switch (error)
{
case 1:
handler->PSendSysMessage("Player %s not found.", last_name.c_str());
break;
case 2:
handler->PSendSysMessage("Player %s is being teleported.", last_name.c_str());
break;
case 3:
handler->PSendSysMessage("Player %s is in instance/battleground/arena.", last_name.c_str());
break;
case 4:
handler->PSendSysMessage("Player %s is in LFG system.", last_name.c_str());
break;
case 5:
handler->PSendSysMessage("Player %s is queued for battleground/arena.", last_name.c_str());
break;
case 6:
handler->PSendSysMessage("Player %s is not in group.", last_name.c_str());
break;
case 7:
handler->PSendSysMessage("Player %s is not in normal group.", last_name.c_str());
break;
case 8:
handler->PSendSysMessage("Group of player %s has invalid member count.", last_name.c_str());
break;
case 9:
handler->PSendSysMessage("Players %s are not in the same group.", last_name.c_str());
break;
case 10:
handler->PSendSysMessage("Player %s is in flight.", last_name.c_str());
break;
case 11:
handler->PSendSysMessage("Player %s is dead.", last_name.c_str());
break;
case 12:
handler->PSendSysMessage("Player %s is in a group.", last_name.c_str());
break;
case 13:
handler->PSendSysMessage("Player %s occurs more than once.", last_name.c_str());
break;
}
uint32 queueSlot = 0;
WorldPacket data;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType(), teamId);
player->GetSession()->SendPacket(&data);
if (error)
{
handler->SetSentErrorMessage(true);
return false;
}
player->SetBattlegroundId(bg->GetInstanceID(), bgTypeId, queueSlot, true, false, teamId);
sBattlegroundMgr->SendToBattleground(player, bg->GetInstanceID(), bgTypeId);
}
Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
if (!bgt)
{
handler->PSendSysMessage("Couldn't create arena map!");
handler->SetSentErrorMessage(true);
return false;
}
handler->PSendSysMessage("Success! Players are now being teleported to the arena.");
return true;
}
Battleground* bg = sBattlegroundMgr->CreateNewBattleground(randomizedArenaBgTypeId, 80, 80, ArenaType(hcnt >= 2 ? hcnt : 2), false);
if (!bg)
{
handler->PSendSysMessage("Couldn't create arena map!");
handler->SetSentErrorMessage(true);
return false;
}
bg->StartBattleground();
BattlegroundTypeId bgTypeId = bg->GetBgTypeID();
TeamId teamId1 = Player::TeamIdForRace(players[0]->getRace());
TeamId teamId2 = (teamId1 == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE);
for (uint8 i=0; i<cnt; ++i)
{
Player* player = players[i];
TeamId teamId = (i < hcnt ? teamId1 : teamId2);
player->SetEntryPoint();
uint32 queueSlot = 0;
WorldPacket data;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType(), teamId);
player->GetSession()->SendPacket(&data);
player->SetBattlegroundId(bg->GetInstanceID(), bgTypeId, queueSlot, true, false, teamId);
sBattlegroundMgr->SendToBattleground(player, bg->GetInstanceID(), bgTypeId);
}
handler->PSendSysMessage("Success! Players are now being teleported to the arena.");
return true;
}
static bool HandleDevCommand(ChatHandler* handler, char const* args)
{
@@ -363,9 +363,9 @@ public:
if (argstr == "on")
{
handler->GetSession()->GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER);
handler->GetSession()->SendNotification(LANG_DEV_ON);
return true;
handler->GetSession()->GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER);
handler->GetSession()->SendNotification(LANG_DEV_ON);
return true;
}
if (argstr == "off")
@@ -380,7 +380,7 @@ public:
return false;
}
static bool HandleGPSCommand(ChatHandler* handler, char const* args)
static bool HandleGPSCommand(ChatHandler* handler, char const* args)
{
WorldObject* object = NULL;
if (*args)
@@ -460,8 +460,8 @@ public:
if (status)
handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status);
if (Transport* t = object->GetTransport())
handler->PSendSysMessage("Transport offset: %.2f, %.2f, %.2f, %.2f", object->m_movementInfo.transport.pos.GetPositionX(), object->m_movementInfo.transport.pos.GetPositionY(), object->m_movementInfo.transport.pos.GetPositionZ(), object->m_movementInfo.transport.pos.GetOrientation());
if (Transport* t = object->GetTransport())
handler->PSendSysMessage("Transport offset: %.2f, %.2f, %.2f, %.2f", object->m_movementInfo.transport.pos.GetPositionX(), object->m_movementInfo.transport.pos.GetPositionY(), object->m_movementInfo.transport.pos.GetPositionZ(), object->m_movementInfo.transport.pos.GetOrientation());
return true;
}
@@ -607,7 +607,7 @@ public:
InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(_player->GetGUIDLow(), target->GetMapId(), target->GetDifficulty(map->IsRaid()));
if (!bind)
if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(target->GetInstanceId()))
sInstanceSaveMgr->PlayerBindToInstance(_player->GetGUIDLow(), save, !save->CanReset(), _player);
sInstanceSaveMgr->PlayerBindToInstance(_player->GetGUIDLow(), save, !save->CanReset(), _player);
if (map->IsRaid())
_player->SetRaidDifficulty(target->GetRaidDifficulty());
@@ -703,9 +703,9 @@ public:
}
else if (map->IsDungeon())
{
// pussywizard: prevent unbinding normal player's perm bind by just summoning him >_>
if (!target->GetSession()->GetSecurity())
{
// pussywizard: prevent unbinding normal player's perm bind by just summoning him >_>
if (!target->GetSession()->GetSecurity())
{
handler->PSendSysMessage("Only GMs can be summoned to an instance!");
handler->SetSentErrorMessage(true);
return false;
@@ -888,11 +888,11 @@ public:
if (target->IsAlive())
{
if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE))
{
if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard
target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth());
{
if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard
target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth());
Unit::Kill(handler->GetSession()->GetPlayer(), target);
}
}
else
Unit::DealDamage(handler->GetSession()->GetPlayer(), target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false, true);
}
@@ -1341,11 +1341,11 @@ public:
std::string team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_NOTEAM);
if (data->teamId == TEAM_NEUTRAL)
if (data->teamId == TEAM_NEUTRAL)
team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY);
else if (data->teamId == TEAM_HORDE)
else if (data->teamId == TEAM_HORDE)
team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE);
else if (data->teamId == TEAM_ALLIANCE)
else if (data->teamId == TEAM_ALLIANCE)
team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ALLIANCE);
handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, graveyardId, team_name.c_str(), zone_id);
@@ -1543,11 +1543,11 @@ public:
return true;
}
if (handler->GetSession()->GetSecurity() < SEC_ADMINISTRATOR)
{
handler->PSendSysMessage("You may only remove items. Adding items is available for higher GMLevel.");
return false;
}
if (handler->GetSession()->GetSecurity() < SEC_ADMINISTRATOR)
{
handler->PSendSysMessage("You may only remove items. Adding items is available for higher GMLevel.");
return false;
}
// Adding items
uint32 noSpaceForCount = 0;
@@ -1801,21 +1801,21 @@ public:
uint32 areaId;
uint32 phase = 0;
// pussywizard: guild info
std::string guildName = "";
bool guildIsLeader = false;
uint64 guildMoney = 0;
uint32 guildMemberCount = 0;
if (const GlobalPlayerData* gpd = sWorld->GetGlobalPlayerData(targetGuid))
if (gpd->guildId)
if (Guild* targetGuild = sGuildMgr->GetGuildById(gpd->guildId))
{
guildName = targetGuild->GetName();
guildMoney = targetGuild->GetTotalBankMoney();
guildMemberCount = targetGuild->GetMemberCount();
if (targetGuild->GetLeaderGUID() == targetGuid)
guildIsLeader = true;
}
// pussywizard: guild info
std::string guildName = "";
bool guildIsLeader = false;
uint64 guildMoney = 0;
uint32 guildMemberCount = 0;
if (const GlobalPlayerData* gpd = sWorld->GetGlobalPlayerData(targetGuid))
if (gpd->guildId)
if (Guild* targetGuild = sGuildMgr->GetGuildById(gpd->guildId))
{
guildName = targetGuild->GetName();
guildMoney = targetGuild->GetTotalBankMoney();
guildMemberCount = targetGuild->GetMemberCount();
if (targetGuild->GetLeaderGUID() == targetGuid)
guildIsLeader = true;
}
// get additional information from Player object
if (target)
@@ -2038,13 +2038,13 @@ public:
else
handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str());
if (!guildName.empty())
{
uint32 gold = guildMoney /GOLD;
uint32 silv = (guildMoney % GOLD) / SILVER;
uint32 copp = (guildMoney % GOLD) % SILVER;
handler->PSendSysMessage("Guild: %s, members: %u, gb money: %ug %us %uc, is guild leader: %s", guildName.c_str(), guildMemberCount, gold, silv, copp, guildIsLeader ? "yes" : "no");
}
if (!guildName.empty())
{
uint32 gold = guildMoney /GOLD;
uint32 silv = (guildMoney % GOLD) / SILVER;
uint32 copp = (guildMoney % GOLD) % SILVER;
handler->PSendSysMessage("Guild: %s, members: %u, gb money: %ug %us %uc, is guild leader: %s", guildName.c_str(), guildMemberCount, gold, silv, copp, guildIsLeader ? "yes" : "no");
}
return true;
}
@@ -2362,8 +2362,8 @@ public:
uint32 damage = damage_int;
if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard
target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth());
if (target->GetTypeId() == TYPEID_UNIT && handler->GetSession()->GetSecurity() == SEC_CONSOLE) // pussywizard
target->ToCreature()->LowerPlayerDamageReq(target->GetMaxHealth());
Unit::DealDamage(handler->GetSession()->GetPlayer(), target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false, true);
if (target != handler->GetSession()->GetPlayer())
handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0);
@@ -2670,8 +2670,8 @@ public:
if (!handler->extractPlayerTarget((char*)args, &player))
return false;
if (!player)
return false;
if (!player)
return false;
char* msgStr = strtok(NULL, "");
if (!msgStr)
@@ -2908,18 +2908,18 @@ public:
{
handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
player->RemoveAurasDueToSpell(9454);
return true;
return true;
}
else if (targetName)
{
if (uint64 playerGUID = sWorld->GetGlobalPlayerGUID(name))
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN);
stmt->setUInt32(0, GUID_LOPART(playerGUID));
CharacterDatabase.Execute(stmt);
handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
return true;
}
if (uint64 playerGUID = sWorld->GetGlobalPlayerGUID(name))
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_FROZEN);
stmt->setUInt32(0, GUID_LOPART(playerGUID));
CharacterDatabase.Execute(stmt);
handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
return true;
}
}
handler->SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
@@ -3046,9 +3046,9 @@ public:
if (playerTarget)
groupTarget = playerTarget->GetGroup();
if (!groupTarget && guidTarget)
if (uint32 groupId = Player::GetGroupIdFromStorage(GUID_LOPART(guidTarget)))
groupTarget = sGroupMgr->GetGroupByGUID(groupId);
if (!groupTarget && guidTarget)
if (uint32 groupId = Player::GetGroupIdFromStorage(GUID_LOPART(guidTarget)))
groupTarget = sGroupMgr->GetGroupByGUID(groupId);
if (groupTarget)
{

View File

@@ -37,7 +37,7 @@ public:
ChatCommand* GetCommands() const
{
static ChatCommand modifyspeedCommandTable[] =
static ChatCommand modifyspeedCommandTable[] =
{
{ "fly", SEC_GAMEMASTER, false, &HandleModifyFlyCommand, "", NULL },
{ "all", SEC_GAMEMASTER, false, &HandleModifyASpeedCommand, "", NULL },
@@ -69,12 +69,12 @@ public:
{ "standstate", SEC_GAMEMASTER, false, &HandleModifyStandStateCommand, "", NULL },
{ "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL },
{ "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL },
{ "speed", SEC_GAMEMASTER, false, NULL, "", modifyspeedCommandTable },
{ "speed", SEC_GAMEMASTER, false, NULL, "", modifyspeedCommandTable },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
{ "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL },
{ "morph", SEC_GAMEMASTER, false, &HandleModifyMorphCommand, "", NULL },
{ "demorph", SEC_GAMEMASTER, false, &HandleDeMorphCommand, "", NULL },
{ "modify", SEC_GAMEMASTER, false, NULL, "", modifyCommandTable },
{ NULL, 0, false, NULL, "", NULL }
@@ -487,8 +487,8 @@ public:
}
Player* target = handler->getSelectedPlayerOrSelf();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -537,8 +537,8 @@ public:
}
Player* target = handler->getSelectedPlayerOrSelf();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -584,8 +584,8 @@ public:
}
Player* target = handler->getSelectedPlayerOrSelf();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -631,8 +631,8 @@ public:
}
Player* target = handler->getSelectedPlayerOrSelf();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -678,8 +678,8 @@ public:
}
Player* target = handler->getSelectedPlayerOrSelf();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (handler->GetSession()->GetSecurity() < SEC_GAMEMASTER)
target = handler->GetSession()->GetPlayer();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);

View File

@@ -175,24 +175,24 @@ public:
Map* map = chr->GetMap();
if (Transport* tt = chr->GetTransport())
if (MotionTransport* trans = tt->ToMotionTransport())
{
uint32 guid = sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT);
CreatureData& data = sObjectMgr->NewOrExistCreatureData(guid);
data.id = id;
data.phaseMask = chr->GetPhaseMaskForSpawn();
data.posX = chr->GetTransOffsetX();
data.posY = chr->GetTransOffsetY();
data.posZ = chr->GetTransOffsetZ();
data.orientation = chr->GetTransOffsetO();
if (MotionTransport* trans = tt->ToMotionTransport())
{
uint32 guid = sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT);
CreatureData& data = sObjectMgr->NewOrExistCreatureData(guid);
data.id = id;
data.phaseMask = chr->GetPhaseMaskForSpawn();
data.posX = chr->GetTransOffsetX();
data.posY = chr->GetTransOffsetY();
data.posZ = chr->GetTransOffsetZ();
data.orientation = chr->GetTransOffsetO();
Creature* creature = trans->CreateNPCPassenger(guid, &data);
Creature* creature = trans->CreateNPCPassenger(guid, &data);
creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn());
creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn());
sObjectMgr->AddCreatureToGrid(guid, &data);
return true;
}
sObjectMgr->AddCreatureToGrid(guid, &data);
return true;
}
Creature* creature = new Creature();
if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o))
@@ -260,7 +260,7 @@ public:
return false;
}
char* addMulti = strtok(NULL, " ");
char* addMulti = strtok(NULL, " ");
uint32 vendor_entry = addMulti ? handler->GetSession()->GetCurrentVendor() : vendor ? vendor->GetEntry() : 0;
if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, handler->GetSession()->GetPlayer()))
@@ -484,7 +484,7 @@ public:
}
uint32 itemId = atol(pitem);
char* addMulti = strtok(NULL, " ");
char* addMulti = strtok(NULL, " ");
if (!sObjectMgr->RemoveVendorItem(addMulti ? handler->GetSession()->GetCurrentVendor() : vendor->GetEntry(), itemId))
{
handler->PSendSysMessage(LANG_ITEM_NOT_IN_LIST, itemId);
@@ -574,7 +574,7 @@ public:
return true;
}
//set data of creature for testing scripting
//set data of creature for testing scripting
static bool HandleNpcSetDataCommand(ChatHandler* handler, const char* args)
{
if (!*args)
@@ -603,7 +603,7 @@ public:
creature->AI()->SetData(data_1, data_2);
std::string AIorScript = creature->GetAIName() != "" ? "AI type: " + creature->GetAIName() : (creature->GetScriptName() != "" ? "Script Name: " + creature->GetScriptName() : "No AI or Script Name Set");
handler->PSendSysMessage(LANG_NPC_SETDATA, creature->GetGUID(), creature->GetEntry(), creature->GetName().c_str(), data_1, data_2, AIorScript.c_str());
handler->PSendSysMessage(LANG_NPC_SETDATA, creature->GetGUID(), creature->GetEntry(), creature->GetName().c_str(), data_1, data_2, AIorScript.c_str());
return true;
}

View File

@@ -117,20 +117,20 @@ public:
uint32 updateTime = sWorld->GetUpdateTime();
uint32 avgUpdateTime = avgDiffTracker.getAverage();
handler->PSendSysMessage("%s Realm, revision: %s.", realmName.c_str(), _REVISION);
handler->PSendSysMessage("This server runs on SunwellCore.");
if (!queuedSessionCount)
handler->PSendSysMessage("Connected players: %u. Characters in world: %u.", activeSessionCount, playerCount);
else
handler->PSendSysMessage("Connected players: %u. Characters in world: %u. Queue: %u.", activeSessionCount, playerCount, queuedSessionCount);
//handler->PSendSysMessage("Connection peak: %u.", connPeak);
handler->PSendSysMessage("%s Realm, revision: %s.", realmName.c_str(), _REVISION);
handler->PSendSysMessage("This server runs on SunwellCore.");
if (!queuedSessionCount)
handler->PSendSysMessage("Connected players: %u. Characters in world: %u.", activeSessionCount, playerCount);
else
handler->PSendSysMessage("Connected players: %u. Characters in world: %u. Queue: %u.", activeSessionCount, playerCount, queuedSessionCount);
//handler->PSendSysMessage("Connection peak: %u.", connPeak);
handler->PSendSysMessage(LANG_UPTIME, uptime.c_str());
handler->PSendSysMessage("Update time diff: %ums, average: %ums.", updateTime, avgUpdateTime);
handler->PSendSysMessage("Update time diff: %ums, average: %ums.", updateTime, avgUpdateTime);
if (handler->GetSession())
if (Player* p = handler->GetSession()->GetPlayer())
if (p->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER))
handler->PSendSysMessage("DEV wavg: %ums, nsmax: %ums, nsavg: %ums. LFG avg: %ums, max: %ums.", avgDiffTracker.getTimeWeightedAverage(), devDiffTracker.getMax(), devDiffTracker.getAverage(), lfgDiffTracker.getAverage(), lfgDiffTracker.getMax());
if (handler->GetSession())
if (Player* p = handler->GetSession()->GetPlayer())
if (p->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER))
handler->PSendSysMessage("DEV wavg: %ums, nsmax: %ums, nsavg: %ums. LFG avg: %ums, max: %ums.", avgDiffTracker.getTimeWeightedAverage(), devDiffTracker.getMax(), devDiffTracker.getAverage(), lfgDiffTracker.getAverage(), lfgDiffTracker.getMax());
//! Can't use sWorld->ShutdownMsg here in case of console command
if (sWorld->IsShuttingDown())

View File

@@ -36,219 +36,219 @@ public:
return commandTable;
}
static bool HandleSpectatorCommand(ChatHandler* handler, char const* args)
static bool HandleSpectatorCommand(ChatHandler* handler, char const* args)
{
handler->PSendSysMessage("Incorrect syntax.");
handler->PSendSysMessage("Command has subcommands:");
handler->PSendSysMessage(" spectate");
handler->PSendSysMessage(" leave");
return true;
handler->PSendSysMessage("Incorrect syntax.");
handler->PSendSysMessage("Command has subcommands:");
handler->PSendSysMessage(" spectate");
handler->PSendSysMessage(" leave");
return true;
}
static bool HandleSpectatorVersionCommand(ChatHandler* handler, char const* args)
static bool HandleSpectatorVersionCommand(ChatHandler* handler, char const* args)
{
if (atoi(args) < SPECTATOR_ADDON_VERSION)
ArenaSpectator::SendCommand(handler->GetSession()->GetPlayer(), "%sOUTDATED", SPECTATOR_ADDON_PREFIX);
return true;
ArenaSpectator::SendCommand(handler->GetSession()->GetPlayer(), "%sOUTDATED", SPECTATOR_ADDON_PREFIX);
return true;
}
static bool HandleSpectatorResetCommand(ChatHandler* handler, char const* args)
static bool HandleSpectatorResetCommand(ChatHandler* handler, char const* args)
{
Player* p = handler->GetSession()->GetPlayer();
if (!p->IsSpectator())
return true;
ArenaSpectator::HandleResetCommand(p);
return true;
if (!p->IsSpectator())
return true;
ArenaSpectator::HandleResetCommand(p);
return true;
}
static bool HandleSpectatorLeaveCommand(ChatHandler* handler, char const* args)
static bool HandleSpectatorLeaveCommand(ChatHandler* handler, char const* args)
{
Player* player = handler->GetSession()->GetPlayer();
if (!player->IsSpectator() || !player->FindMap() || !player->FindMap()->IsBattleArena())
{
handler->SendSysMessage("You are not a spectator.");
return true;
}
Player* player = handler->GetSession()->GetPlayer();
if (!player->IsSpectator() || !player->FindMap() || !player->FindMap()->IsBattleArena())
{
handler->SendSysMessage("You are not a spectator.");
return true;
}
//player->SetIsSpectator(false);
player->TeleportToEntryPoint();
return true;
//player->SetIsSpectator(false);
player->TeleportToEntryPoint();
return true;
}
};
bool ArenaSpectator::HandleSpectatorSpectateCommand(ChatHandler* handler, char const* args)
{
Player* player = handler->GetSession()->GetPlayer();
std::list<std::string> errors;
if (!*args)
{
handler->SendSysMessage("Missing player name.");
return true;
}
if (player->IsSpectator())
{
if (player->FindMap() && player->FindMap()->IsBattleArena())
{
HandleSpectatorWatchCommand(handler, args);
return true;
}
handler->PSendSysMessage("You are already spectacting arena.");
return true;
}
if (player->getClass() == CLASS_DEATH_KNIGHT && player->GetMapId() == 609)
{
handler->PSendSysMessage("Death Knights can't spectate before finishing questline.");
return true;
}
Player* player = handler->GetSession()->GetPlayer();
std::list<std::string> errors;
if (!*args)
{
handler->SendSysMessage("Missing player name.");
return true;
}
if (player->IsSpectator())
{
if (player->FindMap() && player->FindMap()->IsBattleArena())
{
HandleSpectatorWatchCommand(handler, args);
return true;
}
handler->PSendSysMessage("You are already spectacting arena.");
return true;
}
if (player->getClass() == CLASS_DEATH_KNIGHT && player->GetMapId() == 609)
{
handler->PSendSysMessage("Death Knights can't spectate before finishing questline.");
return true;
}
std::string name = std::string(args);
Player* spectate = ObjectAccessor::FindPlayerByName(name);
if (!spectate)
{
handler->SendSysMessage("Requested player not found.");
return true;
}
if (spectate->IsSpectator())
{
handler->SendSysMessage("Requested player is a spectator.");
return true;
}
if (!spectate->FindMap() || !spectate->FindMap()->IsBattleArena())
{
handler->SendSysMessage("Requested player is not in arena.");
return true;
}
BattlegroundMap* bgmap = ((BattlegroundMap*)spectate->FindMap());
if (!bgmap->GetBG() || bgmap->GetBG()->GetStatus() == STATUS_WAIT_LEAVE)
{
handler->SendSysMessage("This arena battle has finished.");
return true;
}
std::string name = std::string(args);
Player* spectate = ObjectAccessor::FindPlayerByName(name);
if (!spectate)
{
handler->SendSysMessage("Requested player not found.");
return true;
}
if (spectate->IsSpectator())
{
handler->SendSysMessage("Requested player is a spectator.");
return true;
}
if (!spectate->FindMap() || !spectate->FindMap()->IsBattleArena())
{
handler->SendSysMessage("Requested player is not in arena.");
return true;
}
BattlegroundMap* bgmap = ((BattlegroundMap*)spectate->FindMap());
if (!bgmap->GetBG() || bgmap->GetBG()->GetStatus() == STATUS_WAIT_LEAVE)
{
handler->SendSysMessage("This arena battle has finished.");
return true;
}
if (player->IsBeingTeleported() || !player->IsInWorld())
errors.push_back("Can't use while being teleported.");
if (!player->FindMap() || player->FindMap()->Instanceable())
errors.push_back("Can't use while in instance, bg or arena.");
if (player->GetVehicle())
errors.push_back("Can't be on a vehicle.");
if (player->IsInCombat())
errors.push_back("Can't be in combat.");
if (player->isUsingLfg())
errors.push_back("Can't spectate while using LFG system.");
if (player->InBattlegroundQueue())
errors.push_back("Can't be queued for arena or bg.");
if (player->GetGroup())
errors.push_back("Can't be in a group.");
if (player->HasUnitState(UNIT_STATE_ISOLATED))
errors.push_back("Can't be isolated.");
if (player->m_mover != player)
errors.push_back("You must control yourself.");
if (player->IsInFlight())
errors.push_back("Can't be in flight.");
if (player->IsMounted())
errors.push_back("Dismount before spectating.");
if (!player->IsAlive())
errors.push_back("Must be alive.");
if (!player->m_Controlled.empty())
errors.push_back("Can't be controlling creatures.");
if (player->IsBeingTeleported() || !player->IsInWorld())
errors.push_back("Can't use while being teleported.");
if (!player->FindMap() || player->FindMap()->Instanceable())
errors.push_back("Can't use while in instance, bg or arena.");
if (player->GetVehicle())
errors.push_back("Can't be on a vehicle.");
if (player->IsInCombat())
errors.push_back("Can't be in combat.");
if (player->isUsingLfg())
errors.push_back("Can't spectate while using LFG system.");
if (player->InBattlegroundQueue())
errors.push_back("Can't be queued for arena or bg.");
if (player->GetGroup())
errors.push_back("Can't be in a group.");
if (player->HasUnitState(UNIT_STATE_ISOLATED))
errors.push_back("Can't be isolated.");
if (player->m_mover != player)
errors.push_back("You must control yourself.");
if (player->IsInFlight())
errors.push_back("Can't be in flight.");
if (player->IsMounted())
errors.push_back("Dismount before spectating.");
if (!player->IsAlive())
errors.push_back("Must be alive.");
if (!player->m_Controlled.empty())
errors.push_back("Can't be controlling creatures.");
const Unit::VisibleAuraMap* va = player->GetVisibleAuras();
for (Unit::VisibleAuraMap::const_iterator itr = va->begin(); itr != va->end(); ++itr)
if (Aura* aura = itr->second->GetBase())
if (!itr->second->IsPositive() && !aura->IsPermanent() && aura->GetDuration() < HOUR*IN_MILLISECONDS)
{
switch (aura->GetSpellInfo()->Id)
{
case lfg::LFG_SPELL_DUNGEON_DESERTER:
case lfg::LFG_SPELL_DUNGEON_COOLDOWN:
case 26013: // bg deserter
case 57724: // sated
case 57723: // exhaustion
case 25771: // forbearance
case 15007: // resurrection sickness
case 24755: // Tricked or Treated (z eventu)
continue;
}
const Unit::VisibleAuraMap* va = player->GetVisibleAuras();
for (Unit::VisibleAuraMap::const_iterator itr = va->begin(); itr != va->end(); ++itr)
if (Aura* aura = itr->second->GetBase())
if (!itr->second->IsPositive() && !aura->IsPermanent() && aura->GetDuration() < HOUR*IN_MILLISECONDS)
{
switch (aura->GetSpellInfo()->Id)
{
case lfg::LFG_SPELL_DUNGEON_DESERTER:
case lfg::LFG_SPELL_DUNGEON_COOLDOWN:
case 26013: // bg deserter
case 57724: // sated
case 57723: // exhaustion
case 25771: // forbearance
case 15007: // resurrection sickness
case 24755: // Tricked or Treated (z eventu)
continue;
}
errors.push_back("Can't have negative auras.");
break;
}
errors.push_back("Can't have negative auras.");
break;
}
if (uint32 inviteInstanceId = player->GetPendingSpectatorInviteInstanceId())
{
if (Battleground* tbg = sBattlegroundMgr->GetBattleground(inviteInstanceId))
tbg->RemoveToBeTeleported(player->GetGUID());
player->SetPendingSpectatorInviteInstanceId(0);
}
if (uint32 inviteInstanceId = player->GetPendingSpectatorInviteInstanceId())
{
if (Battleground* tbg = sBattlegroundMgr->GetBattleground(inviteInstanceId))
tbg->RemoveToBeTeleported(player->GetGUID());
player->SetPendingSpectatorInviteInstanceId(0);
}
bool bgPreparation = false;
if (!handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS ||
handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_WAIT_JOIN && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS)
{
bgPreparation = true;
handler->SendSysMessage("Arena is not in progress yet. You will be invited as soon as it starts.");
bgmap->GetBG()->AddToBeTeleported(player->GetGUID(), spectate->GetGUID());
player->SetPendingSpectatorInviteInstanceId(spectate->GetBattlegroundId());
}
bool bgPreparation = false;
if (!handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS ||
handler->GetSession()->GetSecurity() && bgmap->GetBG()->GetStatus() != STATUS_WAIT_JOIN && bgmap->GetBG()->GetStatus() != STATUS_IN_PROGRESS)
{
bgPreparation = true;
handler->SendSysMessage("Arena is not in progress yet. You will be invited as soon as it starts.");
bgmap->GetBG()->AddToBeTeleported(player->GetGUID(), spectate->GetGUID());
player->SetPendingSpectatorInviteInstanceId(spectate->GetBattlegroundId());
}
if (!errors.empty())
{
handler->PSendSysMessage("To spectate, please fix the following:");
for (std::list<std::string>::const_iterator itr = errors.begin(); itr != errors.end(); ++itr)
handler->PSendSysMessage(("- "+(*itr)).c_str());
if (!errors.empty())
{
handler->PSendSysMessage("To spectate, please fix the following:");
for (std::list<std::string>::const_iterator itr = errors.begin(); itr != errors.end(); ++itr)
handler->PSendSysMessage(("- "+(*itr)).c_str());
return true;
}
return true;
}
if (bgPreparation)
return true;
if (bgPreparation)
return true;
player->SetPendingSpectatorForBG(spectate->GetBattlegroundId());
player->SetBattlegroundId(spectate->GetBattlegroundId(), spectate->GetBattlegroundTypeId(), PLAYER_MAX_BATTLEGROUND_QUEUES, false, false, TEAM_NEUTRAL);
player->SetEntryPoint();
float z = spectate->GetMapId() == 618 ? std::max(28.27f, spectate->GetPositionZ()+0.25f) : spectate->GetPositionZ()+0.25f;
player->TeleportTo(spectate->GetMapId(), spectate->GetPositionX(), spectate->GetPositionY(), z, spectate->GetOrientation(), TELE_TO_GM_MODE);
return true;
player->SetPendingSpectatorForBG(spectate->GetBattlegroundId());
player->SetBattlegroundId(spectate->GetBattlegroundId(), spectate->GetBattlegroundTypeId(), PLAYER_MAX_BATTLEGROUND_QUEUES, false, false, TEAM_NEUTRAL);
player->SetEntryPoint();
float z = spectate->GetMapId() == 618 ? std::max(28.27f, spectate->GetPositionZ()+0.25f) : spectate->GetPositionZ()+0.25f;
player->TeleportTo(spectate->GetMapId(), spectate->GetPositionX(), spectate->GetPositionY(), z, spectate->GetOrientation(), TELE_TO_GM_MODE);
return true;
}
bool ArenaSpectator::HandleSpectatorWatchCommand(ChatHandler* handler, char const* args)
{
if (!*args)
if (!*args)
return true;
Player* player = handler->GetSession()->GetPlayer();
if (!player->IsSpectator())
return true;
Player* player = handler->GetSession()->GetPlayer();
if (!player->IsSpectator())
return true;
if (!player->FindMap() || !player->FindMap()->IsBattleArena())
return true;
if (!player->FindMap() || !player->FindMap()->IsBattleArena())
return true;
Battleground* bg = ((BattlegroundMap*)player->FindMap())->GetBG();
if (!bg || bg->GetStatus() != STATUS_IN_PROGRESS)
return true;
Battleground* bg = ((BattlegroundMap*)player->FindMap())->GetBG();
if (!bg || bg->GetStatus() != STATUS_IN_PROGRESS)
return true;
std::string name = std::string(args);
Player* spectate = ObjectAccessor::FindPlayerByName(name);
if (!spectate || !spectate->IsAlive() || spectate->IsSpectator() || spectate->GetGUID() == player->GetGUID() || !spectate->IsInWorld() || !spectate->FindMap() || spectate->IsBeingTeleported() || spectate->FindMap() != player->FindMap() || !bg->IsPlayerInBattleground(spectate->GetGUID()))
return true;
std::string name = std::string(args);
Player* spectate = ObjectAccessor::FindPlayerByName(name);
if (!spectate || !spectate->IsAlive() || spectate->IsSpectator() || spectate->GetGUID() == player->GetGUID() || !spectate->IsInWorld() || !spectate->FindMap() || spectate->IsBeingTeleported() || spectate->FindMap() != player->FindMap() || !bg->IsPlayerInBattleground(spectate->GetGUID()))
return true;
if (WorldObject* o = player->GetViewpoint())
if (Unit* u = o->ToUnit())
{
u->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, player->GetGUID());
player->RemoveAurasDueToSpell(SPECTATOR_SPELL_BINDSIGHT, player->GetGUID(), (1 << EFFECT_1));
if (WorldObject* o = player->GetViewpoint())
if (Unit* u = o->ToUnit())
{
u->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, player->GetGUID());
player->RemoveAurasDueToSpell(SPECTATOR_SPELL_BINDSIGHT, player->GetGUID(), (1 << EFFECT_1));
if (u->GetGUID() == spectate->GetGUID())
return true;
}
if (u->GetGUID() == spectate->GetGUID())
return true;
}
if (player->GetUInt64Value(PLAYER_FARSIGHT) || player->m_seer != player) // pussywizard: below this point we must not have a viewpoint!
return true;
if (player->GetUInt64Value(PLAYER_FARSIGHT) || player->m_seer != player) // pussywizard: below this point we must not have a viewpoint!
return true;
if (player->HaveAtClient(spectate))
player->CastSpell(spectate, SPECTATOR_SPELL_BINDSIGHT, true);
if (player->HaveAtClient(spectate))
player->CastSpell(spectate, SPECTATOR_SPELL_BINDSIGHT, true);
return true;
return true;
}
void AddSC_spectator_commandscript()

View File

@@ -133,7 +133,7 @@ public:
if (target)
target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation());
/* xinef: optimization, not needed function
else
else
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND);
stmt->setUInt32(0, target_guid);

View File

@@ -49,17 +49,17 @@ public:
enum eChallenge
{
QUEST_THE_CHALLENGE = 9015,
GO_BANNER_OF_PROVOCATION = 181058,
GO_ARENA_SPOILS = 181074,
QUEST_THE_CHALLENGE = 9015,
GO_BANNER_OF_PROVOCATION = 181058,
GO_ARENA_SPOILS = 181074,
NPC_GRIMSTONE = 10096,
NPC_THELDREN = 16059,
NPC_GRIMSTONE = 10096,
NPC_THELDREN = 16059,
};
uint32 theldrenTeam[] =
{
16053, 16055, 16050, 16051, 16049, 16052, 16054, 16058
16053, 16055, 16050, 16051, 16049, 16052, 16054, 16058
};
uint32 RingMob[]=
@@ -130,39 +130,39 @@ public:
{
instance = creature->GetInstanceScript();
MobSpawnId = rand()%6;
eventPhase = 0;
eventTimer = 1000;
theldrenEvent = false;
summons.DespawnAll();
eventPhase = 0;
eventTimer = 1000;
theldrenEvent = false;
summons.DespawnAll();
}
InstanceScript* instance;
SummonList summons;
SummonList summons;
uint8 eventPhase;
uint32 eventTimer;
uint8 MobSpawnId;
bool theldrenEvent;
bool theldrenEvent;
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Unit* target = SelectTargetFromPlayerList(100.0f))
summon->AI()->AttackStart(target);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Unit* target = SelectTargetFromPlayerList(100.0f))
summon->AI()->AttackStart(target);
}
void SummonedCreatureDies(Creature* summon, Unit*)
{
summons.Despawn(summon);
// All Summons killed, next phase
if (summons.empty())
eventTimer = 5000;
}
void SummonedCreatureDies(Creature* summon, Unit*)
{
summons.Despawn(summon);
// All Summons killed, next phase
if (summons.empty())
eventTimer = 5000;
}
void WaypointReached(uint32 waypointId)
{
@@ -204,19 +204,19 @@ public:
instance->HandleGameObject(instance->GetData64(id), open);
}
void SummonBoss()
{
if (me->FindNearestGameObject(GO_BANNER_OF_PROVOCATION, 100.0f))
{
theldrenEvent = true;
me->SummonCreature(NPC_THELDREN, 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0);
uint8 rand = urand(0, 4);
for (uint8 i = rand; i < rand+4; ++i)
me->SummonCreature(theldrenTeam[i], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0);
}
else
me->SummonCreature(RingBoss[rand()%6], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0);
}
void SummonBoss()
{
if (me->FindNearestGameObject(GO_BANNER_OF_PROVOCATION, 100.0f))
{
theldrenEvent = true;
me->SummonCreature(NPC_THELDREN, 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0);
uint8 rand = urand(0, 4);
for (uint8 i = rand; i < rand+4; ++i)
me->SummonCreature(theldrenTeam[i], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0);
}
else
me->SummonCreature(RingBoss[rand()%6], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0);
}
void UpdateEscortAI(uint32 diff)
{
@@ -229,77 +229,77 @@ public:
{
switch (eventPhase)
{
case 0:
Talk(SAY_TEXT5);
HandleGameObject(DATA_ARENA4, false);
Start(false, false);
eventTimer = 0;
break;
case 1:
SetEscortPaused(false);
eventTimer = 0;
break;
case 2:
eventTimer = 2000;
break;
case 3:
HandleGameObject(DATA_ARENA1, true);
eventTimer = 3000;
break;
case 4:
SetEscortPaused(false);
me->SetVisible(false);
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
eventTimer = 8000;
break;
case 5:
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
eventTimer = 8000;
break;
case 6:
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
eventTimer = 0;
break;
case 7:
me->SetVisible(true);
HandleGameObject(DATA_ARENA1, false);
Talk(SAY_TEXT6);
SetEscortPaused(false);
eventTimer = 0;
break;
case 8:
HandleGameObject(DATA_ARENA2, true);
eventTimer = 5000;
break;
case 9:
me->SetVisible(false);
SummonBoss();
eventTimer = 0;
break;
case 10:
if (theldrenEvent)
{
if (GameObject* go = me->SummonGameObject(GO_ARENA_SPOILS, 596.48f, -187.91f, -54.14f, 4.9f, 0.0f, 0.0f, 0.0f, 0.0f, 300))
go->SetOwnerGUID(0);
case 0:
Talk(SAY_TEXT5);
HandleGameObject(DATA_ARENA4, false);
Start(false, false);
eventTimer = 0;
break;
case 1:
SetEscortPaused(false);
eventTimer = 0;
break;
case 2:
eventTimer = 2000;
break;
case 3:
HandleGameObject(DATA_ARENA1, true);
eventTimer = 3000;
break;
case 4:
SetEscortPaused(false);
me->SetVisible(false);
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
eventTimer = 8000;
break;
case 5:
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
eventTimer = 8000;
break;
case 6:
me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0);
eventTimer = 0;
break;
case 7:
me->SetVisible(true);
HandleGameObject(DATA_ARENA1, false);
Talk(SAY_TEXT6);
SetEscortPaused(false);
eventTimer = 0;
break;
case 8:
HandleGameObject(DATA_ARENA2, true);
eventTimer = 5000;
break;
case 9:
me->SetVisible(false);
SummonBoss();
eventTimer = 0;
break;
case 10:
if (theldrenEvent)
{
if (GameObject* go = me->SummonGameObject(GO_ARENA_SPOILS, 596.48f, -187.91f, -54.14f, 4.9f, 0.0f, 0.0f, 0.0f, 0.0f, 300))
go->SetOwnerGUID(0);
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
itr->GetSource()->KilledMonsterCredit(16166, 0);
}
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
itr->GetSource()->KilledMonsterCredit(16166, 0);
}
HandleGameObject(DATA_ARENA2, false);
HandleGameObject(DATA_ARENA3, true);
HandleGameObject(DATA_ARENA4, true);
SetEscortPaused(false);
break;
HandleGameObject(DATA_ARENA2, false);
HandleGameObject(DATA_ARENA3, true);
HandleGameObject(DATA_ARENA4, true);
SetEscortPaused(false);
break;
}
++eventPhase;
}
else
eventTimer -= diff;
else
eventTimer -= diff;
}
}
}
};
};

View File

@@ -60,7 +60,7 @@ enum DataTypes
DATA_SF_BRAZIER_S = 26,
DATA_MOIRA = 27,
DATA_OPEN_COFFER_DOORS = 30,
DATA_OPEN_COFFER_DOORS = 30,
};
#endif

View File

@@ -38,7 +38,7 @@ enum Creatures
NPC_MAGMUS = 9938,
NPC_MOIRA = 8929,
NPC_WATCHMAN_DOOMGRIP = 9476,
NPC_WATCHMAN_DOOMGRIP = 9476,
};
enum GameObjects
@@ -116,7 +116,7 @@ public:
uint64 TombEventStarterGUID;
uint32 TombTimer;
uint32 TombEventCounter;
uint32 OpenedCoofers;
uint32 OpenedCoofers;
void Initialize()
{
@@ -154,7 +154,7 @@ public:
TombEventStarterGUID = 0;
TombTimer = TIMER_TOMBOFTHESEVEN;
TombEventCounter = 0;
OpenedCoofers = 0;
OpenedCoofers = 0;
for (uint8 i = 0; i < 7; ++i)
TombBossGUIDs[i] = 0;
@@ -262,15 +262,15 @@ public:
case DATA_GHOSTKILL:
GhostKillCount += data;
break;
case DATA_OPEN_COFFER_DOORS:
OpenedCoofers += 1;
if (OpenedCoofers == 12)
{
Position pos = {812.15f, -348.91f, -50.579f, 0.7f};
if (TempSummon* summon = instance->SummonCreature(NPC_WATCHMAN_DOOMGRIP, pos))
summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
}
break;
case DATA_OPEN_COFFER_DOORS:
OpenedCoofers += 1;
if (OpenedCoofers == 12)
{
Position pos = {812.15f, -348.91f, -50.579f, 0.7f};
if (TempSummon* summon = instance->SummonCreature(NPC_WATCHMAN_DOOMGRIP, pos))
summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
}
break;
}
if (data == DONE || GhostKillCount >= 7)

View File

@@ -115,8 +115,8 @@ enum GameObjectsIds
GO_DR_PORTCULLIS = 175185,
GO_PORTCULLIS_ACTIVE = 164726,
GO_PORTCULLIS_TOBOSSROOMS = 175186,
// Urok Doomhowl
GO_UROK_PILE = 175621,
// Urok Doomhowl
GO_UROK_PILE = 175621,
};
#endif

View File

@@ -24,7 +24,7 @@ enum Spells
SPELL_REND = 16509,
SPELL_STRIKE = 15580,
SPELL_INTIMIDATING_ROAR = 16508,
SPELL_UROK_SPAWN = 16473,
SPELL_UROK_SPAWN = 16473,
};
enum Says
@@ -54,11 +54,11 @@ public:
_Reset();
}
void InitializeAI()
{
me->CastSpell(me, SPELL_UROK_SPAWN, true);
BossAI::InitializeAI();
}
void InitializeAI()
{
me->CastSpell(me, SPELL_UROK_SPAWN, true);
BossAI::InitializeAI();
}
void EnterCombat(Unit* /*who*/)
{

View File

@@ -73,7 +73,7 @@ public:
go_blackrockaltar = 0;
go_portcullis_active = 0;
go_portcullis_tobossrooms = 0;
go_urok_pile = 0;
go_urok_pile = 0;
memset(go_roomrunes, 0, sizeof(go_roomrunes));
memset(go_emberseerrunes, 0, sizeof(go_emberseerrunes));
}
@@ -238,9 +238,9 @@ public:
if (GetBossState(DATA_GYTH) == DONE)
HandleGameObject(0, true, go);
break;
case GO_UROK_PILE:
go_urok_pile = go->GetGUID();
break;
case GO_UROK_PILE:
go_urok_pile = go->GetGUID();
break;
default:
break;
}
@@ -290,8 +290,8 @@ public:
case EVENT_UROK_DOOMHOWL:
if (GetBossState(DATA_UROK_DOOMHOWL) == NOT_STARTED)
{
if (GameObject* pile = instance->GetGameObject(go_urok_pile))
pile->SetLootState(GO_JUST_DEACTIVATED);
if (GameObject* pile = instance->GetGameObject(go_urok_pile))
pile->SetLootState(GO_JUST_DEACTIVATED);
}
break;
default:
@@ -577,7 +577,7 @@ public:
uint64 runecreaturelist[7][5];
uint64 go_portcullis_active;
uint64 go_portcullis_tobossrooms;
uint64 go_urok_pile;
uint64 go_urok_pile;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const

View File

@@ -174,19 +174,19 @@ public:
if (me->GetMapId() == 469)
{
// pussywizard:
bool reset = true;
if (instance)
if (Creature* nefarian = instance->instance->GetCreature(instance->GetData64(DATA_NEFARIAN)))
reset = false;
if (reset)
// pussywizard:
bool reset = true;
if (instance)
if (Creature* nefarian = instance->instance->GetCreature(instance->GetData64(DATA_NEFARIAN)))
reset = false;
if (reset)
_Reset();
// pussywizard:
if (!instance || instance->GetBossState(BOSS_NEFARIAN) == DONE || instance->GetBossState(BOSS_NEFARIAN) == IN_PROGRESS)
me->SetVisible(false);
else
me->SetVisible(true);
// pussywizard:
if (!instance || instance->GetBossState(BOSS_NEFARIAN) == DONE || instance->GetBossState(BOSS_NEFARIAN) == IN_PROGRESS)
me->SetVisible(false);
else
me->SetVisible(true);
me->SetPhaseMask(1, true);
me->SetUInt32Value(UNIT_NPC_FLAGS, 1);
@@ -196,7 +196,7 @@ public:
}
}
bool CanAIAttack(const Unit* target) const { return me->IsVisible(); }
bool CanAIAttack(const Unit* target) const { return me->IsVisible(); }
void JustReachedHome()
{
@@ -351,12 +351,12 @@ public:
{
if (Creature* nefarian = me->SummonCreature(NPC_NEFARIAN, NefarianLoc[0]))
{
nefarian->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
nefarian->SetCanFly(true);
nefarian->SetHover(false);
nefarian->setActive(true);
nefarian->SetHomePosition(NefarianLoc[1]);
nefarian->GetMotionMaster()->MoveCharge(NefarianLoc[1].GetPositionX(), NefarianLoc[1].GetPositionY(), NefarianLoc[1].GetPositionZ(), 15.0f);
nefarian->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
nefarian->SetCanFly(true);
nefarian->SetHover(false);
nefarian->setActive(true);
nefarian->SetHomePosition(NefarianLoc[1]);
nefarian->GetMotionMaster()->MoveCharge(NefarianLoc[1].GetPositionX(), NefarianLoc[1].GetPositionY(), NefarianLoc[1].GetPositionZ(), 15.0f);
nefarian->AI()->DoCastAOE(SPELL_SHADOWFLAME_INITIAL);
}
@@ -364,7 +364,7 @@ public:
events.CancelEvent(EVENT_FEAR);
events.CancelEvent(EVENT_SHADOW_BOLT);
me->SetVisible(false);
EnterEvadeMode();
EnterEvadeMode();
return;
}
}
@@ -379,10 +379,10 @@ public:
{
if (sender == GOSSIP_ID && action == GOSSIP_OPTION_ID)
{
// pussywizard:
InstanceScript* instance = player->GetInstanceScript();
if (!instance || instance->GetBossState(BOSS_NEFARIAN) == DONE)
return;
// pussywizard:
InstanceScript* instance = player->GetInstanceScript();
if (!instance || instance->GetBossState(BOSS_NEFARIAN) == DONE)
return;
player->CLOSE_GOSSIP_MENU();
Talk(SAY_GAMESBEGIN_1);
@@ -451,9 +451,9 @@ public:
if (type != POINT_MOTION_TYPE)
return;
me->SetCanFly(false);
me->SetDisableGravity(false);
me->SetWalk(false);
me->SetCanFly(false);
me->SetDisableGravity(false);
me->SetWalk(false);
me->SetInCombatWithZone();
if (me->GetVictim())
AttackStart(me->GetVictim());

View File

@@ -168,9 +168,9 @@ public:
bool SetBossState(uint32 type, EncounterState state)
{
// pussywizard:
if (GetBossState(type) == DONE && state != DONE) // prevent undoneing a boss xd
return false;
// pussywizard:
if (GetBossState(type) == DONE && state != DONE) // prevent undoneing a boss xd
return false;
if (!InstanceScript::SetBossState(type, state))
return false;

View File

@@ -105,7 +105,7 @@ class boss_majordomo : public CreatureScript
if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f))
{
me->GetMap()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry(), me);
me->GetMap()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry(), me);
me->setFaction(35);
EnterEvadeMode();
Talk(SAY_DEFEAT);

View File

@@ -115,11 +115,11 @@ class boss_ragnaros : public CreatureScript
Talk(SAY_KILL);
}
void AttackStart(Unit* target)
{
if (target && me->Attack(target, true))
DoStartNoMovement(target);
}
void AttackStart(Unit* target)
{
if (target && me->Attack(target, true))
DoStartNoMovement(target);
}
void UpdateAI(uint32 diff)
{
@@ -154,7 +154,7 @@ class boss_ragnaros : public CreatureScript
case EVENT_INTRO_4:
Talk(SAY_ARRIVAL5_RAG);
if (Creature* executus = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_MAJORDOMO_EXECUTUS)))
Unit::Kill(me, executus);
Unit::Kill(me, executus);
break;
case EVENT_INTRO_5:
me->SetReactState(REACT_AGGRESSIVE);

View File

@@ -11,135 +11,135 @@ enum Spels
SPELL_SMITE_SLAM = 6435,
EQUIP_SWORD = 1,
EQUIP_TWO_SWORDS = 2,
EQUIP_TWO_SWORDS = 2,
EQUIP_MACE = 3,
EVENT_CHECK_HEALTH1 = 1,
EVENT_CHECK_HEALTH2 = 2,
EVENT_SMITE_SLAM = 3,
EVENT_SWAP_WEAPON1 = 4,
EVENT_SWAP_WEAPON2 = 5,
EVENT_RESTORE_COMBAT = 6,
EVENT_KNEEL = 7,
EVENT_CHECK_HEALTH1 = 1,
EVENT_CHECK_HEALTH2 = 2,
EVENT_SMITE_SLAM = 3,
EVENT_SWAP_WEAPON1 = 4,
EVENT_SWAP_WEAPON2 = 5,
EVENT_RESTORE_COMBAT = 6,
EVENT_KNEEL = 7,
SAY_SWAP1 = 2,
SAY_SWAP2 = 3
SAY_SWAP1 = 2,
SAY_SWAP2 = 3
};
class boss_mr_smite : public CreatureScript
{
public:
boss_mr_smite() : CreatureScript("boss_mr_smite") { }
public:
boss_mr_smite() : CreatureScript("boss_mr_smite") { }
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_mr_smiteAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_mr_smiteAI>(creature);
}
struct boss_mr_smiteAI : public ScriptedAI
{
boss_mr_smiteAI(Creature* creature) : ScriptedAI(creature)
{
}
struct boss_mr_smiteAI : public ScriptedAI
{
boss_mr_smiteAI(Creature* creature) : ScriptedAI(creature)
{
}
EventMap events;
EventMap events;
void Reset()
{
me->LoadEquipment(EQUIP_SWORD);
me->SetCanDualWield(false);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_AGGRESSIVE);
}
void Reset()
{
me->LoadEquipment(EQUIP_SWORD);
me->SetCanDualWield(false);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_AGGRESSIVE);
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500);
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500);
events.ScheduleEvent(EVENT_SMITE_SLAM, 3000);
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500);
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500);
events.ScheduleEvent(EVENT_SMITE_SLAM, 3000);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SMITE_SLAM:
me->CastSpell(me->GetVictim(), SPELL_SMITE_SLAM, false);
events.ScheduleEvent(EVENT_SMITE_SLAM, 15000);
break;
case EVENT_CHECK_HEALTH1:
if (me->HealthBelowPct(67))
{
me->CastSpell(me, SPELL_SMITE_STOMP, false);
events.DelayEvents(10000);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(EQUIP_TWO_SWORDS, 1.859f, -780.72f, 9.831f);
Talk(SAY_SWAP1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500);
break;
case EVENT_CHECK_HEALTH2:
if (me->HealthBelowPct(34))
{
me->CastSpell(me, SPELL_SMITE_STOMP, false);
events.DelayEvents(10000);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(EQUIP_MACE, 1.859f, -780.72f, 9.831f);
Talk(SAY_SWAP2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500);
break;
case EVENT_SWAP_WEAPON1:
me->LoadEquipment(EQUIP_TWO_SWORDS);
me->SetCanDualWield(true);
break;
case EVENT_SWAP_WEAPON2:
me->LoadEquipment(EQUIP_MACE);
me->SetCanDualWield(false);
break;
case EVENT_RESTORE_COMBAT:
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetStandState(UNIT_STAND_STATE_STAND);
if (me->GetVictim())
{
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->SetTarget(me->GetVictim()->GetGUID());
}
break;
case EVENT_KNEEL:
me->SendMeleeAttackStop(me->GetVictim());
me->SetStandState(UNIT_STAND_STATE_KNEEL);
break;
}
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SMITE_SLAM:
me->CastSpell(me->GetVictim(), SPELL_SMITE_SLAM, false);
events.ScheduleEvent(EVENT_SMITE_SLAM, 15000);
break;
case EVENT_CHECK_HEALTH1:
if (me->HealthBelowPct(67))
{
me->CastSpell(me, SPELL_SMITE_STOMP, false);
events.DelayEvents(10000);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(EQUIP_TWO_SWORDS, 1.859f, -780.72f, 9.831f);
Talk(SAY_SWAP1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 500);
break;
case EVENT_CHECK_HEALTH2:
if (me->HealthBelowPct(34))
{
me->CastSpell(me, SPELL_SMITE_STOMP, false);
events.DelayEvents(10000);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(EQUIP_MACE, 1.859f, -780.72f, 9.831f);
Talk(SAY_SWAP2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 500);
break;
case EVENT_SWAP_WEAPON1:
me->LoadEquipment(EQUIP_TWO_SWORDS);
me->SetCanDualWield(true);
break;
case EVENT_SWAP_WEAPON2:
me->LoadEquipment(EQUIP_MACE);
me->SetCanDualWield(false);
break;
case EVENT_RESTORE_COMBAT:
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
me->SetStandState(UNIT_STAND_STATE_STAND);
if (me->GetVictim())
{
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->SetTarget(me->GetVictim()->GetGUID());
}
break;
case EVENT_KNEEL:
me->SendMeleeAttackStop(me->GetVictim());
me->SetStandState(UNIT_STAND_STATE_KNEEL);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void MovementInform(uint32 type, uint32 point)
{
if (type != POINT_MOTION_TYPE)
return;
void MovementInform(uint32 type, uint32 point)
{
if (type != POINT_MOTION_TYPE)
return;
me->SetTarget(0);
me->SetFacingTo(5.558f);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
events.ScheduleEvent(point == EQUIP_TWO_SWORDS ? EVENT_SWAP_WEAPON1 : EVENT_SWAP_WEAPON2, 1500);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 3000);
events.ScheduleEvent(EVENT_KNEEL, 0);
}
};
me->SetTarget(0);
me->SetFacingTo(5.558f);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
events.ScheduleEvent(point == EQUIP_TWO_SWORDS ? EVENT_SWAP_WEAPON1 : EVENT_SWAP_WEAPON2, 1500);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 3000);
events.ScheduleEvent(EVENT_KNEEL, 0);
}
};
};
void AddSC_boss_mr_smite()

View File

@@ -7,15 +7,15 @@ REWRITTEN BY XINEF
enum DataTypes
{
TYPE_RHAHK_ZOR = 0,
TYPE_CANNON = 1,
MAX_ENCOUNTERS = 2
TYPE_RHAHK_ZOR = 0,
TYPE_CANNON = 1,
MAX_ENCOUNTERS = 2
};
enum GameObjects
{
GO_FACTORY_DOOR = 13965,
GO_IRON_CLAD_DOOR = 16397
GO_FACTORY_DOOR = 13965,
GO_IRON_CLAD_DOOR = 16397
};
#endif

View File

@@ -13,72 +13,72 @@ class instance_deadmines : public InstanceMapScript
struct instance_deadmines_InstanceMapScript : public InstanceScript
{
instance_deadmines_InstanceMapScript(Map* map) : InstanceScript(map)
{
}
instance_deadmines_InstanceMapScript(Map* map) : InstanceScript(map)
{
}
void Initialize()
{
memset(&_encounters, 0, sizeof(_encounters));
}
void Initialize()
{
memset(&_encounters, 0, sizeof(_encounters));
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_FACTORY_DOOR:
if (_encounters[TYPE_RHAHK_ZOR] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_IRON_CLAD_DOOR:
if (_encounters[TYPE_CANNON] == DONE)
HandleGameObject(0, true, gameobject);
break;
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_FACTORY_DOOR:
if (_encounters[TYPE_RHAHK_ZOR] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_IRON_CLAD_DOOR:
if (_encounters[TYPE_CANNON] == DONE)
HandleGameObject(0, true, gameobject);
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_RHAHK_ZOR:
case TYPE_CANNON:
_encounters[type] = data;
break;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_RHAHK_ZOR:
case TYPE_CANNON:
_encounters[type] = data;
break;
}
if (data == DONE)
SaveToDB();
}
if (data == DONE)
SaveToDB();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "D E " << _encounters[0] << ' ' << _encounters[1];
return saveStream.str();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "D E " << _encounters[0] << ' ' << _encounters[1];
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
return;
void Load(const char* in)
{
if (!in)
return;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'D' && dataHead2 == 'E')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'D' && dataHead2 == 'E')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
private:
uint32 _encounters[MAX_ENCOUNTERS];
private:
uint32 _encounters[MAX_ENCOUNTERS];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const

View File

@@ -7,79 +7,79 @@ REWRITTEN BY XINEF
class instance_gnomeregan : public InstanceMapScript
{
public:
instance_gnomeregan() : InstanceMapScript("instance_gnomeregan", 90) { }
public:
instance_gnomeregan() : InstanceMapScript("instance_gnomeregan", 90) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_gnomeregan_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_gnomeregan_InstanceMapScript(map);
}
struct instance_gnomeregan_InstanceMapScript : public InstanceScript
{
instance_gnomeregan_InstanceMapScript(Map* map) : InstanceScript(map)
{
}
};
struct instance_gnomeregan_InstanceMapScript : public InstanceScript
{
instance_gnomeregan_InstanceMapScript(Map* map) : InstanceScript(map)
{
}
};
};
enum eKernobee
{
QUEST_A_FINE_MESS = 2904,
QUEST_A_FINE_MESS = 2904,
};
class npc_kernobee : public CreatureScript
{
public:
npc_kernobee() : CreatureScript("npc_kernobee") { }
public:
npc_kernobee() : CreatureScript("npc_kernobee") { }
CreatureAI* GetAI(Creature* creature) const
{
return new npc_kernobeeAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new npc_kernobeeAI(creature);
}
bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
{
if (quest->GetQuestId() == QUEST_A_FINE_MESS)
{
creature->SetStandState(UNIT_STAND_STATE_STAND);
creature->AI()->SetGUID(player->GetGUID(), 0);
creature->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, M_PI, MOTION_SLOT_CONTROLLED);
}
return true;
}
bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
{
if (quest->GetQuestId() == QUEST_A_FINE_MESS)
{
creature->SetStandState(UNIT_STAND_STATE_STAND);
creature->AI()->SetGUID(player->GetGUID(), 0);
creature->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, M_PI, MOTION_SLOT_CONTROLLED);
}
return true;
}
struct npc_kernobeeAI : public PassiveAI
{
npc_kernobeeAI(Creature* creature) : PassiveAI(creature)
{
playerGUID = 0;
checkTimer = 0;
}
struct npc_kernobeeAI : public PassiveAI
{
npc_kernobeeAI(Creature* creature) : PassiveAI(creature)
{
playerGUID = 0;
checkTimer = 0;
}
uint32 checkTimer;
uint64 playerGUID;
uint32 checkTimer;
uint64 playerGUID;
void SetGUID(uint64 guid, int32)
{
playerGUID = guid;
}
void SetGUID(uint64 guid, int32)
{
playerGUID = guid;
}
void UpdateAI(uint32 diff)
{
checkTimer += diff;
if (checkTimer >= 2000)
{
checkTimer = 0;
if (me->GetDistance(-332.2f, -2.8f, -152.8f) < 5.0f)
{
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
player->GroupEventHappens(QUEST_A_FINE_MESS, me);
me->DespawnOrUnsummon(1000);
}
}
}
};
void UpdateAI(uint32 diff)
{
checkTimer += diff;
if (checkTimer >= 2000)
{
checkTimer = 0;
if (me->GetDistance(-332.2f, -2.8f, -152.8f) < 5.0f)
{
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
player->GroupEventHappens(QUEST_A_FINE_MESS, me);
me->DespawnOrUnsummon(1000);
}
}
}
};
};
class spell_gnomeregan_radiation_bolt : public SpellScriptLoader
@@ -93,8 +93,8 @@ class spell_gnomeregan_radiation_bolt : public SpellScriptLoader
void HandleTriggerSpell(SpellEffIndex effIndex)
{
if (roll_chance_i(80))
PreventHitDefaultEffect(effIndex);
if (roll_chance_i(80))
PreventHitDefaultEffect(effIndex);
}
void Register()
@@ -112,6 +112,6 @@ class spell_gnomeregan_radiation_bolt : public SpellScriptLoader
void AddSC_instance_gnomeregan()
{
new instance_gnomeregan();
new npc_kernobee();
new spell_gnomeregan_radiation_bolt();
new npc_kernobee();
new spell_gnomeregan_radiation_bolt();
}

View File

@@ -20,139 +20,139 @@ enum Curator
SPELL_ARCANE_INFUSION = 30403,
SPELL_ASTRAL_DECONSTRUCTION = 30407,
SPELL_SUMMON_ASTRAL_FLARE1 = 30236,
SPELL_SUMMON_ASTRAL_FLARE2 = 30239,
SPELL_SUMMON_ASTRAL_FLARE3 = 30240,
SPELL_SUMMON_ASTRAL_FLARE4 = 30241,
SPELL_SUMMON_ASTRAL_FLARE1 = 30236,
SPELL_SUMMON_ASTRAL_FLARE2 = 30239,
SPELL_SUMMON_ASTRAL_FLARE3 = 30240,
SPELL_SUMMON_ASTRAL_FLARE4 = 30241,
EVENT_KILL_TALK = 1,
EVENT_SPELL_HATEFUL_BOLT = 2,
EVENT_SPELL_EVOCATION = 3,
EVENT_SPELL_ASTRAL_FLARE = 4,
EVENT_SPELL_BERSERK = 5,
EVENT_CHECK_HEALTH = 6
EVENT_KILL_TALK = 1,
EVENT_SPELL_HATEFUL_BOLT = 2,
EVENT_SPELL_EVOCATION = 3,
EVENT_SPELL_ASTRAL_FLARE = 4,
EVENT_SPELL_BERSERK = 5,
EVENT_CHECK_HEALTH = 6
};
class boss_curator : public CreatureScript
{
public:
boss_curator() : CreatureScript("boss_curator") { }
public:
boss_curator() : CreatureScript("boss_curator") { }
struct boss_curatorAI : public BossAI
{
boss_curatorAI(Creature* creature) : BossAI(creature, TYPE_CURATOR) { }
struct boss_curatorAI : public BossAI
{
boss_curatorAI(Creature* creature) : BossAI(creature, TYPE_CURATOR) { }
void Reset()
{
BossAI::Reset();
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_POWER_BURN, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_BURN, true);
}
void Reset()
{
BossAI::Reset();
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_PERIODIC_MANA_LEECH, true);
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_POWER_BURN, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_POWER_BURN, true);
}
void KilledUnit(Unit* victim)
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 5000);
}
}
void KilledUnit(Unit* victim)
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 5000);
}
}
void JustDied(Unit* killer)
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void JustDied(Unit* killer)
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
Talk(SAY_AGGRO);
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, 10000);
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
}
events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, 10000);
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 6000);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Unit* target = summon->SelectNearbyTarget(NULL, 40.0f))
{
summon->AI()->AttackStart(target);
summon->AddThreat(target, 1000.0f);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Unit* target = summon->SelectNearbyTarget(NULL, 40.0f))
{
summon->AI()->AttackStart(target);
summon->AddThreat(target, 1000.0f);
}
summon->SetInCombatWithZone();
}
summon->SetInCombatWithZone();
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH:
if (me->HealthBelowPct(16))
{
events.CancelEvent(EVENT_SPELL_ASTRAL_FLARE);
me->CastSpell(me, SPELL_ARCANE_INFUSION, true);
Talk(SAY_ENRAGE);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
break;
case EVENT_SPELL_BERSERK:
Talk(SAY_ENRAGE);
me->InterruptNonMeleeSpells(true);
me->CastSpell(me, SPELL_ASTRAL_DECONSTRUCTION, true);
break;
case EVENT_SPELL_HATEFUL_BOLT:
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1, 2), 40.0f))
me->CastSpell(target, SPELL_HATEFUL_BOLT, false);
events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, urand(5000, 7500) * (events.GetNextEventTime(EVENT_SPELL_BERSERK) == 0 ? 1 : 2));
break;
case EVENT_SPELL_ASTRAL_FLARE:
{
me->CastSpell(me, RAND(SPELL_SUMMON_ASTRAL_FLARE1, SPELL_SUMMON_ASTRAL_FLARE2, SPELL_SUMMON_ASTRAL_FLARE3, SPELL_SUMMON_ASTRAL_FLARE4), false);
int32 mana = CalculatePct(me->GetMaxPower(POWER_MANA), 10);
me->ModifyPower(POWER_MANA, -mana);
if (me->GetPowerPct(POWER_MANA) < 10.0f)
{
Talk(SAY_EVOCATE);
me->CastSpell(me, SPELL_EVOCATION, false);
switch (events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH:
if (me->HealthBelowPct(16))
{
events.CancelEvent(EVENT_SPELL_ASTRAL_FLARE);
me->CastSpell(me, SPELL_ARCANE_INFUSION, true);
Talk(SAY_ENRAGE);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
break;
case EVENT_SPELL_BERSERK:
Talk(SAY_ENRAGE);
me->InterruptNonMeleeSpells(true);
me->CastSpell(me, SPELL_ASTRAL_DECONSTRUCTION, true);
break;
case EVENT_SPELL_HATEFUL_BOLT:
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1, 2), 40.0f))
me->CastSpell(target, SPELL_HATEFUL_BOLT, false);
events.ScheduleEvent(EVENT_SPELL_HATEFUL_BOLT, urand(5000, 7500) * (events.GetNextEventTime(EVENT_SPELL_BERSERK) == 0 ? 1 : 2));
break;
case EVENT_SPELL_ASTRAL_FLARE:
{
me->CastSpell(me, RAND(SPELL_SUMMON_ASTRAL_FLARE1, SPELL_SUMMON_ASTRAL_FLARE2, SPELL_SUMMON_ASTRAL_FLARE3, SPELL_SUMMON_ASTRAL_FLARE4), false);
int32 mana = CalculatePct(me->GetMaxPower(POWER_MANA), 10);
me->ModifyPower(POWER_MANA, -mana);
if (me->GetPowerPct(POWER_MANA) < 10.0f)
{
Talk(SAY_EVOCATE);
me->CastSpell(me, SPELL_EVOCATION, false);
events.DelayEvents(20000);
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 20000);
}
else
{
if (roll_chance_i(50))
Talk(SAY_SUMMON);
events.DelayEvents(20000);
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 20000);
}
else
{
if (roll_chance_i(50))
Talk(SAY_SUMMON);
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 10000);
}
events.ScheduleEvent(EVENT_SPELL_ASTRAL_FLARE, 10000);
}
break;
}
}
break;
}
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_curatorAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_curatorAI>(creature);
}
};
void AddSC_boss_curator()

View File

@@ -8,103 +8,103 @@ REWRITTEN BY XINEF
enum MaidenOfVirtue
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_REPENTANCE = 2,
SAY_DEATH = 3,
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_REPENTANCE = 2,
SAY_DEATH = 3,
SPELL_REPENTANCE = 29511,
SPELL_HOLY_FIRE = 29522,
SPELL_HOLY_WRATH = 32445,
SPELL_HOLY_GROUND = 29523,
SPELL_BERSERK = 26662,
SPELL_REPENTANCE = 29511,
SPELL_HOLY_FIRE = 29522,
SPELL_HOLY_WRATH = 32445,
SPELL_HOLY_GROUND = 29523,
SPELL_BERSERK = 26662,
EVENT_SPELL_REPENTANCE = 1,
EVENT_SPELL_HOLY_FIRE = 2,
EVENT_SPELL_HOLY_WRATH = 3,
EVENT_SPELL_ENRAGE = 4,
EVENT_KILL_TALK = 5
EVENT_SPELL_REPENTANCE = 1,
EVENT_SPELL_HOLY_FIRE = 2,
EVENT_SPELL_HOLY_WRATH = 3,
EVENT_SPELL_ENRAGE = 4,
EVENT_KILL_TALK = 5
};
class boss_maiden_of_virtue : public CreatureScript
{
public:
boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { }
public:
boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { }
struct boss_maiden_of_virtueAI : public BossAI
{
boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { }
struct boss_maiden_of_virtueAI : public BossAI
{
boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { }
void Reset()
{
BossAI::Reset();
}
void Reset()
{
BossAI::Reset();
}
void KilledUnit(Unit* /*victim*/)
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_SLAY);
events.ScheduleEvent(EVENT_KILL_TALK, 5000);
}
}
void KilledUnit(Unit* /*victim*/)
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_SLAY);
events.ScheduleEvent(EVENT_KILL_TALK, 5000);
}
}
void JustDied(Unit* killer)
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void JustDied(Unit* killer)
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
Talk(SAY_AGGRO);
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
Talk(SAY_AGGRO);
me->CastSpell(me, SPELL_HOLY_GROUND, true);
events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25000);
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
}
me->CastSpell(me, SPELL_HOLY_GROUND, true);
events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25000);
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_REPENTANCE:
me->CastSpell(me, SPELL_REPENTANCE, true);
events.ScheduleEvent(EVENT_SPELL_REPENTANCE, urand(25000, 35000));
break;
case EVENT_SPELL_HOLY_FIRE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
me->CastSpell(target, SPELL_HOLY_FIRE, true);
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(8000, 18000));
break;
case EVENT_SPELL_HOLY_WRATH:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
me->CastSpell(target, SPELL_HOLY_WRATH, true);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, urand(20000, 25000));
break;
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_BERSERK, true);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_REPENTANCE:
me->CastSpell(me, SPELL_REPENTANCE, true);
events.ScheduleEvent(EVENT_SPELL_REPENTANCE, urand(25000, 35000));
break;
case EVENT_SPELL_HOLY_FIRE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
me->CastSpell(target, SPELL_HOLY_FIRE, true);
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(8000, 18000));
break;
case EVENT_SPELL_HOLY_WRATH:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
me->CastSpell(target, SPELL_HOLY_WRATH, true);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, urand(20000, 25000));
break;
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_BERSERK, true);
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_maiden_of_virtueAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_maiden_of_virtueAI>(creature);
}
};
void AddSC_boss_maiden_of_virtue()

View File

@@ -9,401 +9,401 @@ REWRITTEN BY XINEF
enum eSay
{
SAY_ATTUMEN1_APPEAR = 0,
SAY_ATTUMEN1_MOUNT = 2,
SAY_ATTUMEN1_APPEAR = 0,
SAY_ATTUMEN1_MOUNT = 2,
SAY_ATTUMEN2_DEATH = 0,
SAY_ATTUMEN2_DEATH = 0,
SAY_ATTUMEN_KILL = 1,
SAY_ATTUMEN_DISARM = 3,
SAY_ATTUMEN_RANDOM = 4,
SAY_ATTUMEN_MIDNIGHT_KILL = 5,
SAY_ATTUMEN_KILL = 1,
SAY_ATTUMEN_DISARM = 3,
SAY_ATTUMEN_RANDOM = 4,
SAY_ATTUMEN_MIDNIGHT_KILL = 5,
SAY_MIDNIGHT_EMOTE = 0
SAY_MIDNIGHT_EMOTE = 0
};
enum eSpells
{
// Midnight
SPELL_KNOCKDOWN = 29711,
SPELL_SUMMON_ATTUMEN = 29714,
SPELL_SUMMON_ATTUMEN_MOUNTED = 29799,
// Midnight
SPELL_KNOCKDOWN = 29711,
SPELL_SUMMON_ATTUMEN = 29714,
SPELL_SUMMON_ATTUMEN_MOUNTED = 29799,
// Attumen
SPELL_SHADOW_CLEAVE = 29832,
SPELL_INTANGIBLE_PRESENCE = 29833,
SPELL_SPAWN_SMOKE1 = 29802,
// Attumen
SPELL_SHADOW_CLEAVE = 29832,
SPELL_INTANGIBLE_PRESENCE = 29833,
SPELL_SPAWN_SMOKE1 = 29802,
// Attumen 2
SPELL_CHARGE_MIDNIGHT = 29847,
SPELL_SPAWN_SMOKE2 = 10389,
// Attumen 2
SPELL_CHARGE_MIDNIGHT = 29847,
SPELL_SPAWN_SMOKE2 = 10389,
// Generic
SPELL_MOUNT_TARGET_ATTUMEN = 29769,
SPELL_MOUNT_TARGET_MIDNIGHT = 29770
// Generic
SPELL_MOUNT_TARGET_ATTUMEN = 29769,
SPELL_MOUNT_TARGET_MIDNIGHT = 29770
};
enum eEvents
{
EVENT_CHECK_HEALTH_95 = 1,
EVENT_CHECK_HEALTH_25 = 2,
EVENT_SPELL_KNOCKDOWN = 3,
EVENT_SUMMON_ATTUMEN_MOUNTED = 4,
EVENT_CHECK_HEALTH_95 = 1,
EVENT_CHECK_HEALTH_25 = 2,
EVENT_SPELL_KNOCKDOWN = 3,
EVENT_SUMMON_ATTUMEN_MOUNTED = 4,
EVENT_SPELL_SHADOW_CLEAVE = 10,
EVENT_SPELL_INTANGIBLE_PRESENCE = 11,
EVENT_RANDOM_YELL = 12,
EVENT_SPELL_SHADOW_CLEAVE = 10,
EVENT_SPELL_INTANGIBLE_PRESENCE = 11,
EVENT_RANDOM_YELL = 12,
EVENT_SPELL_CHARGE = 20,
EVENT_SPELL_CHARGE = 20,
EVENT_KILL_TALK = 30
EVENT_KILL_TALK = 30
};
enum eMisc
{
POINT_MOVE_TO_MIDNIGHT = 1,
DATA_ATTUMEN_READY = 1
POINT_MOVE_TO_MIDNIGHT = 1,
DATA_ATTUMEN_READY = 1
};
class boss_midnight : public CreatureScript
{
public:
boss_midnight() : CreatureScript("boss_midnight") { }
public:
boss_midnight() : CreatureScript("boss_midnight") { }
struct boss_midnightAI : public BossAI
{
boss_midnightAI(Creature* creature) : BossAI(creature, TYPE_ATTUMEN) { }
struct boss_midnightAI : public BossAI
{
boss_midnightAI(Creature* creature) : BossAI(creature, TYPE_ATTUMEN) { }
void Reset()
{
BossAI::Reset();
me->SetVisible(true);
_healthPct = 100.0f;
}
void Reset()
{
BossAI::Reset();
me->SetVisible(true);
_healthPct = 100.0f;
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0);
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000);
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 0);
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000);
}
void KilledUnit(Unit* /*victim*/)
{
if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN))
attumen->AI()->Talk(SAY_ATTUMEN_MIDNIGHT_KILL);
}
void KilledUnit(Unit* /*victim*/)
{
if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN))
attumen->AI()->Talk(SAY_ATTUMEN_MIDNIGHT_KILL);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
summon->SetInCombatWithZone();
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
summon->SetInCombatWithZone();
if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED)
{
summon->SetHealth(summon->CountPctFromMaxHealth(_healthPct));
summon->CastSpell(summon, SPELL_SPAWN_SMOKE2, true);
}
else
summon->CastSpell(summon, SPELL_SPAWN_SMOKE1, true);
}
if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED)
{
summon->SetHealth(summon->CountPctFromMaxHealth(_healthPct));
summon->CastSpell(summon, SPELL_SPAWN_SMOKE2, true);
}
else
summon->CastSpell(summon, SPELL_SPAWN_SMOKE1, true);
}
void SetData(uint32 type, uint32 /*data*/)
{
if (type == DATA_ATTUMEN_READY)
events.ScheduleEvent(EVENT_SUMMON_ATTUMEN_MOUNTED, 0);
}
void SetData(uint32 type, uint32 /*data*/)
{
if (type == DATA_ATTUMEN_READY)
events.ScheduleEvent(EVENT_SUMMON_ATTUMEN_MOUNTED, 0);
}
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/)
{
if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED)
{
summons.clear();
Unit::Kill(me, me);
}
}
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/)
{
if (summon->GetEntry() == NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED)
{
summons.clear();
Unit::Kill(me, me);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH_95:
if (me->HealthBelowPct(96))
{
me->CastSpell(me, SPELL_SUMMON_ATTUMEN, true);
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 500);
break;
case EVENT_CHECK_HEALTH_25:
if (me->HealthBelowPct(25))
{
Talk(SAY_MIDNIGHT_EMOTE);
me->CastSpell(me, SPELL_MOUNT_TARGET_ATTUMEN, true);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
break;
case EVENT_SPELL_KNOCKDOWN:
me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false);
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000);
break;
case EVENT_SUMMON_ATTUMEN_MOUNTED:
if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN))
{
_healthPct = std::max<float>(me->GetHealthPct(), attumen->GetHealthPct());
attumen->DespawnOrUnsummon();
}
switch (events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH_95:
if (me->HealthBelowPct(96))
{
me->CastSpell(me, SPELL_SUMMON_ATTUMEN, true);
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH_95, 500);
break;
case EVENT_CHECK_HEALTH_25:
if (me->HealthBelowPct(25))
{
Talk(SAY_MIDNIGHT_EMOTE);
me->CastSpell(me, SPELL_MOUNT_TARGET_ATTUMEN, true);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
break;
case EVENT_SPELL_KNOCKDOWN:
me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false);
events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000);
break;
case EVENT_SUMMON_ATTUMEN_MOUNTED:
if (Creature* attumen = summons.GetCreatureWithEntry(NPC_ATTUMEN_THE_HUNTSMAN))
{
_healthPct = std::max<float>(me->GetHealthPct(), attumen->GetHealthPct());
attumen->DespawnOrUnsummon();
}
me->CastSpell(me, SPELL_SUMMON_ATTUMEN_MOUNTED, true);
me->SetVisible(false);
break;
}
me->CastSpell(me, SPELL_SUMMON_ATTUMEN_MOUNTED, true);
me->SetVisible(false);
break;
}
if (me->IsVisible())
DoMeleeAttackIfReady();
if (me->IsVisible())
DoMeleeAttackIfReady();
EnterEvadeIfOutOfCombatArea();
}
bool CheckEvadeIfOutOfCombatArea() const
{
return me->GetHomePosition().GetExactDist2d(me) > 50.0f || me->GetPositionZ() > 60.0f;
}
bool CheckEvadeIfOutOfCombatArea() const
{
return me->GetHomePosition().GetExactDist2d(me) > 50.0f || me->GetPositionZ() > 60.0f;
}
private:
float _healthPct;
};
private:
float _healthPct;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_midnightAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_midnightAI>(creature);
}
};
class boss_attumen : public CreatureScript
{
public:
boss_attumen() : CreatureScript("boss_attumen") { }
public:
boss_attumen() : CreatureScript("boss_attumen") { }
struct boss_attumenAI : public ScriptedAI
{
boss_attumenAI(Creature* creature) : ScriptedAI(creature)
{
}
struct boss_attumenAI : public ScriptedAI
{
boss_attumenAI(Creature* creature) : ScriptedAI(creature)
{
}
void Reset()
{
_events.Reset();
}
void Reset()
{
_events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_ATTUMEN1_APPEAR);
_events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0);
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000));
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_ATTUMEN1_APPEAR);
_events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 0);
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000));
}
void KilledUnit(Unit* /*victim*/)
{
if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_KILL);
}
}
void KilledUnit(Unit* /*victim*/)
{
if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_KILL);
}
}
void SpellHit(Unit* caster, const SpellInfo* spellInfo)
{
if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_DISARM);
}
else if (spellInfo->Id == SPELL_MOUNT_TARGET_ATTUMEN)
{
me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true);
}
}
void SpellHit(Unit* caster, const SpellInfo* spellInfo)
{
if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_DISARM);
}
else if (spellInfo->Id == SPELL_MOUNT_TARGET_ATTUMEN)
{
me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true);
}
}
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_MOUNT_TARGET_MIDNIGHT)
{
Talk(SAY_ATTUMEN1_MOUNT);
_events.Reset();
me->GetMotionMaster()->MovePoint(POINT_MOVE_TO_MIDNIGHT, target->GetPositionX() + 2.0f*cos(target->GetAngle(me)), target->GetPositionY() + 2.0f*sin(target->GetAngle(me)), target->GetPositionZ()+0.2f, true, true, MOTION_SLOT_CONTROLLED);
}
}
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_MOUNT_TARGET_MIDNIGHT)
{
Talk(SAY_ATTUMEN1_MOUNT);
_events.Reset();
me->GetMotionMaster()->MovePoint(POINT_MOVE_TO_MIDNIGHT, target->GetPositionX() + 2.0f*cos(target->GetAngle(me)), target->GetPositionY() + 2.0f*sin(target->GetAngle(me)), target->GetPositionZ()+0.2f, true, true, MOTION_SLOT_CONTROLLED);
}
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT)
{
if (TempSummon* summon = me->ToTempSummon())
if (Unit* midnight = summon->GetSummoner())
midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0);
}
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT)
{
if (TempSummon* summon = me->ToTempSummon())
if (Unit* midnight = summon->GetSummoner())
midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (_events.ExecuteEvent())
{
case EVENT_SPELL_SHADOW_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false);
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000));
break;
case EVENT_SPELL_INTANGIBLE_PRESENCE:
me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000);
break;
case EVENT_RANDOM_YELL:
Talk(SAY_ATTUMEN_RANDOM);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000));
break;
case EVENT_CHECK_HEALTH_25:
if (me->HealthBelowPct(25))
{
me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true);
break;
}
_events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
break;
}
switch (_events.ExecuteEvent())
{
case EVENT_SPELL_SHADOW_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false);
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000));
break;
case EVENT_SPELL_INTANGIBLE_PRESENCE:
me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000);
break;
case EVENT_RANDOM_YELL:
Talk(SAY_ATTUMEN_RANDOM);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000));
break;
case EVENT_CHECK_HEALTH_25:
if (me->HealthBelowPct(25))
{
me->CastSpell(me, SPELL_MOUNT_TARGET_MIDNIGHT, true);
break;
}
_events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
private:
EventMap _events;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_attumenAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_attumenAI>(creature);
}
};
class boss_attumen_midnight : public CreatureScript
{
public:
boss_attumen_midnight() : CreatureScript("boss_attumen_midnight") { }
public:
boss_attumen_midnight() : CreatureScript("boss_attumen_midnight") { }
struct boss_attumen_midnightAI : public ScriptedAI
{
boss_attumen_midnightAI(Creature* creature) : ScriptedAI(creature)
{
}
struct boss_attumen_midnightAI : public ScriptedAI
{
boss_attumen_midnightAI(Creature* creature) : ScriptedAI(creature)
{
}
void Reset()
{
_events.Reset();
}
void Reset()
{
_events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000));
_events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000);
_events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 11000);
}
void EnterCombat(Unit* /*who*/)
{
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, 6000);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 15000);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(25000, 45000));
_events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000);
_events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 11000);
}
void KilledUnit(Unit* /*victim*/)
{
if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_KILL);
}
}
void KilledUnit(Unit* /*victim*/)
{
if (_events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_KILL);
}
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_ATTUMEN2_DEATH);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_ATTUMEN2_DEATH);
}
void SpellHit(Unit* caster, const SpellInfo* spellInfo)
{
if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_DISARM);
}
}
void SpellHit(Unit* caster, const SpellInfo* spellInfo)
{
if (spellInfo->Mechanic == MECHANIC_DISARM && _events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
_events.ScheduleEvent(EVENT_KILL_TALK, 5000);
Talk(SAY_ATTUMEN_DISARM);
}
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT)
{
if (TempSummon* summon = me->ToTempSummon())
if (Unit* midnight = summon->GetSummoner())
midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0);
}
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == POINT_MOVE_TO_MIDNIGHT)
{
if (TempSummon* summon = me->ToTempSummon())
if (Unit* midnight = summon->GetSummoner())
midnight->GetAI()->SetData(DATA_ATTUMEN_READY, 0);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (_events.ExecuteEvent())
{
case EVENT_SPELL_SHADOW_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false);
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000));
break;
case EVENT_SPELL_INTANGIBLE_PRESENCE:
me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000);
break;
case EVENT_RANDOM_YELL:
Talk(SAY_ATTUMEN_RANDOM);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000));
break;
case EVENT_SPELL_CHARGE:
if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 24.0f, true))
me->CastSpell(target, SPELL_CHARGE_MIDNIGHT, false);
_events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000);
break;
case EVENT_SPELL_KNOCKDOWN:
me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false);
_events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000);
break;
}
switch (_events.ExecuteEvent())
{
case EVENT_SPELL_SHADOW_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_SHADOW_CLEAVE, false);
_events.ScheduleEvent(EVENT_SPELL_SHADOW_CLEAVE, urand(9000, 14000));
break;
case EVENT_SPELL_INTANGIBLE_PRESENCE:
me->CastSpell(me->GetVictim(), SPELL_INTANGIBLE_PRESENCE, false);
_events.ScheduleEvent(EVENT_SPELL_INTANGIBLE_PRESENCE, 30000);
break;
case EVENT_RANDOM_YELL:
Talk(SAY_ATTUMEN_RANDOM);
_events.ScheduleEvent(EVENT_RANDOM_YELL, urand(30000, 70000));
break;
case EVENT_SPELL_CHARGE:
if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 24.0f, true))
me->CastSpell(target, SPELL_CHARGE_MIDNIGHT, false);
_events.ScheduleEvent(EVENT_SPELL_CHARGE, 20000);
break;
case EVENT_SPELL_KNOCKDOWN:
me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, false);
_events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 20000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
private:
EventMap _events;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_attumen_midnightAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_attumen_midnightAI>(creature);
}
};
class spell_midnight_fixate : public SpellScriptLoader
@@ -418,15 +418,15 @@ class spell_midnight_fixate : public SpellScriptLoader
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (Unit* caster = GetCaster())
caster->TauntApply(target);
if (Unit* caster = GetCaster())
caster->TauntApply(target);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (Unit* caster = GetCaster())
caster->TauntFadeOut(target);
if (Unit* caster = GetCaster())
caster->TauntFadeOut(target);
}
void Register()
@@ -447,5 +447,5 @@ void AddSC_boss_attumen()
{
new boss_midnight();
new boss_attumen();
new boss_attumen_midnight();
new boss_attumen_midnight();
}

View File

@@ -8,42 +8,42 @@ REWRITTEN BY XINEF
enum Yells
{
SAY_AGGRO = 0,
SAY_SPECIAL = 1,
SAY_KILL = 2,
SAY_DEATH = 3,
SAY_OUT_OF_COMBAT = 4,
SAY_AGGRO = 0,
SAY_SPECIAL = 1,
SAY_KILL = 2,
SAY_DEATH = 3,
SAY_OUT_OF_COMBAT = 4,
SAY_GUEST = 0
SAY_GUEST = 0
};
enum Spells
{
SPELL_VANISH = 29448,
SPELL_GARROTE_DUMMY = 29433,
SPELL_GARROTE = 37066,
SPELL_GARROTE = 37066,
SPELL_BLIND = 34694,
SPELL_GOUGE = 29425,
SPELL_FRENZY = 37023,
SPELL_DUAL_WIELD = 29651,
SPELL_BERSERK = 26662,
SPELL_VANISH_TELEPORT = 29431,
SPELL_DUAL_WIELD = 29651,
SPELL_BERSERK = 26662,
SPELL_VANISH_TELEPORT = 29431,
};
enum Misc
{
EVENT_GUEST_TALK = 1,
EVENT_GUEST_TALK2 = 2,
EVENT_SPELL_VANISH = 3,
EVENT_SPELL_GARROTE = 4,
EVENT_SPELL_BLIND = 5,
EVENT_SPELL_GOUGE = 6,
EVENT_CHECK_HEALTH = 7,
EVENT_SPELL_ENRAGE = 8,
EVENT_KILL_TALK = 9,
EVENT_GUEST_TALK = 1,
EVENT_GUEST_TALK2 = 2,
EVENT_SPELL_VANISH = 3,
EVENT_SPELL_GARROTE = 4,
EVENT_SPELL_BLIND = 5,
EVENT_SPELL_GOUGE = 6,
EVENT_CHECK_HEALTH = 7,
EVENT_SPELL_ENRAGE = 8,
EVENT_KILL_TALK = 9,
ACTIVE_GUEST_COUNT = 4,
MAX_GUEST_COUNT = 6
ACTIVE_GUEST_COUNT = 4,
MAX_GUEST_COUNT = 6
};
const Position GuestsPosition[4] =
@@ -66,174 +66,174 @@ const uint32 GuestEntries[6]=
class boss_moroes : public CreatureScript
{
public:
boss_moroes() : CreatureScript("boss_moroes") { }
public:
boss_moroes() : CreatureScript("boss_moroes") { }
struct boss_moroesAI : public BossAI
{
boss_moroesAI(Creature* creature) : BossAI(creature, TYPE_MOROES)
{
_activeGuests = 0;
}
struct boss_moroesAI : public BossAI
{
boss_moroesAI(Creature* creature) : BossAI(creature, TYPE_MOROES)
{
_activeGuests = 0;
}
void InitializeAI()
{
BossAI::InitializeAI();
InitializeGuests();
}
void InitializeAI()
{
BossAI::InitializeAI();
InitializeGuests();
}
void JustReachedHome()
{
BossAI::JustReachedHome();
InitializeGuests();
}
void JustReachedHome()
{
BossAI::JustReachedHome();
InitializeGuests();
}
void InitializeGuests()
{
if (!me->IsAlive())
return;
void InitializeGuests()
{
if (!me->IsAlive())
return;
if (_activeGuests == 0)
{
_activeGuests |= 0x3F;
uint8 rand1 = RAND(0x01, 0x02, 0x04);
uint8 rand2 = RAND(0x08, 0x10, 0x20);
_activeGuests &= ~(rand1|rand2);
}
if (_activeGuests == 0)
{
_activeGuests |= 0x3F;
uint8 rand1 = RAND(0x01, 0x02, 0x04);
uint8 rand2 = RAND(0x08, 0x10, 0x20);
_activeGuests &= ~(rand1|rand2);
}
for (uint8 i = 0; i < MAX_GUEST_COUNT; ++i)
if ((1 << i) & _activeGuests)
me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN);
for (uint8 i = 0; i < MAX_GUEST_COUNT; ++i)
if ((1 << i) & _activeGuests)
me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN);
_events2.Reset();
_events2.ScheduleEvent(EVENT_GUEST_TALK, 10000);
}
_events2.Reset();
_events2.ScheduleEvent(EVENT_GUEST_TALK, 10000);
}
void Reset()
{
BossAI::Reset();
me->CastSpell(me, SPELL_DUAL_WIELD, true);
}
void Reset()
{
BossAI::Reset();
me->CastSpell(me, SPELL_DUAL_WIELD, true);
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
Talk(SAY_AGGRO);
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_VANISH, 30000);
events.ScheduleEvent(EVENT_SPELL_BLIND, 20000);
events.ScheduleEvent(EVENT_SPELL_GOUGE, 13000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 5000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
events.ScheduleEvent(EVENT_SPELL_VANISH, 30000);
events.ScheduleEvent(EVENT_SPELL_BLIND, 20000);
events.ScheduleEvent(EVENT_SPELL_GOUGE, 13000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 5000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
_events2.Reset();
me->CallForHelp(20.0f);
}
_events2.Reset();
me->CallForHelp(20.0f);
}
void KilledUnit(Unit* /*victim*/)
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 5000);
}
}
void KilledUnit(Unit* /*victim*/)
{
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 5000);
}
}
void JustDied(Unit* killer)
{
summons.clear();
BossAI::JustDied(killer);
Talk(SAY_DEATH);
void JustDied(Unit* killer)
{
summons.clear();
BossAI::JustDied(killer);
Talk(SAY_DEATH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE);
}
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
}
Creature* GetRandomGuest()
{
std::list<Creature*> guestList;
for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i)
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i))
guestList.push_back(summon);
Creature* GetRandomGuest()
{
std::list<Creature*> guestList;
for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i)
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i))
guestList.push_back(summon);
return Trinity::Containers::SelectRandomContainerElement(guestList);
}
return Trinity::Containers::SelectRandomContainerElement(guestList);
}
void UpdateAI(uint32 diff)
{
_events2.Update(diff);
switch (_events2.ExecuteEvent())
{
case EVENT_GUEST_TALK:
if (Creature* guest = GetRandomGuest())
guest->AI()->Talk(SAY_GUEST);
_events2.ScheduleEvent(EVENT_GUEST_TALK2, 5000);
break;
case EVENT_GUEST_TALK2:
Talk(SAY_OUT_OF_COMBAT);
_events2.ScheduleEvent(EVENT_GUEST_TALK, urand(60000, 120000));
break;
}
void UpdateAI(uint32 diff)
{
_events2.Update(diff);
switch (_events2.ExecuteEvent())
{
case EVENT_GUEST_TALK:
if (Creature* guest = GetRandomGuest())
guest->AI()->Talk(SAY_GUEST);
_events2.ScheduleEvent(EVENT_GUEST_TALK2, 5000);
break;
case EVENT_GUEST_TALK2:
Talk(SAY_OUT_OF_COMBAT);
_events2.ScheduleEvent(EVENT_GUEST_TALK, urand(60000, 120000));
break;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH:
if (me->HealthBelowPct(31))
{
me->CastSpell(me, SPELL_FRENZY, true);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
break;
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SPELL_BLIND:
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 10.0f, true))
me->CastSpell(target, SPELL_BLIND, false);
events.ScheduleEvent(EVENT_SPELL_BLIND, urand(25000, 40000));
break;
case EVENT_SPELL_GOUGE:
me->CastSpell(me->GetVictim(), SPELL_GOUGE, false);
events.ScheduleEvent(EVENT_SPELL_GOUGE, urand(25000, 40000));
return;
case EVENT_SPELL_VANISH:
events.DelayEvents(9000);
events.SetPhase(1);
me->CastSpell(me, SPELL_VANISH, false);
events.ScheduleEvent(EVENT_SPELL_VANISH, 30000);
events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000));
return;
case EVENT_SPELL_GARROTE:
me->CastSpell(me, SPELL_VANISH_TELEPORT, false);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH:
if (me->HealthBelowPct(31))
{
me->CastSpell(me, SPELL_FRENZY, true);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
break;
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SPELL_BLIND:
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 10.0f, true))
me->CastSpell(target, SPELL_BLIND, false);
events.ScheduleEvent(EVENT_SPELL_BLIND, urand(25000, 40000));
break;
case EVENT_SPELL_GOUGE:
me->CastSpell(me->GetVictim(), SPELL_GOUGE, false);
events.ScheduleEvent(EVENT_SPELL_GOUGE, urand(25000, 40000));
return;
case EVENT_SPELL_VANISH:
events.DelayEvents(9000);
events.SetPhase(1);
me->CastSpell(me, SPELL_VANISH, false);
events.ScheduleEvent(EVENT_SPELL_VANISH, 30000);
events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000));
return;
case EVENT_SPELL_GARROTE:
me->CastSpell(me, SPELL_VANISH_TELEPORT, false);
break;
}
// Xinef: not in vanish
if (events.GetPhaseMask() == 0)
DoMeleeAttackIfReady();
}
// Xinef: not in vanish
if (events.GetPhaseMask() == 0)
DoMeleeAttackIfReady();
}
private:
EventMap _events2;
uint8 _activeGuests;
};
private:
EventMap _events2;
uint8 _activeGuests;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_moroesAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_moroesAI>(creature);
}
};
class spell_moroes_vanish : public SpellScriptLoader
@@ -247,15 +247,15 @@ class spell_moroes_vanish : public SpellScriptLoader
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
{
Position pos;
target->GetFirstCollisionPosition(pos, 5.0f, M_PI);
GetCaster()->CastSpell(target, SPELL_GARROTE_DUMMY, true);
GetCaster()->RemoveAurasDueToSpell(SPELL_VANISH);
GetCaster()->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), target->GetOrientation());
}
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
{
Position pos;
target->GetFirstCollisionPosition(pos, 5.0f, M_PI);
GetCaster()->CastSpell(target, SPELL_GARROTE_DUMMY, true);
GetCaster()->RemoveAurasDueToSpell(SPELL_VANISH);
GetCaster()->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), target->GetOrientation());
}
}
@@ -274,5 +274,5 @@ class spell_moroes_vanish : public SpellScriptLoader
void AddSC_boss_moroes()
{
new boss_moroes();
new spell_moroes_vanish();
new spell_moroes_vanish();
}

View File

@@ -201,8 +201,8 @@ public:
return;
}
MovePhase = id+1;
return;
MovePhase = id+1;
return;
}
if (Flying)
@@ -216,10 +216,10 @@ public:
}
if (id < 8)
MovePhase = id+1;
else
MovePhase = id+1;
else
{
Phase = 1;
Phase = 1;
Flying = false;
Movement = true;
return;
@@ -255,25 +255,25 @@ public:
void UpdateAI(uint32 diff)
{
if (Intro)
{
if (MovePhase)
{
if (MovePhase >= 7)
{
me->SetDisableGravity(false);
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->GetMotionMaster()->MovePoint(8, IntroWay[7][0], IntroWay[7][1], IntroWay[7][2]);
}
else
{
me->GetMotionMaster()->MovePoint(MovePhase, IntroWay[MovePhase][0], IntroWay[MovePhase][1], IntroWay[MovePhase][2]);
}
MovePhase = 0;
}
return;
}
{
if (MovePhase)
{
if (MovePhase >= 7)
{
me->SetDisableGravity(false);
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->GetMotionMaster()->MovePoint(8, IntroWay[7][0], IntroWay[7][1], IntroWay[7][2]);
}
else
{
me->GetMotionMaster()->MovePoint(MovePhase, IntroWay[MovePhase][0], IntroWay[MovePhase][1], IntroWay[MovePhase][2]);
}
MovePhase = 0;
}
return;
}
if (Flying && MovePhase)
if (Flying && MovePhase)
{
if (MovePhase >= 7)
{
@@ -284,7 +284,7 @@ public:
else
me->GetMotionMaster()->MovePoint(MovePhase, IntroWay[MovePhase][0], IntroWay[MovePhase][1], IntroWay[MovePhase][2]);
MovePhase = 0;
MovePhase = 0;
}
if (!UpdateVictim())
@@ -417,18 +417,18 @@ public:
bool OnGossipHello(Player* pPlayer, GameObject *pGo)
{
if (InstanceScript* pInstance = pGo->GetInstanceScript())
{
if (pInstance->GetData(TYPE_NIGHTBANE) != DONE && !pGo->FindNearestCreature(17225, 40.0f))
if (Creature *cr = ObjectAccessor::GetCreature(*pPlayer, pInstance->GetData64(DATA_NIGHTBANE)))
cr->GetMotionMaster()->MovePoint(0, IntroWay[0][0], IntroWay[0][1], IntroWay[0][2]);
}
return false;
if (InstanceScript* pInstance = pGo->GetInstanceScript())
{
if (pInstance->GetData(TYPE_NIGHTBANE) != DONE && !pGo->FindNearestCreature(17225, 40.0f))
if (Creature *cr = ObjectAccessor::GetCreature(*pPlayer, pInstance->GetData64(DATA_NIGHTBANE)))
cr->GetMotionMaster()->MovePoint(0, IntroWay[0][0], IntroWay[0][1], IntroWay[0][2]);
}
return false;
}
};
void AddSC_boss_nightbane()
{
new boss_nightbane();
new go_blackened_urn();
new go_blackened_urn();
}

View File

@@ -8,155 +8,155 @@ REWRITTEN BY XINEF
enum ServantQuartersSpells
{
SPELL_SNEAK = 22766,
SPELL_ACIDIC_FANG = 29901,
SPELL_HYAKISS_WEB = 29896,
SPELL_SNEAK = 22766,
SPELL_ACIDIC_FANG = 29901,
SPELL_HYAKISS_WEB = 29896,
SPELL_DIVE = 29903,
SPELL_SONIC_BURST = 29904,
SPELL_WING_BUFFET = 29905,
SPELL_FEAR = 29321,
SPELL_DIVE = 29903,
SPELL_SONIC_BURST = 29904,
SPELL_WING_BUFFET = 29905,
SPELL_FEAR = 29321,
SPELL_RAVAGE = 29906
SPELL_RAVAGE = 29906
};
enum ServantQuertersMisc
{
EVENT_SPELL_ACIDIC_FANG = 1,
EVENT_SPELL_HYAKISS_WEB = 2,
EVENT_SPELL_ACIDIC_FANG = 1,
EVENT_SPELL_HYAKISS_WEB = 2,
EVENT_SPELL_DIVE = 10,
EVENT_SPELL_SONIC_BURST = 11,
EVENT_SPELL_WING_BUFFET = 12,
EVENT_SPELL_FEAR = 13,
EVENT_SPELL_DIVE = 10,
EVENT_SPELL_SONIC_BURST = 11,
EVENT_SPELL_WING_BUFFET = 12,
EVENT_SPELL_FEAR = 13,
EVENT_SPELL_RAVAGE = 20,
EVENT_SPELL_RAVAGE = 20,
EVENT_CHECK_VISIBILITY = 30
EVENT_CHECK_VISIBILITY = 30
};
class boss_servant_quarters : public CreatureScript
{
public:
boss_servant_quarters() : CreatureScript("boss_servant_quarters") { }
public:
boss_servant_quarters() : CreatureScript("boss_servant_quarters") { }
struct boss_servant_quartersAI : public BossAI
{
boss_servant_quartersAI(Creature* creature) : BossAI(creature, TYPE_SERVANT_QUARTERS) { }
struct boss_servant_quartersAI : public BossAI
{
boss_servant_quartersAI(Creature* creature) : BossAI(creature, TYPE_SERVANT_QUARTERS) { }
void Reset()
{
events.Reset();
me->SetVisible(false);
me->SetReactState(REACT_PASSIVE);
me->setFaction(35);
_events2.Reset();
_events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000);
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
me->CastSpell(me, SPELL_SNEAK, true);
void Reset()
{
events.Reset();
me->SetVisible(false);
me->SetReactState(REACT_PASSIVE);
me->setFaction(35);
_events2.Reset();
_events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000);
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
me->CastSpell(me, SPELL_SNEAK, true);
if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry())
me->DespawnOrUnsummon(1);
}
if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry())
me->DespawnOrUnsummon(1);
}
void EnterCombat(Unit* who)
{
me->setActive(true);
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
{
events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5000);
events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9000);
}
else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER)
{
events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4000);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7000);
events.ScheduleEvent(EVENT_SPELL_DIVE, 10000);
}
else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER)
{
events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3000);
}
}
void EnterCombat(Unit* who)
{
me->setActive(true);
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
{
events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5000);
events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9000);
}
else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER)
{
events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4000);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7000);
events.ScheduleEvent(EVENT_SPELL_DIVE, 10000);
}
else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER)
{
events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3000);
}
}
void JustDied(Unit* /*who*/)
{
}
void JustDied(Unit* /*who*/)
{
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == EVENT_CHARGE)
events.ScheduleEvent(EVENT_SPELL_FEAR, 0);
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == EVENT_CHARGE)
events.ScheduleEvent(EVENT_SPELL_FEAR, 0);
}
void UpdateAI(uint32 diff)
{
_events2.Update(diff);
switch (_events2.ExecuteEvent())
{
case EVENT_CHECK_VISIBILITY:
if (instance->GetBossState(TYPE_SERVANT_QUARTERS) == DONE)
{
me->SetVisible(true);
me->SetReactState(REACT_AGGRESSIVE);
me->RestoreFaction();
}
else
_events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000);
break;
}
void UpdateAI(uint32 diff)
{
_events2.Update(diff);
switch (_events2.ExecuteEvent())
{
case EVENT_CHECK_VISIBILITY:
if (instance->GetBossState(TYPE_SERVANT_QUARTERS) == DONE)
{
me->SetVisible(true);
me->SetReactState(REACT_AGGRESSIVE);
me->RestoreFaction();
}
else
_events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000);
break;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ACIDIC_FANG:
me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false);
events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, urand(12000, 18000));
break;
case EVENT_SPELL_HYAKISS_WEB:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f))
me->CastSpell(target, SPELL_HYAKISS_WEB, false);
events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 15000);
break;
case EVENT_SPELL_SONIC_BURST:
me->CastSpell(me, SPELL_SONIC_BURST, false);
events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, urand(12000, 18000));
break;
case EVENT_SPELL_WING_BUFFET:
me->CastSpell(me, SPELL_WING_BUFFET, false);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, urand(12000, 18000));
break;
case EVENT_SPELL_DIVE:
if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, FarthestTargetSelector(me, 40.0f, false, true)))
me->CastSpell(target, SPELL_DIVE, false);
events.ScheduleEvent(EVENT_SPELL_DIVE, 20000);
break;
case EVENT_SPELL_FEAR:
me->CastSpell(me->GetVictim(), SPELL_FEAR, false);
break;
case EVENT_SPELL_RAVAGE:
me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false);
events.ScheduleEvent(EVENT_SPELL_RAVAGE, 10500);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ACIDIC_FANG:
me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false);
events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, urand(12000, 18000));
break;
case EVENT_SPELL_HYAKISS_WEB:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f))
me->CastSpell(target, SPELL_HYAKISS_WEB, false);
events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 15000);
break;
case EVENT_SPELL_SONIC_BURST:
me->CastSpell(me, SPELL_SONIC_BURST, false);
events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, urand(12000, 18000));
break;
case EVENT_SPELL_WING_BUFFET:
me->CastSpell(me, SPELL_WING_BUFFET, false);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, urand(12000, 18000));
break;
case EVENT_SPELL_DIVE:
if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, FarthestTargetSelector(me, 40.0f, false, true)))
me->CastSpell(target, SPELL_DIVE, false);
events.ScheduleEvent(EVENT_SPELL_DIVE, 20000);
break;
case EVENT_SPELL_FEAR:
me->CastSpell(me->GetVictim(), SPELL_FEAR, false);
break;
case EVENT_SPELL_RAVAGE:
me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false);
events.ScheduleEvent(EVENT_SPELL_RAVAGE, 10500);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
private:
EventMap _events2;
};
private:
EventMap _events2;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_servant_quartersAI>(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return GetInstanceAI<boss_servant_quartersAI>(creature);
}
};
void AddSC_boss_servant_quarters()

View File

@@ -9,158 +9,158 @@ REWRITTEN BY XINEF
class instance_karazhan : public InstanceMapScript
{
public:
instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { }
public:
instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_karazhan_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_karazhan_InstanceMapScript(map);
}
struct instance_karazhan_InstanceMapScript : public InstanceScript
{
instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { }
struct instance_karazhan_InstanceMapScript : public InstanceScript
{
instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { }
void Initialize()
{
SetBossNumber(MAX_ENCOUNTERS);
_servantQuartersKills = 0;
_selectedRare = RAND(NPC_HYAKISS_THE_LURKER, NPC_SHADIKITH_THE_GLIDER, NPC_ROKAD_THE_RAVAGER);
}
void Initialize()
{
SetBossNumber(MAX_ENCOUNTERS);
_servantQuartersKills = 0;
_selectedRare = RAND(NPC_HYAKISS_THE_LURKER, NPC_SHADIKITH_THE_GLIDER, NPC_ROKAD_THE_RAVAGER);
}
void OnCreatureCreate(Creature* creature)
{
void OnCreatureCreate(Creature* creature)
{
}
}
void SetData(uint32 type, uint32 uiData)
{
switch (type)
{
case DATA_COUNT_SERVANT_QUARTERS_KILLS:
if (++_servantQuartersKills > 52) // 56 in total, not all have to be killed, almost all
{
SetBossState(TYPE_SERVANT_QUARTERS, NOT_STARTED);
SetBossState(TYPE_SERVANT_QUARTERS, DONE);
}
SaveToDB();
break;
void SetData(uint32 type, uint32 uiData)
{
switch (type)
{
case DATA_COUNT_SERVANT_QUARTERS_KILLS:
if (++_servantQuartersKills > 52) // 56 in total, not all have to be killed, almost all
{
SetBossState(TYPE_SERVANT_QUARTERS, NOT_STARTED);
SetBossState(TYPE_SERVANT_QUARTERS, DONE);
}
SaveToDB();
break;
/*
case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break;
case TYPE_MOROES:
if (m_auiEncounter[1] == DONE)
break;
m_auiEncounter[1] = uiData;
break;
case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break;
case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break;
case TYPE_OPERA:
m_auiEncounter[4] = uiData;
if (uiData == DONE)
instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL);
break;
case TYPE_CURATOR: m_auiEncounter[5] = uiData; break;
case TYPE_ARAN: m_auiEncounter[6] = uiData; break;
case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break;
case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break;
case TYPE_CHESS:
if (uiData == DONE)
DoRespawnGameObject(DustCoveredChest, DAY);
m_auiEncounter[9] = uiData;
break;
case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break;
case TYPE_NIGHTBANE:
if (m_auiEncounter[11] != DONE)
m_auiEncounter[11] = uiData;
break;
case DATA_OPERA_OZ_DEATHCOUNT:
if (uiData == SPECIAL)
++m_uiOzDeathCount;
else if (uiData == IN_PROGRESS)
m_uiOzDeathCount = 0;
break;
/*
case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break;
case TYPE_MOROES:
if (m_auiEncounter[1] == DONE)
break;
m_auiEncounter[1] = uiData;
break;
case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break;
case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break;
case TYPE_OPERA:
m_auiEncounter[4] = uiData;
if (uiData == DONE)
instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL);
break;
case TYPE_CURATOR: m_auiEncounter[5] = uiData; break;
case TYPE_ARAN: m_auiEncounter[6] = uiData; break;
case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break;
case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break;
case TYPE_CHESS:
if (uiData == DONE)
DoRespawnGameObject(DustCoveredChest, DAY);
m_auiEncounter[9] = uiData;
break;
case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break;
case TYPE_NIGHTBANE:
if (m_auiEncounter[11] != DONE)
m_auiEncounter[11] = uiData;
break;
case DATA_OPERA_OZ_DEATHCOUNT:
if (uiData == SPECIAL)
++m_uiOzDeathCount;
else if (uiData == IN_PROGRESS)
m_uiOzDeathCount = 0;
break;
*/
}
}
}
}
void SetData64(uint32 identifier, uint64 data)
{
// switch (identifier)
// {
//case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
// }
}
void SetData64(uint32 identifier, uint64 data)
{
// switch (identifier)
// {
//case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
// }
}
void OnGameObjectCreate(GameObject* go)
{
/*switch (go->GetEntry())
{
case 183932: m_uiCurtainGUID = go->GetGUID(); break;
case 184278:
m_uiStageDoorLeftGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184279:
m_uiStageDoorRightGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184517: m_uiLibraryDoor = go->GetGUID(); break;
case 185521: m_uiMassiveDoor = go->GetGUID(); break;
case 184276: m_uiGamesmansDoor = go->GetGUID(); break;
case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break;
case 185134: m_uiNetherspaceDoor = go->GetGUID(); break;
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
case 184275:
m_uiSideEntranceDoor = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
break;
case 185119: DustCoveredChest = go->GetGUID(); break;
}*/
}
void OnGameObjectCreate(GameObject* go)
{
/*switch (go->GetEntry())
{
case 183932: m_uiCurtainGUID = go->GetGUID(); break;
case 184278:
m_uiStageDoorLeftGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184279:
m_uiStageDoorRightGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184517: m_uiLibraryDoor = go->GetGUID(); break;
case 185521: m_uiMassiveDoor = go->GetGUID(); break;
case 184276: m_uiGamesmansDoor = go->GetGUID(); break;
case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break;
case 185134: m_uiNetherspaceDoor = go->GetGUID(); break;
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
case 184275:
m_uiSideEntranceDoor = go->GetGUID();
if (m_auiEncounter[4] == DONE)
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
break;
case 185119: DustCoveredChest = go->GetGUID(); break;
}*/
}
uint32 GetData(uint32 data) const
{
switch (data)
{
case DATA_SELECTED_RARE:
return _selectedRare;
}
uint32 GetData(uint32 data) const
{
switch (data)
{
case DATA_SELECTED_RARE:
return _selectedRare;
}
return 0;
}
return 0;
}
uint64 GetData64(uint32 data) const
{
/*switch (uiData)
{
case DATA_KILREK: return m_uiKilrekGUID;
case DATA_TERESTIAN: return m_uiTerestianGUID;
case DATA_MOROES: return m_uiMoroesGUID;
case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID;
case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID;
case DATA_GO_CURTAINS: return m_uiCurtainGUID;
case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor;
case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor;
case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor;
case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor;
case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
case DATA_NIGHTBANE: return m_uiNightbaneGUID;
}
uint64 GetData64(uint32 data) const
{
/*switch (uiData)
{
case DATA_KILREK: return m_uiKilrekGUID;
case DATA_TERESTIAN: return m_uiTerestianGUID;
case DATA_MOROES: return m_uiMoroesGUID;
case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID;
case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID;
case DATA_GO_CURTAINS: return m_uiCurtainGUID;
case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor;
case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor;
case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor;
case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor;
case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
case DATA_NIGHTBANE: return m_uiNightbaneGUID;
}
*/
return 0;
}
return 0;
}
std::string GetSaveData()
{
@@ -190,77 +190,77 @@ class instance_karazhan : public InstanceMapScript
SetBossState(i, EncounterState(tmpState));
}
loadStream >> _servantQuartersKills;
loadStream >> _selectedRare;
loadStream >> _servantQuartersKills;
loadStream >> _selectedRare;
}
}
private:
uint32 _servantQuartersKills;
uint32 _selectedRare;
};
private:
uint32 _servantQuartersKills;
uint32 _selectedRare;
};
};
class spell_karazhan_brittle_bones : public SpellScriptLoader
{
public:
spell_karazhan_brittle_bones() : SpellScriptLoader("spell_karazhan_brittle_bones") { }
public:
spell_karazhan_brittle_bones() : SpellScriptLoader("spell_karazhan_brittle_bones") { }
class spell_karazhan_brittle_bones_AuraScript : public AuraScript
{
PrepareAuraScript(spell_karazhan_brittle_bones_AuraScript);
class spell_karazhan_brittle_bones_AuraScript : public AuraScript
{
PrepareAuraScript(spell_karazhan_brittle_bones_AuraScript);
void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
{
isPeriodic = true;
amplitude = 5000;
}
void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
{
isPeriodic = true;
amplitude = 5000;
}
void Update(AuraEffect const* effect)
{
PreventDefaultAction();
if (roll_chance_i(35))
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_RATTLED, true);
}
void Update(AuraEffect const* effect)
{
PreventDefaultAction();
if (roll_chance_i(35))
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_RATTLED, true);
}
void Register()
{
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_karazhan_brittle_bones_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_brittle_bones_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY);
}
};
void Register()
{
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_karazhan_brittle_bones_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_brittle_bones_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
return new spell_karazhan_brittle_bones_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_karazhan_brittle_bones_AuraScript();
}
};
class spell_karazhan_overload : public SpellScriptLoader
{
public:
spell_karazhan_overload() : SpellScriptLoader("spell_karazhan_overload") { }
public:
spell_karazhan_overload() : SpellScriptLoader("spell_karazhan_overload") { }
class spell_karazhan_overload_AuraScript : public AuraScript
{
PrepareAuraScript(spell_karazhan_overload_AuraScript);
class spell_karazhan_overload_AuraScript : public AuraScript
{
PrepareAuraScript(spell_karazhan_overload_AuraScript);
void PeriodicTick(AuraEffect const* auraEffect)
{
PreventDefaultAction();
GetUnitOwner()->CastCustomSpell(SPELL_OVERLOAD, SPELLVALUE_BASE_POINT0, int32(auraEffect->GetAmount() * (2.0, auraEffect->GetTickNumber())), GetUnitOwner(), true);
}
void PeriodicTick(AuraEffect const* auraEffect)
{
PreventDefaultAction();
GetUnitOwner()->CastCustomSpell(SPELL_OVERLOAD, SPELLVALUE_BASE_POINT0, int32(auraEffect->GetAmount() * (2.0, auraEffect->GetTickNumber())), GetUnitOwner(), true);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_overload_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_karazhan_overload_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_karazhan_overload_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_karazhan_overload_AuraScript();
}
};
class spell_karazhan_blink : public SpellScriptLoader
@@ -274,10 +274,10 @@ class spell_karazhan_blink : public SpellScriptLoader
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
GetCaster()->getThreatManager().resetAllAggro();
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target, SPELL_BLINK, true);
PreventHitDefaultEffect(effIndex);
GetCaster()->getThreatManager().resetAllAggro();
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target, SPELL_BLINK, true);
}
void Register()
@@ -295,7 +295,7 @@ class spell_karazhan_blink : public SpellScriptLoader
void AddSC_instance_karazhan()
{
new instance_karazhan();
new spell_karazhan_brittle_bones();
new spell_karazhan_overload();
new spell_karazhan_blink();
new spell_karazhan_brittle_bones();
new spell_karazhan_overload();
new spell_karazhan_blink();
}

View File

@@ -439,8 +439,8 @@ public:
npc_image_of_medivhAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
Step = 1;
YellTimer = 5000;
Step = 1;
YellTimer = 5000;
}
InstanceScript* instance;
@@ -457,28 +457,28 @@ public:
void Reset()
{
ArcanagosGUID = 0;
MTimer = 0;
ATimer = 0;
MTimer = 0;
ATimer = 0;
if (instance && instance->GetData64(DATA_IMAGE_OF_MEDIVH) == 0)
{
Creature* Arcanagos = me->SummonCreature(NPC_ARCANAGOS, ArcanagosPos[0], ArcanagosPos[1], ArcanagosPos[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
if (!Arcanagos)
{
me->DespawnOrUnsummon();
return;
}
Creature* Arcanagos = me->SummonCreature(NPC_ARCANAGOS, ArcanagosPos[0], ArcanagosPos[1], ArcanagosPos[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
if (!Arcanagos)
{
me->DespawnOrUnsummon();
return;
}
instance->SetData64(DATA_IMAGE_OF_MEDIVH, me->GetGUID());
EventStarted = true;
ArcanagosGUID = Arcanagos->GetGUID();
instance->SetData64(DATA_IMAGE_OF_MEDIVH, me->GetGUID());
EventStarted = true;
ArcanagosGUID = Arcanagos->GetGUID();
Arcanagos->SetFacingToObject(me);
me->SetFacingToObject(Arcanagos);
Arcanagos->SetFacingToObject(me);
me->SetFacingToObject(Arcanagos);
Arcanagos->SetCanFly(true);
Arcanagos->SetCanFly(true);
}
else
else
me->DespawnOrUnsummon();
}
@@ -509,8 +509,8 @@ public:
if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID))
arca->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, 0);
ATimer = 5500;
MTimer = 6600;
ATimer = 5500;
MTimer = 6600;
return 10000;
case 7:
return 1000;
@@ -519,10 +519,10 @@ public:
return 5500;
case 9:
me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false);
me->CastSpell(me, 30972, true);
me->CastSpell(me, 30972, true);
return 10000;
case 10:
me->RemoveAurasDueToSpell(30972);
me->RemoveAurasDueToSpell(30972);
if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID))
me->CastSpell(arca, SPELL_CONFLAGRATION_BLAST, false);
return 1000;
@@ -531,12 +531,12 @@ public:
arca->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, 0);
return 5000;
case 12:
if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID))
{
arca->SetSpeed(MOVE_RUN, 2.0f);
arca->GetMotionMaster()->MovePoint(0, -11010.82f, -1761.18f, 156.47f);
arca->InterruptNonMeleeSpells(true);
}
if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID))
{
arca->SetSpeed(MOVE_RUN, 2.0f);
arca->GetMotionMaster()->MovePoint(0, -11010.82f, -1761.18f, 156.47f);
arca->InterruptNonMeleeSpells(true);
}
return 10000;
case 13:
me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, 0);
@@ -548,20 +548,20 @@ public:
for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->GetSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE)
{
{
i->GetSource()->GroupEventHappens(9645, me);
break;
}
break;
}
}
}
me->DespawnOrUnsummon(100);
if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID))
arca->DespawnOrUnsummon(100);
me->DespawnOrUnsummon(100);
if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID))
arca->DespawnOrUnsummon(100);
return 5000;
default:
return 2000;
return 2000;
}
}
@@ -577,8 +577,8 @@ public:
if (Step >= 7 && Step <= 8)
{
ATimer += diff;
MTimer += diff;
ATimer += diff;
MTimer += diff;
if (ATimer >= 6000)
{
if (Unit* arca = ObjectAccessor::GetUnit((*me), ArcanagosGUID))
@@ -588,7 +588,7 @@ public:
if (MTimer >= 6000)
{
if (Unit* arca = ObjectAccessor::GetUnit((*me), ArcanagosGUID))
me->CastSpell(arca, SPELL_FIRE_BALL, false);
me->CastSpell(arca, SPELL_FIRE_BALL, false);
MTimer = 0;
}
}

View File

@@ -7,7 +7,7 @@ REWRITTEN BY XINEF
enum DataTypes
{
TYPE_SERVANT_QUARTERS = 0,
TYPE_SERVANT_QUARTERS = 0,
TYPE_ATTUMEN = 1,
TYPE_MOROES = 2,
TYPE_MAIDEN = 3,
@@ -20,7 +20,7 @@ enum DataTypes
TYPE_CHESS = 10,
TYPE_MALCHEZZAR = 11,
TYPE_NIGHTBANE = 12,
MAX_ENCOUNTERS = 13,
MAX_ENCOUNTERS = 13,
DATA_OPERA_PERFORMANCE = 13,
DATA_OPERA_OZ_DEATHCOUNT = 14,
@@ -42,10 +42,10 @@ enum DataTypes
DATA_MASTERS_TERRACE_DOOR_2 = 28,
DATA_GO_SIDE_ENTRANCE_DOOR = 29,
DATA_NIGHTBANE = 30,
DATA_NIGHTBANE = 30,
DATA_COUNT_SERVANT_QUARTERS_KILLS = 100,
DATA_SELECTED_RARE = 101,
DATA_COUNT_SERVANT_QUARTERS_KILLS = 100,
DATA_SELECTED_RARE = 101,
};
enum OperaEvents
@@ -57,19 +57,19 @@ enum OperaEvents
enum KarazhanNPCs
{
NPC_HYAKISS_THE_LURKER = 16179,
NPC_SHADIKITH_THE_GLIDER = 16180,
NPC_ROKAD_THE_RAVAGER = 16181,
NPC_HYAKISS_THE_LURKER = 16179,
NPC_SHADIKITH_THE_GLIDER = 16180,
NPC_ROKAD_THE_RAVAGER = 16181,
NPC_ATTUMEN_THE_HUNTSMAN = 15550,
NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152
NPC_ATTUMEN_THE_HUNTSMAN = 15550,
NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152
};
enum KarazhanSpells
{
SPELL_RATTLED = 32437,
SPELL_OVERLOAD = 29766,
SPELL_BLINK = 29884
SPELL_RATTLED = 32437,
SPELL_OVERLOAD = 29766,
SPELL_BLINK = 29884
};
#endif

View File

@@ -22,46 +22,46 @@ enum Says
enum Spells
{
// Phase 1
SPELL_FIREBALL_N = 44189,
SPELL_FIREBALL_H = 46164,
SPELL_FLAMESTRIKE_SUMMON = 44192,
SPELL_PHOENIX = 44194,
SPELL_SHOCK_BARRIER = 46165,
SPELL_PYROBLAST = 36819,
SPELL_FIREBALL_N = 44189,
SPELL_FIREBALL_H = 46164,
SPELL_FLAMESTRIKE_SUMMON = 44192,
SPELL_PHOENIX = 44194,
SPELL_SHOCK_BARRIER = 46165,
SPELL_PYROBLAST = 36819,
// Phase 2
SPELL_SUMMON_ARCANE_SPHERE = 44265,
SPELL_TELEPORT_CENTER = 44218,
SPELL_GRAVITY_LAPSE_INITIAL = 44224,
SPELL_GRAVITY_LAPSE_PLAYER = 44219, // Till 44223, 5 players
SPELL_GRAVITY_LAPSE_FLY = 44227,
SPELL_GRAVITY_LAPSE_DOT = 44226,
SPELL_GRAVITY_LAPSE_CHANNEL = 44251,
SPELL_POWER_FEEDBACK = 44233
// Phase 2
SPELL_SUMMON_ARCANE_SPHERE = 44265,
SPELL_TELEPORT_CENTER = 44218,
SPELL_GRAVITY_LAPSE_INITIAL = 44224,
SPELL_GRAVITY_LAPSE_PLAYER = 44219, // Till 44223, 5 players
SPELL_GRAVITY_LAPSE_FLY = 44227,
SPELL_GRAVITY_LAPSE_DOT = 44226,
SPELL_GRAVITY_LAPSE_CHANNEL = 44251,
SPELL_POWER_FEEDBACK = 44233
};
enum Misc
{
EVENT_INIT_COMBAT = 1,
EVENT_SPELL_FIREBALL = 2,
EVENT_SPELL_PHOENIX = 3,
EVENT_SPELL_FLAMESTRIKE = 4,
EVENT_SPELL_SHOCK_BARRIER = 5,
EVENT_CHECK_HEALTH = 6,
EVENT_GRAVITY_LAPSE_1_1 = 7,
EVENT_GRAVITY_LAPSE_1_2 = 8,
EVENT_GRAVITY_LAPSE_2 = 9,
EVENT_GRAVITY_LAPSE_3 = 10,
EVENT_GRAVITY_LAPSE_4 = 11,
EVENT_GRAVITY_LAPSE_5 = 12,
EVENT_FINISH_TALK = 13,
EVENT_INIT_COMBAT = 1,
EVENT_SPELL_FIREBALL = 2,
EVENT_SPELL_PHOENIX = 3,
EVENT_SPELL_FLAMESTRIKE = 4,
EVENT_SPELL_SHOCK_BARRIER = 5,
EVENT_CHECK_HEALTH = 6,
EVENT_GRAVITY_LAPSE_1_1 = 7,
EVENT_GRAVITY_LAPSE_1_2 = 8,
EVENT_GRAVITY_LAPSE_2 = 9,
EVENT_GRAVITY_LAPSE_3 = 10,
EVENT_GRAVITY_LAPSE_4 = 11,
EVENT_GRAVITY_LAPSE_5 = 12,
EVENT_FINISH_TALK = 13,
ACTION_TELEPORT_PLAYERS = 1,
ACTION_KNOCKUP = 2,
ACTION_ALLOW_FLY = 3,
ACTION_REMOVE_FLY = 4,
ACTION_TELEPORT_PLAYERS = 1,
ACTION_KNOCKUP = 2,
ACTION_ALLOW_FLY = 3,
ACTION_REMOVE_FLY = 4,
CREATURE_ARCANE_SPHERE = 24708
CREATURE_ARCANE_SPHERE = 24708
};
class boss_felblood_kaelthas : public CreatureScript
@@ -79,64 +79,64 @@ public:
boss_felblood_kaelthasAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = creature->GetInstanceScript();
introSpeak = false;
introSpeak = false;
}
InstanceScript* instance;
EventMap events;
EventMap events2;
SummonList summons;
bool introSpeak;
EventMap events;
EventMap events2;
SummonList summons;
bool introSpeak;
void Reset()
{
events.Reset();
summons.DespawnAll();
events.Reset();
summons.DespawnAll();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
}
void JustSummoned(Creature* summon)
{
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (*itr == summon->GetGUID())
return;
summons.Summon(summon);
}
void JustSummoned(Creature* summon)
{
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (*itr == summon->GetGUID())
return;
summons.Summon(summon);
}
void InitializeAI()
{
ScriptedAI::InitializeAI();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
}
void InitializeAI()
{
ScriptedAI::InitializeAI();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
}
void JustDied(Unit*)
{
instance->SetData(DATA_KAELTHAS_EVENT, DONE);
}
void JustDied(Unit*)
{
instance->SetData(DATA_KAELTHAS_EVENT, DONE);
}
void EnterCombat(Unit* /*who*/)
{
instance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS);
me->SetInCombatWithZone();
me->SetInCombatWithZone();
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0);
events.ScheduleEvent(EVENT_SPELL_PHOENIX, 15000);
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 22000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0);
events.ScheduleEvent(EVENT_SPELL_PHOENIX, 15000);
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 22000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
}
void MoveInLineOfSight(Unit* who)
{
if (!introSpeak && me->IsWithinDistInMap(who, 40.0f) && who->GetTypeId() == TYPEID_PLAYER)
if (!introSpeak && me->IsWithinDistInMap(who, 40.0f) && who->GetTypeId() == TYPEID_PLAYER)
{
Talk(SAY_AGGRO);
introSpeak = true;
events2.ScheduleEvent(EVENT_INIT_COMBAT, 35000);
events2.ScheduleEvent(EVENT_INIT_COMBAT, 35000);
}
ScriptedAI::MoveInLineOfSight(who);
@@ -145,140 +145,140 @@ public:
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (damage >= me->GetHealth())
{
damage = me->GetHealth()-1;
if (me->isRegeneratingHealth())
{
me->SetRegeneratingHealth(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->CombatStop();
me->SetReactState(REACT_PASSIVE);
LapseAction(ACTION_REMOVE_FLY);
events.Reset();
events2.ScheduleEvent(EVENT_FINISH_TALK, 6000);
Talk(SAY_DEATH);
}
}
{
damage = me->GetHealth()-1;
if (me->isRegeneratingHealth())
{
me->SetRegeneratingHealth(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->CombatStop();
me->SetReactState(REACT_PASSIVE);
LapseAction(ACTION_REMOVE_FLY);
events.Reset();
events2.ScheduleEvent(EVENT_FINISH_TALK, 6000);
Talk(SAY_DEATH);
}
}
}
void LapseAction(uint8 action)
{
uint8 counter = 0;
Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr, ++counter)
if (Player* player = itr->GetSource())
{
if (action == ACTION_TELEPORT_PLAYERS)
me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER+counter, true);
else if (action == ACTION_KNOCKUP)
player->CastSpell(player, SPELL_GRAVITY_LAPSE_DOT, true, NULL, NULL, me->GetGUID());
else if (action == ACTION_ALLOW_FLY)
player->CastSpell(player, SPELL_GRAVITY_LAPSE_FLY, true, NULL, NULL, me->GetGUID());
else if (action == ACTION_REMOVE_FLY)
{
player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT);
}
}
}
void LapseAction(uint8 action)
{
uint8 counter = 0;
Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr, ++counter)
if (Player* player = itr->GetSource())
{
if (action == ACTION_TELEPORT_PLAYERS)
me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER+counter, true);
else if (action == ACTION_KNOCKUP)
player->CastSpell(player, SPELL_GRAVITY_LAPSE_DOT, true, NULL, NULL, me->GetGUID());
else if (action == ACTION_ALLOW_FLY)
player->CastSpell(player, SPELL_GRAVITY_LAPSE_FLY, true, NULL, NULL, me->GetGUID());
else if (action == ACTION_REMOVE_FLY)
{
player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT);
}
}
}
void UpdateAI(uint32 diff)
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_INIT_COMBAT:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
if (Unit* target = SelectTargetFromPlayerList(50.0f))
AttackStart(target);
return;
case EVENT_FINISH_TALK:
Unit::Kill(me, me);
return;
}
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_INIT_COMBAT:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
if (Unit* target = SelectTargetFromPlayerList(50.0f))
AttackStart(target);
return;
case EVENT_FINISH_TALK:
Unit::Kill(me, me);
return;
}
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (uint32 eventId = events.ExecuteEvent())
{
case EVENT_SPELL_FIREBALL:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false);
events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500));
break;
case EVENT_SPELL_FLAMESTRIKE:
switch (uint32 eventId = events.ExecuteEvent())
{
case EVENT_SPELL_FIREBALL:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false);
events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500));
break;
case EVENT_SPELL_FLAMESTRIKE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true);
{
me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true);
Talk(SAY_FLAMESTRIKE);
}
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
break;
case EVENT_SPELL_SHOCK_BARRIER:
me->CastSpell(me, SPELL_SHOCK_BARRIER, true);
me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
break;
case EVENT_SPELL_PHOENIX:
events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000);
break;
case EVENT_SPELL_SHOCK_BARRIER:
me->CastSpell(me, SPELL_SHOCK_BARRIER, true);
me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000);
break;
case EVENT_SPELL_PHOENIX:
Talk(SAY_PHOENIX);
me->CastSpell(me, SPELL_PHOENIX, false);
events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000);
break;
case EVENT_CHECK_HEALTH:
me->CastSpell(me, SPELL_PHOENIX, false);
events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000);
break;
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(50))
{
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
me->CastSpell(me, SPELL_TELEPORT_CENTER, true);
events.Reset();
me->CastSpell(me, SPELL_TELEPORT_CENTER, true);
events.Reset();
me->StopMoving();
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveIdle();
events.SetPhase(1);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0);
break;
events.SetPhase(1);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
break;
case EVENT_GRAVITY_LAPSE_1_1:
case EVENT_GRAVITY_LAPSE_1_2:
Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY);
me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 500);
break;
case EVENT_GRAVITY_LAPSE_2:
LapseAction(ACTION_TELEPORT_PLAYERS);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000);
break;
case EVENT_GRAVITY_LAPSE_3:
LapseAction(ACTION_KNOCKUP);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000);
break;
case EVENT_GRAVITY_LAPSE_4:
case EVENT_GRAVITY_LAPSE_1_1:
case EVENT_GRAVITY_LAPSE_1_2:
Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY);
me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000);
break;
case EVENT_GRAVITY_LAPSE_2:
LapseAction(ACTION_TELEPORT_PLAYERS);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000);
break;
case EVENT_GRAVITY_LAPSE_3:
LapseAction(ACTION_KNOCKUP);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000);
break;
case EVENT_GRAVITY_LAPSE_4:
LapseAction(ACTION_ALLOW_FLY);
for (uint8 i = 0; i < 3; ++i)
me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true);
me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true);
me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000);
break;
case EVENT_GRAVITY_LAPSE_5:
LapseAction(ACTION_REMOVE_FLY);
me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000);
break;
case EVENT_GRAVITY_LAPSE_5:
LapseAction(ACTION_REMOVE_FLY);
me->InterruptNonMeleeSpells(false);
Talk(SAY_TIRED);
me->CastSpell(me, SPELL_POWER_FEEDBACK, false);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000);
break;
}
me->CastSpell(me, SPELL_POWER_FEEDBACK, false);
events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000);
break;
}
if (events.GetPhaseMask() == 0)
DoMeleeAttackIfReady();
if (events.GetPhaseMask() == 0)
DoMeleeAttackIfReady();
}
};
};
@@ -294,8 +294,8 @@ class spell_mt_phoenix_burn : public SpellScriptLoader
void HandleAfterCast()
{
uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5);
Unit::DealDamage(GetCaster(), GetCaster(), damage);
uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5);
Unit::DealDamage(GetCaster(), GetCaster(), damage);
}
void Register()
@@ -313,5 +313,5 @@ class spell_mt_phoenix_burn : public SpellScriptLoader
void AddSC_boss_felblood_kaelthas()
{
new boss_felblood_kaelthas();
new spell_mt_phoenix_burn();
new spell_mt_phoenix_burn();
}

View File

@@ -20,23 +20,23 @@ enum Spells
{
SPELL_FEL_CRYSTAL_COSMETIC = 44374,
SPELL_MANA_RAGE = 44320,
SPELL_MANA_RAGE_TRIGGER = 44321,
SPELL_MANA_RAGE_TRIGGER = 44321,
//Selin's spells
SPELL_DRAIN_LIFE_N = 44294,
SPELL_DRAIN_LIFE_H = 46155,
SPELL_FEL_EXPLOSION = 44314,
SPELL_DRAIN_MANA = 46153
SPELL_DRAIN_LIFE_N = 44294,
SPELL_DRAIN_LIFE_H = 46155,
SPELL_FEL_EXPLOSION = 44314,
SPELL_DRAIN_MANA = 46153
};
enum Events
{
EVENT_SPELL_DRAIN_LIFE = 1,
EVENT_SPELL_FEL_EXPLOSION = 2,
EVENT_SPELL_DRAIN_MANA = 3,
EVENT_DRAIN_CRYSTAL = 4,
EVENT_EMPOWER = 5,
EVENT_RESTORE_COMBAT = 6
EVENT_SPELL_DRAIN_LIFE = 1,
EVENT_SPELL_FEL_EXPLOSION = 2,
EVENT_SPELL_DRAIN_MANA = 3,
EVENT_DRAIN_CRYSTAL = 4,
EVENT_EMPOWER = 5,
EVENT_RESTORE_COMBAT = 6
};
class boss_selin_fireheart : public CreatureScript
@@ -57,64 +57,64 @@ public:
}
InstanceScript* instance;
EventMap events;
SummonList summons;
EventMap events;
SummonList summons;
uint64 CrystalGUID;
bool CanAIAttack(const Unit* who) const
{
return who->GetPositionX() > 216.0f;
}
bool CanAIAttack(const Unit* who) const
{
return who->GetPositionX() > 216.0f;
}
void SpawnCrystals()
{
me->SummonCreature(NPC_FEL_CRYSTAL, 248.053f, 14.592f, 3.74882f, 3.94444f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 225.969f, -20.0775f, -2.9731f, 0.942478f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 226.314f, 20.2183f, -2.98127f, 5.32325f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 247.888f, -14.6252f, 3.80777f, 2.33874f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 263.149f, 0.309245f, 1.32057f, 3.15905f, TEMPSUMMON_CORPSE_DESPAWN);
}
void SpawnCrystals()
{
me->SummonCreature(NPC_FEL_CRYSTAL, 248.053f, 14.592f, 3.74882f, 3.94444f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 225.969f, -20.0775f, -2.9731f, 0.942478f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 226.314f, 20.2183f, -2.98127f, 5.32325f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 247.888f, -14.6252f, 3.80777f, 2.33874f, TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_FEL_CRYSTAL, 263.149f, 0.309245f, 1.32057f, 3.15905f, TEMPSUMMON_CORPSE_DESPAWN);
}
void JustSummoned(Creature* summon)
{
summon->SetReactState(REACT_PASSIVE);
summons.Summon(summon);
}
void JustSummoned(Creature* summon)
{
summon->SetReactState(REACT_PASSIVE);
summons.Summon(summon);
}
void SummonedCreatureDies(Creature* summon, Unit*)
{
summons.Despawn(summon);
if (events.GetPhaseMask() & 0x01)
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
}
void SummonedCreatureDies(Creature* summon, Unit*)
{
summons.Despawn(summon);
if (events.GetPhaseMask() & 0x01)
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
}
void Reset()
{
events.Reset();
summons.DespawnAll();
SpawnCrystals();
summons.DespawnAll();
SpawnCrystals();
instance->SetData(DATA_SELIN_EVENT, NOT_STARTED);
CrystalGUID = 0;
me->SetPower(POWER_MANA, 0);
me->SetPower(POWER_MANA, 0);
}
void EnterCombat(Unit* /*who*/)
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
instance->SetData(DATA_SELIN_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1);
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1);
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 14000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 7500, 1);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 7500, 1);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
}
void JustDied(Unit* /*killer*/)
@@ -127,22 +127,22 @@ public:
void SelectNearestCrystal()
{
if (summons.empty())
return;
if (summons.empty())
return;
CrystalGUID = 0;
Unit* crystal = NULL;
for (SummonList::const_iterator i = summons.begin(); i != summons.end(); )
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i++))
for (SummonList::const_iterator i = summons.begin(); i != summons.end(); )
if (Creature* summon = ObjectAccessor::GetCreature(*me, *i++))
if (!crystal || me->GetDistanceOrder(summon, crystal, false))
crystal = summon;
crystal = summon;
if (crystal)
{
Talk(SAY_ENERGY);
float x, y, z;
crystal->GetClosePoint(x, y, z, me->GetObjectSize(), CONTACT_DISTANCE);
CrystalGUID = crystal->GetGUID();
CrystalGUID = crystal->GetGUID();
me->GetMotionMaster()->MovePoint(2, x, y, z);
}
}
@@ -153,15 +153,15 @@ public:
{
if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID))
{
Talk(EMOTE_CRYSTAL);
Talk(EMOTE_CRYSTAL);
crystal->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
crystal->CastSpell(me, SPELL_MANA_RAGE, true);
me->CastSpell(crystal, SPELL_FEL_CRYSTAL_COSMETIC, true);
events.SetPhase(1);
events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1);
events.SetPhase(1);
events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1);
}
else
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
else
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
}
}
@@ -170,50 +170,50 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_DRAIN_LIFE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_DRAIN_LIFE_N, SPELL_DRAIN_LIFE_H), false);
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 10000, 1);
return;
case EVENT_SPELL_DRAIN_MANA:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
me->CastSpell(target, SPELL_DRAIN_MANA, false);
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 10000, 1);
return;
case EVENT_SPELL_FEL_EXPLOSION:
me->RemoveAuraFromStack(SPELL_MANA_RAGE_TRIGGER);
me->CastSpell(me, SPELL_FEL_EXPLOSION, false);
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
break;
case EVENT_DRAIN_CRYSTAL:
events.DelayEvents(10001);
events.ScheduleEvent(EVENT_EMPOWER, 10000);
events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 30000);
SelectNearestCrystal();
break;
case EVENT_EMPOWER:
if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA))
{
Talk(SAY_EMPOWERED);
if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID))
Unit::Kill(crystal, crystal);
events.DelayEvents(10000, 1);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
}
else
events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1);
break;
case EVENT_RESTORE_COMBAT:
events.SetPhase(0);
me->GetMotionMaster()->MoveChase(me->GetVictim());
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_DRAIN_LIFE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_DRAIN_LIFE_N, SPELL_DRAIN_LIFE_H), false);
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 10000, 1);
return;
case EVENT_SPELL_DRAIN_MANA:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
me->CastSpell(target, SPELL_DRAIN_MANA, false);
events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 10000, 1);
return;
case EVENT_SPELL_FEL_EXPLOSION:
me->RemoveAuraFromStack(SPELL_MANA_RAGE_TRIGGER);
me->CastSpell(me, SPELL_FEL_EXPLOSION, false);
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
break;
case EVENT_DRAIN_CRYSTAL:
events.DelayEvents(10001);
events.ScheduleEvent(EVENT_EMPOWER, 10000);
events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 30000);
SelectNearestCrystal();
break;
case EVENT_EMPOWER:
if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA))
{
Talk(SAY_EMPOWERED);
if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID))
Unit::Kill(crystal, crystal);
events.DelayEvents(10000, 1);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
}
else
events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1);
break;
case EVENT_RESTORE_COMBAT:
events.SetPhase(0);
me->GetMotionMaster()->MoveChase(me->GetVictim());
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -18,19 +18,19 @@ enum Yells
enum Spells
{
// Pure energy spell info
SPELL_ENERGY_FEEDBACK_CHANNEL = 44328,
SPELL_ENERGY_FEEDBACK_CHANNEL = 44328,
SPELL_ENERGY_FEEDBACK = 44335,
// Vexallus spell info
SPELL_CHAIN_LIGHTNING_N = 44318,
SPELL_CHAIN_LIGHTNING_H = 46380,
SPELL_CHAIN_LIGHTNING_N = 44318,
SPELL_CHAIN_LIGHTNING_H = 46380,
SPELL_OVERLOAD = 44352,
SPELL_ARCANE_SHOCK_N = 44319,
SPELL_ARCANE_SHOCK_H = 46381,
SPELL_ARCANE_SHOCK_N = 44319,
SPELL_ARCANE_SHOCK_H = 46381,
SPELL_SUMMON_PURE_ENERGY_N = 44322,
SPELL_SUMMON_PURE_ENERGY_H1 = 46154,
SPELL_SUMMON_PURE_ENERGY_H2 = 46159
SPELL_SUMMON_PURE_ENERGY_N = 44322,
SPELL_SUMMON_PURE_ENERGY_H1 = 46154,
SPELL_SUMMON_PURE_ENERGY_H2 = 46159
};
enum Misc
@@ -40,9 +40,9 @@ enum Misc
INTERVAL_MODIFIER = 15,
INTERVAL_SWITCH = 6,
EVENT_SPELL_CHAIN_LIGHTNING = 1,
EVENT_SPELL_ARCANE_SHOCK = 2,
EVENT_HEALTH_CHECK = 3,
EVENT_SPELL_CHAIN_LIGHTNING = 1,
EVENT_SPELL_ARCANE_SHOCK = 2,
EVENT_HEALTH_CHECK = 3,
};
class boss_vexallus : public CreatureScript
@@ -63,8 +63,8 @@ public:
}
InstanceScript* instance;
EventMap events;
SummonList summons;
EventMap events;
SummonList summons;
uint8 IntervalHealthAmount;
bool Enraged;
@@ -75,20 +75,20 @@ public:
IntervalHealthAmount = 1;
instance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
}
void JustDied(Unit* /*killer*/)
{
summons.DespawnAll();
instance->SetData(DATA_VEXALLUS_EVENT, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
}
void EnterCombat(Unit* /*who*/)
@@ -96,75 +96,75 @@ public:
Talk(SAY_AGGRO);
instance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
}
void JustSummoned(Creature* summon)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
{
summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f);
summon->CastSpell(target, SPELL_ENERGY_FEEDBACK_CHANNEL, false);
}
summons.Summon(summon);
summon->CastSpell(target, SPELL_ENERGY_FEEDBACK_CHANNEL, false);
}
summons.Summon(summon);
}
void SummonedCreatureDies(Creature* summon, Unit* killer)
{
summons.Despawn(summon);
summon->DespawnOrUnsummon(1);
if (killer)
killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID());
}
void SummonedCreatureDies(Creature* summon, Unit* killer)
{
summons.Despawn(summon);
summon->DespawnOrUnsummon(1);
if (killer)
killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID());
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_HEALTH_CHECK:
//used for check, when Vexallus cast adds 85%, 70%, 55%, 40%
if (!HealthAbovePct(100 - INTERVAL_MODIFIER * IntervalHealthAmount))
{
if (IntervalHealthAmount++ == INTERVAL_SWITCH)
{
events.Reset();
me->CastSpell(me, SPELL_OVERLOAD, true);
return;
}
Talk(SAY_ENERGY);
Talk(EMOTE_DISCHARGE_ENERGY);
switch (events.ExecuteEvent())
{
case EVENT_HEALTH_CHECK:
//used for check, when Vexallus cast adds 85%, 70%, 55%, 40%
if (!HealthAbovePct(100 - INTERVAL_MODIFIER * IntervalHealthAmount))
{
if (IntervalHealthAmount++ == INTERVAL_SWITCH)
{
events.Reset();
me->CastSpell(me, SPELL_OVERLOAD, true);
return;
}
Talk(SAY_ENERGY);
Talk(EMOTE_DISCHARGE_ENERGY);
if (IsHeroic())
{
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H1, false);
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H2, false);
}
else
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_N, false);
}
events.ScheduleEvent(EVENT_HEALTH_CHECK, 0);
break;
case EVENT_SPELL_CHAIN_LIGHTNING:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H), false);
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
break;
case EVENT_SPELL_ARCANE_SHOCK:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f))
me->CastSpell(target, DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H), false);
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 8000);
break;
}
if (IsHeroic())
{
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H1, false);
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H2, false);
}
else
me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_N, false);
}
events.ScheduleEvent(EVENT_HEALTH_CHECK, 0);
break;
case EVENT_SPELL_CHAIN_LIGHTNING:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H), false);
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
break;
case EVENT_SPELL_ARCANE_SHOCK:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f))
me->CastSpell(target, DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H), false);
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 8000);
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -30,7 +30,7 @@ public:
void Initialize()
{
memset(&Encounter, 0, sizeof(Encounter));
VexallusDoorGUID = 0;
SelinDoorGUID = 0;
SelinEncounterDoorGUID = 0;
@@ -39,7 +39,7 @@ public:
EscapeOrbGUID = 0;
DelrissaGUID = 0;
KaelGUID = 0;
KaelGUID = 0;
}
bool IsEncounterInProgress() const
@@ -84,9 +84,9 @@ public:
break;
case DATA_KAELTHAS_EVENT:
HandleGameObject(KaelDoorGUID, data != IN_PROGRESS);
if (data == DONE)
if (GameObject* escapeOrb = instance->GetGameObject(EscapeOrbGUID))
escapeOrb->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (data == DONE)
if (GameObject* escapeOrb = instance->GetGameObject(EscapeOrbGUID))
escapeOrb->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
Encounter[identifier] = data;
break;
}
@@ -101,14 +101,14 @@ public:
case NPC_DELRISSA:
DelrissaGUID = creature->GetGUID();
break;
case NPC_KAEL_THAS:
KaelGUID = creature->GetGUID();
break;
case NPC_PHOENIX:
case NPC_PHOENIX_EGG:
if (Creature* kael = instance->GetCreature(KaelGUID))
kael->AI()->JustSummoned(creature);
break;
case NPC_KAEL_THAS:
KaelGUID = creature->GetGUID();
break;
case NPC_PHOENIX:
case NPC_PHOENIX_EGG:
if (Creature* kael = instance->GetCreature(KaelGUID))
kael->AI()->JustSummoned(creature);
break;
}
}
@@ -116,9 +116,9 @@ public:
{
switch (go->GetEntry())
{
case GO_SELIN_DOOR:
if (GetData(DATA_SELIN_EVENT) == DONE)
HandleGameObject(0, true, go);
case GO_SELIN_DOOR:
if (GetData(DATA_SELIN_EVENT) == DONE)
HandleGameObject(0, true, go);
SelinDoorGUID = go->GetGUID();
break;
case GO_SELIN_ENCOUNTER_DOOR:
@@ -126,22 +126,22 @@ public:
break;
case GO_VEXALLUS_DOOR:
if (GetData(DATA_VEXALLUS_EVENT) == DONE)
if (GetData(DATA_VEXALLUS_EVENT) == DONE)
HandleGameObject(0, true, go);
VexallusDoorGUID = go->GetGUID();
break;
case GO_DELRISSA_DOOR:
if (GetData(DATA_DELRISSA_EVENT) == DONE)
HandleGameObject(0, true, go);
if (GetData(DATA_DELRISSA_EVENT) == DONE)
HandleGameObject(0, true, go);
DelrissaDoorGUID = go->GetGUID();
break;
case GO_KAEL_DOOR:
KaelDoorGUID = go->GetGUID();
break;
case GO_ESCAPE_ORB:
if (GetData(DATA_KAELTHAS_EVENT) == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (GetData(DATA_KAELTHAS_EVENT) == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
EscapeOrbGUID = go->GetGUID();
break;
}

View File

@@ -7,31 +7,31 @@ REWRITTEN BY XINEF
enum MTData
{
DATA_SELIN_EVENT = 0,
DATA_VEXALLUS_EVENT = 1,
DATA_DELRISSA_EVENT = 2,
DATA_KAELTHAS_EVENT = 3,
MAX_ENCOUNTER = 4
DATA_SELIN_EVENT = 0,
DATA_VEXALLUS_EVENT = 1,
DATA_DELRISSA_EVENT = 2,
DATA_KAELTHAS_EVENT = 3,
MAX_ENCOUNTER = 4
};
enum MTCreatures
{
NPC_DELRISSA = 24560,
NPC_FEL_CRYSTAL = 24722,
NPC_KAEL_THAS = 24664,
NPC_PHOENIX = 21362,
NPC_PHOENIX_EGG = 21364
NPC_DELRISSA = 24560,
NPC_FEL_CRYSTAL = 24722,
NPC_KAEL_THAS = 24664,
NPC_PHOENIX = 21362,
NPC_PHOENIX_EGG = 21364
};
enum MTGameObjects
{
GO_VEXALLUS_DOOR = 187896,
GO_SELIN_DOOR = 187979,
GO_SELIN_ENCOUNTER_DOOR = 188065,
GO_DELRISSA_DOOR = 187770,
GO_KAEL_DOOR = 188064,
GO_ESCAPE_ORB = 188173
GO_VEXALLUS_DOOR = 187896,
GO_SELIN_DOOR = 187979,
GO_SELIN_ENCOUNTER_DOOR = 188065,
GO_DELRISSA_DOOR = 187770,
GO_KAEL_DOOR = 188064,
GO_ESCAPE_ORB = 188173
};

View File

@@ -31,15 +31,15 @@
// Ours
enum eyeOfAcherus
{
EVENT_REMOVE_CONTROL = 1,
EVENT_SPEAK_1 = 2,
EVENT_LAUNCH = 3,
EVENT_REGAIN_CONTROL = 4,
EVENT_REMOVE_CONTROL = 1,
EVENT_SPEAK_1 = 2,
EVENT_LAUNCH = 3,
EVENT_REGAIN_CONTROL = 4,
EYE_TEXT_LAUNCH = 0,
EYE_TEXT_CONTROL = 1,
EYE_TEXT_LAUNCH = 0,
EYE_TEXT_CONTROL = 1,
SPELL_EYE_OF_ACHERUS_VISUAL = 51892,
SPELL_EYE_OF_ACHERUS_VISUAL = 51892,
};
class npc_eye_of_acherus : public CreatureScript
@@ -56,68 +56,68 @@ public:
{
npc_eye_of_acherusAI(Creature* creature) : NullCreatureAI(creature) { }
EventMap events;
EventMap events;
void InitializeAI()
{
events.Reset();
events.ScheduleEvent(EVENT_REMOVE_CONTROL, 500);
events.ScheduleEvent(EVENT_SPEAK_1, 4000);
events.ScheduleEvent(EVENT_LAUNCH, 7000);
void InitializeAI()
{
events.Reset();
events.ScheduleEvent(EVENT_REMOVE_CONTROL, 500);
events.ScheduleEvent(EVENT_SPEAK_1, 4000);
events.ScheduleEvent(EVENT_LAUNCH, 7000);
me->CastSpell(me, SPELL_EYE_OF_ACHERUS_VISUAL, true);
}
me->CastSpell(me, SPELL_EYE_OF_ACHERUS_VISUAL, true);
}
void MovementInform(uint32 type, uint32 point)
{
if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized())
events.ScheduleEvent(EVENT_REGAIN_CONTROL, 1000);
}
void MovementInform(uint32 type, uint32 point)
{
if (type == ESCORT_MOTION_TYPE && me->movespline->Finalized())
events.ScheduleEvent(EVENT_REGAIN_CONTROL, 1000);
}
void SetControl(Player* player, bool on)
{
WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, me->GetPackGUID().size()+1);
data.append(me->GetPackGUID());
data << uint8(on ? 1 : 0);
player->GetSession()->SendPacket(&data);
}
void SetControl(Player* player, bool on)
{
WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, me->GetPackGUID().size()+1);
data.append(me->GetPackGUID());
data << uint8(on ? 1 : 0);
player->GetSession()->SendPacket(&data);
}
void JustSummoned(Creature* creature)
{
if (Unit* target = creature->SelectNearbyTarget())
creature->AI()->AttackStart(target);
}
void JustSummoned(Creature* creature)
{
if (Unit* target = creature->SelectNearbyTarget())
creature->AI()->AttackStart(target);
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_REMOVE_CONTROL:
if (Player* player = me->GetCharmerOrOwnerPlayerOrPlayerItself())
SetControl(player, false);
break;
case EVENT_SPEAK_1:
Talk(EYE_TEXT_LAUNCH, me->GetCharmerOrOwnerPlayerOrPlayerItself());
break;
case EVENT_LAUNCH:
{
Movement::PointsArray path;
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
path.push_back(G3D::Vector3(me->GetPositionX()-40.0f, me->GetPositionY(), me->GetPositionZ()+10.0f));
path.push_back(G3D::Vector3(1768.0f, -5876.0f, 153.0f));
me->GetMotionMaster()->MoveSplinePath(&path);
break;
}
case EVENT_REGAIN_CONTROL:
if (Player* player = me->GetCharmerOrOwnerPlayerOrPlayerItself())
{
SetControl(player, true);
Talk(EYE_TEXT_CONTROL, player);
}
break;
}
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_REMOVE_CONTROL:
if (Player* player = me->GetCharmerOrOwnerPlayerOrPlayerItself())
SetControl(player, false);
break;
case EVENT_SPEAK_1:
Talk(EYE_TEXT_LAUNCH, me->GetCharmerOrOwnerPlayerOrPlayerItself());
break;
case EVENT_LAUNCH:
{
Movement::PointsArray path;
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
path.push_back(G3D::Vector3(me->GetPositionX()-40.0f, me->GetPositionY(), me->GetPositionZ()+10.0f));
path.push_back(G3D::Vector3(1768.0f, -5876.0f, 153.0f));
me->GetMotionMaster()->MoveSplinePath(&path);
break;
}
case EVENT_REGAIN_CONTROL:
if (Player* player = me->GetCharmerOrOwnerPlayerOrPlayerItself())
{
SetControl(player, true);
Talk(EYE_TEXT_CONTROL, player);
}
break;
}
}
};
};
@@ -132,9 +132,9 @@ class spell_q12641_death_comes_from_on_high_summon_ghouls : public SpellScriptLo
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitEffect(effIndex);
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 54522, true);
PreventHitEffect(effIndex);
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 54522, true);
}
void Register()
@@ -163,10 +163,10 @@ enum deathsChallenge
QUEST_DEATH_CHALLENGE = 12733,
FACTION_HOSTILE = 2068,
DATA_IN_PROGRESS = 0,
DATA_IN_PROGRESS = 0,
EVENT_SPEAK = 1, // 1 - 6
EVENT_DUEL_LOST = 7, // 7 - 8
EVENT_SPEAK = 1, // 1 - 6
EVENT_DUEL_LOST = 7, // 7 - 8
};
class npc_death_knight_initiate : public CreatureScript
@@ -184,8 +184,8 @@ public:
if (player->IsInCombat() || creature->IsInCombat())
return true;
if (creature->AI()->GetData(DATA_IN_PROGRESS))
return true;
if (creature->AI()->GetData(DATA_IN_PROGRESS))
return true;
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15);
@@ -206,8 +206,8 @@ public:
if (player->IsInCombat() || creature->IsInCombat())
return true;
if (!creature->AI()->GetData(player->GetGUIDLow()))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ACCEPT_DUEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
if (!creature->AI()->GetData(player->GetGUIDLow()))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ACCEPT_DUEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
}
@@ -223,23 +223,23 @@ public:
{
npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature) { }
bool _duelInProgress;
uint64 _duelGUID;
EventMap events;
std::set<uint32> playerGUIDs;
bool _duelInProgress;
uint64 _duelGUID;
EventMap events;
std::set<uint32> playerGUIDs;
uint32 GetData(uint32 data) const
{
if (data == DATA_IN_PROGRESS)
return _duelInProgress;
uint32 GetData(uint32 data) const
{
if (data == DATA_IN_PROGRESS)
return _duelInProgress;
return playerGUIDs.find(data) != playerGUIDs.end();
}
return playerGUIDs.find(data) != playerGUIDs.end();
}
void Reset()
{
_duelInProgress = false;
_duelGUID = 0;
_duelInProgress = false;
_duelGUID = 0;
me->RestoreFaction();
CombatAI::Reset();
@@ -250,37 +250,37 @@ public:
{
if (!_duelInProgress && pSpell->Id == SPELL_DUEL)
{
playerGUIDs.insert(caster->GetGUIDLow());
playerGUIDs.insert(caster->GetGUIDLow());
_duelGUID = caster->GetGUID();
_duelInProgress = true;
events.ScheduleEvent(EVENT_SPEAK, 3000);
events.ScheduleEvent(EVENT_SPEAK+1, 7000);
events.ScheduleEvent(EVENT_SPEAK+2, 8000);
events.ScheduleEvent(EVENT_SPEAK+3, 9000);
events.ScheduleEvent(EVENT_SPEAK+4, 10000);
events.ScheduleEvent(EVENT_SPEAK+5, 11000);
events.ScheduleEvent(EVENT_SPEAK, 3000);
events.ScheduleEvent(EVENT_SPEAK+1, 7000);
events.ScheduleEvent(EVENT_SPEAK+2, 8000);
events.ScheduleEvent(EVENT_SPEAK+3, 9000);
events.ScheduleEvent(EVENT_SPEAK+4, 10000);
events.ScheduleEvent(EVENT_SPEAK+5, 11000);
}
}
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (attacker && _duelInProgress && attacker->IsControlledByPlayer())
if (attacker && _duelInProgress && attacker->IsControlledByPlayer())
{
if (attacker->GetCharmerOrOwnerOrOwnGUID() != _duelGUID)
damage = 0;
else if (damage >= me->GetHealth())
{
damage = 0;
events.ScheduleEvent(EVENT_DUEL_LOST, 2000);
events.ScheduleEvent(EVENT_DUEL_LOST+1, 6000);
_duelGUID = 0;
_duelInProgress = 0;
if (attacker->GetCharmerOrOwnerOrOwnGUID() != _duelGUID)
damage = 0;
else if (damage >= me->GetHealth())
{
damage = 0;
events.ScheduleEvent(EVENT_DUEL_LOST, 2000);
events.ScheduleEvent(EVENT_DUEL_LOST+1, 6000);
_duelGUID = 0;
_duelInProgress = 0;
attacker->RemoveGameObject(SPELL_DUEL_FLAG, true);
attacker->AttackStop();
me->CombatStop(false);
me->RemoveAllAuras();
me->CombatStop(false);
me->RemoveAllAuras();
me->CastSpell(attacker, SPELL_DUEL_VICTORY, true);
me->RestoreFaction();
}
@@ -289,43 +289,43 @@ public:
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SPEAK:
Talk(SAY_DUEL, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+1:
Talk(SAY_DUEL+1, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+2:
Talk(SAY_DUEL+2, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+3:
Talk(SAY_DUEL+3, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+4:
Talk(SAY_DUEL+4, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+5:
me->setFaction(FACTION_HOSTILE);
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SPEAK:
Talk(SAY_DUEL, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+1:
Talk(SAY_DUEL+1, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+2:
Talk(SAY_DUEL+2, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+3:
Talk(SAY_DUEL+3, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+4:
Talk(SAY_DUEL+4, ObjectAccessor::GetPlayer(*me, _duelGUID));
break;
case EVENT_SPEAK+5:
me->setFaction(FACTION_HOSTILE);
if (Player* player = ObjectAccessor::GetPlayer(*me, _duelGUID))
AttackStart(player);
return;
case EVENT_DUEL_LOST:
me->CastSpell(me, 7267, true);
break;
case EVENT_DUEL_LOST+1:
EnterEvadeMode();
return;
}
return;
case EVENT_DUEL_LOST:
me->CastSpell(me, 7267, true);
break;
case EVENT_DUEL_LOST+1:
EnterEvadeMode();
return;
}
if (!events.Empty() || !UpdateVictim())
return;
if (!events.Empty() || !UpdateVictim())
return;
if (_duelInProgress)
{
if (me->GetVictim()->GetGUID() == _duelGUID && me->GetVictim()->HealthBelowPct(10))
if (me->GetVictim()->GetGUID() == _duelGUID && me->GetVictim()->HealthBelowPct(10))
{
me->GetVictim()->CastSpell(me->GetVictim(), 7267, true); // beg
me->GetVictim()->RemoveGameObject(SPELL_DUEL_FLAG, true);
@@ -341,19 +341,19 @@ public:
enum GiftOfTheHarvester
{
NPC_GHOUL = 28845,
MAX_GHOULS = 5,
NPC_GHOUL = 28845,
MAX_GHOULS = 5,
SPELL_GHOUL_EMERGE = 50142,
SPELL_SUMMON_SCARLET_GHOST = 52505,
SPELL_GHOUL_SUBMERGE = 26234,
SPELL_GHOUL_EMERGE = 50142,
SPELL_SUMMON_SCARLET_GHOST = 52505,
SPELL_GHOUL_SUBMERGE = 26234,
EVENT_GHOUL_RESTORE_STATE = 1,
EVENT_GHOUL_CHECK_COMBAT = 2,
EVENT_GHOUL_EMOTE = 3,
EVENT_GHOUL_MOVE_TO_PIT = 4,
EVENT_GHOUL_RESTORE_STATE = 1,
EVENT_GHOUL_CHECK_COMBAT = 2,
EVENT_GHOUL_EMOTE = 3,
EVENT_GHOUL_MOVE_TO_PIT = 4,
SAY_GOTHIK_PIT = 0
SAY_GOTHIK_PIT = 0
};
class spell_item_gift_of_the_harvester : public SpellScriptLoader
@@ -399,15 +399,15 @@ class spell_q12698_the_gift_that_keeps_on_giving : public SpellScriptLoader
{
PrepareSpellScript(spell_q12698_the_gift_that_keeps_on_giving_SpellScript);
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (GetOriginalCaster() && GetHitUnit())
if (GetOriginalCaster() && GetHitUnit())
GetOriginalCaster()->CastSpell(GetHitUnit(), urand(0, 1) ? GetEffectValue() : SPELL_SUMMON_SCARLET_GHOST, true);
}
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnEffectHitTarget += SpellEffectFn(spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
@@ -433,79 +433,79 @@ public:
{
}
EventMap events;
uint64 gothikGUID;
EventMap events;
uint64 gothikGUID;
void InitializeAI()
{
gothikGUID = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
ScriptedAI::InitializeAI();
me->SetReactState(REACT_PASSIVE);
void InitializeAI()
{
gothikGUID = 0;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
ScriptedAI::InitializeAI();
me->SetReactState(REACT_PASSIVE);
events.ScheduleEvent(EVENT_GHOUL_EMOTE, 1);
events.ScheduleEvent(EVENT_GHOUL_RESTORE_STATE, 3500);
}
events.ScheduleEvent(EVENT_GHOUL_EMOTE, 1);
events.ScheduleEvent(EVENT_GHOUL_RESTORE_STATE, 3500);
}
void OwnerAttackedBy(Unit* attacker)
{
if (!me->IsInCombat() && me->GetReactState() == REACT_DEFENSIVE)
AttackStart(attacker);
}
void OwnerAttackedBy(Unit* attacker)
{
if (!me->IsInCombat() && me->GetReactState() == REACT_DEFENSIVE)
AttackStart(attacker);
}
void SetGUID(uint64 guid, int32)
{
gothikGUID = guid;
events.ScheduleEvent(EVENT_GHOUL_MOVE_TO_PIT, 3000);
me->GetMotionMaster()->Clear(false);
}
void SetGUID(uint64 guid, int32)
{
gothikGUID = guid;
events.ScheduleEvent(EVENT_GHOUL_MOVE_TO_PIT, 3000);
me->GetMotionMaster()->Clear(false);
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == 1)
{
me->DespawnOrUnsummon(1500);
me->CastSpell(me, SPELL_GHOUL_SUBMERGE, true);
}
}
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == 1)
{
me->DespawnOrUnsummon(1500);
me->CastSpell(me, SPELL_GHOUL_SUBMERGE, true);
}
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_GHOUL_MOVE_TO_PIT:
me->GetMotionMaster()->MovePoint(1, 2364.77f, -5776.14f, 151.36f);
if (Creature* gothik = ObjectAccessor::GetCreature(*me, gothikGUID))
gothik->AI()->DoAction(SAY_GOTHIK_PIT);
events.PopEvent();
break;
case EVENT_GHOUL_EMOTE:
me->CastSpell(me, SPELL_GHOUL_EMERGE, true);
events.PopEvent();
break;
case EVENT_GHOUL_RESTORE_STATE:
me->SetReactState(REACT_DEFENSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself())
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, frand(0.0f, 2*M_PI));
events.PopEvent();
events.ScheduleEvent(EVENT_GHOUL_CHECK_COMBAT, 1000);
return;
case EVENT_GHOUL_CHECK_COMBAT:
if (!me->IsInCombat())
if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself())
if (owner->GetVictim())
AttackStart(owner->GetVictim());
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_GHOUL_MOVE_TO_PIT:
me->GetMotionMaster()->MovePoint(1, 2364.77f, -5776.14f, 151.36f);
if (Creature* gothik = ObjectAccessor::GetCreature(*me, gothikGUID))
gothik->AI()->DoAction(SAY_GOTHIK_PIT);
events.PopEvent();
break;
case EVENT_GHOUL_EMOTE:
me->CastSpell(me, SPELL_GHOUL_EMERGE, true);
events.PopEvent();
break;
case EVENT_GHOUL_RESTORE_STATE:
me->SetReactState(REACT_DEFENSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself())
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, frand(0.0f, 2*M_PI));
events.PopEvent();
events.ScheduleEvent(EVENT_GHOUL_CHECK_COMBAT, 1000);
return;
case EVENT_GHOUL_CHECK_COMBAT:
if (!me->IsInCombat())
if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself())
if (owner->GetVictim())
AttackStart(owner->GetVictim());
events.RepeatEvent(1000);
return;
}
if (!UpdateVictim())
return;
events.RepeatEvent(1000);
return;
}
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
};
};
@@ -524,22 +524,22 @@ public:
{
npc_dkc1_gothikAI(Creature* creature) : ScriptedAI(creature) { spoken = 0; }
int32 spoken;
int32 spoken;
void DoAction(int32 action)
{
if (action == SAY_GOTHIK_PIT && spoken <= 0)
{
spoken = 5000;
Talk(SAY_GOTHIK_PIT);
}
}
void DoAction(int32 action)
{
if (action == SAY_GOTHIK_PIT && spoken <= 0)
{
spoken = 5000;
Talk(SAY_GOTHIK_PIT);
}
}
void MoveInLineOfSight(Unit* who)
{
ScriptedAI::MoveInLineOfSight(who);
if (!who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC) && who->GetEntry() == NPC_GHOUL && me->IsWithinDistInMap(who, 10.0f))
if (!who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC) && who->GetEntry() == NPC_GHOUL && me->IsWithinDistInMap(who, 10.0f))
if (Unit* owner = who->GetOwner())
if (Player* player = owner->ToPlayer())
{
@@ -547,18 +547,18 @@ public:
if (player->GetQuestStatus(12698) == QUEST_STATUS_INCOMPLETE)
creature->CastSpell(owner, 52517, true);
creature->AI()->SetGUID(me->GetGUID());
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
creature->AI()->SetGUID(me->GetGUID());
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
}
}
void UpdateAI(uint32 diff)
{
if (spoken > 0)
spoken -= diff;
void UpdateAI(uint32 diff)
{
if (spoken > 0)
spoken -= diff;
ScriptedAI::UpdateAI(diff);
}
ScriptedAI::UpdateAI(diff);
}
};
};
@@ -574,34 +574,34 @@ public:
struct npc_scarlet_cannonAI : public VehicleAI
{
npc_scarlet_cannonAI(Creature* creature) : VehicleAI(creature) { summonAttackers = 0; }
npc_scarlet_cannonAI(Creature* creature) : VehicleAI(creature) { summonAttackers = 0; }
uint32 summonAttackers;
void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply)
{
summonAttackers = apply ? 8000 : 0;
}
uint32 summonAttackers;
void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply)
{
summonAttackers = apply ? 8000 : 0;
}
void UpdateAI(uint32 diff)
{
VehicleAI::UpdateAI(diff);
void UpdateAI(uint32 diff)
{
VehicleAI::UpdateAI(diff);
if (summonAttackers)
{
summonAttackers += diff;
if (summonAttackers >= 15000)
{
for (uint8 i = 0; i < 15; ++i)
if (Creature* summon = me->SummonCreature(28834 /*NPC_SCARLET_FLEET_DEFENDER*/, 2192.56f+irand(-10, 10), -6147.90f+irand(-10, 10), 5.2f, 4.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 45000))
{
summon->SetHomePosition(me->GetHomePosition());
summon->AI()->AttackStart(me);
}
if (summonAttackers)
{
summonAttackers += diff;
if (summonAttackers >= 15000)
{
for (uint8 i = 0; i < 15; ++i)
if (Creature* summon = me->SummonCreature(28834 /*NPC_SCARLET_FLEET_DEFENDER*/, 2192.56f+irand(-10, 10), -6147.90f+irand(-10, 10), 5.2f, 4.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 45000))
{
summon->SetHomePosition(me->GetHomePosition());
summon->AI()->AttackStart(me);
}
summonAttackers = 1;
}
}
}
summonAttackers = 1;
}
}
}
};
};
@@ -924,7 +924,7 @@ public:
npc_scarlet_miner_cartAI(Creature* creature) : PassiveAI(creature), minerGUID(0)
{
me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->setFaction(35);
me->setFaction(35);
me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); // Modelid2 is a horse.
}
@@ -946,14 +946,14 @@ public:
me->SetSpeed(MOVE_RUN, 1.25f);
me->GetMotionMaster()->MoveFollow(miner, 1.0f, 0);
me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->setFaction(35);
}
}
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply)
{
who->SetVisible(!apply);
who->SetVisible(!apply);
if (!apply)
if (Creature* miner = ObjectAccessor::GetCreature(*me, minerGUID))
miner->DisappearAndDie();
@@ -1129,8 +1129,8 @@ public:
car->AI()->SetGUID(miner->GetGUID());
CAST_AI(npc_scarlet_miner::npc_scarlet_minerAI, miner->AI())->InitCartQuest(player);
}
}
}
}
}
}
return true;
}
@@ -1139,17 +1139,17 @@ public:
void AddSC_the_scarlet_enclave_c1()
{
// Ours
new npc_eye_of_acherus();
new spell_q12641_death_comes_from_on_high_summon_ghouls();
new npc_death_knight_initiate();
// Ours
new npc_eye_of_acherus();
new spell_q12641_death_comes_from_on_high_summon_ghouls();
new npc_death_knight_initiate();
new spell_item_gift_of_the_harvester();
new spell_q12698_the_gift_that_keeps_on_giving();
new spell_q12698_the_gift_that_keeps_on_giving();
new npc_scarlet_ghoul();
new npc_dkc1_gothik();
new npc_scarlet_cannon();
new npc_dkc1_gothik();
new npc_scarlet_cannon();
// Theirs
// Theirs
new npc_unworthy_initiate();
new npc_unworthy_initiate_anchor();
new go_acherus_soul_prison();

View File

@@ -26,7 +26,7 @@
// texts signed for creature 28939 but used for 28939, 28940, 28610
enum win_friends
{
SAY_AGGRO = 0,
SAY_AGGRO = 0,
SAY_CRUSADER = 1,
SAY_PERSUADED1 = 2,
SAY_PERSUADED2 = 3,
@@ -67,11 +67,11 @@ public:
me->RestoreFaction();
}
void EnterCombat(Unit*)
{
if (roll_chance_i(33))
Talk(SAY_AGGRO);
}
void EnterCombat(Unit*)
{
if (roll_chance_i(33))
Talk(SAY_AGGRO);
}
void SpellHit(Unit* caster, const SpellInfo* spell)
{
@@ -154,7 +154,7 @@ public:
return;
}
CombatAI::UpdateAI(diff);
CombatAI::UpdateAI(diff);
}
};
@@ -200,7 +200,7 @@ public:
if (quest->GetQuestId() == QUEST_BREAKOUT)
{
creature->SetStandState(UNIT_STAND_STATE_STAND);
creature->setActive(true);
creature->setActive(true);
if (npc_escortAI* pEscortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
pEscortAI->Start(false, false, player->GetGUID());
@@ -223,7 +223,7 @@ public:
uint32 m_uiWave;
uint32 m_uiWave_Timer;
uint64 m_uiValrothGUID;
SummonList summons;
SummonList summons;
void Reset()
{
@@ -235,38 +235,38 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->LoadEquipment(0, true);
me->RemoveAllAuras();
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ALL, true);
summons.DespawnAll();
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ALL, true);
summons.DespawnAll();
}
}
void EnterEvadeMode()
{
me->DeleteThreatList();
me->CombatStop(false);
me->SetLootRecipient(NULL);
void EnterEvadeMode()
{
me->DeleteThreatList();
me->CombatStop(false);
me->SetLootRecipient(NULL);
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
AddEscortState(STATE_ESCORT_RETURNING);
ReturnToLastPoint();
;//sLog->outDebug(LOG_FILTER_TSCR, "TSCR: EscortAI has left combat and is now returning to last point");
}
else
{
me->GetMotionMaster()->MoveTargetedHome();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
Reset();
}
}
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
AddEscortState(STATE_ESCORT_RETURNING);
ReturnToLastPoint();
;//sLog->outDebug(LOG_FILTER_TSCR, "TSCR: EscortAI has left combat and is now returning to last point");
}
else
{
me->GetMotionMaster()->MoveTargetedHome();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
Reset();
}
}
void AttackStart(Unit* who)
{
if (HasEscortState(STATE_ESCORT_PAUSED))
return;
void AttackStart(Unit* who)
{
if (HasEscortState(STATE_ESCORT_PAUSED))
return;
npc_escortAI::AttackStart(who);
}
npc_escortAI::AttackStart(who);
}
void WaypointReached(uint32 waypointId)
{
@@ -292,7 +292,7 @@ public:
DoCast(me, SPELL_ANTI_MAGIC_ZONE); // cast again that makes bubble up
break;
case 4:
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, false);
SetRun(true);
break;
case 9:
@@ -314,7 +314,7 @@ public:
summoned->AddThreat(me, 0.0f);
summoned->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
summons.Summon(summoned);
summons.Summon(summoned);
}
void SummonAcolyte(uint32 uiAmount)
@@ -1066,15 +1066,15 @@ class spell_q12779_an_end_to_all_things : public SpellScriptLoader
{
PrepareSpellScript(spell_q12779_an_end_to_all_things_SpellScript);
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (GetHitUnit())
if (GetHitUnit())
GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true);
}
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_q12779_an_end_to_all_things_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnEffectHitTarget += SpellEffectFn(spell_q12779_an_end_to_all_things_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
@@ -1092,6 +1092,6 @@ void AddSC_the_scarlet_enclave_c2()
new npc_high_inquisitor_valroth();
new npc_a_special_surprise();
// Xinef: Should be in chapter III
new spell_q12779_an_end_to_all_things();
// Xinef: Should be in chapter III
new spell_q12779_an_end_to_all_things();
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,18 +7,18 @@ REWRITTEN BY XINEF
class instance_scarlet_monastery : public InstanceMapScript
{
public:
instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { }
public:
instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_scarlet_monastery_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_scarlet_monastery_InstanceMapScript(map);
}
struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript
{
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map) {}
};
struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript
{
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map) {}
};
};
void AddSC_instance_scarlet_monastery()

View File

@@ -44,8 +44,8 @@ enum Misc
WEAPON_KIRTONOS_STAFF = 11365,
POINT_KIRTONOS_LAND = 13,
KIRTONOS_PATH = 105061,
EMOTE_SUMMONED = 0
EMOTE_SUMMONED = 0
};
Position const PosMove[2] =
@@ -61,20 +61,20 @@ class boss_kirtonos_the_herald : public CreatureScript
struct boss_kirtonos_the_heraldAI : public ScriptedAI
{
boss_kirtonos_the_heraldAI(Creature* creature) : ScriptedAI(creature)
{
instance = me->GetInstanceScript();
}
{
instance = me->GetInstanceScript();
}
EventMap events;
EventMap events2;
InstanceScript* instance;
EventMap events;
EventMap events2;
InstanceScript* instance;
void EnterCombat(Unit* /*who*/)
{
events.Reset();
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000);
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000);
events.ScheduleEvent(EVENT_DOMINATE_MIND, 20000);
events.Reset();
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000);
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000);
events.ScheduleEvent(EVENT_DOMINATE_MIND, 20000);
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 5000);
}
@@ -83,7 +83,7 @@ class boss_kirtonos_the_herald : public CreatureScript
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
gate->SetGoState(GO_STATE_ACTIVE);
instance->SetData(DATA_KIRTONOS_THE_HERALD, DONE);
instance->SetData(DATA_KIRTONOS_THE_HERALD, DONE);
}
void EnterEvadeMode()
@@ -91,13 +91,13 @@ class boss_kirtonos_the_herald : public CreatureScript
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
gate->SetGoState(GO_STATE_ACTIVE);
instance->SetData(DATA_KIRTONOS_THE_HERALD, NOT_STARTED);
instance->SetData(DATA_KIRTONOS_THE_HERALD, NOT_STARTED);
me->DespawnOrUnsummon(1);
}
void IsSummonedBy(Unit* /*summoner*/)
{
events2.Reset();
events2.Reset();
events2.ScheduleEvent(INTRO_1, 500);
me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE);
@@ -108,13 +108,13 @@ class boss_kirtonos_the_herald : public CreatureScript
void MovementInform(uint32 type, uint32 id)
{
if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND)
{
{
events2.ScheduleEvent(INTRO_2, 1500);
events2.ScheduleEvent(INTRO_3, 2500);
events2.ScheduleEvent(INTRO_4, 5500);
events2.ScheduleEvent(INTRO_5, 6500);
events2.ScheduleEvent(INTRO_6, 11500);
}
}
}
void UpdateAI(uint32 diff)
@@ -153,18 +153,18 @@ class boss_kirtonos_the_herald : public CreatureScript
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SWOOP:
me->CastSpell(me->GetVictim(), SPELL_SWOOP, false);
me->CastSpell(me->GetVictim(), SPELL_SWOOP, false);
events.ScheduleEvent(EVENT_SWOOP, 15000);
break;
case EVENT_WING_FLAP:
me->CastSpell(me, SPELL_WING_FLAP, false);
me->CastSpell(me, SPELL_WING_FLAP, false);
events.ScheduleEvent(EVENT_WING_FLAP, 13000);
break;
case EVENT_PIERCE_ARMOR:
@@ -180,28 +180,28 @@ class boss_kirtonos_the_herald : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 10000);
break;
case EVENT_CURSE_OF_TONGUES:
me->CastSpell(me, SPELL_CURSE_OF_TONGUES, false);
me->CastSpell(me, SPELL_CURSE_OF_TONGUES, false);
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 20000);
break;
case EVENT_DOMINATE_MIND:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true))
me->CastSpell(target, SPELL_DOMINATE_MIND, false);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true))
me->CastSpell(target, SPELL_DOMINATE_MIND, false);
events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(44000, 48000));
break;
case EVENT_KIRTONOS_TRANSFORM:
if (me->HealthBelowPct(50))
{
events.Reset();
events.ScheduleEvent(EVENT_SWOOP, 4000);
events.ScheduleEvent(EVENT_WING_FLAP, 7000);
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 11000);
events.ScheduleEvent(EVENT_DISARM, 15000);
if (me->HealthBelowPct(50))
{
events.Reset();
events.ScheduleEvent(EVENT_SWOOP, 4000);
events.ScheduleEvent(EVENT_WING_FLAP, 7000);
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 11000);
events.ScheduleEvent(EVENT_DISARM, 15000);
me->RemoveAura(SPELL_KIRTONOS_TRANSFORM);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
break;
break;
}
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 2000);
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 2000);
break;
}

View File

@@ -29,8 +29,8 @@ class instance_scholomance : public InstanceMapScript
GateRavenianGUID = 0;
GateBarovGUID = 0;
GateIlluciaGUID = 0;
_kirtonosState = 0;
_miniBosses = 0;
_kirtonosState = 0;
_miniBosses = 0;
}
void OnGameObjectCreate(GameObject* go)
@@ -84,32 +84,32 @@ class instance_scholomance : public InstanceMapScript
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_KIRTONOS_THE_HERALD:
_kirtonosState = data;
break;
case DATA_MINI_BOSSES:
++_miniBosses;
break;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_KIRTONOS_THE_HERALD:
_kirtonosState = data;
break;
case DATA_MINI_BOSSES:
++_miniBosses;
break;
}
SaveToDB();
}
SaveToDB();
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case DATA_KIRTONOS_THE_HERALD:
return _kirtonosState;
case DATA_MINI_BOSSES:
return _miniBosses;
}
return 0;
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case DATA_KIRTONOS_THE_HERALD:
return _kirtonosState;
case DATA_MINI_BOSSES:
return _miniBosses;
}
return 0;
}
std::string GetSaveData()
{
@@ -130,10 +130,10 @@ class instance_scholomance : public InstanceMapScript
if (dataHead1 == 'S' && dataHead2 == 'O')
{
loadStream >> _kirtonosState;
loadStream >> _miniBosses;
loadStream >> _miniBosses;
if (_kirtonosState == IN_PROGRESS)
_kirtonosState = NOT_STARTED;
if (_kirtonosState == IN_PROGRESS)
_kirtonosState = NOT_STARTED;
}
}
@@ -146,8 +146,8 @@ class instance_scholomance : public InstanceMapScript
uint64 GateBarovGUID;
uint64 GateIlluciaGUID;
uint32 _kirtonosState;
uint32 _miniBosses;
uint32 _kirtonosState;
uint32 _miniBosses;
};
};
@@ -163,15 +163,15 @@ class spell_scholomance_fixate : public SpellScriptLoader
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (Unit* caster = GetCaster())
caster->TauntApply(target);
if (Unit* caster = GetCaster())
caster->TauntApply(target);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (Unit* caster = GetCaster())
caster->TauntFadeOut(target);
if (Unit* caster = GetCaster())
caster->TauntFadeOut(target);
}
void Register()
@@ -221,28 +221,28 @@ class spell_kormok_summon_bone_minions : SpellScriptLoader
public:
spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { }
class spell_kormok_summon_bone_minionsSpellScript : public SpellScript
{
PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript);
class spell_kormok_summon_bone_minionsSpellScript : public SpellScript
{
PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript);
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
for (uint32 i = 0; i < 4; ++i)
GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MINION1+i, true);
}
for (uint32 i = 0; i < 4; ++i)
GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_BONE_MINION1+i, true);
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_kormok_summon_bone_minionsSpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_kormok_summon_bone_minionsSpellScript();
}
};
enum Rooms
@@ -253,7 +253,7 @@ enum Rooms
ROOM_THE_SHADOW_VAULT = 3,
ROOM_BAROV_FAMILY_VAULT = 4,
ROOM_VAULT_OF_THE_RAVENIAN = 5,
ROOM_MAX = 6
ROOM_MAX = 6
};
class spell_scholomance_shadow_portal : public SpellScriptLoader
@@ -265,15 +265,15 @@ class spell_scholomance_shadow_portal : public SpellScriptLoader
{
PrepareSpellScript(spell_scholomance_shadow_portal_SpellScript);
bool Load()
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
bool Load()
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Creature* caster = GetCaster()->ToCreature();
uint8 attempts = 0;
uint8 attempts = 0;
uint8 room = urand(ROOM_HALL_OF_SECRETS, ROOM_VAULT_OF_THE_RAVENIAN);
uint32 spellId = 0;
@@ -284,51 +284,51 @@ class spell_scholomance_shadow_portal : public SpellScriptLoader
case ROOM_HALL_OF_SECRETS:
if (InstanceScript* instance = caster->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_RAVENIAN)))
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS;
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS;
break;
case ROOM_HALL_OF_THE_DAMNED:
if (InstanceScript* instance = caster->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_THEOLEN)))
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED;
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED;
break;
case ROOM_THE_COVEN:
if (InstanceScript* instance = caster->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_MALICIA)))
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_THECOVEN;
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_THECOVEN;
break;
case ROOM_THE_SHADOW_VAULT:
if (InstanceScript* instance = caster->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_ILLUCIA)))
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT;
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT;
break;
case ROOM_BAROV_FAMILY_VAULT:
if (InstanceScript* instance = caster->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_BAROV)))
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT;
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT;
break;
case ROOM_VAULT_OF_THE_RAVENIAN:
if (InstanceScript* instance = caster->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(GO_GATE_POLKELT)))
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN;
if (gate->GetGoState() == GO_STATE_ACTIVE)
spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN;
break;
}
if (spellId)
{
{
caster->CastSpell(GetHitUnit(), spellId, true);
break;
}
else
{
room = (++room)%ROOM_MAX;
++attempts;
}
break;
}
else
{
room = (++room)%ROOM_MAX;
++attempts;
}
}
}
@@ -381,14 +381,14 @@ class spell_scholomance_shadow_portal_rooms : public SpellScriptLoader
{
PrepareSpellScript(spell_scholomance_shadow_portal_rooms_SpellScript);
bool Load()
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
bool Load()
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
void HandleSendEvent(SpellEffIndex effIndex)
{
PreventHitEffect(effIndex);
PreventHitEffect(effIndex);
Creature* caster = GetCaster()->ToCreature();
uint8 summonPos = 0;
@@ -435,10 +435,10 @@ class spell_scholomance_shadow_portal_rooms : public SpellScriptLoader
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, instance->GetData64(gateId)))
{
{
gate->SetGoState(GO_STATE_READY);
gate->AI()->SetData(1, 1);
}
gate->AI()->SetData(1, 1);
}
}
}
@@ -457,9 +457,9 @@ class spell_scholomance_shadow_portal_rooms : public SpellScriptLoader
void AddSC_instance_scholomance()
{
new instance_scholomance();
new spell_scholomance_fixate();
new spell_kormok_summon_bone_mages();
new spell_kormok_summon_bone_minions();
new spell_scholomance_shadow_portal();
new spell_scholomance_shadow_portal_rooms();
new spell_scholomance_fixate();
new spell_kormok_summon_bone_mages();
new spell_kormok_summon_bone_minions();
new spell_scholomance_shadow_portal();
new spell_scholomance_shadow_portal_rooms();
}

View File

@@ -8,7 +8,7 @@ REWRITTEN BY XINEF
enum DataTypes
{
DATA_KIRTONOS_THE_HERALD = 0,
DATA_MINI_BOSSES = 1
DATA_MINI_BOSSES = 1
};
enum CreatureIds
@@ -29,22 +29,22 @@ enum GameobjectIds
enum SpellIds
{
SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696,
SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697,
SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698,
SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699,
SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696,
SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697,
SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698,
SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699,
SPELL_SUMMON_BONE_MINION1 = 27690,
SPELL_SUMMON_BONE_MINION2 = 27691,
SPELL_SUMMON_BONE_MINION3 = 27692,
SPELL_SUMMON_BONE_MINION4 = 27693,
SPELL_SUMMON_BONE_MINION1 = 27690,
SPELL_SUMMON_BONE_MINION2 = 27691,
SPELL_SUMMON_BONE_MINION3 = 27692,
SPELL_SUMMON_BONE_MINION4 = 27693,
SPELL_SHADOW_PORTAL_HALLOFSECRETS = 17863,
SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED = 17939,
SPELL_SHADOW_PORTAL_THECOVEN = 17943,
SPELL_SHADOW_PORTAL_THESHADOWVAULT = 17944,
SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT = 17946,
SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN = 17948
SPELL_SHADOW_PORTAL_HALLOFSECRETS = 17863,
SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED = 17939,
SPELL_SHADOW_PORTAL_THECOVEN = 17943,
SPELL_SHADOW_PORTAL_THESHADOWVAULT = 17944,
SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT = 17946,
SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN = 17948
};
#endif

View File

@@ -20,86 +20,86 @@ enum Creatures
class instance_shadowfang_keep : public InstanceMapScript
{
public:
instance_shadowfang_keep() : InstanceMapScript("instance_shadowfang_keep", 33) { }
public:
instance_shadowfang_keep() : InstanceMapScript("instance_shadowfang_keep", 33) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_shadowfang_keep_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_shadowfang_keep_InstanceMapScript(map);
}
struct instance_shadowfang_keep_InstanceMapScript : public InstanceScript
{
instance_shadowfang_keep_InstanceMapScript(Map* map) : InstanceScript(map) { }
struct instance_shadowfang_keep_InstanceMapScript : public InstanceScript
{
instance_shadowfang_keep_InstanceMapScript(Map* map) : InstanceScript(map) { }
void Initialize()
{
memset(&_encounters, 0, sizeof(_encounters));
}
void Initialize()
{
memset(&_encounters, 0, sizeof(_encounters));
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_COURTYARD_DOOR:
if (_encounters[TYPE_COURTYARD] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_SORCERER_DOOR:
if (_encounters[TYPE_FENRUS_THE_DEVOURER] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_ARUGAL_DOOR:
if (_encounters[TYPE_WOLF_MASTER_NANDOS] == DONE)
HandleGameObject(0, true, gameobject);
break;
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_COURTYARD_DOOR:
if (_encounters[TYPE_COURTYARD] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_SORCERER_DOOR:
if (_encounters[TYPE_FENRUS_THE_DEVOURER] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_ARUGAL_DOOR:
if (_encounters[TYPE_WOLF_MASTER_NANDOS] == DONE)
HandleGameObject(0, true, gameobject);
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_COURTYARD:
case TYPE_FENRUS_THE_DEVOURER:
case TYPE_WOLF_MASTER_NANDOS:
_encounters[type] = data;
break;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_COURTYARD:
case TYPE_FENRUS_THE_DEVOURER:
case TYPE_WOLF_MASTER_NANDOS:
_encounters[type] = data;
break;
}
if (data == DONE)
SaveToDB();
}
if (data == DONE)
SaveToDB();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "S K " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2];
return saveStream.str();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "S K " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2];
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
return;
void Load(const char* in)
{
if (!in)
return;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'K')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'K')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
private:
uint32 _encounters[MAX_ENCOUNTERS];
};
private:
uint32 _encounters[MAX_ENCOUNTERS];
};
};
@@ -144,8 +144,8 @@ class spell_shadowfang_keep_haunting_spirits : public SpellScriptLoader
enum ForsakenSpells
{
SPELL_FORSAKEN_SKILL_SWORD = 7038,
SPELL_FORSAKEN_SKILL_SHADOW = 7053
SPELL_FORSAKEN_SKILL_SWORD = 7038,
SPELL_FORSAKEN_SKILL_SHADOW = 7053
};
class spell_shadowfang_keep_forsaken_skills : public SpellScriptLoader
@@ -157,38 +157,38 @@ class spell_shadowfang_keep_forsaken_skills : public SpellScriptLoader
{
PrepareAuraScript(spell_shadowfang_keep_forsaken_skills_AuraScript);
bool Load()
{
_forsakenSpell = 0;
return true;
}
bool Load()
{
_forsakenSpell = 0;
return true;
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
_forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW);
if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1)
++_forsakenSpell;
GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true);
}
{
_forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW);
if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1)
++_forsakenSpell;
GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true);
}
void HandleDummyTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
GetUnitOwner()->RemoveAurasDueToSpell(_forsakenSpell);
_forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW);
if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1)
++_forsakenSpell;
GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true);
PreventDefaultAction();
GetUnitOwner()->RemoveAurasDueToSpell(_forsakenSpell);
_forsakenSpell = urand(SPELL_FORSAKEN_SKILL_SWORD, SPELL_FORSAKEN_SKILL_SHADOW);
if (_forsakenSpell == SPELL_FORSAKEN_SKILL_SHADOW - 1)
++_forsakenSpell;
GetUnitOwner()->CastSpell(GetUnitOwner(), _forsakenSpell, true);
}
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
private:
uint32 _forsakenSpell;
private:
uint32 _forsakenSpell;
};
AuraScript* GetAuraScript() const
@@ -201,5 +201,5 @@ void AddSC_instance_shadowfang_keep()
{
new instance_shadowfang_keep();
new spell_shadowfang_keep_haunting_spirits();
new spell_shadowfang_keep_forsaken_skills();
new spell_shadowfang_keep_forsaken_skills();
}

View File

@@ -7,17 +7,17 @@ REWRITTEN BY XINEF
enum DataTypes
{
TYPE_COURTYARD = 0,
TYPE_FENRUS_THE_DEVOURER = 1,
TYPE_WOLF_MASTER_NANDOS = 2,
MAX_ENCOUNTERS = 3
TYPE_COURTYARD = 0,
TYPE_FENRUS_THE_DEVOURER = 1,
TYPE_WOLF_MASTER_NANDOS = 2,
MAX_ENCOUNTERS = 3
};
enum GameObjects
{
GO_COURTYARD_DOOR = 18895,
GO_SORCERER_DOOR = 18972,
GO_ARUGAL_DOOR = 18971
GO_COURTYARD_DOOR = 18895,
GO_SORCERER_DOOR = 18972,
GO_ARUGAL_DOOR = 18971
};
#endif

View File

@@ -10,17 +10,17 @@ REWRITTEN BY XINEF
const Position BlackGuardPos[10] =
{
{4032.73f+0.0f, -3378.26f+0.0f, 119.76f, 4.67f},
{4032.73f+2.0f, -3378.26f+2.0f, 119.76f, 4.67f},
{4032.73f+2.0f, -3378.26f-2.0f, 119.76f, 4.67f},
{4032.73f-2.0f, -3378.26f+2.0f, 119.76f, 4.67f},
{4032.73f-2.0f, -3378.26f-2.0f, 119.76f, 4.67f},
{4032.73f+0.0f, -3407.38f+0.0f, 115.56f, 0.0f},
{4032.73f+2.0f, -3407.38f+2.0f, 115.56f, 0.0f},
{4032.73f+2.0f, -3407.38f-2.0f, 115.56f, 0.0f},
{4032.73f-2.0f, -3407.38f+2.0f, 115.56f, 0.0f},
{4032.73f-2.0f, -3407.38f-2.0f, 115.56f, 0.0f}
{4032.73f+0.0f, -3378.26f+0.0f, 119.76f, 4.67f},
{4032.73f+2.0f, -3378.26f+2.0f, 119.76f, 4.67f},
{4032.73f+2.0f, -3378.26f-2.0f, 119.76f, 4.67f},
{4032.73f-2.0f, -3378.26f+2.0f, 119.76f, 4.67f},
{4032.73f-2.0f, -3378.26f-2.0f, 119.76f, 4.67f},
{4032.73f+0.0f, -3407.38f+0.0f, 115.56f, 0.0f},
{4032.73f+2.0f, -3407.38f+2.0f, 115.56f, 0.0f},
{4032.73f+2.0f, -3407.38f-2.0f, 115.56f, 0.0f},
{4032.73f-2.0f, -3407.38f+2.0f, 115.56f, 0.0f},
{4032.73f-2.0f, -3407.38f-2.0f, 115.56f, 0.0f}
};
class instance_stratholme : public InstanceMapScript
@@ -36,33 +36,33 @@ class instance_stratholme : public InstanceMapScript
void Initialize()
{
_baronRunProgress = 0;
_baronRunTime = 0;
_zigguratState1 = 0;
_zigguratState2 = 0;
_zigguratState3 = 0;
_slaughterProgress = 0;
_slaughterNPCs = 0;
_postboxesOpened = 0;
_baronRunProgress = 0;
_baronRunTime = 0;
_zigguratState1 = 0;
_zigguratState2 = 0;
_zigguratState3 = 0;
_slaughterProgress = 0;
_slaughterNPCs = 0;
_postboxesOpened = 0;
_zigguratDoorsGUID1 = 0;
_zigguratDoorsGUID2 = 0;
_zigguratDoorsGUID3 = 0;
_zigguratDoorsGUID4 = 0;
_zigguratDoorsGUID5 = 0;
_gauntletGateGUID = 0;
_slaughterGateGUID = 0;
_baronRivendareGUID = 0;
_zigguratDoorsGUID1 = 0;
_zigguratDoorsGUID2 = 0;
_zigguratDoorsGUID3 = 0;
_zigguratDoorsGUID4 = 0;
_zigguratDoorsGUID5 = 0;
_gauntletGateGUID = 0;
_slaughterGateGUID = 0;
_baronRivendareGUID = 0;
events.Reset();
events.Reset();
}
void OnPlayerEnter(Player* player)
{
if (_baronRunTime > 0)
if (Aura* aura = player->AddAura(SPELL_BARON_ULTIMATUM, player))
aura->SetDuration(_baronRunTime*MINUTE*IN_MILLISECONDS);
}
void OnPlayerEnter(Player* player)
{
if (_baronRunTime > 0)
if (Aura* aura = player->AddAura(SPELL_BARON_ULTIMATUM, player))
aura->SetDuration(_baronRunTime*MINUTE*IN_MILLISECONDS);
}
void OnCreatureCreate(Creature* creature)
{
@@ -71,76 +71,76 @@ class instance_stratholme : public InstanceMapScript
case NPC_BARON_RIVENDARE:
_baronRivendareGUID = creature->GetGUID();
break;
case NPC_VENOM_BELCHER:
case NPC_BILE_SPEWER:
if (_slaughterProgress == 0)
++_slaughterNPCs;
break;
case NPC_RAMSTEIN_THE_GORGER:
if (_slaughterProgress == 1)
++_slaughterNPCs;
break;
case NPC_MINDLESS_UNDEAD:
if (_slaughterProgress == 2)
++_slaughterNPCs;
break;
case NPC_BLACK_GUARD:
if (_slaughterProgress == 3)
++_slaughterNPCs;
break;
case NPC_VENOM_BELCHER:
case NPC_BILE_SPEWER:
if (_slaughterProgress == 0)
++_slaughterNPCs;
break;
case NPC_RAMSTEIN_THE_GORGER:
if (_slaughterProgress == 1)
++_slaughterNPCs;
break;
case NPC_MINDLESS_UNDEAD:
if (_slaughterProgress == 2)
++_slaughterNPCs;
break;
case NPC_BLACK_GUARD:
if (_slaughterProgress == 3)
++_slaughterNPCs;
break;
}
}
void ProcessSlaughterEvent()
{
if (_slaughterProgress == 1)
{
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BRAON_SUMMON_RAMSTEIN);
void ProcessSlaughterEvent()
{
if (_slaughterProgress == 1)
{
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BRAON_SUMMON_RAMSTEIN);
Position pos = {4032.20f, -3378.06f, 119.75f, 4.67f};
instance->SummonCreature(NPC_RAMSTEIN_THE_GORGER, pos);
}
if (_slaughterProgress == 2)
{
for (uint32 i = 0; i < 33; ++i)
events.ScheduleEvent(EVENT_SPAWN_MINDLESS, 5000 + i*210);
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
if (GameObject* gate = baron->FindNearestGameObject(GO_SLAUGHTER_GATE_SIDE, 200.0f))
gate->SetGoState(GO_STATE_ACTIVE);
}
if (_slaughterProgress == 3)
{
events.ScheduleEvent(EVENT_SPAWN_BLACK_GUARD, 20000);
}
if (_slaughterProgress == 4)
{
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BARON_GUARD_DEAD);
if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5))
gate->SetGoState(GO_STATE_ACTIVE);
Position pos = {4032.20f, -3378.06f, 119.75f, 4.67f};
instance->SummonCreature(NPC_RAMSTEIN_THE_GORGER, pos);
}
if (_slaughterProgress == 2)
{
for (uint32 i = 0; i < 33; ++i)
events.ScheduleEvent(EVENT_SPAWN_MINDLESS, 5000 + i*210);
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
if (GameObject* gate = baron->FindNearestGameObject(GO_SLAUGHTER_GATE_SIDE, 200.0f))
gate->SetGoState(GO_STATE_ACTIVE);
}
if (_slaughterProgress == 3)
{
events.ScheduleEvent(EVENT_SPAWN_BLACK_GUARD, 20000);
}
if (_slaughterProgress == 4)
{
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BARON_GUARD_DEAD);
if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5))
gate->SetGoState(GO_STATE_ACTIVE);
}
}
}
}
void OnUnitDeath(Unit* unit)
{
switch (unit->GetEntry())
{
case NPC_VENOM_BELCHER:
case NPC_BILE_SPEWER:
case NPC_RAMSTEIN_THE_GORGER:
case NPC_MINDLESS_UNDEAD:
case NPC_BLACK_GUARD:
if (--_slaughterNPCs == 0)
{
++_slaughterProgress;
ProcessSlaughterEvent();
SaveToDB();
}
break;
}
}
void OnUnitDeath(Unit* unit)
{
switch (unit->GetEntry())
{
case NPC_VENOM_BELCHER:
case NPC_BILE_SPEWER:
case NPC_RAMSTEIN_THE_GORGER:
case NPC_MINDLESS_UNDEAD:
case NPC_BLACK_GUARD:
if (--_slaughterNPCs == 0)
{
++_slaughterProgress;
ProcessSlaughterEvent();
SaveToDB();
}
break;
}
}
void OnGameObjectCreate(GameObject* go)
{
@@ -181,93 +181,93 @@ class instance_stratholme : public InstanceMapScript
if (_slaughterProgress == 4)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_SLAUGHTER_GATE_SIDE:
if (_slaughterProgress >= 2)
case GO_SLAUGHTER_GATE_SIDE:
if (_slaughterProgress >= 2)
go->SetGoState(GO_STATE_ACTIVE);
break;
break;
}
}
void CheckZiggurats()
{
if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2)
{
instance->LoadGrid(4035.83f, -3336.31f);
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BRAON_ZIGGURAT_FALL_YELL);
void CheckZiggurats()
{
if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2)
{
instance->LoadGrid(4035.83f, -3336.31f);
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BRAON_ZIGGURAT_FALL_YELL);
if (GameObject* gate = instance->GetGameObject(_gauntletGateGUID))
gate->SetGoState(GO_STATE_ACTIVE);
if (GameObject* gate = instance->GetGameObject(_slaughterGateGUID))
gate->SetGoState(GO_STATE_ACTIVE);
}
}
if (GameObject* gate = instance->GetGameObject(_gauntletGateGUID))
gate->SetGoState(GO_STATE_ACTIVE);
if (GameObject* gate = instance->GetGameObject(_slaughterGateGUID))
gate->SetGoState(GO_STATE_ACTIVE);
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_BARON_RUN:
{
if (_baronRunProgress == DATA_BARON_RUN_NONE)
{
_baronRunProgress = DATA_BARON_RUN_GATE;
_baronRunTime = 45;
DoCastSpellOnPlayers(SPELL_BARON_ULTIMATUM);
events.ScheduleEvent(EVENT_BARON_TIME, 60000);
switch (type)
{
case TYPE_BARON_RUN:
{
if (_baronRunProgress == DATA_BARON_RUN_NONE)
{
_baronRunProgress = DATA_BARON_RUN_GATE;
_baronRunTime = 45;
DoCastSpellOnPlayers(SPELL_BARON_ULTIMATUM);
events.ScheduleEvent(EVENT_BARON_TIME, 60000);
instance->LoadGrid(4035.83f, -3336.31f);
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BARON_INIT_YELL);
}
break;
}
case TYPE_ZIGGURAT1:
{
if (data == _zigguratState1+1)
++_zigguratState1;
instance->LoadGrid(4035.83f, -3336.31f);
if (Creature* baron = instance->GetCreature(_baronRivendareGUID))
baron->AI()->Talk(SAY_BARON_INIT_YELL);
}
break;
}
case TYPE_ZIGGURAT1:
{
if (data == _zigguratState1+1)
++_zigguratState1;
if (_zigguratState1 == 1)
if (GameObject* ziggurat = instance->GetGameObject(_zigguratDoorsGUID1))
ziggurat->SetGoState(GO_STATE_ACTIVE);
if (_zigguratState1 == 1)
if (GameObject* ziggurat = instance->GetGameObject(_zigguratDoorsGUID1))
ziggurat->SetGoState(GO_STATE_ACTIVE);
CheckZiggurats();
break;
}
case TYPE_ZIGGURAT2:
{
if (data == _zigguratState2+1)
++_zigguratState2;
CheckZiggurats();
break;
}
case TYPE_ZIGGURAT2:
{
if (data == _zigguratState2+1)
++_zigguratState2;
if (_zigguratState2 == 1)
if (GameObject* ziggurat = instance->GetGameObject(_zigguratDoorsGUID2))
ziggurat->SetGoState(GO_STATE_ACTIVE);
if (_zigguratState2 == 1)
if (GameObject* ziggurat = instance->GetGameObject(_zigguratDoorsGUID2))
ziggurat->SetGoState(GO_STATE_ACTIVE);
CheckZiggurats();
break;
}
case TYPE_ZIGGURAT3:
{
if (data == _zigguratState3+1)
++_zigguratState3;
CheckZiggurats();
break;
}
case TYPE_ZIGGURAT3:
{
if (data == _zigguratState3+1)
++_zigguratState3;
if (_zigguratState3 == 1)
if (GameObject* ziggurat = instance->GetGameObject(_zigguratDoorsGUID3))
ziggurat->SetGoState(GO_STATE_ACTIVE);
if (_zigguratState3 == 1)
if (GameObject* ziggurat = instance->GetGameObject(_zigguratDoorsGUID3))
ziggurat->SetGoState(GO_STATE_ACTIVE);
CheckZiggurats();
break;
}
case TYPE_BARON_FIGHT:
{
if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5))
gate->SetGoState(data == IN_PROGRESS ? GO_STATE_READY : GO_STATE_ACTIVE);
return;
}
case TYPE_MALLOW:
++_postboxesOpened;
break;
}
CheckZiggurats();
break;
}
case TYPE_BARON_FIGHT:
{
if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID5))
gate->SetGoState(data == IN_PROGRESS ? GO_STATE_READY : GO_STATE_ACTIVE);
return;
}
case TYPE_MALLOW:
++_postboxesOpened;
break;
}
SaveToDB();
}
@@ -275,48 +275,48 @@ class instance_stratholme : public InstanceMapScript
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "S T " << _baronRunProgress << ' ' << _baronRunTime << ' ' << _zigguratState1 << ' ' << _zigguratState2 << ' ' << _zigguratState3 << ' ' << _slaughterProgress << ' ' << _postboxesOpened;
saveStream << "S T " << _baronRunProgress << ' ' << _baronRunTime << ' ' << _zigguratState1 << ' ' << _zigguratState2 << ' ' << _zigguratState3 << ' ' << _slaughterProgress << ' ' << _postboxesOpened;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
return;
if (!in)
return;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'T')
{
loadStream >> _baronRunProgress;
loadStream >> _baronRunTime;
loadStream >> _zigguratState1;
loadStream >> _zigguratState2;
loadStream >> _zigguratState3;
loadStream >> _slaughterProgress;
loadStream >> _postboxesOpened;
}
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'T')
{
loadStream >> _baronRunProgress;
loadStream >> _baronRunTime;
loadStream >> _zigguratState1;
loadStream >> _zigguratState2;
loadStream >> _zigguratState3;
loadStream >> _slaughterProgress;
loadStream >> _postboxesOpened;
}
if (_baronRunTime > 0)
events.ScheduleEvent(EVENT_BARON_TIME, 60000);
if (_baronRunTime > 0)
events.ScheduleEvent(EVENT_BARON_TIME, 60000);
if (_slaughterProgress > 0 && _slaughterProgress < 4)
events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 5000);
if (_slaughterProgress > 0 && _slaughterProgress < 4)
events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 5000);
}
uint32 GetData(uint32 type) const
{
switch (type)
switch (type)
{
case TYPE_ZIGGURAT1:
return _zigguratState1;
case TYPE_ZIGGURAT2:
return _zigguratState2;
case TYPE_ZIGGURAT3:
return _zigguratState3;
case TYPE_MALLOW:
return _postboxesOpened;
case TYPE_ZIGGURAT1:
return _zigguratState1;
case TYPE_ZIGGURAT2:
return _zigguratState2;
case TYPE_ZIGGURAT3:
return _zigguratState3;
case TYPE_MALLOW:
return _postboxesOpened;
}
return 0;
}
@@ -324,116 +324,116 @@ class instance_stratholme : public InstanceMapScript
void Update(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
switch (events.ExecuteEvent())
{
case EVENT_BARON_TIME:
{
--_baronRunTime;
instance->LoadGrid(4035.83f, -3336.31f);
Creature* baron = instance->GetCreature(_baronRivendareGUID);
if (baron && !baron->IsInCombat())
{
switch (_baronRunTime)
{
case 10:
baron->AI()->Talk(SAY_BARON_10M);
break;
case 5:
baron->AI()->Talk(SAY_BARON_5M);
if (Creature* ysida = baron->FindNearestCreature(NPC_YSIDA, 50.0f))
ysida->AI()->SetData(1, 1);
break;
case 0:
baron->AI()->Talk(SAY_BARON_0M);
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
break;
}
}
{
--_baronRunTime;
instance->LoadGrid(4035.83f, -3336.31f);
Creature* baron = instance->GetCreature(_baronRivendareGUID);
if (baron && !baron->IsInCombat())
{
switch (_baronRunTime)
{
case 10:
baron->AI()->Talk(SAY_BARON_10M);
break;
case 5:
baron->AI()->Talk(SAY_BARON_5M);
if (Creature* ysida = baron->FindNearestCreature(NPC_YSIDA, 50.0f))
ysida->AI()->SetData(1, 1);
break;
case 0:
baron->AI()->Talk(SAY_BARON_0M);
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
break;
}
}
if (_baronRunTime > 0)
events.ScheduleEvent(EVENT_BARON_TIME, 60000);
else
events.ScheduleEvent(EVENT_EXECUTE_PRISONER, 0);
if (_baronRunTime > 0)
events.ScheduleEvent(EVENT_BARON_TIME, 60000);
else
events.ScheduleEvent(EVENT_EXECUTE_PRISONER, 0);
SaveToDB();
break;
}
case EVENT_EXECUTE_PRISONER:
{
instance->LoadGrid(4035.83f, -3336.31f);
Creature* baron = instance->GetCreature(_baronRivendareGUID);
if (baron && baron->IsAlive())
{
if (!baron->IsInCombat())
{
baron->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
if (Creature* ysida = baron->FindNearestCreature(NPC_YSIDA, 50.0f))
Unit::Kill(baron, ysida);
}
else
events.ScheduleEvent(EVENT_EXECUTE_PRISONER, 1000);
}
break;
}
SaveToDB();
break;
}
case EVENT_EXECUTE_PRISONER:
{
instance->LoadGrid(4035.83f, -3336.31f);
Creature* baron = instance->GetCreature(_baronRivendareGUID);
if (baron && baron->IsAlive())
{
if (!baron->IsInCombat())
{
baron->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
if (Creature* ysida = baron->FindNearestCreature(NPC_YSIDA, 50.0f))
Unit::Kill(baron, ysida);
}
else
events.ScheduleEvent(EVENT_EXECUTE_PRISONER, 1000);
}
break;
}
case EVENT_SPAWN_MINDLESS:
{
Position pos = {3941.75f, -3393.06f, 119.70f, 0.0f};
instance->SummonCreature(NPC_MINDLESS_UNDEAD, pos);
break;
}
case EVENT_FORCE_SLAUGHTER_EVENT:
{
Map::PlayerList const& PlayerList = instance->GetPlayers();
if (!PlayerList.isEmpty())
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (Player* player = i->GetSource())
if (player->GetDistance2d(4034.97f, -3402.13f) < 50.0f)
{
ProcessSlaughterEvent();
return;
}
events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 3000);
break;
}
case EVENT_SPAWN_BLACK_GUARD:
{
for (uint8 i = 0; i < 5; ++i)
if (Creature* guard = instance->SummonCreature(NPC_BLACK_GUARD, BlackGuardPos[i]))
{
guard->SetWalk(true);
guard->GetMotionMaster()->MovePoint(0, BlackGuardPos[i+5]);
guard->SetHomePosition(BlackGuardPos[i+5]);
if (i == 0 && guard->AI())
guard->AI()->Talk(SAY_BLACK_GUARD_INIT);
}
{
Position pos = {3941.75f, -3393.06f, 119.70f, 0.0f};
instance->SummonCreature(NPC_MINDLESS_UNDEAD, pos);
break;
}
case EVENT_FORCE_SLAUGHTER_EVENT:
{
Map::PlayerList const& PlayerList = instance->GetPlayers();
if (!PlayerList.isEmpty())
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (Player* player = i->GetSource())
if (player->GetDistance2d(4034.97f, -3402.13f) < 50.0f)
{
ProcessSlaughterEvent();
return;
}
events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 3000);
break;
}
case EVENT_SPAWN_BLACK_GUARD:
{
for (uint8 i = 0; i < 5; ++i)
if (Creature* guard = instance->SummonCreature(NPC_BLACK_GUARD, BlackGuardPos[i]))
{
guard->SetWalk(true);
guard->GetMotionMaster()->MovePoint(0, BlackGuardPos[i+5]);
guard->SetHomePosition(BlackGuardPos[i+5]);
if (i == 0 && guard->AI())
guard->AI()->Talk(SAY_BLACK_GUARD_INIT);
}
if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID4))
gate->SetGoState(GO_STATE_ACTIVE);
break;
}
if (GameObject* gate = instance->GetGameObject(_zigguratDoorsGUID4))
gate->SetGoState(GO_STATE_ACTIVE);
break;
}
}
}
private:
uint32 _baronRunProgress;
uint32 _baronRunTime;
uint32 _zigguratState1;
uint32 _zigguratState2;
uint32 _zigguratState3;
uint32 _slaughterProgress;
uint32 _slaughterNPCs;
uint32 _postboxesOpened;
EventMap events;
private:
uint32 _baronRunProgress;
uint32 _baronRunTime;
uint32 _zigguratState1;
uint32 _zigguratState2;
uint32 _zigguratState3;
uint32 _slaughterProgress;
uint32 _slaughterNPCs;
uint32 _postboxesOpened;
EventMap events;
uint64 _zigguratDoorsGUID1;
uint64 _zigguratDoorsGUID2;
uint64 _zigguratDoorsGUID3;
uint64 _zigguratDoorsGUID4;
uint64 _zigguratDoorsGUID5;
uint64 _slaughterGateGUID;
uint64 _gauntletGateGUID;
uint64 _baronRivendareGUID;
uint64 _zigguratDoorsGUID1;
uint64 _zigguratDoorsGUID2;
uint64 _zigguratDoorsGUID3;
uint64 _zigguratDoorsGUID4;
uint64 _zigguratDoorsGUID5;
uint64 _slaughterGateGUID;
uint64 _gauntletGateGUID;
uint64 _baronRivendareGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const

View File

@@ -8,14 +8,14 @@ REWRITTEN BY XINEF
enum DataTypes
{
TYPE_BARON_RUN = 0,
TYPE_ZIGGURAT1 = 1,
TYPE_ZIGGURAT2 = 2,
TYPE_ZIGGURAT3 = 3,
TYPE_BARON_FIGHT = 4,
TYPE_MALLOW = 5,
TYPE_ZIGGURAT1 = 1,
TYPE_ZIGGURAT2 = 2,
TYPE_ZIGGURAT3 = 3,
TYPE_BARON_FIGHT = 4,
TYPE_MALLOW = 5,
DATA_BARON_RUN_NONE = 0,
DATA_BARON_RUN_GATE = 1,
DATA_BARON_RUN_NONE = 0,
DATA_BARON_RUN_GATE = 1,
};
enum CreatureIds
@@ -24,7 +24,7 @@ enum CreatureIds
NPC_BILE_SPEWER = 10416,
NPC_VENOM_BELCHER = 10417,
NPC_RAMSTEIN_THE_GORGER = 10439,
NPC_MINDLESS_UNDEAD = 11030,
NPC_MINDLESS_UNDEAD = 11030,
NPC_BLACK_GUARD = 10394,
NPC_YSIDA = 16031
};
@@ -38,26 +38,26 @@ enum GameobjectIds
GO_ZIGGURAT_DOORS5 = 175796, // baron
GO_GAUNTLET_GATE = 175374,
GO_SLAUGTHER_GATE = 175373,
GO_SLAUGHTER_GATE_SIDE = 175358,
GO_EXIT_GATE = 176424
GO_SLAUGHTER_GATE_SIDE = 175358,
GO_EXIT_GATE = 176424
};
enum MiscIds
{
SAY_BLACK_GUARD_INIT = 0,
SAY_BARON_INIT_YELL = 0,
SAY_BRAON_ZIGGURAT_FALL_YELL = 1,
SAY_BARON_10M = 2,
SAY_BARON_5M = 3,
SAY_BARON_0M = 4,
SAY_BRAON_SUMMON_RAMSTEIN = 5,
SAY_BARON_GUARD_DEAD = 6,
SAY_BLACK_GUARD_INIT = 0,
SAY_BARON_INIT_YELL = 0,
SAY_BRAON_ZIGGURAT_FALL_YELL = 1,
SAY_BARON_10M = 2,
SAY_BARON_5M = 3,
SAY_BARON_0M = 4,
SAY_BRAON_SUMMON_RAMSTEIN = 5,
SAY_BARON_GUARD_DEAD = 6,
EVENT_BARON_TIME = 1,
EVENT_SPAWN_MINDLESS = 2,
EVENT_FORCE_SLAUGHTER_EVENT = 3,
EVENT_SPAWN_BLACK_GUARD = 4,
EVENT_EXECUTE_PRISONER = 5,
EVENT_BARON_TIME = 1,
EVENT_SPAWN_MINDLESS = 2,
EVENT_FORCE_SLAUGHTER_EVENT = 3,
EVENT_SPAWN_BLACK_GUARD = 4,
EVENT_EXECUTE_PRISONER = 5,
SPELL_BARON_ULTIMATUM = 27861
};

View File

@@ -8,185 +8,185 @@ REWRITTEN BY XINEF
class instance_sunken_temple : public InstanceMapScript
{
public:
instance_sunken_temple() : InstanceMapScript("instance_sunken_temple", 109) { }
public:
instance_sunken_temple() : InstanceMapScript("instance_sunken_temple", 109) { }
struct instance_sunken_temple_InstanceMapScript : public InstanceScript
{
instance_sunken_temple_InstanceMapScript(Map* map) : InstanceScript(map)
{
}
struct instance_sunken_temple_InstanceMapScript : public InstanceScript
{
instance_sunken_temple_InstanceMapScript(Map* map) : InstanceScript(map)
{
}
void Initialize()
{
_statuePhase = 0;
_defendersKilled = 0;
memset(&_encounters, 0, sizeof(_encounters));
void Initialize()
{
_statuePhase = 0;
_defendersKilled = 0;
memset(&_encounters, 0, sizeof(_encounters));
_forcefieldGUID = 0;
_jammalanGUID = 0;
}
_forcefieldGUID = 0;
_jammalanGUID = 0;
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
case NPC_JAMMAL_AN_THE_PROPHET:
_jammalanGUID = creature->GetGUID();
break;
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
case NPC_JAMMAL_AN_THE_PROPHET:
_jammalanGUID = creature->GetGUID();
break;
}
if (creature->IsAlive() && creature->GetDBTableGUIDLow() && creature->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && creature->GetEntry() != NPC_SHADE_OF_ERANIKUS)
_dragonkinList.push_back(creature->GetGUID());
}
if (creature->IsAlive() && creature->GetDBTableGUIDLow() && creature->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && creature->GetEntry() != NPC_SHADE_OF_ERANIKUS)
_dragonkinList.push_back(creature->GetGUID());
}
void OnUnitDeath(Unit* unit)
{
if (unit->GetTypeId() == TYPEID_UNIT && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS)
_dragonkinList.remove(unit->GetGUID());
}
void OnUnitDeath(Unit* unit)
{
if (unit->GetTypeId() == TYPEID_UNIT && unit->GetCreatureType() == CREATURE_TYPE_DRAGONKIN && unit->GetEntry() != NPC_SHADE_OF_ERANIKUS)
_dragonkinList.remove(unit->GetGUID());
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_ATALAI_STATUE1:
case GO_ATALAI_STATUE2:
case GO_ATALAI_STATUE3:
case GO_ATALAI_STATUE4:
case GO_ATALAI_STATUE5:
case GO_ATALAI_STATUE6:
if (gameobject->GetEntry() < GO_ATALAI_STATUE1+_statuePhase)
{
instance->SummonGameObject(GO_ATALAI_LIGHT2, gameobject->GetPositionX(), gameobject->GetPositionY(), gameobject->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
gameobject->SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
case GO_ATALAI_IDOL:
if (_statuePhase == MAX_STATUE_PHASE)
gameobject->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
break;
case GO_IDOL_OF_HAKKAR:
if (_encounters[TYPE_ATAL_ALARION] == DONE)
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_FORCEFIELD:
_forcefieldGUID = gameobject->GetGUID();
if (_defendersKilled == DEFENDERS_COUNT)
gameobject->SetGoState(GO_STATE_ACTIVE);
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_ATALAI_STATUE1:
case GO_ATALAI_STATUE2:
case GO_ATALAI_STATUE3:
case GO_ATALAI_STATUE4:
case GO_ATALAI_STATUE5:
case GO_ATALAI_STATUE6:
if (gameobject->GetEntry() < GO_ATALAI_STATUE1+_statuePhase)
{
instance->SummonGameObject(GO_ATALAI_LIGHT2, gameobject->GetPositionX(), gameobject->GetPositionY(), gameobject->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
gameobject->SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
case GO_ATALAI_IDOL:
if (_statuePhase == MAX_STATUE_PHASE)
gameobject->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
break;
case GO_IDOL_OF_HAKKAR:
if (_encounters[TYPE_ATAL_ALARION] == DONE)
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_FORCEFIELD:
_forcefieldGUID = gameobject->GetGUID();
if (_defendersKilled == DEFENDERS_COUNT)
gameobject->SetGoState(GO_STATE_ACTIVE);
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_STATUES:
_events.ScheduleEvent(DATA_STATUES, 0);
break;
case DATA_DEFENDER_KILLED:
++_defendersKilled;
if (_defendersKilled == DEFENDERS_COUNT)
{
instance->LoadGrid(-425.89f, -86.07f);
if (Creature* jammal = instance->GetCreature(_jammalanGUID))
jammal->AI()->Talk(0);
if (GameObject* forcefield = instance->GetGameObject(_forcefieldGUID))
forcefield->SetGoState(GO_STATE_ACTIVE);
}
break;
case DATA_ERANIKUS_FIGHT:
for (std::list<uint64>::const_iterator itr = _dragonkinList.begin(); itr != _dragonkinList.end(); ++itr)
{
if (Creature* creature = instance->GetCreature(*itr))
if (instance->IsGridLoaded(creature->GetPositionX(), creature->GetPositionY()))
creature->SetInCombatWithZone();
}
break;
case TYPE_ATAL_ALARION:
case TYPE_JAMMAL_AN:
case TYPE_HAKKAR_EVENT:
_encounters[type] = data;
break;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_STATUES:
_events.ScheduleEvent(DATA_STATUES, 0);
break;
case DATA_DEFENDER_KILLED:
++_defendersKilled;
if (_defendersKilled == DEFENDERS_COUNT)
{
instance->LoadGrid(-425.89f, -86.07f);
if (Creature* jammal = instance->GetCreature(_jammalanGUID))
jammal->AI()->Talk(0);
if (GameObject* forcefield = instance->GetGameObject(_forcefieldGUID))
forcefield->SetGoState(GO_STATE_ACTIVE);
}
break;
case DATA_ERANIKUS_FIGHT:
for (std::list<uint64>::const_iterator itr = _dragonkinList.begin(); itr != _dragonkinList.end(); ++itr)
{
if (Creature* creature = instance->GetCreature(*itr))
if (instance->IsGridLoaded(creature->GetPositionX(), creature->GetPositionY()))
creature->SetInCombatWithZone();
}
break;
case TYPE_ATAL_ALARION:
case TYPE_JAMMAL_AN:
case TYPE_HAKKAR_EVENT:
_encounters[type] = data;
break;
}
SaveToDB();
}
SaveToDB();
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case DATA_STATUES:
return _statuePhase;
case DATA_DEFENDER_KILLED:
return _defendersKilled;
case TYPE_ATAL_ALARION:
case TYPE_JAMMAL_AN:
case TYPE_HAKKAR_EVENT:
return _encounters[type];
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case DATA_STATUES:
return _statuePhase;
case DATA_DEFENDER_KILLED:
return _defendersKilled;
case TYPE_ATAL_ALARION:
case TYPE_JAMMAL_AN:
case TYPE_HAKKAR_EVENT:
return _encounters[type];
}
return 0;
}
return 0;
}
void Update(uint32 diff)
{
_events.Update(diff);
switch (_events.ExecuteEvent())
{
case DATA_STATUES:
++_statuePhase;
if (_statuePhase == MAX_STATUE_PHASE)
instance->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
break;
}
}
void Update(uint32 diff)
{
_events.Update(diff);
switch (_events.ExecuteEvent())
{
case DATA_STATUES:
++_statuePhase;
if (_statuePhase == MAX_STATUE_PHASE)
instance->SummonGameObject(GO_IDOL_OF_HAKKAR, -480.08f, 94.29f, -189.72f, 1.571f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
break;
}
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "T A " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _statuePhase << ' ' << _defendersKilled;
return saveStream.str();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "T A " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _statuePhase << ' ' << _defendersKilled;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
return;
void Load(const char* in)
{
if (!in)
return;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'T' && dataHead2 == 'A')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'T' && dataHead2 == 'A')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
loadStream >> _statuePhase;
loadStream >> _defendersKilled;
}
}
loadStream >> _statuePhase;
loadStream >> _defendersKilled;
}
}
private:
uint32 _statuePhase;
uint32 _defendersKilled;
uint32 _encounters[MAX_ENCOUNTERS];
private:
uint32 _statuePhase;
uint32 _defendersKilled;
uint32 _encounters[MAX_ENCOUNTERS];
uint64 _forcefieldGUID;
uint64 _jammalanGUID;
std::list<uint64> _dragonkinList;
EventMap _events;
};
uint64 _forcefieldGUID;
uint64 _jammalanGUID;
std::list<uint64> _dragonkinList;
EventMap _events;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_sunken_temple_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_sunken_temple_InstanceMapScript(map);
}
};
enum MalfurionMisc
@@ -220,12 +220,12 @@ class spell_temple_of_atal_hakkar_hex_of_jammal_an : public SpellScriptLoader
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* caster = GetCaster())
if (caster->IsAlive() && caster->IsInCombat())
{
caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN, true);
caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN_CHARM, true);
}
if (Unit* caster = GetCaster())
if (caster->IsAlive() && caster->IsInCombat())
{
caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN, true);
caster->CastSpell(GetTarget(), HEX_OF_JAMMAL_AN_CHARM, true);
}
}
void Register()
@@ -242,45 +242,45 @@ class spell_temple_of_atal_hakkar_hex_of_jammal_an : public SpellScriptLoader
class spell_temple_of_atal_hakkar_awaken_the_soulflayer : public SpellScriptLoader
{
public:
spell_temple_of_atal_hakkar_awaken_the_soulflayer() : SpellScriptLoader("spell_temple_of_atal_hakkar_awaken_the_soulflayer") { }
public:
spell_temple_of_atal_hakkar_awaken_the_soulflayer() : SpellScriptLoader("spell_temple_of_atal_hakkar_awaken_the_soulflayer") { }
class spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript : public SpellScript
{
PrepareSpellScript(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript);
class spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript : public SpellScript
{
PrepareSpellScript(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript);
void HandleSendEvent(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
InstanceScript* instanceScript = GetCaster()->GetInstanceScript();
Map* map = GetCaster()->FindMap();
if (!map || !instanceScript || instanceScript->GetData(TYPE_HAKKAR_EVENT) != NOT_STARTED)
return;
void HandleSendEvent(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
InstanceScript* instanceScript = GetCaster()->GetInstanceScript();
Map* map = GetCaster()->FindMap();
if (!map || !instanceScript || instanceScript->GetData(TYPE_HAKKAR_EVENT) != NOT_STARTED)
return;
Position pos = {-466.795f, 272.863f, -90.447f, 1.57f};
if (TempSummon* summon = map->SummonCreature(NPC_SHADE_OF_HAKKAR, pos))
{
summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
instanceScript->SetData(TYPE_HAKKAR_EVENT, IN_PROGRESS);
}
}
Position pos = {-466.795f, 272.863f, -90.447f, 1.57f};
if (TempSummon* summon = map->SummonCreature(NPC_SHADE_OF_HAKKAR, pos))
{
summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
instanceScript->SetData(TYPE_HAKKAR_EVENT, IN_PROGRESS);
}
}
void Register()
{
OnEffectHit += SpellEffectFn(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
void Register()
{
OnEffectHit += SpellEffectFn(spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_temple_of_atal_hakkar_awaken_the_soulflayer_SpellScript();
}
};
void AddSC_instance_sunken_temple()
{
new instance_sunken_temple();
new at_malfurion_stormrage();
new spell_temple_of_atal_hakkar_hex_of_jammal_an();
new spell_temple_of_atal_hakkar_awaken_the_soulflayer();
new spell_temple_of_atal_hakkar_hex_of_jammal_an();
new spell_temple_of_atal_hakkar_awaken_the_soulflayer();
}

View File

@@ -7,16 +7,16 @@ REWRITTEN BY XINEF
enum DataTypes
{
DATA_STATUES = 10,
DATA_DEFENDER_KILLED = 11,
DATA_ERANIKUS_FIGHT = 12,
MAX_STATUE_PHASE = 6,
DEFENDERS_COUNT = 6,
DATA_STATUES = 10,
DATA_DEFENDER_KILLED = 11,
DATA_ERANIKUS_FIGHT = 12,
MAX_STATUE_PHASE = 6,
DEFENDERS_COUNT = 6,
TYPE_ATAL_ALARION = 0,
TYPE_JAMMAL_AN = 1,
TYPE_HAKKAR_EVENT = 2,
MAX_ENCOUNTERS = 3
TYPE_ATAL_ALARION = 0,
TYPE_JAMMAL_AN = 1,
TYPE_HAKKAR_EVENT = 2,
MAX_ENCOUNTERS = 3
};
enum GoIds
@@ -28,23 +28,23 @@ enum GoIds
GO_ATALAI_STATUE5 = 148834,
GO_ATALAI_STATUE6 = 148835,
GO_ATALAI_IDOL = 148836,
GO_IDOL_OF_HAKKAR = 148838,
GO_IDOL_OF_HAKKAR = 148838,
GO_ATALAI_LIGHT2 = 148937,
GO_FORCEFIELD = 149431
GO_FORCEFIELD = 149431
};
enum CreatureIds
{
NPC_MALFURION_STORMRAGE = 15362,
NPC_JAMMAL_AN_THE_PROPHET = 5710,
NPC_SHADE_OF_ERANIKUS = 5709,
NPC_SHADE_OF_HAKKAR = 8440,
NPC_JAMMAL_AN_THE_PROPHET = 5710,
NPC_SHADE_OF_ERANIKUS = 5709,
NPC_SHADE_OF_HAKKAR = 8440,
};
enum SpellIds
{
HEX_OF_JAMMAL_AN = 12480,
HEX_OF_JAMMAL_AN_CHARM = 12483
HEX_OF_JAMMAL_AN = 12480,
HEX_OF_JAMMAL_AN_CHARM = 12483
};
#endif

View File

@@ -8,39 +8,39 @@ REWRITTEN BY XINEF
enum Quotes
{
YELL_INTRO = 0,
YELL_INTRO_BREAK_ICE = 1,
YELL_INTRO_CHARGE = 2,
YELL_INTRO_KILL_MADRIGOSA = 3,
YELL_INTRO_TAUNT = 4,
YELL_INTRO = 0,
YELL_INTRO_BREAK_ICE = 1,
YELL_INTRO_CHARGE = 2,
YELL_INTRO_KILL_MADRIGOSA = 3,
YELL_INTRO_TAUNT = 4,
YELL_AGGRO = 5,
YELL_KILL = 6,
YELL_LOVE = 7,
YELL_BERSERK = 8,
YELL_DEATH = 9,
YELL_AGGRO = 5,
YELL_KILL = 6,
YELL_LOVE = 7,
YELL_BERSERK = 8,
YELL_DEATH = 9,
};
enum Spells
{
SPELL_METEOR_SLASH = 45150,
SPELL_BURN_DAMAGE = 46394,
SPELL_BURN = 45141,
SPELL_STOMP = 45185,
SPELL_BERSERK = 26662,
SPELL_DUAL_WIELD = 42459,
SPELL_SUMMON_BRUTALLUS_DEATH_CLOUD = 45884
SPELL_METEOR_SLASH = 45150,
SPELL_BURN_DAMAGE = 46394,
SPELL_BURN = 45141,
SPELL_STOMP = 45185,
SPELL_BERSERK = 26662,
SPELL_DUAL_WIELD = 42459,
SPELL_SUMMON_BRUTALLUS_DEATH_CLOUD = 45884
};
enum Misc
{
EVENT_SPELL_SLASH = 1,
EVENT_SPELL_STOMP = 2,
EVENT_SPELL_BURN = 3,
EVENT_SPELL_BERSERK = 4,
EVENT_SPELL_SLASH = 1,
EVENT_SPELL_STOMP = 2,
EVENT_SPELL_BURN = 3,
EVENT_SPELL_BERSERK = 4,
ACTION_START_EVENT = 1,
ACTION_SPAWN_FELMYST = 2
ACTION_START_EVENT = 1,
ACTION_SPAWN_FELMYST = 2
};
class boss_brutallus : public CreatureScript
@@ -54,48 +54,48 @@ public:
void Reset()
{
BossAI::Reset();
me->CastSpell(me, SPELL_DUAL_WIELD, true);
BossAI::Reset();
me->CastSpell(me, SPELL_DUAL_WIELD, true);
}
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (me->GetReactState() == REACT_PASSIVE && (!who || who->GetEntry() != NPC_MADRIGOSA))
{
if (who)
Unit::Kill(me, who);
damage = 0;
}
}
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (me->GetReactState() == REACT_PASSIVE && (!who || who->GetEntry() != NPC_MADRIGOSA))
{
if (who)
Unit::Kill(me, who);
damage = 0;
}
}
void EnterCombat(Unit* who)
{
if (who->GetEntry() == NPC_MADRIGOSA)
return;
if (who->GetEntry() == NPC_MADRIGOSA)
return;
Talk(YELL_AGGRO);
BossAI::EnterCombat(who);
events.ScheduleEvent(EVENT_SPELL_SLASH, 11000);
events.ScheduleEvent(EVENT_SPELL_STOMP, 30000);
events.ScheduleEvent(EVENT_SPELL_BURN, 45000);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 360000);
BossAI::EnterCombat(who);
events.ScheduleEvent(EVENT_SPELL_SLASH, 11000);
events.ScheduleEvent(EVENT_SPELL_STOMP, 30000);
events.ScheduleEvent(EVENT_SPELL_BURN, 45000);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 360000);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
Talk(YELL_KILL);
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
Talk(YELL_KILL);
}
void JustDied(Unit* killer)
{
BossAI::JustDied(killer);
BossAI::JustDied(killer);
Talk(YELL_DEATH);
me->CastSpell(me, SPELL_SUMMON_BRUTALLUS_DEATH_CLOUD, true);
if (Creature* madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_MADRIGOSA)))
madrigosa->AI()->DoAction(ACTION_SPAWN_FELMYST);
me->CastSpell(me, SPELL_SUMMON_BRUTALLUS_DEATH_CLOUD, true);
if (Creature* madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_MADRIGOSA)))
madrigosa->AI()->DoAction(ACTION_SPAWN_FELMYST);
}
void AttackStart(Unit* who)
@@ -110,31 +110,31 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_SLASH:
me->CastSpell(me->GetVictim(), SPELL_METEOR_SLASH, false);
events.ScheduleEvent(EVENT_SPELL_SLASH, 10000);
break;
case EVENT_SPELL_STOMP:
me->CastSpell(me->GetVictim(), SPELL_STOMP, false);
Talk(YELL_LOVE);
events.ScheduleEvent(EVENT_SPELL_STOMP, 30000);
break;
case EVENT_SPELL_BURN:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_BURN_DAMAGE))
me->CastSpell(target, SPELL_BURN, false);
events.ScheduleEvent(EVENT_SPELL_BURN, 60000);
break;
case EVENT_SPELL_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
Talk(YELL_BERSERK);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_SLASH:
me->CastSpell(me->GetVictim(), SPELL_METEOR_SLASH, false);
events.ScheduleEvent(EVENT_SPELL_SLASH, 10000);
break;
case EVENT_SPELL_STOMP:
me->CastSpell(me->GetVictim(), SPELL_STOMP, false);
Talk(YELL_LOVE);
events.ScheduleEvent(EVENT_SPELL_STOMP, 30000);
break;
case EVENT_SPELL_BURN:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_BURN_DAMAGE))
me->CastSpell(target, SPELL_BURN, false);
events.ScheduleEvent(EVENT_SPELL_BURN, 60000);
break;
case EVENT_SPELL_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
Talk(YELL_BERSERK);
break;
}
DoMeleeAttackIfReady();
}
@@ -148,46 +148,46 @@ public:
enum eMadrigosa
{
EVENT_MAD_1 = 1,
EVENT_MAD_2 = 2,
EVENT_MAD_2_1 = 200,
EVENT_MAD_3 = 3,
EVENT_MAD_4 = 4,
EVENT_MAD_5 = 5,
EVENT_MAD_6 = 6,
EVENT_MAD_7 = 7,
EVENT_MAD_8 = 8,
EVENT_MAD_9 = 9,
EVENT_MAD_10 = 10,
EVENT_MAD_11 = 11,
EVENT_MAD_12 = 12,
EVENT_MAD_13 = 13,
EVENT_MAD_14 = 14,
EVENT_MAD_15 = 15,
EVENT_MAD_16 = 16,
EVENT_MAD_17 = 17,
EVENT_MAD_18 = 18,
EVENT_MAD_19 = 19,
EVENT_MAD_20 = 20,
EVENT_MAD_21 = 21,
EVENT_SPAWN_FELMYST = 30,
EVENT_MAD_1 = 1,
EVENT_MAD_2 = 2,
EVENT_MAD_2_1 = 200,
EVENT_MAD_3 = 3,
EVENT_MAD_4 = 4,
EVENT_MAD_5 = 5,
EVENT_MAD_6 = 6,
EVENT_MAD_7 = 7,
EVENT_MAD_8 = 8,
EVENT_MAD_9 = 9,
EVENT_MAD_10 = 10,
EVENT_MAD_11 = 11,
EVENT_MAD_12 = 12,
EVENT_MAD_13 = 13,
EVENT_MAD_14 = 14,
EVENT_MAD_15 = 15,
EVENT_MAD_16 = 16,
EVENT_MAD_17 = 17,
EVENT_MAD_18 = 18,
EVENT_MAD_19 = 19,
EVENT_MAD_20 = 20,
EVENT_MAD_21 = 21,
EVENT_SPAWN_FELMYST = 30,
SAY_MAD_1 = 0,
SAY_MAD_2 = 1,
SAY_MAD_3 = 2,
SAY_MAD_4 = 3,
SAY_MAD_5 = 4,
SAY_MAD_1 = 0,
SAY_MAD_2 = 1,
SAY_MAD_3 = 2,
SAY_MAD_4 = 3,
SAY_MAD_5 = 4,
SPELL_MADRIGOSA_FREEZE = 46609,
SPELL_MADRIGOSA_FROST_BREATH = 45065,
SPELL_MADRIGOSA_FROST_BLAST = 44872,
SPELL_MADRIGOSA_FROSTBOLT = 44843,
SPELL_MADRIGOSA_ENCAPSULATE = 44883,
SPELL_MADRIGOSA_FREEZE = 46609,
SPELL_MADRIGOSA_FROST_BREATH = 45065,
SPELL_MADRIGOSA_FROST_BLAST = 44872,
SPELL_MADRIGOSA_FROSTBOLT = 44843,
SPELL_MADRIGOSA_ENCAPSULATE = 44883,
SPELL_BRUTALLUS_CHARGE = 44884,
SPELL_BRUTALLUS_FEL_FIREBALL = 44844,
SPELL_BRUTALLUS_FLAME_RING = 44874,
SPELL_BRUTALLUS_BREAK_ICE = 46637,
SPELL_BRUTALLUS_CHARGE = 44884,
SPELL_BRUTALLUS_FEL_FIREBALL = 44844,
SPELL_BRUTALLUS_FLAME_RING = 44874,
SPELL_BRUTALLUS_BREAK_ICE = 46637,
};
class npc_madrigosa : public CreatureScript
@@ -199,188 +199,188 @@ public:
{
npc_madrigosaAI(Creature* creature) : NullCreatureAI(creature)
{
instance = creature->GetInstanceScript();
bool appear = instance->GetBossState(DATA_BRUTALLUS) != DONE && instance->GetBossState(DATA_MADRIGOSA) == DONE;
creature->SetVisible(appear);
creature->SetStandState(UNIT_STAND_STATE_DEAD);
creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
instance = creature->GetInstanceScript();
bool appear = instance->GetBossState(DATA_BRUTALLUS) != DONE && instance->GetBossState(DATA_MADRIGOSA) == DONE;
creature->SetVisible(appear);
creature->SetStandState(UNIT_STAND_STATE_DEAD);
creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
}
EventMap events;
InstanceScript* instance;
EventMap events;
InstanceScript* instance;
void DoAction(int32 param)
{
if (param == ACTION_START_EVENT)
{
me->SetDisableGravity(true);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
me->NearTeleportTo(1570.97f, 725.51f, 79.77f, 3.82f);
events.ScheduleEvent(EVENT_MAD_1, 2000);
}
else if (param == ACTION_SPAWN_FELMYST)
events.ScheduleEvent(EVENT_SPAWN_FELMYST, 60000);
}
void DoAction(int32 param)
{
if (param == ACTION_START_EVENT)
{
me->SetDisableGravity(true);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
me->NearTeleportTo(1570.97f, 725.51f, 79.77f, 3.82f);
events.ScheduleEvent(EVENT_MAD_1, 2000);
}
else if (param == ACTION_SPAWN_FELMYST)
events.ScheduleEvent(EVENT_SPAWN_FELMYST, 60000);
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_MAD_1:
me->SetVisible(true);
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
me->SetTarget(brutallus->GetGUID());
brutallus->SetReactState(REACT_PASSIVE);
brutallus->setActive(true);
}
me->GetMotionMaster()->MovePoint(1, 1477.94f, 643.22f, 21.21f);
me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
events.ScheduleEvent(EVENT_MAD_2, 6000);
break;
case EVENT_MAD_2:
Talk(SAY_MAD_1);
me->CastSpell(me, SPELL_MADRIGOSA_FREEZE, false);
events.ScheduleEvent(EVENT_MAD_2_1, 1000);
break;
case EVENT_MAD_2_1:
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->SetDisableGravity(false);
me->CastSpell(me, SPELL_MADRIGOSA_FROST_BREATH, false);
events.ScheduleEvent(EVENT_MAD_3, 7000);
break;
case EVENT_MAD_3:
Talk(SAY_MAD_2);
events.ScheduleEvent(EVENT_MAD_4, 7000);
break;
case EVENT_MAD_4:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->AI()->Talk(YELL_INTRO);
events.ScheduleEvent(EVENT_MAD_5, 5000);
break;
case EVENT_MAD_5:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
}
events.ScheduleEvent(EVENT_MAD_6, 10000);
break;
case EVENT_MAD_6:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
}
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true);
events.ScheduleEvent(EVENT_MAD_7, 4000);
break;
case EVENT_MAD_7:
Talk(SAY_MAD_3);
me->CastSpell(me, SPELL_MADRIGOSA_FROST_BLAST, false);
events.ScheduleEvent(EVENT_MAD_8, 3000);
events.ScheduleEvent(EVENT_MAD_8, 5000);
events.ScheduleEvent(EVENT_MAD_8, 6500);
events.ScheduleEvent(EVENT_MAD_8, 7500);
events.ScheduleEvent(EVENT_MAD_8, 8500);
events.ScheduleEvent(EVENT_MAD_8, 9500);
events.ScheduleEvent(EVENT_MAD_9, 11000);
events.ScheduleEvent(EVENT_MAD_8, 12000);
events.ScheduleEvent(EVENT_MAD_8, 14000);
break;
case EVENT_MAD_8:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
me->CastSpell(brutallus, SPELL_MADRIGOSA_FROSTBOLT, false);
break;
case EVENT_MAD_9:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FLAME_RING, true);
brutallus->RemoveAllAuras();
brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FEL_FIREBALL, false);
brutallus->AI()->Talk(YELL_INTRO_BREAK_ICE);
}
events.ScheduleEvent(EVENT_MAD_11, 6000);
break;
//case EVENT_MAD_10:
case EVENT_MAD_11:
me->SetDisableGravity(false);
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
events.ScheduleEvent(EVENT_MAD_13, 2500);
break;
case EVENT_MAD_13:
Talk(SAY_MAD_4);
me->RemoveAllAuras();
me->CastSpell(me, SPELL_MADRIGOSA_ENCAPSULATE, false);
events.ScheduleEvent(EVENT_MAD_14, 2000);
break;
case EVENT_MAD_14:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetDisableGravity(true);
brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY()-30.0f, brutallus->GetPositionZ()+15.0f, false, true);
}
events.ScheduleEvent(EVENT_MAD_15, 10000);
break;
case EVENT_MAD_15:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->RemoveAllAuras();
brutallus->SetDisableGravity(false);
brutallus->GetMotionMaster()->MoveFall();
brutallus->AI()->Talk(YELL_INTRO_CHARGE);
}
events.ScheduleEvent(EVENT_MAD_16, 1400);
break;
case EVENT_MAD_16:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->CastSpell(me, SPELL_BRUTALLUS_CHARGE, true);
events.ScheduleEvent(EVENT_MAD_17, 1200);
break;
case EVENT_MAD_17:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
events.ScheduleEvent(EVENT_MAD_18, 500);
break;
case EVENT_MAD_18:
Talk(SAY_MAD_5);
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
me->SetStandState(UNIT_STAND_STATE_DEAD);
events.ScheduleEvent(EVENT_MAD_19, 6000);
break;
case EVENT_MAD_19:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->AI()->Talk(YELL_INTRO_KILL_MADRIGOSA);
events.ScheduleEvent(EVENT_MAD_20, 7000);
break;
case EVENT_MAD_20:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->setFaction(35);
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->AI()->Talk(YELL_INTRO_TAUNT);
brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_BREAK_ICE, false);
}
events.ScheduleEvent(EVENT_MAD_21, 4000);
break;
case EVENT_MAD_21:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetReactState(REACT_AGGRESSIVE);
brutallus->SetHealth(brutallus->GetMaxHealth());
brutallus->AI()->EnterEvadeMode();
brutallus->setActive(false);
}
break;
case EVENT_SPAWN_FELMYST:
me->DespawnOrUnsummon(1);
if (Creature* felmyst = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_FELMYST)))
felmyst->AI()->DoAction(ACTION_START_EVENT);
break;
}
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_MAD_1:
me->SetVisible(true);
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
me->SetTarget(brutallus->GetGUID());
brutallus->SetReactState(REACT_PASSIVE);
brutallus->setActive(true);
}
me->GetMotionMaster()->MovePoint(1, 1477.94f, 643.22f, 21.21f);
me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
events.ScheduleEvent(EVENT_MAD_2, 6000);
break;
case EVENT_MAD_2:
Talk(SAY_MAD_1);
me->CastSpell(me, SPELL_MADRIGOSA_FREEZE, false);
events.ScheduleEvent(EVENT_MAD_2_1, 1000);
break;
case EVENT_MAD_2_1:
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->SetDisableGravity(false);
me->CastSpell(me, SPELL_MADRIGOSA_FROST_BREATH, false);
events.ScheduleEvent(EVENT_MAD_3, 7000);
break;
case EVENT_MAD_3:
Talk(SAY_MAD_2);
events.ScheduleEvent(EVENT_MAD_4, 7000);
break;
case EVENT_MAD_4:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->AI()->Talk(YELL_INTRO);
events.ScheduleEvent(EVENT_MAD_5, 5000);
break;
case EVENT_MAD_5:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
}
events.ScheduleEvent(EVENT_MAD_6, 10000);
break;
case EVENT_MAD_6:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
}
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true);
events.ScheduleEvent(EVENT_MAD_7, 4000);
break;
case EVENT_MAD_7:
Talk(SAY_MAD_3);
me->CastSpell(me, SPELL_MADRIGOSA_FROST_BLAST, false);
events.ScheduleEvent(EVENT_MAD_8, 3000);
events.ScheduleEvent(EVENT_MAD_8, 5000);
events.ScheduleEvent(EVENT_MAD_8, 6500);
events.ScheduleEvent(EVENT_MAD_8, 7500);
events.ScheduleEvent(EVENT_MAD_8, 8500);
events.ScheduleEvent(EVENT_MAD_8, 9500);
events.ScheduleEvent(EVENT_MAD_9, 11000);
events.ScheduleEvent(EVENT_MAD_8, 12000);
events.ScheduleEvent(EVENT_MAD_8, 14000);
break;
case EVENT_MAD_8:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
me->CastSpell(brutallus, SPELL_MADRIGOSA_FROSTBOLT, false);
break;
case EVENT_MAD_9:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FLAME_RING, true);
brutallus->RemoveAllAuras();
brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FEL_FIREBALL, false);
brutallus->AI()->Talk(YELL_INTRO_BREAK_ICE);
}
events.ScheduleEvent(EVENT_MAD_11, 6000);
break;
//case EVENT_MAD_10:
case EVENT_MAD_11:
me->SetDisableGravity(false);
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
events.ScheduleEvent(EVENT_MAD_13, 2500);
break;
case EVENT_MAD_13:
Talk(SAY_MAD_4);
me->RemoveAllAuras();
me->CastSpell(me, SPELL_MADRIGOSA_ENCAPSULATE, false);
events.ScheduleEvent(EVENT_MAD_14, 2000);
break;
case EVENT_MAD_14:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetDisableGravity(true);
brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY()-30.0f, brutallus->GetPositionZ()+15.0f, false, true);
}
events.ScheduleEvent(EVENT_MAD_15, 10000);
break;
case EVENT_MAD_15:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->RemoveAllAuras();
brutallus->SetDisableGravity(false);
brutallus->GetMotionMaster()->MoveFall();
brutallus->AI()->Talk(YELL_INTRO_CHARGE);
}
events.ScheduleEvent(EVENT_MAD_16, 1400);
break;
case EVENT_MAD_16:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->CastSpell(me, SPELL_BRUTALLUS_CHARGE, true);
events.ScheduleEvent(EVENT_MAD_17, 1200);
break;
case EVENT_MAD_17:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
events.ScheduleEvent(EVENT_MAD_18, 500);
break;
case EVENT_MAD_18:
Talk(SAY_MAD_5);
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
me->SetStandState(UNIT_STAND_STATE_DEAD);
events.ScheduleEvent(EVENT_MAD_19, 6000);
break;
case EVENT_MAD_19:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
brutallus->AI()->Talk(YELL_INTRO_KILL_MADRIGOSA);
events.ScheduleEvent(EVENT_MAD_20, 7000);
break;
case EVENT_MAD_20:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->setFaction(35);
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->AI()->Talk(YELL_INTRO_TAUNT);
brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_BREAK_ICE, false);
}
events.ScheduleEvent(EVENT_MAD_21, 4000);
break;
case EVENT_MAD_21:
if (Creature* brutallus = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_BRUTALLUS)))
{
brutallus->SetReactState(REACT_AGGRESSIVE);
brutallus->SetHealth(brutallus->GetMaxHealth());
brutallus->AI()->EnterEvadeMode();
brutallus->setActive(false);
}
break;
case EVENT_SPAWN_FELMYST:
me->DespawnOrUnsummon(1);
if (Creature* felmyst = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_FELMYST)))
felmyst->AI()->DoAction(ACTION_START_EVENT);
break;
}
}
};
@@ -401,14 +401,14 @@ class spell_madrigosa_activate_barrier : public SpellScriptLoader
void HandleActivateObject(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (GameObject* go = GetHitGObj())
{
go->SetGoState(GO_STATE_READY);
if (Map* map = go->GetMap())
{
PreventHitDefaultEffect(effIndex);
if (GameObject* go = GetHitGObj())
{
go->SetGoState(GO_STATE_READY);
if (Map* map = go->GetMap())
{
Map::PlayerList const &PlayerList = map->GetPlayers();
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (i->GetSource())
{
UpdateData data;
@@ -418,7 +418,7 @@ class spell_madrigosa_activate_barrier : public SpellScriptLoader
i->GetSource()->GetSession()->SendPacket(&pkt);
}
}
}
}
}
void Register()
@@ -444,14 +444,14 @@ class spell_madrigosa_deactivate_barrier : public SpellScriptLoader
void HandleActivateObject(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (GameObject* go = GetHitGObj())
{
go->SetGoState(GO_STATE_ACTIVE);
if (Map* map = go->GetMap())
{
PreventHitDefaultEffect(effIndex);
if (GameObject* go = GetHitGObj())
{
go->SetGoState(GO_STATE_ACTIVE);
if (Map* map = go->GetMap())
{
Map::PlayerList const &PlayerList = map->GetPlayers();
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (i->GetSource())
{
UpdateData data;
@@ -461,7 +461,7 @@ class spell_madrigosa_deactivate_barrier : public SpellScriptLoader
i->GetSource()->GetSession()->SendPacket(&pkt);
}
}
}
}
}
void Register()
@@ -487,10 +487,10 @@ class spell_brutallus_burn : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
if (!target->HasAura(SPELL_BURN_DAMAGE))
target->CastSpell(target, SPELL_BURN_DAMAGE, true);
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
if (!target->HasAura(SPELL_BURN_DAMAGE))
target->CastSpell(target, SPELL_BURN_DAMAGE, true);
}
void Register()
@@ -513,14 +513,14 @@ class AreaTrigger_at_sunwell_madrigosa : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/)
{
if (InstanceScript* instance = player->GetInstanceScript())
if (instance->GetBossState(DATA_MADRIGOSA) != DONE)
{
instance->SetBossState(DATA_MADRIGOSA, NOT_STARTED);
instance->SetBossState(DATA_MADRIGOSA, DONE);
if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_MADRIGOSA)))
creature->AI()->DoAction(ACTION_START_EVENT);
}
if (InstanceScript* instance = player->GetInstanceScript())
if (instance->GetBossState(DATA_MADRIGOSA) != DONE)
{
instance->SetBossState(DATA_MADRIGOSA, NOT_STARTED);
instance->SetBossState(DATA_MADRIGOSA, DONE);
if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_MADRIGOSA)))
creature->AI()->DoAction(ACTION_START_EVENT);
}
return true;
}
@@ -529,9 +529,9 @@ class AreaTrigger_at_sunwell_madrigosa : public AreaTriggerScript
void AddSC_boss_brutallus()
{
new boss_brutallus();
new npc_madrigosa();
new spell_madrigosa_activate_barrier();
new spell_madrigosa_deactivate_barrier();
new spell_brutallus_burn();
new AreaTrigger_at_sunwell_madrigosa();
new npc_madrigosa();
new spell_madrigosa_activate_barrier();
new spell_madrigosa_deactivate_barrier();
new spell_brutallus_burn();
new AreaTrigger_at_sunwell_madrigosa();
}

View File

@@ -9,21 +9,21 @@ REWRITTEN BY XINEF
enum Quotes
{
YELL_INTRO_SAC = 0,
YELL_SAC_DEAD = 4,
EMOTE_SHADOW_NOVA = 5,
YELL_ENRAGE = 6,
YELL_SISTER_ALYTHESS_DEAD = 7,
YELL_SAC_KILL = 8,
YELL_SHADOW_NOVA = 9,
YELL_INTRO_SAC = 0,
YELL_SAC_DEAD = 4,
EMOTE_SHADOW_NOVA = 5,
YELL_ENRAGE = 6,
YELL_SISTER_ALYTHESS_DEAD = 7,
YELL_SAC_KILL = 8,
YELL_SHADOW_NOVA = 9,
YELL_INTRO_ALY = 0,
EMOTE_CONFLAGRATION = 4,
YELL_ALY_KILL = 5,
YELL_ALY_DEAD = 6,
YELL_SISTER_SACROLASH_DEAD = 7,
YELL_CANFLAGRATION = 8,
YELL_BERSERK = 9
YELL_INTRO_ALY = 0,
EMOTE_CONFLAGRATION = 4,
YELL_ALY_KILL = 5,
YELL_ALY_DEAD = 6,
YELL_SISTER_SACROLASH_DEAD = 7,
YELL_CANFLAGRATION = 8,
YELL_BERSERK = 9
};
enum Spells
@@ -34,14 +34,14 @@ enum Spells
SPELL_DARK_FLAME = 45345,
//Lady Sacrolash spells
SPELL_SHADOWFORM = 45455,
SPELL_SHADOWFORM = 45455,
SPELL_DARK_TOUCHED = 45347,
SPELL_SHADOW_BLADES = 45248,
SPELL_SHADOW_NOVA = 45329,
SPELL_CONFOUNDING_BLOW = 45256,
//Grand Warlock Alythess spells
SPELL_FIREFORM = 45457,
SPELL_FIREFORM = 45457,
SPELL_FLAME_TOUCHED = 45348,
SPELL_PYROGENICS = 45230,
SPELL_CONFLAGRATION = 45342,
@@ -52,17 +52,17 @@ enum Spells
enum Misc
{
ACTION_SISTER_DIED = 1,
ACTION_SISTER_DIED = 1,
EVENT_SPELL_SHADOW_BLADES = 1,
EVENT_SPELL_SHADOW_NOVA = 2,
EVENT_SPELL_CONFOUNDING_BLOW= 3,
EVENT_SHADOW_IMAGE = 4,
EVENT_SPELL_ENRAGE = 5,
EVENT_SPELL_CONFLAGRATION = 6,
EVENT_SPELL_BLAZE = 7,
EVENT_SPELL_PYROGENICS = 8,
EVENT_SPELL_FLAME_SEAR = 9
EVENT_SPELL_SHADOW_BLADES = 1,
EVENT_SPELL_SHADOW_NOVA = 2,
EVENT_SPELL_CONFOUNDING_BLOW= 3,
EVENT_SHADOW_IMAGE = 4,
EVENT_SPELL_ENRAGE = 5,
EVENT_SPELL_CONFLAGRATION = 6,
EVENT_SPELL_BLAZE = 7,
EVENT_SPELL_PYROGENICS = 8,
EVENT_SPELL_FLAME_SEAR = 9
};
class boss_sacrolash : public CreatureScript
@@ -74,54 +74,54 @@ public:
{
boss_sacrolashAI(Creature* creature) : BossAI(creature, DATA_EREDAR_TWINS) {}
bool sisterDied;
bool sisterDied;
void Reset()
{
me->CastSpell(me, SPELL_SHADOWFORM, true);
sisterDied = false;
BossAI::Reset();
me->SetLootMode(0);
me->CastSpell(me, SPELL_SHADOWFORM, true);
sisterDied = false;
BossAI::Reset();
me->SetLootMode(0);
}
void DoAction(int32 param)
{
if (param == ACTION_SISTER_DIED)
{
me->ResetLootMode();
sisterDied = true;
Talk(YELL_SISTER_ALYTHESS_DEAD);
me->CastSpell(me, SPELL_EMPOWER, true);
void DoAction(int32 param)
{
if (param == ACTION_SISTER_DIED)
{
me->ResetLootMode();
sisterDied = true;
Talk(YELL_SISTER_ALYTHESS_DEAD);
me->CastSpell(me, SPELL_EMPOWER, true);
uint32 timer = events.GetNextEventTime(EVENT_SPELL_SHADOW_NOVA);
events.CancelEvent(EVENT_SPELL_SHADOW_NOVA);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, timer-events.GetTimer());
}
}
uint32 timer = events.GetNextEventTime(EVENT_SPELL_SHADOW_NOVA);
events.CancelEvent(EVENT_SPELL_SHADOW_NOVA);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, timer-events.GetTimer());
}
}
void EnterEvadeMode()
{
BossAI::EnterEvadeMode();
if (Creature* alythess = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
{
if (!alythess->IsAlive())
alythess->Respawn(true);
else if (!alythess->IsInEvadeMode())
alythess->AI()->EnterEvadeMode();
}
}
void EnterEvadeMode()
{
BossAI::EnterEvadeMode();
if (Creature* alythess = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
{
if (!alythess->IsAlive())
alythess->Respawn(true);
else if (!alythess->IsInEvadeMode())
alythess->AI()->EnterEvadeMode();
}
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
BossAI::EnterCombat(who);
if (Creature* alythess = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
if (alythess->IsAlive() && !alythess->IsInCombat())
alythess->AI()->AttackStart(who);
if (alythess->IsAlive() && !alythess->IsInCombat())
alythess->AI()->AttackStart(who);
events.ScheduleEvent(EVENT_SPELL_SHADOW_BLADES, 10000);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, 36000);
events.ScheduleEvent(EVENT_SPELL_CONFOUNDING_BLOW, 25000);
events.ScheduleEvent(EVENT_SHADOW_IMAGE, 20000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 360000);
events.ScheduleEvent(EVENT_SPELL_SHADOW_BLADES, 10000);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, 36000);
events.ScheduleEvent(EVENT_SPELL_CONFOUNDING_BLOW, 25000);
events.ScheduleEvent(EVENT_SHADOW_IMAGE, 20000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 360000);
}
void KilledUnit(Unit* victim)
@@ -132,76 +132,76 @@ public:
void JustDied(Unit* /*killer*/)
{
events.Reset();
summons.DespawnAll();
events.Reset();
summons.DespawnAll();
if (sisterDied)
{
Talk(YELL_SAC_DEAD);
instance->SetBossState(DATA_EREDAR_TWINS, DONE);
}
else if (Creature* alythess = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
alythess->AI()->DoAction(ACTION_SISTER_DIED);
else if (Creature* alythess = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
alythess->AI()->DoAction(ACTION_SISTER_DIED);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
{
summon->AI()->AttackStart(target);
summon->AddThreat(target, 10000000);
}
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
{
summon->AI()->AttackStart(target);
summon->AddThreat(target, 10000000);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
Talk(YELL_ENRAGE);
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SPELL_CONFOUNDING_BLOW:
me->CastSpell(me->GetVictim(), SPELL_CONFOUNDING_BLOW, false);
events.ScheduleEvent(EVENT_SPELL_CONFOUNDING_BLOW, urand(20000, 25000));
break;
case EVENT_SPELL_SHADOW_BLADES:
me->CastSpell(me, SPELL_SHADOW_BLADES, false);
events.ScheduleEvent(EVENT_SPELL_SHADOW_BLADES, 10000);
break;
case EVENT_SPELL_SHADOW_NOVA:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
Talk(EMOTE_SHADOW_NOVA, target);
Talk(YELL_SHADOW_NOVA);
me->CastSpell(target, SPELL_SHADOW_NOVA, false);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000));
break;
}
case EVENT_SHADOW_IMAGE:
me->SummonCreature(NPC_SHADOW_IMAGE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 12000);
events.ScheduleEvent(EVENT_SHADOW_IMAGE, 6000);
break;
case EVENT_SPELL_CONFLAGRATION:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
me->CastSpell(target, SPELL_CONFLAGRATION, false);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000));
break;
}
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
Talk(YELL_ENRAGE);
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SPELL_CONFOUNDING_BLOW:
me->CastSpell(me->GetVictim(), SPELL_CONFOUNDING_BLOW, false);
events.ScheduleEvent(EVENT_SPELL_CONFOUNDING_BLOW, urand(20000, 25000));
break;
case EVENT_SPELL_SHADOW_BLADES:
me->CastSpell(me, SPELL_SHADOW_BLADES, false);
events.ScheduleEvent(EVENT_SPELL_SHADOW_BLADES, 10000);
break;
case EVENT_SPELL_SHADOW_NOVA:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
Talk(EMOTE_SHADOW_NOVA, target);
Talk(YELL_SHADOW_NOVA);
me->CastSpell(target, SPELL_SHADOW_NOVA, false);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000));
break;
}
case EVENT_SHADOW_IMAGE:
me->SummonCreature(NPC_SHADOW_IMAGE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 12000);
events.ScheduleEvent(EVENT_SHADOW_IMAGE, 6000);
break;
case EVENT_SPELL_CONFLAGRATION:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
me->CastSpell(target, SPELL_CONFLAGRATION, false);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000));
break;
}
}
DoMeleeAttackIfReady();
}
@@ -222,54 +222,54 @@ public:
{
boss_alythessAI(Creature* creature) : BossAI(creature, DATA_EREDAR_TWINS) { }
bool sisterDied;
bool sisterDied;
void Reset()
{
me->CastSpell(me, SPELL_FIREFORM, true);
sisterDied = false;
BossAI::Reset();
me->SetLootMode(0);
me->CastSpell(me, SPELL_FIREFORM, true);
sisterDied = false;
BossAI::Reset();
me->SetLootMode(0);
}
void DoAction(int32 param)
{
if (param == ACTION_SISTER_DIED)
{
me->ResetLootMode();
sisterDied = true;
Talk(YELL_SISTER_SACROLASH_DEAD);
me->CastSpell(me, SPELL_EMPOWER, true);
void DoAction(int32 param)
{
if (param == ACTION_SISTER_DIED)
{
me->ResetLootMode();
sisterDied = true;
Talk(YELL_SISTER_SACROLASH_DEAD);
me->CastSpell(me, SPELL_EMPOWER, true);
uint32 timer = events.GetNextEventTime(EVENT_SPELL_CONFLAGRATION);
events.CancelEvent(EVENT_SPELL_CONFLAGRATION);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, timer-events.GetTimer());
}
}
uint32 timer = events.GetNextEventTime(EVENT_SPELL_CONFLAGRATION);
events.CancelEvent(EVENT_SPELL_CONFLAGRATION);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, timer-events.GetTimer());
}
}
void EnterEvadeMode()
{
BossAI::EnterEvadeMode();
if (Creature* scorlash = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_SACROLASH)))
{
if (!scorlash->IsAlive())
scorlash->Respawn(true);
else if (!scorlash->IsInEvadeMode())
scorlash->AI()->EnterEvadeMode();
}
}
void EnterEvadeMode()
{
BossAI::EnterEvadeMode();
if (Creature* scorlash = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_SACROLASH)))
{
if (!scorlash->IsAlive())
scorlash->Respawn(true);
else if (!scorlash->IsInEvadeMode())
scorlash->AI()->EnterEvadeMode();
}
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
BossAI::EnterCombat(who);
if (Creature* scorlash = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_SACROLASH)))
if (scorlash->IsAlive() && !scorlash->IsInCombat())
scorlash->AI()->AttackStart(who);
if (scorlash->IsAlive() && !scorlash->IsInCombat())
scorlash->AI()->AttackStart(who);
events.ScheduleEvent(EVENT_SPELL_BLAZE, 100);
events.ScheduleEvent(EVENT_SPELL_PYROGENICS, 15000);
events.ScheduleEvent(EVENT_SPELL_FLAME_SEAR, 20000);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, 30000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 360000);
events.ScheduleEvent(EVENT_SPELL_BLAZE, 100);
events.ScheduleEvent(EVENT_SPELL_PYROGENICS, 15000);
events.ScheduleEvent(EVENT_SPELL_FLAME_SEAR, 20000);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, 30000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 360000);
}
void KilledUnit(Unit* victim)
@@ -280,16 +280,16 @@ public:
void JustDied(Unit* /*killer*/)
{
events.Reset();
summons.DespawnAll();
events.Reset();
summons.DespawnAll();
if (sisterDied)
{
Talk(YELL_SAC_DEAD);
instance->SetBossState(DATA_EREDAR_TWINS, DONE);
}
else if (Creature* scorlash = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_SACROLASH)))
scorlash->AI()->DoAction(ACTION_SISTER_DIED);
else if (Creature* scorlash = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_LADY_SACROLASH)))
scorlash->AI()->DoAction(ACTION_SISTER_DIED);
}
void UpdateAI(uint32 diff)
@@ -297,51 +297,51 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
Talk(YELL_BERSERK);
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SPELL_PYROGENICS:
me->CastSpell(me, SPELL_PYROGENICS, false);
events.ScheduleEvent(EVENT_SPELL_PYROGENICS, 15000);
break;
case EVENT_SPELL_FLAME_SEAR:
me->CastCustomSpell(SPELL_FLAME_SEAR, SPELLVALUE_MAX_TARGETS, 5, me, TRIGGERED_NONE);
events.ScheduleEvent(EVENT_SPELL_FLAME_SEAR, 15000);
break;
case EVENT_SPELL_BLAZE:
me->CastSpell(me->GetVictim(), SPELL_BLAZE, false);
events.ScheduleEvent(EVENT_SPELL_BLAZE, 3800);
break;
case EVENT_SPELL_SHADOW_NOVA:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
me->CastSpell(target, SPELL_SHADOW_NOVA, false);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000));
break;
}
case EVENT_SPELL_CONFLAGRATION:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
Talk(EMOTE_CONFLAGRATION, target);
Talk(YELL_CANFLAGRATION);
me->CastSpell(target, SPELL_CONFLAGRATION, false);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000));
break;
}
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
Talk(YELL_BERSERK);
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SPELL_PYROGENICS:
me->CastSpell(me, SPELL_PYROGENICS, false);
events.ScheduleEvent(EVENT_SPELL_PYROGENICS, 15000);
break;
case EVENT_SPELL_FLAME_SEAR:
me->CastCustomSpell(SPELL_FLAME_SEAR, SPELLVALUE_MAX_TARGETS, 5, me, TRIGGERED_NONE);
events.ScheduleEvent(EVENT_SPELL_FLAME_SEAR, 15000);
break;
case EVENT_SPELL_BLAZE:
me->CastSpell(me->GetVictim(), SPELL_BLAZE, false);
events.ScheduleEvent(EVENT_SPELL_BLAZE, 3800);
break;
case EVENT_SPELL_SHADOW_NOVA:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
me->CastSpell(target, SPELL_SHADOW_NOVA, false);
events.ScheduleEvent(EVENT_SPELL_SHADOW_NOVA, urand(30000, 35000));
break;
}
case EVENT_SPELL_CONFLAGRATION:
{
Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 100.0f);
if (!target)
target = me->GetVictim();
Talk(EMOTE_CONFLAGRATION, target);
Talk(YELL_CANFLAGRATION);
me->CastSpell(target, SPELL_CONFLAGRATION, false);
events.ScheduleEvent(EVENT_SPELL_CONFLAGRATION, urand(30000, 35000));
break;
}
}
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
};
@@ -353,131 +353,131 @@ public:
class spell_eredar_twins_apply_dark_touched : public SpellScriptLoader
{
public:
spell_eredar_twins_apply_dark_touched() : SpellScriptLoader("spell_eredar_twins_apply_dark_touched") { }
public:
spell_eredar_twins_apply_dark_touched() : SpellScriptLoader("spell_eredar_twins_apply_dark_touched") { }
class spell_eredar_twins_apply_dark_touched_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_apply_dark_touched_SpellScript);
class spell_eredar_twins_apply_dark_touched_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_apply_dark_touched_SpellScript);
void HandleApplyTouch()
{
if (Player* target = GetHitPlayer())
target->CastSpell(target, SPELL_DARK_TOUCHED, true);
}
void HandleApplyTouch()
{
if (Player* target = GetHitPlayer())
target->CastSpell(target, SPELL_DARK_TOUCHED, true);
}
void Register()
{
AfterHit += SpellHitFn(spell_eredar_twins_apply_dark_touched_SpellScript::HandleApplyTouch);
}
};
void Register()
{
AfterHit += SpellHitFn(spell_eredar_twins_apply_dark_touched_SpellScript::HandleApplyTouch);
}
};
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_apply_dark_touched_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_apply_dark_touched_SpellScript();
}
};
class spell_eredar_twins_apply_flame_touched : public SpellScriptLoader
{
public:
spell_eredar_twins_apply_flame_touched() : SpellScriptLoader("spell_eredar_twins_apply_flame_touched") { }
public:
spell_eredar_twins_apply_flame_touched() : SpellScriptLoader("spell_eredar_twins_apply_flame_touched") { }
class spell_eredar_twins_apply_flame_touched_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_apply_flame_touched_SpellScript);
class spell_eredar_twins_apply_flame_touched_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_apply_flame_touched_SpellScript);
void HandleApplyTouch()
{
if (Player* target = GetHitPlayer())
target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
}
void HandleApplyTouch()
{
if (Player* target = GetHitPlayer())
target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
}
void Register()
{
AfterHit += SpellHitFn(spell_eredar_twins_apply_flame_touched_SpellScript::HandleApplyTouch);
}
};
void Register()
{
AfterHit += SpellHitFn(spell_eredar_twins_apply_flame_touched_SpellScript::HandleApplyTouch);
}
};
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_apply_flame_touched_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_apply_flame_touched_SpellScript();
}
};
class spell_eredar_twins_handle_touch : public SpellScriptLoader
{
public:
spell_eredar_twins_handle_touch() : SpellScriptLoader("spell_eredar_twins_handle_touch") { }
public:
spell_eredar_twins_handle_touch() : SpellScriptLoader("spell_eredar_twins_handle_touch") { }
class spell_eredar_twins_handle_touch_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_handle_touch_SpellScript);
class spell_eredar_twins_handle_touch_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_handle_touch_SpellScript);
SpellCastResult CheckCast()
SpellCastResult CheckCast()
{
if (GetCaster()->HasAura(SPELL_DARK_FLAME))
return SPELL_FAILED_DONT_REPORT;
if (GetCaster()->HasAura(SPELL_DARK_FLAME))
return SPELL_FAILED_DONT_REPORT;
if (GetSpellInfo()->Id == SPELL_DARK_TOUCHED)
{
if (GetCaster()->HasAura(SPELL_FLAME_TOUCHED))
if (GetSpellInfo()->Id == SPELL_DARK_TOUCHED)
{
if (GetCaster()->HasAura(SPELL_FLAME_TOUCHED))
{
GetCaster()->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true);
return SPELL_FAILED_DONT_REPORT;
GetCaster()->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true);
return SPELL_FAILED_DONT_REPORT;
}
}
else // if (m_spellInfo->Id == SPELL_FLAME_TOUCHED)
{
if (GetCaster()->HasAura(SPELL_DARK_TOUCHED))
}
else // if (m_spellInfo->Id == SPELL_FLAME_TOUCHED)
{
if (GetCaster()->HasAura(SPELL_DARK_TOUCHED))
{
GetCaster()->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true);
return SPELL_FAILED_DONT_REPORT;
GetCaster()->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
GetCaster()->CastSpell(GetCaster(), SPELL_DARK_FLAME, true);
return SPELL_FAILED_DONT_REPORT;
}
}
return SPELL_CAST_OK;
}
}
return SPELL_CAST_OK;
}
void Register()
{
void Register()
{
OnCheckCast += SpellCheckCastFn(spell_eredar_twins_handle_touch_SpellScript::CheckCast);
}
};
}
};
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_handle_touch_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_handle_touch_SpellScript();
}
};
class spell_eredar_twins_blaze : public SpellScriptLoader
{
public:
spell_eredar_twins_blaze() : SpellScriptLoader("spell_eredar_twins_blaze") { }
public:
spell_eredar_twins_blaze() : SpellScriptLoader("spell_eredar_twins_blaze") { }
class spell_eredar_twins_blaze_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_blaze_SpellScript);
class spell_eredar_twins_blaze_SpellScript : public SpellScript
{
PrepareSpellScript(spell_eredar_twins_blaze_SpellScript);
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_eredar_twins_blaze_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_eredar_twins_blaze_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_blaze_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_eredar_twins_blaze_SpellScript();
}
};
class AreaTrigger_at_sunwell_eredar_twins : public AreaTriggerScript
@@ -488,15 +488,15 @@ class AreaTrigger_at_sunwell_eredar_twins : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/)
{
if (InstanceScript* instance = player->GetInstanceScript())
if (instance->GetBossState(DATA_EREDAR_TWINS_INTRO) != DONE)
{
instance->SetBossState(DATA_EREDAR_TWINS_INTRO, DONE);
if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_LADY_SACROLASH)))
creature->AI()->Talk(YELL_INTRO_SAC);
if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
creature->AI()->Talk(YELL_INTRO_ALY);
}
if (InstanceScript* instance = player->GetInstanceScript())
if (instance->GetBossState(DATA_EREDAR_TWINS_INTRO) != DONE)
{
instance->SetBossState(DATA_EREDAR_TWINS_INTRO, DONE);
if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_LADY_SACROLASH)))
creature->AI()->Talk(YELL_INTRO_SAC);
if (Creature* creature = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_GRAND_WARLOCK_ALYTHESS)))
creature->AI()->Talk(YELL_INTRO_ALY);
}
return true;
}
@@ -506,9 +506,9 @@ void AddSC_boss_eredar_twins()
{
new boss_sacrolash();
new boss_alythess();
new spell_eredar_twins_apply_dark_touched();
new spell_eredar_twins_apply_flame_touched();
new spell_eredar_twins_handle_touch();
new spell_eredar_twins_blaze();
new AreaTrigger_at_sunwell_eredar_twins();
new spell_eredar_twins_apply_dark_touched();
new spell_eredar_twins_apply_flame_touched();
new spell_eredar_twins_handle_touch();
new spell_eredar_twins_blaze();
new AreaTrigger_at_sunwell_eredar_twins();
}

View File

@@ -12,82 +12,82 @@ REWRITTEN BY XINEF
enum Yells
{
YELL_BIRTH = 0,
YELL_KILL = 1,
YELL_BREATH = 2,
YELL_TAKEOFF = 3,
YELL_BERSERK = 4,
YELL_DEATH = 5,
EMOTE_BREATH = 6
YELL_BIRTH = 0,
YELL_KILL = 1,
YELL_BREATH = 2,
YELL_TAKEOFF = 3,
YELL_BERSERK = 4,
YELL_DEATH = 5,
EMOTE_BREATH = 6
};
enum Spells
{
//Aura
SPELL_NOXIOUS_FUMES = 47002,
SPELL_NOXIOUS_FUMES = 47002,
//Land phase
SPELL_BERSERK = 45078,
SPELL_CLEAVE = 19983,
SPELL_CORROSION = 45866,
SPELL_GAS_NOVA = 45855,
SPELL_ENCAPSULATE_CHANNEL = 45661,
SPELL_BERSERK = 45078,
SPELL_CLEAVE = 19983,
SPELL_CORROSION = 45866,
SPELL_GAS_NOVA = 45855,
SPELL_ENCAPSULATE_CHANNEL = 45661,
//Flight phase
SPELL_SUMMON_DEMONIC_VAPOR = 45391,
SPELL_DEMONIC_VAPOR_SPAWN_TRIGGER = 45388, // Triggers visual beam
SPELL_DEMONIC_VAPOR_PERIODIC = 45411, // Spawns cloud and deals damage
SPELL_DEMONIC_VAPOR_TRAIL_PERIODIC = 45399, // periodic of cloud
SPELL_DEMONIC_VAPOR = 45402, // cloud dot
SPELL_SUMMON_BLAZING_DEAD = 45400, // spawns skeletons
SPELL_FELMYST_SPEED_BURST = 45495, // speed burst and breath animation
SPELL_FOG_OF_CORRUPTION = 45582, // trigger cast
SPELL_FOG_OF_CORRUPTION_CHARM = 45717, // charm 1
SPELL_FOG_OF_CORRUPTION_CHARM2 = 45726, // charm 2
SPELL_SUMMON_DEMONIC_VAPOR = 45391,
SPELL_DEMONIC_VAPOR_SPAWN_TRIGGER = 45388, // Triggers visual beam
SPELL_DEMONIC_VAPOR_PERIODIC = 45411, // Spawns cloud and deals damage
SPELL_DEMONIC_VAPOR_TRAIL_PERIODIC = 45399, // periodic of cloud
SPELL_DEMONIC_VAPOR = 45402, // cloud dot
SPELL_SUMMON_BLAZING_DEAD = 45400, // spawns skeletons
SPELL_FELMYST_SPEED_BURST = 45495, // speed burst and breath animation
SPELL_FOG_OF_CORRUPTION = 45582, // trigger cast
SPELL_FOG_OF_CORRUPTION_CHARM = 45717, // charm 1
SPELL_FOG_OF_CORRUPTION_CHARM2 = 45726, // charm 2
};
enum Misc
{
// Land
EVENT_SPELL_BERSERK = 1,
EVENT_SPELL_CLEAVE = 2,
EVENT_SPELL_CORROSION = 3,
EVENT_SPELL_GAS_NOVA = 4,
EVENT_SPELL_ENCAPSULATE = 5,
EVENT_FLIGHT = 6,
EVENT_LAND = 7,
EVENT_RESTORE_COMBAT = 8,
EVENT_RESTORE_COMBAT2 = 9,
// Land
EVENT_SPELL_BERSERK = 1,
EVENT_SPELL_CLEAVE = 2,
EVENT_SPELL_CORROSION = 3,
EVENT_SPELL_GAS_NOVA = 4,
EVENT_SPELL_ENCAPSULATE = 5,
EVENT_FLIGHT = 6,
EVENT_LAND = 7,
EVENT_RESTORE_COMBAT = 8,
EVENT_RESTORE_COMBAT2 = 9,
// Air
EVENT_FLIGHT_SEQ = 100,
EVENT_FLIGHT_VAPOR = 101,
EVENT_FLIGHT_MOVE_UP = 102,
EVENT_LAND_FIGHT = 103,
EVENT_FLIGHT_EMOTE = 104,
EVENT_FLIGHT_BREATH1 = 105,
EVENT_FLIGHT_BREATH2 = 106,
EVENT_FLIGHT_FLYOVER1 = 107,
EVENT_FLIGHT_FLYOVER2 = 108,
EVENT_CORRUPT_TRIGGERS = 109,
// Air
EVENT_FLIGHT_SEQ = 100,
EVENT_FLIGHT_VAPOR = 101,
EVENT_FLIGHT_MOVE_UP = 102,
EVENT_LAND_FIGHT = 103,
EVENT_FLIGHT_EMOTE = 104,
EVENT_FLIGHT_BREATH1 = 105,
EVENT_FLIGHT_BREATH2 = 106,
EVENT_FLIGHT_FLYOVER1 = 107,
EVENT_FLIGHT_FLYOVER2 = 108,
EVENT_CORRUPT_TRIGGERS = 109,
// Intro
EVENT_INTRO_1 = 20,
EVENT_INTRO_2 = 21,
EVENT_INTRO_3 = 22,
EVENT_INTRO_4 = 23,
// Intro
EVENT_INTRO_1 = 20,
EVENT_INTRO_2 = 21,
EVENT_INTRO_3 = 22,
EVENT_INTRO_4 = 23,
// Misc
ACTION_START_EVENT = 1,
POINT_GROUND = 1,
POINT_AIR = 2,
POINT_AIR_BREATH_START1 = 3,
POINT_AIR_BREATH_END1 = 4,
POINT_AIR_BREATH_START2 = 5,
POINT_AIR_BREATH_END2 = 6,
POINT_MISC = 7,
// Misc
ACTION_START_EVENT = 1,
POINT_GROUND = 1,
POINT_AIR = 2,
POINT_AIR_BREATH_START1 = 3,
POINT_AIR_BREATH_END1 = 4,
POINT_AIR_BREATH_START2 = 5,
POINT_AIR_BREATH_END2 = 6,
POINT_MISC = 7,
NPC_FOG_TRIGGER = 23472
NPC_FOG_TRIGGER = 23472
};
class CorruptTriggers : public BasicEvent
@@ -99,11 +99,11 @@ class CorruptTriggers : public BasicEvent
bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
{
std::list<Creature*> cList;
_caster->GetCreaturesWithEntryInRange(cList, 70.0f, NPC_FOG_TRIGGER);
for (std::list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); ++itr)
if (_caster->GetExactDist2d(*itr) <= 11.0f)
(*itr)->CastSpell(*itr, SPELL_FOG_OF_CORRUPTION, true);
std::list<Creature*> cList;
_caster->GetCreaturesWithEntryInRange(cList, 70.0f, NPC_FOG_TRIGGER);
for (std::list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); ++itr)
if (_caster->GetExactDist2d(*itr) <= 11.0f)
(*itr)->CastSpell(*itr, SPELL_FOG_OF_CORRUPTION, true);
return true;
}
@@ -121,144 +121,144 @@ public:
boss_felmystAI(Creature* creature) : BossAI(creature, DATA_FELMYST)
{
bool appear = instance->GetBossState(DATA_BRUTALLUS) == DONE;
creature->SetVisible(appear);
creature->SetStandState(UNIT_STAND_STATE_SLEEP);
creature->SetReactState(REACT_PASSIVE);
creature->SetVisible(appear);
creature->SetStandState(UNIT_STAND_STATE_SLEEP);
creature->SetReactState(REACT_PASSIVE);
}
EventMap events2;
void DoAction(int32 param)
{
if (param == ACTION_START_EVENT)
{
me->SetVisible(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
events2.ScheduleEvent(EVENT_INTRO_1, 3000);
}
}
void DoAction(int32 param)
{
if (param == ACTION_START_EVENT)
{
me->SetVisible(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
events2.ScheduleEvent(EVENT_INTRO_1, 3000);
}
}
void Reset()
{
BossAI::Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
me->SetDisableGravity(false);
events2.Reset();
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FOG_OF_CORRUPTION_CHARM);
BossAI::Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
me->SetDisableGravity(false);
events2.Reset();
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FOG_OF_CORRUPTION_CHARM);
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (events.Empty() && events2.Empty())
events2.ScheduleEvent(EVENT_INTRO_2, 3000);
BossAI::EnterCombat(who);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (events.Empty() && events2.Empty())
events2.ScheduleEvent(EVENT_INTRO_2, 3000);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
Talk(YELL_KILL);
if (victim->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
Talk(YELL_KILL);
}
void JustDied(Unit* killer)
{
BossAI::JustDied(killer);
BossAI::JustDied(killer);
Talk(YELL_DEATH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FOG_OF_CORRUPTION_CHARM);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FOG_OF_CORRUPTION_CHARM);
// Summon Kalecgos (human form of kalecgos fight)
me->SummonCreature(NPC_KALEC, 1526.28f, 700.10f, 60.0f, 4.33f);
// Summon Kalecgos (human form of kalecgos fight)
me->SummonCreature(NPC_KALEC, 1526.28f, 700.10f, 60.0f, 4.33f);
}
void MovementInform(uint32 type, uint32 point)
{
if (type != POINT_MOTION_TYPE)
return;
if (type != POINT_MOTION_TYPE)
return;
if (point == POINT_GROUND)
{
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->SetDisableGravity(false);
me->SendMovementFlagUpdate();
if (point == POINT_GROUND)
{
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->SetDisableGravity(false);
me->SendMovementFlagUpdate();
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
events.ScheduleEvent(EVENT_RESTORE_COMBAT2, 1);
events.ScheduleEvent(EVENT_SPELL_CLEAVE, 7500, 1);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
events.ScheduleEvent(EVENT_RESTORE_COMBAT2, 1);
events.ScheduleEvent(EVENT_SPELL_CLEAVE, 7500, 1);
events.ScheduleEvent(EVENT_SPELL_CORROSION, 12000, 1);
events.ScheduleEvent(EVENT_SPELL_GAS_NOVA, 18000, 1);
events.ScheduleEvent(EVENT_SPELL_ENCAPSULATE, 25000, 1);
events.ScheduleEvent(EVENT_FLIGHT, 60000, 1);
}
else if (point == POINT_AIR_BREATH_START1)
{
me->SetTarget(0);
me->SetFacingTo(4.71f);
events.ScheduleEvent(EVENT_FLIGHT_EMOTE, 2000);
events.ScheduleEvent(EVENT_CORRUPT_TRIGGERS, 5000);
events.ScheduleEvent(EVENT_FLIGHT_FLYOVER1, 5000);
}
else if (point == POINT_AIR_BREATH_END1)
{
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
me->SetFacingTo(1.57f);
if (events.GetNextEventTime(EVENT_FLIGHT_BREATH1) != 0)
events.ScheduleEvent(EVENT_FLIGHT_BREATH2, 2000);
}
else if (point == POINT_AIR_BREATH_START2)
{
me->SetTarget(0);
me->SetFacingTo(1.57f);
events.ScheduleEvent(EVENT_FLIGHT_EMOTE, 2000);
events.ScheduleEvent(EVENT_CORRUPT_TRIGGERS, 5000);
events.ScheduleEvent(EVENT_FLIGHT_FLYOVER2, 5000);
}
else if (point == POINT_AIR_BREATH_END2)
{
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
me->SetFacingTo(4.71f);
}
}
else if (point == POINT_AIR_BREATH_START1)
{
me->SetTarget(0);
me->SetFacingTo(4.71f);
events.ScheduleEvent(EVENT_FLIGHT_EMOTE, 2000);
events.ScheduleEvent(EVENT_CORRUPT_TRIGGERS, 5000);
events.ScheduleEvent(EVENT_FLIGHT_FLYOVER1, 5000);
}
else if (point == POINT_AIR_BREATH_END1)
{
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
me->SetFacingTo(1.57f);
if (events.GetNextEventTime(EVENT_FLIGHT_BREATH1) != 0)
events.ScheduleEvent(EVENT_FLIGHT_BREATH2, 2000);
}
else if (point == POINT_AIR_BREATH_START2)
{
me->SetTarget(0);
me->SetFacingTo(1.57f);
events.ScheduleEvent(EVENT_FLIGHT_EMOTE, 2000);
events.ScheduleEvent(EVENT_CORRUPT_TRIGGERS, 5000);
events.ScheduleEvent(EVENT_FLIGHT_FLYOVER2, 5000);
}
else if (point == POINT_AIR_BREATH_END2)
{
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
me->SetFacingTo(4.71f);
}
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
}
void UpdateAI(uint32 diff)
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_INTRO_1:
me->SetStandState(UNIT_STAND_STATE_STAND);
events2.ScheduleEvent(EVENT_INTRO_2, 4000);
break;
case EVENT_INTRO_2:
Talk(YELL_BIRTH);
me->SetDisableGravity(true);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SendMovementFlagUpdate();
events2.ScheduleEvent(EVENT_INTRO_3, 1500);
break;
case EVENT_INTRO_3:
me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10.0f, false, true);
events2.ScheduleEvent(EVENT_INTRO_4, 2000);
break;
case EVENT_INTRO_4:
events.ScheduleEvent(EVENT_LAND, 3000, 1);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
me->SetInCombatWithZone();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_NOXIOUS_FUMES, true);
me->GetMotionMaster()->MovePoint(POINT_MISC, 1472.18f, 603.38f, 34.0f, false, true);
break;
}
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_INTRO_1:
me->SetStandState(UNIT_STAND_STATE_STAND);
events2.ScheduleEvent(EVENT_INTRO_2, 4000);
break;
case EVENT_INTRO_2:
Talk(YELL_BIRTH);
me->SetDisableGravity(true);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SendMovementFlagUpdate();
events2.ScheduleEvent(EVENT_INTRO_3, 1500);
break;
case EVENT_INTRO_3:
me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10.0f, false, true);
events2.ScheduleEvent(EVENT_INTRO_4, 2000);
break;
case EVENT_INTRO_4:
events.ScheduleEvent(EVENT_LAND, 3000, 1);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
me->SetInCombatWithZone();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_NOXIOUS_FUMES, true);
me->GetMotionMaster()->MovePoint(POINT_MISC, 1472.18f, 603.38f, 34.0f, false, true);
break;
}
if (!events2.Empty())
return;
if (!events2.Empty())
return;
if (!UpdateVictim())
return;
@@ -267,108 +267,108 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch(events.ExecuteEvent())
{
case EVENT_RESTORE_COMBAT:
me->SetReactState(REACT_AGGRESSIVE);
break;
case EVENT_RESTORE_COMBAT2:
me->SetTarget(me->GetVictim()->GetGUID());
me->GetMotionMaster()->MoveChase(me->GetVictim());
break;
case EVENT_LAND:
me->GetMotionMaster()->MovePoint(POINT_GROUND, me->GetPositionX(), me->GetPositionY(), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()), false, true);
break;
case EVENT_SPELL_BERSERK:
Talk(YELL_BERSERK);
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SPELL_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
events.ScheduleEvent(EVENT_SPELL_CLEAVE, 7500, 1);
break;
case EVENT_SPELL_CORROSION:
me->CastSpell(me->GetVictim(), SPELL_CORROSION, false);
events.ScheduleEvent(EVENT_SPELL_CORROSION, 20000, 1);
break;
case EVENT_SPELL_GAS_NOVA:
DoCast(me, SPELL_GAS_NOVA, false);
events.ScheduleEvent(EVENT_SPELL_GAS_NOVA, 20000, 1);
break;
case EVENT_SPELL_ENCAPSULATE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
events.ScheduleEvent(EVENT_SPELL_ENCAPSULATE, 25000, 1);
break;
case EVENT_FLIGHT:
events.CancelEventGroup(1);
events.ScheduleEvent(EVENT_FLIGHT_SEQ, 1000);
me->SetReactState(REACT_PASSIVE);
me->StopMoving();
me->GetMotionMaster()->Clear();
break;
case EVENT_FLIGHT_SEQ:
switch(events.ExecuteEvent())
{
case EVENT_RESTORE_COMBAT:
me->SetReactState(REACT_AGGRESSIVE);
break;
case EVENT_RESTORE_COMBAT2:
me->SetTarget(me->GetVictim()->GetGUID());
me->GetMotionMaster()->MoveChase(me->GetVictim());
break;
case EVENT_LAND:
me->GetMotionMaster()->MovePoint(POINT_GROUND, me->GetPositionX(), me->GetPositionY(), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()), false, true);
break;
case EVENT_SPELL_BERSERK:
Talk(YELL_BERSERK);
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SPELL_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
events.ScheduleEvent(EVENT_SPELL_CLEAVE, 7500, 1);
break;
case EVENT_SPELL_CORROSION:
me->CastSpell(me->GetVictim(), SPELL_CORROSION, false);
events.ScheduleEvent(EVENT_SPELL_CORROSION, 20000, 1);
break;
case EVENT_SPELL_GAS_NOVA:
DoCast(me, SPELL_GAS_NOVA, false);
events.ScheduleEvent(EVENT_SPELL_GAS_NOVA, 20000, 1);
break;
case EVENT_SPELL_ENCAPSULATE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
events.ScheduleEvent(EVENT_SPELL_ENCAPSULATE, 25000, 1);
break;
case EVENT_FLIGHT:
events.CancelEventGroup(1);
events.ScheduleEvent(EVENT_FLIGHT_SEQ, 1000);
me->SetReactState(REACT_PASSIVE);
me->StopMoving();
me->GetMotionMaster()->Clear();
break;
case EVENT_FLIGHT_SEQ:
Talk(YELL_TAKEOFF);
me->SetTarget(0);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true);
me->SendMovementFlagUpdate();
me->SetTarget(0);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true);
me->SendMovementFlagUpdate();
events.ScheduleEvent(EVENT_FLIGHT_MOVE_UP, 2000);
events.ScheduleEvent(EVENT_FLIGHT_VAPOR, 8000);
events.ScheduleEvent(EVENT_FLIGHT_VAPOR, 21000);
events.ScheduleEvent(EVENT_FLIGHT_BREATH1, 35000);
events.ScheduleEvent(EVENT_FLIGHT_BREATH1, 72000);
events.ScheduleEvent(EVENT_LAND_FIGHT, 86000);
break;
case EVENT_FLIGHT_MOVE_UP:
me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+15.0f, false, true);
break;
case EVENT_FLIGHT_VAPOR:
me->CastSpell(me, SPELL_SUMMON_DEMONIC_VAPOR, true);
break;
case EVENT_FLIGHT_BREATH1:
{
Position pos = {1447.0f + urand(0, 2)*25.0f, 705.0f, 50.0f, 4.71f};
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true);
break;
}
case EVENT_FLIGHT_BREATH2:
{
Position pos = {1447.0f + urand(0, 2)*25.0f, 515.0f, 50.0f, 1.57f};
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START2, pos, false, true);
break;
}
case EVENT_FLIGHT_EMOTE:
Talk(EMOTE_BREATH);
break;
case EVENT_CORRUPT_TRIGGERS:
events.ScheduleEvent(EVENT_FLIGHT_MOVE_UP, 2000);
events.ScheduleEvent(EVENT_FLIGHT_VAPOR, 8000);
events.ScheduleEvent(EVENT_FLIGHT_VAPOR, 21000);
events.ScheduleEvent(EVENT_FLIGHT_BREATH1, 35000);
events.ScheduleEvent(EVENT_FLIGHT_BREATH1, 72000);
events.ScheduleEvent(EVENT_LAND_FIGHT, 86000);
break;
case EVENT_FLIGHT_MOVE_UP:
me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+15.0f, false, true);
break;
case EVENT_FLIGHT_VAPOR:
me->CastSpell(me, SPELL_SUMMON_DEMONIC_VAPOR, true);
break;
case EVENT_FLIGHT_BREATH1:
{
Position pos = {1447.0f + urand(0, 2)*25.0f, 705.0f, 50.0f, 4.71f};
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true);
break;
}
case EVENT_FLIGHT_BREATH2:
{
Position pos = {1447.0f + urand(0, 2)*25.0f, 515.0f, 50.0f, 1.57f};
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START2, pos, false, true);
break;
}
case EVENT_FLIGHT_EMOTE:
Talk(EMOTE_BREATH);
break;
case EVENT_CORRUPT_TRIGGERS:
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(0));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1000));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2000));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3000));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(4000));
break;
case EVENT_FLIGHT_FLYOVER1:
me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true);
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END1, me->GetPositionX(), me->GetPositionY()-200.0f, me->GetPositionZ()+5.0f, false, true);
break;
case EVENT_FLIGHT_FLYOVER2:
me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true);
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END2, me->GetPositionX(), me->GetPositionY()+200.0f, me->GetPositionZ()+5.0f, false, true);
break;
case EVENT_LAND_FIGHT:
me->GetMotionMaster()->MovePoint(POINT_GROUND, 1500.0f, 552.8f, 26.52f, false, true);
break;
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1000));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2000));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3000));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3500));
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(4000));
break;
case EVENT_FLIGHT_FLYOVER1:
me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true);
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END1, me->GetPositionX(), me->GetPositionY()-200.0f, me->GetPositionZ()+5.0f, false, true);
break;
case EVENT_FLIGHT_FLYOVER2:
me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true);
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END2, me->GetPositionX(), me->GetPositionY()+200.0f, me->GetPositionZ()+5.0f, false, true);
break;
case EVENT_LAND_FIGHT:
me->GetMotionMaster()->MovePoint(POINT_GROUND, 1500.0f, 552.8f, 26.52f, false, true);
break;
}
}
if (!me->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
DoMeleeAttackIfReady();
if (!me->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
DoMeleeAttackIfReady();
}
};
@@ -393,24 +393,24 @@ public:
npc_demonic_vaporAI(Creature* creature) : NullCreatureAI(creature) { }
void Reset()
{
me->CastSpell(me, SPELL_DEMONIC_VAPOR_SPAWN_TRIGGER, true);
me->CastSpell(me, SPELL_DEMONIC_VAPOR_PERIODIC, true);
}
{
me->CastSpell(me, SPELL_DEMONIC_VAPOR_SPAWN_TRIGGER, true);
me->CastSpell(me, SPELL_DEMONIC_VAPOR_PERIODIC, true);
}
void UpdateAI(uint32 diff)
{
if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (me->GetDistance2d(itr->GetSource()) < 20.0f && itr->GetSource()->IsAlive())
{
me->GetMotionMaster()->MoveFollow(itr->GetSource(), 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
break;
}
}
}
void UpdateAI(uint32 diff)
{
if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (me->GetDistance2d(itr->GetSource()) < 20.0f && itr->GetSource()->IsAlive())
{
me->GetMotionMaster()->MoveFollow(itr->GetSource(), 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
break;
}
}
}
};
};
@@ -427,40 +427,40 @@ public:
struct npc_demonic_vapor_trailAI : public NullCreatureAI
{
npc_demonic_vapor_trailAI(Creature* creature) : NullCreatureAI(creature)
{
timer = 1;
}
{
timer = 1;
}
uint32 timer;
uint32 timer;
void Reset()
{
me->CastSpell(me, SPELL_DEMONIC_VAPOR_TRAIL_PERIODIC, true);
}
{
me->CastSpell(me, SPELL_DEMONIC_VAPOR_TRAIL_PERIODIC, true);
}
void SpellHitTarget(Unit* , const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_DEMONIC_VAPOR)
me->CastSpell(me, SPELL_SUMMON_BLAZING_DEAD, true);
}
void SpellHitTarget(Unit* , const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_DEMONIC_VAPOR)
me->CastSpell(me, SPELL_SUMMON_BLAZING_DEAD, true);
}
void UpdateAI(uint32 diff)
{
if (timer)
{
timer += diff;
if (timer >= 6000)
{
timer = 0;
me->CastSpell(me, SPELL_SUMMON_BLAZING_DEAD, true);
}
}
}
void UpdateAI(uint32 diff)
{
if (timer)
{
timer += diff;
if (timer >= 6000)
{
timer = 0;
me->CastSpell(me, SPELL_SUMMON_BLAZING_DEAD, true);
}
}
}
void JustSummoned(Creature* summon)
{
summon->SetInCombatWithZone();
summon->AI()->AttackStart(summon->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f));
}
void JustSummoned(Creature* summon)
{
summon->SetInCombatWithZone();
summon->AI()->AttackStart(summon->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f));
}
};
};
@@ -475,9 +475,9 @@ class spell_felmyst_fog_of_corruption : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
target->CastSpell(GetCaster(), SPELL_FOG_OF_CORRUPTION_CHARM, true);
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
target->CastSpell(GetCaster(), SPELL_FOG_OF_CORRUPTION_CHARM, true);
}
void Register()
@@ -503,13 +503,13 @@ class spell_felmyst_fog_of_corruption_charm : public SpellScriptLoader
void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
GetTarget()->CastSpell(GetTarget(), SPELL_FOG_OF_CORRUPTION_CHARM2, true);
GetTarget()->CastSpell(GetTarget(), SPELL_FOG_OF_CORRUPTION_CHARM2, true);
}
void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
GetTarget()->RemoveAurasDueToSpell(SPELL_FOG_OF_CORRUPTION_CHARM2);
Unit::Kill(GetCaster(), GetTarget(), false);
GetTarget()->RemoveAurasDueToSpell(SPELL_FOG_OF_CORRUPTION_CHARM2);
Unit::Kill(GetCaster(), GetTarget(), false);
}
void Register()
@@ -530,11 +530,11 @@ class DoorsGuidCheck
public:
bool operator()(WorldObject* object) const
{
if (object->GetTypeId() != TYPEID_UNIT)
return true;
if (object->GetTypeId() != TYPEID_UNIT)
return true;
Creature* cr = object->ToCreature();
return cr->GetDBTableGUIDLow() != 54780 && cr->GetDBTableGUIDLow() != 54787 && cr->GetDBTableGUIDLow() != 54801;
Creature* cr = object->ToCreature();
return cr->GetDBTableGUIDLow() != 54780 && cr->GetDBTableGUIDLow() != 54787 && cr->GetDBTableGUIDLow() != 54801;
}
};
@@ -568,8 +568,8 @@ void AddSC_boss_felmyst()
{
new boss_felmyst();
new npc_demonic_vapor();
new npc_demonic_vapor_trail();
new spell_felmyst_fog_of_corruption();
new spell_felmyst_fog_of_corruption_charm();
new spell_felmyst_open_brutallus_back_doors();
new npc_demonic_vapor_trail();
new spell_felmyst_fog_of_corruption();
new spell_felmyst_fog_of_corruption_charm();
new spell_felmyst_open_brutallus_back_doors();
}

View File

@@ -10,50 +10,50 @@ REWRITTEN BY XINEF
enum Spells
{
SPELL_ENRAGE = 26662,
SPELL_NEGATIVE_ENERGY = 46009,
SPELL_SUMMON_BLOOD_ELVES_PERIODIC = 46041,
SPELL_OPEN_PORTAL_PERIODIC = 45994,
SPELL_DARKNESS_PERIODIC = 45998,
SPELL_SUMMON_BERSERKER1 = 46037,
SPELL_SUMMON_FURY_MAGE1 = 46038,
SPELL_SUMMON_FURY_MAGE2 = 46039,
SPELL_SUMMON_BERSERKER2 = 46040,
SPELL_SUMMON_DARK_FIEND = 46000, // till 46007
SPELL_OPEN_ALL_PORTALS = 46177,
SPELL_SUMMON_ENTROPIUS = 46217,
SPELL_ENRAGE = 26662,
SPELL_NEGATIVE_ENERGY = 46009,
SPELL_SUMMON_BLOOD_ELVES_PERIODIC = 46041,
SPELL_OPEN_PORTAL_PERIODIC = 45994,
SPELL_DARKNESS_PERIODIC = 45998,
SPELL_SUMMON_BERSERKER1 = 46037,
SPELL_SUMMON_FURY_MAGE1 = 46038,
SPELL_SUMMON_FURY_MAGE2 = 46039,
SPELL_SUMMON_BERSERKER2 = 46040,
SPELL_SUMMON_DARK_FIEND = 46000, // till 46007
SPELL_OPEN_ALL_PORTALS = 46177,
SPELL_SUMMON_ENTROPIUS = 46217,
// Entropius's spells
SPELL_ENTROPIUS_COSMETIC_SPAWN = 46223,
SPELL_NEGATIVE_ENERGY_PERIODIC = 46284,
SPELL_NEGATIVE_ENERGY_CHAIN = 46285,
SPELL_BLACK_HOLE = 46282,
SPELL_DARKNESS = 46268,
SPELL_SUMMON_DARK_FIEND_ENTROPIUS = 46263,
SPELL_ENTROPIUS_COSMETIC_SPAWN = 46223,
SPELL_NEGATIVE_ENERGY_PERIODIC = 46284,
SPELL_NEGATIVE_ENERGY_CHAIN = 46285,
SPELL_BLACK_HOLE = 46282,
SPELL_DARKNESS = 46268,
SPELL_SUMMON_DARK_FIEND_ENTROPIUS = 46263,
//Black Hole Spells
SPELL_BLACK_HOLE_SUMMON_VISUAL = 46242,
SPELL_BLACK_HOLE_SUMMON_VISUAL2 = 46248,
SPELL_BLACK_HOLE_VISUAL2 = 46235,
SPELL_BLACK_HOLE_PASSIVE = 46228,
SPELL_BLACK_HOLE_EFFECT = 46230
SPELL_BLACK_HOLE_SUMMON_VISUAL = 46242,
SPELL_BLACK_HOLE_SUMMON_VISUAL2 = 46248,
SPELL_BLACK_HOLE_VISUAL2 = 46235,
SPELL_BLACK_HOLE_PASSIVE = 46228,
SPELL_BLACK_HOLE_EFFECT = 46230
};
enum Misc
{
EVENT_SPELL_ENRAGE = 1,
EVENT_SUMMON_ENTROPIUS = 2,
EVENT_SET_INVISIBLE = 3,
EVENT_SPAWN_BLACK_HOLE = 4,
EVENT_SPAWN_DARKNESS = 5,
EVENT_START_BLACK_HOLE = 6,
EVENT_SWITCH_BLACK_HOLE_TARGET = 7,
EVENT_ENTROPIUS_AURAS = 8,
EVENT_ENTROPIUS_COMBAT = 9,
EVENT_SINGULARITY_DEATH = 10,
EVENT_SPELL_ENRAGE = 1,
EVENT_SUMMON_ENTROPIUS = 2,
EVENT_SET_INVISIBLE = 3,
EVENT_SPAWN_BLACK_HOLE = 4,
EVENT_SPAWN_DARKNESS = 5,
EVENT_START_BLACK_HOLE = 6,
EVENT_SWITCH_BLACK_HOLE_TARGET = 7,
EVENT_ENTROPIUS_AURAS = 8,
EVENT_ENTROPIUS_COMBAT = 9,
EVENT_SINGULARITY_DEATH = 10,
DATA_ENRAGE_TIMER = 1,
DATA_NEGATIVE_ENERGY_TARGETS = 2
DATA_ENRAGE_TIMER = 1,
DATA_NEGATIVE_ENERGY_TARGETS = 2
};
class boss_muru : public CreatureScript
@@ -67,21 +67,21 @@ public:
void Reset()
{
BossAI::Reset();
me->SetReactState(REACT_AGGRESSIVE);
BossAI::Reset();
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetVisible(true);
}
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
BossAI::EnterCombat(who);
me->CastSpell(me, SPELL_NEGATIVE_ENERGY, true);
me->CastSpell(me, SPELL_SUMMON_BLOOD_ELVES_PERIODIC, true);
me->CastSpell(me, SPELL_OPEN_PORTAL_PERIODIC, true);
me->CastSpell(me, SPELL_DARKNESS_PERIODIC, true);
me->CastSpell(me, SPELL_SUMMON_BLOOD_ELVES_PERIODIC, true);
me->CastSpell(me, SPELL_OPEN_PORTAL_PERIODIC, true);
me->CastSpell(me, SPELL_DARKNESS_PERIODIC, true);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000);
}
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
@@ -89,26 +89,26 @@ public:
if (damage >= me->GetHealth())
{
damage = 0;
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAllAuras();
me->CastSpell(me, SPELL_OPEN_ALL_PORTALS, true);
events.ScheduleEvent(EVENT_SUMMON_ENTROPIUS, 7000);
}
}
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAllAuras();
me->CastSpell(me, SPELL_OPEN_ALL_PORTALS, true);
events.ScheduleEvent(EVENT_SUMMON_ENTROPIUS, 7000);
}
}
}
void JustSummoned(Creature* summon)
{
if (summon->GetEntry() == NPC_ENTROPIUS)
summon->AI()->SetData(DATA_ENRAGE_TIMER, events.GetNextEventTime(EVENT_SPELL_ENRAGE));
else
{
if (!summon->IsTrigger())
summon->SetInCombatWithZone();
summons.Summon(summon);
}
if (summon->GetEntry() == NPC_ENTROPIUS)
summon->AI()->SetData(DATA_ENRAGE_TIMER, events.GetNextEventTime(EVENT_SPELL_ENRAGE));
else
{
if (!summon->IsTrigger())
summon->SetInCombatWithZone();
summons.Summon(summon);
}
}
void UpdateAI(uint32 diff)
@@ -116,23 +116,23 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SUMMON_ENTROPIUS:
me->CastSpell(me, SPELL_SUMMON_ENTROPIUS, false);
events.ScheduleEvent(EVENT_SET_INVISIBLE, 1000);
break;
case EVENT_SET_INVISIBLE:
me->SetVisible(false);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SUMMON_ENTROPIUS:
me->CastSpell(me, SPELL_SUMMON_ENTROPIUS, false);
events.ScheduleEvent(EVENT_SET_INVISIBLE, 1000);
break;
case EVENT_SET_INVISIBLE:
me->SetVisible(false);
break;
}
}
};
@@ -151,27 +151,27 @@ public:
{
boss_entropiusAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
EventMap events2;
EventMap events;
EventMap events2;
void Reset()
{
events.Reset();
events2.Reset();
events2.ScheduleEvent(EVENT_ENTROPIUS_AURAS, 0);
events2.ScheduleEvent(EVENT_ENTROPIUS_COMBAT, 3000);
me->SetReactState(REACT_PASSIVE);
events.Reset();
events2.Reset();
events2.ScheduleEvent(EVENT_ENTROPIUS_AURAS, 0);
events2.ScheduleEvent(EVENT_ENTROPIUS_COMBAT, 3000);
me->SetReactState(REACT_PASSIVE);
}
void EnterEvadeMode()
{
void EnterEvadeMode()
{
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* muru = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_MURU)))
if (!muru->IsInEvadeMode())
muru->AI()->EnterEvadeMode();
if (Creature* muru = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_MURU)))
if (!muru->IsInEvadeMode())
muru->AI()->EnterEvadeMode();
me->DespawnOrUnsummon();
}
me->DespawnOrUnsummon();
}
void EnterCombat(Unit* /*who*/)
{
@@ -179,68 +179,68 @@ public:
events.ScheduleEvent(EVENT_SPAWN_DARKNESS, 10000);
}
void SetData(uint32 type, uint32 data)
{
if (type == DATA_ENRAGE_TIMER)
events.ScheduleEvent(EVENT_SPELL_ENRAGE, data);
}
void SetData(uint32 type, uint32 data)
{
if (type == DATA_ENRAGE_TIMER)
events.ScheduleEvent(EVENT_SPELL_ENRAGE, data);
}
uint32 GetData(uint32 type) const
{
if (type == DATA_NEGATIVE_ENERGY_TARGETS)
return 1 + uint32(events.GetTimer() / 12000);
return 0;
}
uint32 GetData(uint32 type) const
{
if (type == DATA_NEGATIVE_ENERGY_TARGETS)
return 1 + uint32(events.GetTimer() / 12000);
return 0;
}
void JustDied(Unit* /*killer*/)
{
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* muru = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_MURU)))
Unit::Kill(muru, muru);
if (Creature* muru = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_MURU)))
Unit::Kill(muru, muru);
}
void UpdateAI(uint32 diff)
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_ENTROPIUS_AURAS:
me->CastSpell(me, SPELL_ENTROPIUS_COSMETIC_SPAWN, false);
me->CastSpell(me, SPELL_NEGATIVE_ENERGY_PERIODIC, true);
break;
case EVENT_ENTROPIUS_COMBAT:
me->SetReactState(REACT_AGGRESSIVE);
me->SetInCombatWithZone();
AttackStart(SelectTargetFromPlayerList(50.0f));
break;
}
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_ENTROPIUS_AURAS:
me->CastSpell(me, SPELL_ENTROPIUS_COSMETIC_SPAWN, false);
me->CastSpell(me, SPELL_NEGATIVE_ENERGY_PERIODIC, true);
break;
case EVENT_ENTROPIUS_COMBAT:
me->SetReactState(REACT_AGGRESSIVE);
me->SetInCombatWithZone();
AttackStart(SelectTargetFromPlayerList(50.0f));
break;
}
if (!events2.Empty())
return;
if (!events2.Empty())
return;
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SPAWN_DARKNESS:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_DARKNESS, true);
events.ScheduleEvent(EVENT_SPAWN_DARKNESS, 15000);
break;
case EVENT_SPAWN_BLACK_HOLE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_BLACK_HOLE, true);
events.ScheduleEvent(EVENT_SPAWN_BLACK_HOLE, 15000);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_ENRAGE, true);
break;
case EVENT_SPAWN_DARKNESS:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_DARKNESS, true);
events.ScheduleEvent(EVENT_SPAWN_DARKNESS, 15000);
break;
case EVENT_SPAWN_BLACK_HOLE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_BLACK_HOLE, true);
events.ScheduleEvent(EVENT_SPAWN_BLACK_HOLE, 15000);
break;
}
DoMeleeAttackIfReady();
}
@@ -268,46 +268,46 @@ public:
{
}
EventMap events;
EventMap events;
void Reset()
{
me->DespawnOrUnsummon(18000);
me->CastSpell(me, SPELL_BLACK_HOLE_SUMMON_VISUAL, true);
me->CastSpell(me, SPELL_BLACK_HOLE_SUMMON_VISUAL2, true);
events.ScheduleEvent(EVENT_START_BLACK_HOLE, 3500);
events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 5000);
events.ScheduleEvent(EVENT_SINGULARITY_DEATH, 17000);
me->CastSpell(me, SPELL_BLACK_HOLE_SUMMON_VISUAL, true);
me->CastSpell(me, SPELL_BLACK_HOLE_SUMMON_VISUAL2, true);
events.ScheduleEvent(EVENT_START_BLACK_HOLE, 3500);
events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 5000);
events.ScheduleEvent(EVENT_SINGULARITY_DEATH, 17000);
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SINGULARITY_DEATH:
Unit::Kill(me, me);
break;
case EVENT_START_BLACK_HOLE:
me->RemoveAurasDueToSpell(SPELL_BLACK_HOLE_SUMMON_VISUAL2);
me->CastSpell(me, SPELL_BLACK_HOLE_VISUAL2, true);
me->CastSpell(me, SPELL_BLACK_HOLE_PASSIVE, true);
break;
case EVENT_SWITCH_BLACK_HOLE_TARGET:
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
if (me->GetDistance2d(player) < 15.0f && player->GetPositionZ() < 72.0f && player->IsAlive() && !player->HasAura(SPELL_BLACK_HOLE_EFFECT))
{
me->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), false, true);
events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 5000);
return;
}
events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 500);
break;
}
}
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SINGULARITY_DEATH:
Unit::Kill(me, me);
break;
case EVENT_START_BLACK_HOLE:
me->RemoveAurasDueToSpell(SPELL_BLACK_HOLE_SUMMON_VISUAL2);
me->CastSpell(me, SPELL_BLACK_HOLE_VISUAL2, true);
me->CastSpell(me, SPELL_BLACK_HOLE_PASSIVE, true);
break;
case EVENT_SWITCH_BLACK_HOLE_TARGET:
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
if (me->GetDistance2d(player) < 15.0f && player->GetPositionZ() < 72.0f && player->IsAlive() && !player->HasAura(SPELL_BLACK_HOLE_EFFECT))
{
me->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), false, true);
events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 5000);
return;
}
events.ScheduleEvent(EVENT_SWITCH_BLACK_HOLE_TARGET, 500);
break;
}
}
}
};
};
@@ -323,24 +323,24 @@ class spell_muru_summon_blood_elves_periodic : public SpellScriptLoader
void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
// first tick after 10 seconds
GetAura()->GetEffect(aurEff->GetEffIndex())->SetPeriodicTimer(10000);
// first tick after 10 seconds
GetAura()->GetEffect(aurEff->GetEffIndex())->SetPeriodicTimer(10000);
}
void OnPeriodic(AuraEffect const* aurEff)
{
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE1, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE2, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE1, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_FURY_MAGE2, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER1, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_BERSERKER2, true);
}
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_muru_summon_blood_elves_periodic_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_summon_blood_elves_periodic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_summon_blood_elves_periodic_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
@@ -361,14 +361,14 @@ class spell_muru_darkness : public SpellScriptLoader
void OnPeriodic(AuraEffect const* aurEff)
{
if (aurEff->GetTickNumber() == 3)
for (uint8 i = 0; i < 8; ++i)
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND+i, true);
if (aurEff->GetTickNumber() == 3)
for (uint8 i = 0; i < 8; ++i)
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND+i, true);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_darkness_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_muru_darkness_AuraScript::OnPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY);
}
};
@@ -380,41 +380,41 @@ class spell_muru_darkness : public SpellScriptLoader
class spell_entropius_negative_energy : public SpellScriptLoader
{
public:
spell_entropius_negative_energy() : SpellScriptLoader("spell_entropius_negative_energy") { }
public:
spell_entropius_negative_energy() : SpellScriptLoader("spell_entropius_negative_energy") { }
class spell_entropius_negative_energy_SpellScript : public SpellScript
{
PrepareSpellScript(spell_entropius_negative_energy_SpellScript);
class spell_entropius_negative_energy_SpellScript : public SpellScript
{
PrepareSpellScript(spell_entropius_negative_energy_SpellScript);
bool Load()
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
bool Load()
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
void FilterTargets(std::list<WorldObject*>& targets)
{
Trinity::Containers::RandomResizeList(targets, GetCaster()->GetAI()->GetData(DATA_NEGATIVE_ENERGY_TARGETS));
}
void FilterTargets(std::list<WorldObject*>& targets)
{
Trinity::Containers::RandomResizeList(targets, GetCaster()->GetAI()->GetData(DATA_NEGATIVE_ENERGY_TARGETS));
}
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target, SPELL_NEGATIVE_ENERGY_CHAIN, true);
}
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target, SPELL_NEGATIVE_ENERGY_CHAIN, true);
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_entropius_negative_energy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget += SpellEffectFn(spell_entropius_negative_energy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_entropius_negative_energy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget += SpellEffectFn(spell_entropius_negative_energy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_entropius_negative_energy_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_entropius_negative_energy_SpellScript();
}
};
class spell_entropius_void_zone_visual : public SpellScriptLoader
@@ -428,12 +428,12 @@ class spell_entropius_void_zone_visual : public SpellScriptLoader
void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
SetDuration(3000);
SetDuration(3000);
}
void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND_ENTROPIUS, true);
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_DARK_FIEND_ENTROPIUS, true);
}
void Register()
@@ -460,29 +460,29 @@ class spell_entropius_black_hole_effect : public SpellScriptLoader
void HandlePull(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
Unit* target = GetHitUnit();
if (!target)
return;
PreventHitDefaultEffect(effIndex);
Unit* target = GetHitUnit();
if (!target)
return;
Position pos;
if (target->GetDistance(GetCaster()) < 5.0f)
{
float o = frand(0, 2*M_PI);
pos.Relocate(GetCaster()->GetPositionX() + 4.0f*cos(o), GetCaster()->GetPositionY() + 4.0f*sin(o), GetCaster()->GetPositionZ()+frand(10.0f, 15.0f));
}
else
pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ()+1.0f);
Position pos;
if (target->GetDistance(GetCaster()) < 5.0f)
{
float o = frand(0, 2*M_PI);
pos.Relocate(GetCaster()->GetPositionX() + 4.0f*cos(o), GetCaster()->GetPositionY() + 4.0f*sin(o), GetCaster()->GetPositionZ()+frand(10.0f, 15.0f));
}
else
pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ()+1.0f);
float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f;
float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity;
float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f;
float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity;
target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ);
target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ);
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_entropius_black_hole_effect_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST);
OnEffectHitTarget += SpellEffectFn(spell_entropius_black_hole_effect_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST);
}
};
@@ -498,9 +498,9 @@ void AddSC_boss_muru()
new boss_entropius();
new npc_singularity();
new spell_muru_summon_blood_elves_periodic();
new spell_muru_darkness();
new spell_entropius_negative_energy();
new spell_entropius_void_zone_visual();
new spell_entropius_black_hole_effect();
new spell_muru_summon_blood_elves_periodic();
new spell_muru_darkness();
new spell_entropius_negative_energy();
new spell_entropius_void_zone_visual();
new spell_entropius_black_hole_effect();
}

View File

@@ -43,17 +43,17 @@ class instance_sunwell_plateau : public InstanceMapScript
AnveenaGUID = 0;
KalecgosKjGUID = 0;
IceBarrierGUID = 0;
memset(&blueFlightOrbGUID, 0, sizeof(blueFlightOrbGUID));
IceBarrierGUID = 0;
memset(&blueFlightOrbGUID, 0, sizeof(blueFlightOrbGUID));
}
void OnPlayerEnter(Player* player)
{
instance->LoadGrid(1477.94f, 643.22f);
instance->LoadGrid(1641.45f, 988.08f);
if (GameObject* gobj = instance->GetGameObject(IceBarrierGUID))
gobj->SendUpdateToPlayer(player);
}
void OnPlayerEnter(Player* player)
{
instance->LoadGrid(1477.94f, 643.22f);
instance->LoadGrid(1641.45f, 988.08f);
if (GameObject* gobj = instance->GetGameObject(IceBarrierGUID))
gobj->SendUpdateToPlayer(player);
}
Player const* GetPlayerInMap() const
{
@@ -76,8 +76,8 @@ class instance_sunwell_plateau : public InstanceMapScript
void OnCreatureCreate(Creature* creature)
{
if (creature->GetDBTableGUIDLow() > 0 || !IS_PLAYER_GUID(creature->GetOwnerGUID()))
creature->CastSpell(creature, SPELL_SUNWELL_RADIANCE, true);
if (creature->GetDBTableGUIDLow() > 0 || !IS_PLAYER_GUID(creature->GetOwnerGUID()))
creature->CastSpell(creature, SPELL_SUNWELL_RADIANCE, true);
switch (creature->GetEntry())
{
@@ -118,29 +118,29 @@ class instance_sunwell_plateau : public InstanceMapScript
KalecgosKjGUID = creature->GetGUID();
break;
// Xinef: Felmyst encounter
case NPC_DEMONIC_VAPOR_TRAIL:
case NPC_UNYIELDING_DEAD:
if (Creature* felmyst = instance->GetCreature(FelmystGUID))
felmyst->AI()->JustSummoned(creature);
break;
// Xinef: Felmyst encounter
case NPC_DEMONIC_VAPOR_TRAIL:
case NPC_UNYIELDING_DEAD:
if (Creature* felmyst = instance->GetCreature(FelmystGUID))
felmyst->AI()->JustSummoned(creature);
break;
// Xinef: M'uru encounter
case NPC_DARKNESS:
case NPC_VOID_SENTINEL:
case NPC_VOID_SPAWN:
if (Creature* muru = instance->GetCreature(MuruGUID))
muru->AI()->JustSummoned(creature);
break;
// Xinef: M'uru encounter
case NPC_DARKNESS:
case NPC_VOID_SENTINEL:
case NPC_VOID_SPAWN:
if (Creature* muru = instance->GetCreature(MuruGUID))
muru->AI()->JustSummoned(creature);
break;
// Xinef: Kil'jaeden encounter
case NPC_FELFIRE_PORTAL:
case NPC_VOLATILE_FELFIRE_FIEND:
case NPC_SHIELD_ORB:
case NPC_SINISTER_REFLECTION:
if (Creature* kiljaedenC = instance->GetCreature(KilJaedenControllerGUID))
kiljaedenC->AI()->JustSummoned(creature);
break;
// Xinef: Kil'jaeden encounter
case NPC_FELFIRE_PORTAL:
case NPC_VOLATILE_FELFIRE_FIEND:
case NPC_SHIELD_ORB:
case NPC_SINISTER_REFLECTION:
if (Creature* kiljaedenC = instance->GetCreature(KilJaedenControllerGUID))
kiljaedenC->AI()->JustSummoned(creature);
break;
default:
break;
}
@@ -158,22 +158,22 @@ class instance_sunwell_plateau : public InstanceMapScript
case GO_MURUS_GATE_2:
AddDoor(go, true);
break;
case GO_ICE_BARRIER:
IceBarrierGUID = go->GetGUID();
go->setActive(true);
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1:
blueFlightOrbGUID[0] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2:
blueFlightOrbGUID[1] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3:
blueFlightOrbGUID[2] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4:
blueFlightOrbGUID[3] = go->GetGUID();
break;
case GO_ICE_BARRIER:
IceBarrierGUID = go->GetGUID();
go->setActive(true);
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1:
blueFlightOrbGUID[0] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2:
blueFlightOrbGUID[1] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3:
blueFlightOrbGUID[2] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4:
blueFlightOrbGUID[3] = go->GetGUID();
break;
default:
break;
}
@@ -225,12 +225,12 @@ class instance_sunwell_plateau : public InstanceMapScript
case NPC_KILJAEDEN:
return KilJaedenGUID;
// Orbs
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4:
return blueFlightOrbGUID[id-DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1];
// Orbs
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4:
return blueFlightOrbGUID[id-DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1];
}
return 0;
}
@@ -292,8 +292,8 @@ class instance_sunwell_plateau : public InstanceMapScript
uint64 AnveenaGUID;
uint64 KalecgosKjGUID;
uint64 IceBarrierGUID;
uint64 blueFlightOrbGUID[4];
uint64 IceBarrierGUID;
uint64 blueFlightOrbGUID[4];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
@@ -304,14 +304,14 @@ class instance_sunwell_plateau : public InstanceMapScript
enum cataclysmBreath
{
SPELL_CORROSIVE_POISON = 46293,
SPELL_FEVERED_FATIGUE = 46294,
SPELL_HEX = 46295,
SPELL_NECROTIC_POISON = 46296,
SPELL_PIERCING_SHADOW = 46297,
SPELL_SHRINK = 46298,
SPELL_WAVERING_WILL = 46299,
SPELL_WITHERED_TOUCH = 46300
SPELL_CORROSIVE_POISON = 46293,
SPELL_FEVERED_FATIGUE = 46294,
SPELL_HEX = 46295,
SPELL_NECROTIC_POISON = 46296,
SPELL_PIERCING_SHADOW = 46297,
SPELL_SHRINK = 46298,
SPELL_WAVERING_WILL = 46299,
SPELL_WITHERED_TOUCH = 46300
};
class spell_cataclysm_breath : public SpellScriptLoader
@@ -325,9 +325,9 @@ class spell_cataclysm_breath : public SpellScriptLoader
void HandleAfterCast()
{
if (Unit* target = GetExplTargetUnit())
for (uint8 i = 0; i < 4; ++i)
GetCaster()->CastSpell(target, RAND(SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_HEX, SPELL_NECROTIC_POISON, SPELL_PIERCING_SHADOW, SPELL_SHRINK, SPELL_WAVERING_WILL, SPELL_WITHERED_TOUCH), true);
if (Unit* target = GetExplTargetUnit())
for (uint8 i = 0; i < 4; ++i)
GetCaster()->CastSpell(target, RAND(SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_HEX, SPELL_NECROTIC_POISON, SPELL_PIERCING_SHADOW, SPELL_SHRINK, SPELL_WAVERING_WILL, SPELL_WITHERED_TOUCH), true);
}
void Register()
@@ -345,5 +345,5 @@ class spell_cataclysm_breath : public SpellScriptLoader
void AddSC_instance_sunwell_plateau()
{
new instance_sunwell_plateau();
new spell_cataclysm_breath();
new spell_cataclysm_breath();
}

View File

@@ -7,78 +7,78 @@ REWRITTEN BY XINEF
enum DataTypes
{
DATA_KALECGOS = 0,
DATA_MADRIGOSA = 1,
DATA_BRUTALLUS = 2,
DATA_FELMYST = 3,
DATA_FELMYST_DOORS = 4,
DATA_EREDAR_TWINS_INTRO = 5,
DATA_EREDAR_TWINS = 6,
DATA_MURU = 7,
DATA_KILJAEDEN = 8,
MAX_ENCOUNTERS = 9,
DATA_KALECGOS = 0,
DATA_MADRIGOSA = 1,
DATA_BRUTALLUS = 2,
DATA_FELMYST = 3,
DATA_FELMYST_DOORS = 4,
DATA_EREDAR_TWINS_INTRO = 5,
DATA_EREDAR_TWINS = 6,
DATA_MURU = 7,
DATA_KILJAEDEN = 8,
MAX_ENCOUNTERS = 9,
// GameObject GUIDs
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1 = 10,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2 = 11,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3 = 12,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4 = 13
// GameObject GUIDs
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1 = 10,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2 = 11,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3 = 12,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4 = 13
};
enum CreatureIds
{
NPC_KALECGOS = 24850,
NPC_KALEC = 24891,
NPC_SATHROVARR = 24892,
NPC_KALECGOS = 24850,
NPC_KALEC = 24891,
NPC_SATHROVARR = 24892,
NPC_BRUTALLUS = 24882,
NPC_MADRIGOSA = 24895,
NPC_FELMYST = 25038,
NPC_DEMONIC_VAPOR_TRAIL = 25267,
NPC_UNYIELDING_DEAD = 25268,
NPC_BRUTALLUS = 24882,
NPC_MADRIGOSA = 24895,
NPC_FELMYST = 25038,
NPC_DEMONIC_VAPOR_TRAIL = 25267,
NPC_UNYIELDING_DEAD = 25268,
NPC_GRAND_WARLOCK_ALYTHESS = 25166,
NPC_LADY_SACROLASH = 25165,
NPC_SHADOW_IMAGE = 25214,
NPC_GRAND_WARLOCK_ALYTHESS = 25166,
NPC_LADY_SACROLASH = 25165,
NPC_SHADOW_IMAGE = 25214,
NPC_MURU = 25741,
NPC_ENTROPIUS = 25840,
NPC_DARKNESS = 25879,
NPC_VOID_SENTINEL = 25772,
NPC_VOID_SPAWN = 25824,
NPC_MURU = 25741,
NPC_ENTROPIUS = 25840,
NPC_DARKNESS = 25879,
NPC_VOID_SENTINEL = 25772,
NPC_VOID_SPAWN = 25824,
NPC_KILJAEDEN_CONTROLLER = 25608,
NPC_KILJAEDEN = 25315,
NPC_ANVEENA = 26046,
NPC_KALECGOS_KJ = 25319,
NPC_HAND_OF_THE_DECEIVER = 25588,
NPC_FELFIRE_PORTAL = 25603,
NPC_VOLATILE_FELFIRE_FIEND = 25598,
NPC_SHIELD_ORB = 25502,
NPC_SINISTER_REFLECTION = 25708,
NPC_ARMAGEDDON_TARGET = 25735,
NPC_KILJAEDEN_CONTROLLER = 25608,
NPC_KILJAEDEN = 25315,
NPC_ANVEENA = 26046,
NPC_KALECGOS_KJ = 25319,
NPC_HAND_OF_THE_DECEIVER = 25588,
NPC_FELFIRE_PORTAL = 25603,
NPC_VOLATILE_FELFIRE_FIEND = 25598,
NPC_SHIELD_ORB = 25502,
NPC_SINISTER_REFLECTION = 25708,
NPC_ARMAGEDDON_TARGET = 25735,
};
enum GameObjectIds
{
GO_FORCE_FIELD = 188421,
GO_BOSS_COLLISION_1 = 188523,
GO_BOSS_COLLISION_2 = 188524,
GO_FIRE_BARRIER = 188075,
GO_MURUS_GATE_1 = 187990,
GO_MURUS_GATE_2 = 188118,
GO_ICE_BARRIER = 188119,
GO_FORCE_FIELD = 188421,
GO_BOSS_COLLISION_1 = 188523,
GO_BOSS_COLLISION_2 = 188524,
GO_FIRE_BARRIER = 188075,
GO_MURUS_GATE_1 = 187990,
GO_MURUS_GATE_2 = 188118,
GO_ICE_BARRIER = 188119,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1 = 187869,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2 = 188114,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3 = 188115,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4 = 188116
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1 = 187869,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2 = 188114,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3 = 188115,
GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4 = 188116
};
enum SpellIds
{
SPELL_SUNWELL_RADIANCE = 45769,
SPELL_SUNWELL_RADIANCE = 45769,
};
#endif // SUNWELL_PLATEAU_H

View File

@@ -7,18 +7,18 @@ REWRITTEN BY XINEF
class instance_the_stockade : public InstanceMapScript
{
public:
instance_the_stockade() : InstanceMapScript("instance_the_stockade", 34) { }
public:
instance_the_stockade() : InstanceMapScript("instance_the_stockade", 34) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_the_stockade_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_the_stockade_InstanceMapScript(map);
}
struct instance_the_stockade_InstanceMapScript : public InstanceScript
{
instance_the_stockade_InstanceMapScript(Map* map) : InstanceScript(map) { }
};
struct instance_the_stockade_InstanceMapScript : public InstanceScript
{
instance_the_stockade_InstanceMapScript(Map* map) : InstanceScript(map) { }
};
};
void AddSC_instance_the_stockade()

View File

@@ -50,13 +50,13 @@ class instance_uldaman : public InstanceMapScript
HandleGameObject(0, true, gameobject);
break;
case GO_ANCIENT_VAULT_DOOR:
ancientVaultDoorGUID = gameobject->GetGUID();
ancientVaultDoorGUID = gameobject->GetGUID();
if (_encounters[DATA_ARCHAEDAS] == DONE)
HandleGameObject(0, true, gameobject);
break;
case GO_ARCHAEDAS_TEMPLE_DOOR:
archaedasTempleDoorGUID = gameobject->GetGUID();
break;
case GO_ARCHAEDAS_TEMPLE_DOOR:
archaedasTempleDoorGUID = gameobject->GetGUID();
break;
}
}
@@ -64,15 +64,15 @@ class instance_uldaman : public InstanceMapScript
{
switch (type)
{
case DATA_IRONAYA_DOORS:
case DATA_IRONAYA_DOORS:
case DATA_STONE_KEEPERS:
_encounters[type] = data;
break;
case DATA_ARCHAEDAS:
_encounters[type] = data;
HandleGameObject(ancientVaultDoorGUID, data == DONE, NULL);
HandleGameObject(archaedasTempleDoorGUID, data != IN_PROGRESS, NULL);
break;
_encounters[type] = data;
break;
case DATA_ARCHAEDAS:
_encounters[type] = data;
HandleGameObject(ancientVaultDoorGUID, data == DONE, NULL);
HandleGameObject(archaedasTempleDoorGUID, data != IN_PROGRESS, NULL);
break;
}
if (data == DONE)
@@ -83,7 +83,7 @@ class instance_uldaman : public InstanceMapScript
{
std::ostringstream saveStream;
saveStream << "U D " << _encounters[DATA_IRONAYA_DOORS] << ' ' << _encounters[DATA_STONE_KEEPERS] << ' ' << _encounters[DATA_ARCHAEDAS];
return saveStream.str();
return saveStream.str();
}
void Load(const char* in)
@@ -91,19 +91,19 @@ class instance_uldaman : public InstanceMapScript
if (!in)
return;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'U' && dataHead2 == 'D')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
if (dataHead1 == 'U' && dataHead2 == 'D')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
void OnCreatureCreate(Creature* creature)
@@ -111,13 +111,13 @@ class instance_uldaman : public InstanceMapScript
switch (creature->GetEntry())
{
case NPC_STONE_KEEPER:
if (_encounters[DATA_STONE_KEEPERS] != DONE && !creature->IsAlive())
creature->Respawn();
if (_encounters[DATA_STONE_KEEPERS] != DONE && !creature->IsAlive())
creature->Respawn();
break;
}
}
}
private:
private:
uint32 _encounters[MAX_ENCOUNTERS];
uint64 archaedasTempleDoorGUID;
uint64 ancientVaultDoorGUID;
@@ -131,29 +131,29 @@ class instance_uldaman : public InstanceMapScript
class spell_uldaman_sub_boss_agro_keepers : public SpellScriptLoader
{
public:
spell_uldaman_sub_boss_agro_keepers() : SpellScriptLoader("spell_uldaman_sub_boss_agro_keepers") { }
public:
spell_uldaman_sub_boss_agro_keepers() : SpellScriptLoader("spell_uldaman_sub_boss_agro_keepers") { }
class spell_uldaman_sub_boss_agro_keepers_SpellScript : public SpellScript
{
PrepareSpellScript(spell_uldaman_sub_boss_agro_keepers_SpellScript);
class spell_uldaman_sub_boss_agro_keepers_SpellScript : public SpellScript
{
PrepareSpellScript(spell_uldaman_sub_boss_agro_keepers_SpellScript);
void HandleSendEvent(SpellEffIndex effIndex)
{
if (Creature* keeper = GetCaster()->FindNearestCreature(NPC_STONE_KEEPER, 100.0f, true))
keeper->AI()->SetData(1, 1);
}
void HandleSendEvent(SpellEffIndex effIndex)
{
if (Creature* keeper = GetCaster()->FindNearestCreature(NPC_STONE_KEEPER, 100.0f, true))
keeper->AI()->SetData(1, 1);
}
void Register()
{
OnEffectLaunch += SpellEffectFn(spell_uldaman_sub_boss_agro_keepers_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
void Register()
{
OnEffectLaunch += SpellEffectFn(spell_uldaman_sub_boss_agro_keepers_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_uldaman_sub_boss_agro_keepers_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_uldaman_sub_boss_agro_keepers_SpellScript();
}
};
class spell_uldaman_stoned : public SpellScriptLoader
@@ -165,23 +165,23 @@ class spell_uldaman_stoned : public SpellScriptLoader
{
PrepareAuraScript(spell_uldaman_stoned_AuraScript);
bool Load()
{
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
}
bool Load()
{
return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
}
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Creature* target = GetUnitOwner()->ToCreature();
target->SetReactState(REACT_PASSIVE);
target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
target->SetReactState(REACT_PASSIVE);
target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Creature* target = GetUnitOwner()->ToCreature();
target->SetReactState(REACT_AGGRESSIVE);
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
target->SetReactState(REACT_AGGRESSIVE);
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
}
void Register()
@@ -199,40 +199,40 @@ class spell_uldaman_stoned : public SpellScriptLoader
class spell_uldaman_boss_agro_archaedas : public SpellScriptLoader
{
public:
spell_uldaman_boss_agro_archaedas() : SpellScriptLoader("spell_uldaman_boss_agro_archaedas") { }
public:
spell_uldaman_boss_agro_archaedas() : SpellScriptLoader("spell_uldaman_boss_agro_archaedas") { }
class spell_uldaman_boss_agro_archaedas_SpellScript : public SpellScript
{
PrepareSpellScript(spell_uldaman_boss_agro_archaedas_SpellScript);
class spell_uldaman_boss_agro_archaedas_SpellScript : public SpellScript
{
PrepareSpellScript(spell_uldaman_boss_agro_archaedas_SpellScript);
void HandleSendEvent(SpellEffIndex effIndex)
{
InstanceScript* instance = GetCaster()->GetInstanceScript();
if (!instance || instance->GetData(DATA_ARCHAEDAS) == IN_PROGRESS)
return;
void HandleSendEvent(SpellEffIndex effIndex)
{
InstanceScript* instance = GetCaster()->GetInstanceScript();
if (!instance || instance->GetData(DATA_ARCHAEDAS) == IN_PROGRESS)
return;
instance->SetData(DATA_ARCHAEDAS, IN_PROGRESS);
if (Creature* archaedas = GetCaster()->FindNearestCreature(NPC_ARCHAEDAS, 100.0f, true))
archaedas->AI()->SetData(1, 1);
}
instance->SetData(DATA_ARCHAEDAS, IN_PROGRESS);
if (Creature* archaedas = GetCaster()->FindNearestCreature(NPC_ARCHAEDAS, 100.0f, true))
archaedas->AI()->SetData(1, 1);
}
void Register()
{
OnEffectLaunch += SpellEffectFn(spell_uldaman_boss_agro_archaedas_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
void Register()
{
OnEffectLaunch += SpellEffectFn(spell_uldaman_boss_agro_archaedas_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_uldaman_boss_agro_archaedas_SpellScript();
}
SpellScript* GetSpellScript() const
{
return new spell_uldaman_boss_agro_archaedas_SpellScript();
}
};
void AddSC_instance_uldaman()
{
new instance_uldaman();
new spell_uldaman_sub_boss_agro_keepers();
new spell_uldaman_stoned();
new spell_uldaman_boss_agro_archaedas();
new spell_uldaman_sub_boss_agro_keepers();
new spell_uldaman_stoned();
new spell_uldaman_boss_agro_archaedas();
}

View File

@@ -7,16 +7,16 @@ REWRITTEN BY XINEF
enum DataTypes
{
DATA_IRONAYA_DOORS = 0,
DATA_STONE_KEEPERS = 1,
DATA_ARCHAEDAS = 2,
MAX_ENCOUNTERS = 3
DATA_IRONAYA_DOORS = 0,
DATA_STONE_KEEPERS = 1,
DATA_ARCHAEDAS = 2,
MAX_ENCOUNTERS = 3
};
enum GameObjectIds
{
GO_ARCHAEDAS_TEMPLE_DOOR = 141869,
GO_TEMPLE_DOOR = 124367,
GO_TEMPLE_DOOR = 124367,
GO_ANCIENT_VAULT_DOOR = 124369,
GO_IRONAYA_SEAL_DOOR = 124372,
GO_KEYSTONE = 124371,
@@ -24,8 +24,8 @@ enum GameObjectIds
enum NpcIds
{
NPC_STONE_KEEPER = 4857,
NPC_ARCHAEDAS = 2748
NPC_STONE_KEEPER = 4857,
NPC_ARCHAEDAS = 2748
};
#endif

View File

@@ -340,7 +340,7 @@ class boss_hexlord_malacrass : public CreatureScript
{
Unit* Temp = ObjectAccessor::GetUnit(*me, AddGUID[i]);
if (Temp && Temp->IsAlive())
Unit::DealDamage(Temp, Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
Unit::DealDamage(Temp, Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}

View File

@@ -435,11 +435,11 @@ class boss_janalai : public CreatureScript
FireBreathTimer = 8000;
} else FireBreathTimer -= diff;
}
bool CheckEvadeIfOutOfCombatArea() const
{
return me->GetPositionZ() <= 12.0f;
}
bool CheckEvadeIfOutOfCombatArea() const
{
return me->GetPositionZ() <= 12.0f;
}
};
CreatureAI* GetAI(Creature* creature) const

View File

@@ -87,18 +87,18 @@ class npc_forest_frog : public CreatureScript
}
if (!instance->GetData(TYPE_RAND_VENDOR_1) && roll_chance_i(10))
{
{
cEntry = 24408; //Gunter
instance->SetData(TYPE_RAND_VENDOR_1, DONE);
}
instance->SetData(TYPE_RAND_VENDOR_1, DONE);
}
else if (!instance->GetData(TYPE_RAND_VENDOR_2) && roll_chance_i(10))
{
{
cEntry = 24409; //Kyren
instance->SetData(TYPE_RAND_VENDOR_2, DONE);
}
instance->SetData(TYPE_RAND_VENDOR_2, DONE);
}
me->UpdateEntry(cEntry);
me->DespawnOrUnsummon(2*MINUTE*IN_MILLISECONDS);
me->DespawnOrUnsummon(2*MINUTE*IN_MILLISECONDS);
}
void SpellHit(Unit* caster, const SpellInfo* spell)
@@ -106,9 +106,9 @@ class npc_forest_frog : public CreatureScript
if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG)
{
if (roll_chance_i(2))
DoCast(caster, SPELL_PUSH_MOJO, true);
DoCast(caster, SPELL_PUSH_MOJO, true);
else
DoSpawnRandom();
DoSpawnRandom();
}
}
};

View File

@@ -130,7 +130,7 @@ class boss_hakkar : public CreatureScript
// events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000));
break;
case EVENT_WILL_OF_HAKKAR:
// Xinef: Skip Tank
// Xinef: Skip Tank
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true), SPELL_WILL_OF_HAKKAR);
events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, urand(25000, 35000));
break;

View File

@@ -152,11 +152,11 @@ class boss_jeklik : public CreatureScript
case EVENT_SONIC_BURST:
DoCastVictim(SPELL_SONICBURST);
events.ScheduleEvent(EVENT_SONIC_BURST, urand(8000, 13000), 0, PHASE_ONE);
break;
break;
case EVENT_SCREECH:
DoCastVictim(SPELL_SCREECH);
events.ScheduleEvent(EVENT_SCREECH, urand(18000, 26000), 0, PHASE_ONE);
break;
break;
case EVENT_SPAWN_BATS:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
for (uint8 i = 0; i < 6; ++i)

View File

@@ -61,38 +61,38 @@ public:
KillCount = 0;
}
void InitializeAI()
{
// Xinef: check if copy is summoned
std::list<Creature*> cList;
me->GetCreatureListWithEntryInGrid(cList, me->GetEntry(), 50.0f);
if (!cList.empty())
for (std::list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); ++itr)
if ((*itr)->IsAlive() && me->GetGUID() != (*itr)->GetGUID())
{
me->DespawnOrUnsummon(1);
break;
}
void InitializeAI()
{
// Xinef: check if copy is summoned
std::list<Creature*> cList;
me->GetCreatureListWithEntryInGrid(cList, me->GetEntry(), 50.0f);
if (!cList.empty())
for (std::list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); ++itr)
if ((*itr)->IsAlive() && me->GetGUID() != (*itr)->GetGUID())
{
me->DespawnOrUnsummon(1);
break;
}
_introSpoken = false;
ScriptedAI::InitializeAI();
}
_introSpoken = false;
ScriptedAI::InitializeAI();
}
void MoveInLineOfSight(Unit* who)
{
if (!_introSpoken && who->GetTypeId() == TYPEID_PLAYER)
{
_introSpoken = true;
Talk(YELL_TWILIGHTCORRUPTOR_RESPAWN, who);
me->setFaction(FACTION_HOSTILE);
}
ScriptedAI::MoveInLineOfSight(who);
}
void MoveInLineOfSight(Unit* who)
{
if (!_introSpoken && who->GetTypeId() == TYPEID_PLAYER)
{
_introSpoken = true;
Talk(YELL_TWILIGHTCORRUPTOR_RESPAWN, who);
me->setFaction(FACTION_HOSTILE);
}
ScriptedAI::MoveInLineOfSight(who);
}
void EnterCombat(Unit* /*who*/)
{
Talk(YELL_TWILIGHTCORRUPTOR_AGGRO);
_events.Reset();
_events.Reset();
_events.ScheduleEvent(EVENT_SOUL_CORRUPTION, 15000);
_events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 30000);
}
@@ -128,8 +128,8 @@ public:
_events.ScheduleEvent(EVENT_SOUL_CORRUPTION, rand()%4000+15000);
break;
case EVENT_CREATURE_OF_NIGHTMARE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
DoCast(target, SPELL_CREATURE_OF_NIGHTMARE);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
DoCast(target, SPELL_CREATURE_OF_NIGHTMARE);
_events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 45000);
break;
default:
@@ -142,7 +142,7 @@ public:
private:
EventMap _events;
uint8 KillCount;
bool _introSpoken;
bool _introSpoken;
};
CreatureAI* GetAI(Creature* creature) const
@@ -162,7 +162,7 @@ public:
bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/)
{
if (player->HasQuestForItem(ITEM_FRAGMENT) && !player->HasItemCount(ITEM_FRAGMENT))
if (player->HasQuestForItem(ITEM_FRAGMENT) && !player->HasItemCount(ITEM_FRAGMENT))
player->SummonCreature(NPC_TWILIGHT_CORRUPTER, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 240000);
return false;

View File

@@ -40,21 +40,21 @@ EndContentData */
enum eEris
{
QUEST_BALANCE_OF_LIGHT_AND_SHADOW = 7622,
ITEM_EYE_OF_DIVINITY = 18646,
QUEST_BALANCE_OF_LIGHT_AND_SHADOW = 7622,
ITEM_EYE_OF_DIVINITY = 18646,
NPC_INJURED_PEASANT = 14484,
NPC_PLAGUED_PEASANT = 14485,
NPC_SCOURGE_ARCHER = 14489,
NPC_INJURED_PEASANT = 14484,
NPC_PLAGUED_PEASANT = 14485,
NPC_SCOURGE_ARCHER = 14489,
EVENT_SUMMON_PEASANTS = 1,
EVENT_CHECK_PLAYER = 2,
EVENT_SUMMON_ARCHERS = 3,
EVENT_SUMMON_PEASANTS = 1,
EVENT_CHECK_PLAYER = 2,
EVENT_SUMMON_ARCHERS = 3,
SPELL_SHOOT = 23073,
SPELL_DEATHS_DOOR = 23127,
SPELL_SEETHING_PLAGUE = 23072,
SPELL_ERIS_BLESSING = 23108,
SPELL_SHOOT = 23073,
SPELL_DEATHS_DOOR = 23127,
SPELL_SEETHING_PLAGUE = 23072,
SPELL_ERIS_BLESSING = 23108,
};
class npc_eris_hevenfire : public CreatureScript
@@ -64,16 +64,16 @@ public:
CreatureAI* GetAI(Creature* creature) const
{
return new npc_eris_hevenfireAI(creature);
return new npc_eris_hevenfireAI(creature);
}
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_BALANCE_OF_LIGHT_AND_SHADOW)
{
creature->AI()->SetData(player->getFaction(), 0);
{
creature->AI()->SetData(player->getFaction(), 0);
creature->AI()->SetGUID(player->GetGUID());
}
}
return true;
}
@@ -82,163 +82,163 @@ public:
{
npc_eris_hevenfireAI(Creature* c) : ScriptedAI(c), summons(me) {}
SummonList summons;
EventMap events;
uint64 _playerGUID;
uint8 _counter;
uint8 _savedCount;
uint8 _deathCount;
bool _spoken;
uint32 _faction;
SummonList summons;
EventMap events;
uint64 _playerGUID;
uint8 _counter;
uint8 _savedCount;
uint8 _deathCount;
bool _spoken;
uint32 _faction;
void Reset()
{
_faction = 0;
_spoken = false;
_savedCount = 0;
_deathCount = 0;
_counter = 0;
_playerGUID = 0;
events.Reset();
summons.DespawnAll();
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
}
void Reset()
{
_faction = 0;
_spoken = false;
_savedCount = 0;
_deathCount = 0;
_counter = 0;
_playerGUID = 0;
events.Reset();
summons.DespawnAll();
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
}
void SetData(uint32 faction, uint32)
{
_faction = faction;
}
void SetData(uint32 faction, uint32)
{
_faction = faction;
}
void SetGUID(uint64 guid, int32)
{
_playerGUID = guid;
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
events.Reset();
summons.DespawnAll();
void SetGUID(uint64 guid, int32)
{
_playerGUID = guid;
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
events.Reset();
summons.DespawnAll();
events.ScheduleEvent(EVENT_CHECK_PLAYER, 1000);
events.ScheduleEvent(EVENT_SUMMON_ARCHERS, 4000);
events.ScheduleEvent(EVENT_SUMMON_PEASANTS, 8000);
}
events.ScheduleEvent(EVENT_CHECK_PLAYER, 1000);
events.ScheduleEvent(EVENT_SUMMON_ARCHERS, 4000);
events.ScheduleEvent(EVENT_SUMMON_PEASANTS, 8000);
}
bool CanBeSeen(Player const* player)
{
// requires this trinket to be seen
return player->HasItemOrGemWithIdEquipped(ITEM_EYE_OF_DIVINITY, 1);
}
bool CanBeSeen(Player const* player)
{
// requires this trinket to be seen
return player->HasItemOrGemWithIdEquipped(ITEM_EYE_OF_DIVINITY, 1);
}
void SummonArchers()
{
me->SummonCreature(NPC_SCOURGE_ARCHER, 3330.18f, -3078.97f, 171.814f, 0.799463f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3328.34f, -3017.88f, 171.544f, 6.26976f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3333.71f, -3052.4f, 174.171f, 0.391055f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3316.22f, -3035.49f, 166.428f, 0.163288f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3371.54f, -3067.75f, 174.942f, 1.96578f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3379.39f, -3060.11f, 181.617f, 2.82186f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3352.44f, -3079.01f, 179.07f, 1.32175f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3363.07f, -3077.43f, 183.0f, 1.78121f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3348.11f, -2991.02f, 172.304f, 4.07064f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3377.42f, -3039.77f, 172.594f, 3.20671f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3363.87f, -3010.4f, 185.387f, 3.81932f);
}
void SummonArchers()
{
me->SummonCreature(NPC_SCOURGE_ARCHER, 3330.18f, -3078.97f, 171.814f, 0.799463f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3328.34f, -3017.88f, 171.544f, 6.26976f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3333.71f, -3052.4f, 174.171f, 0.391055f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3316.22f, -3035.49f, 166.428f, 0.163288f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3371.54f, -3067.75f, 174.942f, 1.96578f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3379.39f, -3060.11f, 181.617f, 2.82186f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3352.44f, -3079.01f, 179.07f, 1.32175f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3363.07f, -3077.43f, 183.0f, 1.78121f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3348.11f, -2991.02f, 172.304f, 4.07064f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3377.42f, -3039.77f, 172.594f, 3.20671f);
me->SummonCreature(NPC_SCOURGE_ARCHER, 3363.87f, -3010.4f, 185.387f, 3.81932f);
}
void SummonPeasants()
{
for (uint8 i = 0; i < 12; ++i)
{
float x = 3358 + frand(-6.0f, 6.0f);
float y = -3049 + frand(-6.0f, 6.0f);
float z = 165.25;
float o = 2.0;
me->SummonCreature(roll_chance_i(5) ? NPC_PLAGUED_PEASANT : NPC_INJURED_PEASANT, x, y, z, o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 2*MINUTE*IN_MILLISECONDS);
}
}
void SummonPeasants()
{
for (uint8 i = 0; i < 12; ++i)
{
float x = 3358 + frand(-6.0f, 6.0f);
float y = -3049 + frand(-6.0f, 6.0f);
float z = 165.25;
float o = 2.0;
me->SummonCreature(roll_chance_i(5) ? NPC_PLAGUED_PEASANT : NPC_INJURED_PEASANT, x, y, z, o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 2*MINUTE*IN_MILLISECONDS);
}
}
void JustSummoned(Creature* creature)
{
summons.Summon(creature);
if (creature->GetEntry() == NPC_INJURED_PEASANT || creature->GetEntry() == NPC_PLAGUED_PEASANT)
{
creature->setFaction(_faction);
if (!_spoken)
{
_spoken = true;
creature->AI()->Talk(0);
}
void JustSummoned(Creature* creature)
{
summons.Summon(creature);
if (creature->GetEntry() == NPC_INJURED_PEASANT || creature->GetEntry() == NPC_PLAGUED_PEASANT)
{
creature->setFaction(_faction);
if (!_spoken)
{
_spoken = true;
creature->AI()->Talk(0);
}
if (creature->GetEntry() == NPC_PLAGUED_PEASANT)
creature->CastSpell(creature, SPELL_SEETHING_PLAGUE, true);
if (creature->GetEntry() == NPC_PLAGUED_PEASANT)
creature->CastSpell(creature, SPELL_SEETHING_PLAGUE, true);
float x = 3324+frand(-3.0f, 3.0f);
float y = -2966+frand(-3.0f, 3.0f);
float z = 159.65f;
creature->SetWalk(true);
creature->GetMotionMaster()->MovePoint(0, x, y, z);
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
}
}
float x = 3324+frand(-3.0f, 3.0f);
float y = -2966+frand(-3.0f, 3.0f);
float z = 159.65f;
creature->SetWalk(true);
creature->GetMotionMaster()->MovePoint(0, x, y, z);
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
}
}
void DoAction(int32 action)
{
if (action == 1)
_savedCount++;
else
_deathCount++;
void DoAction(int32 action)
{
if (action == 1)
_savedCount++;
else
_deathCount++;
if (_savedCount > 49)
{
Talk(1);
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
player->AreaExploredOrEventHappens(QUEST_BALANCE_OF_LIGHT_AND_SHADOW);
EnterEvadeMode();
return;
}
else if (_deathCount > 14)
{
Talk(2);
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
player->FailQuest(QUEST_BALANCE_OF_LIGHT_AND_SHADOW);
EnterEvadeMode();
return;
}
if (_savedCount > 49)
{
Talk(1);
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
player->AreaExploredOrEventHappens(QUEST_BALANCE_OF_LIGHT_AND_SHADOW);
EnterEvadeMode();
return;
}
else if (_deathCount > 14)
{
Talk(2);
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
player->FailQuest(QUEST_BALANCE_OF_LIGHT_AND_SHADOW);
EnterEvadeMode();
return;
}
if (action == 1 && !_spoken)
{
_spoken = true;
Talk(0);
me->CastSpell(me, SPELL_ERIS_BLESSING, false);
}
}
if (action == 1 && !_spoken)
{
_spoken = true;
Talk(0);
me->CastSpell(me, SPELL_ERIS_BLESSING, false);
}
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_CHECK_PLAYER:
{
Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
if (!player || me->GetDistance2d(player) > 100.0f)
{
EnterEvadeMode();
return;
}
events.RepeatEvent(2000);
break;
}
case EVENT_SUMMON_ARCHERS:
SummonArchers();
events.PopEvent();
break;
case EVENT_SUMMON_PEASANTS:
_spoken = false;
SummonPeasants();
_spoken = false;
events.RepeatEvent(60*IN_MILLISECONDS);
break;
}
}
};
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_CHECK_PLAYER:
{
Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
if (!player || me->GetDistance2d(player) > 100.0f)
{
EnterEvadeMode();
return;
}
events.RepeatEvent(2000);
break;
}
case EVENT_SUMMON_ARCHERS:
SummonArchers();
events.PopEvent();
break;
case EVENT_SUMMON_PEASANTS:
_spoken = false;
SummonPeasants();
_spoken = false;
events.RepeatEvent(60*IN_MILLISECONDS);
break;
}
}
};
};
class npc_balance_of_light_and_shadow : public CreatureScript
@@ -255,61 +255,61 @@ public:
{
npc_balance_of_light_and_shadowAI(Creature* creature) : NullCreatureAI(creature) { timer = 0; _targetGUID = 0; }
bool CanBeSeen(Player const* player)
{
// requires this trinket to be seen
return player->HasItemOrGemWithIdEquipped(ITEM_EYE_OF_DIVINITY, 1);
}
bool CanBeSeen(Player const* player)
{
// requires this trinket to be seen
return player->HasItemOrGemWithIdEquipped(ITEM_EYE_OF_DIVINITY, 1);
}
uint32 timer;
uint64 _targetGUID;
uint32 timer;
uint64 _targetGUID;
void SpellHit(Unit*, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_SHOOT && roll_chance_i(7))
me->CastSpell(me, SPELL_DEATHS_DOOR, true);
}
void SpellHit(Unit*, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_SHOOT && roll_chance_i(7))
me->CastSpell(me, SPELL_DEATHS_DOOR, true);
}
void MovementInform(uint32 type, uint32 pointId)
{
if (type != POINT_MOTION_TYPE)
return;
void MovementInform(uint32 type, uint32 pointId)
{
if (type != POINT_MOTION_TYPE)
return;
if (TempSummon* summon = me->ToTempSummon())
if (Unit* creature = summon->GetSummoner())
creature->GetAI()->DoAction(1);
if (TempSummon* summon = me->ToTempSummon())
if (Unit* creature = summon->GetSummoner())
creature->GetAI()->DoAction(1);
me->DespawnOrUnsummon(1);
}
me->DespawnOrUnsummon(1);
}
void JustDied(Unit*)
{
if (TempSummon* summon = me->ToTempSummon())
if (Unit* creature = summon->GetSummoner())
creature->GetAI()->DoAction(2);
}
void JustDied(Unit*)
{
if (TempSummon* summon = me->ToTempSummon())
if (Unit* creature = summon->GetSummoner())
creature->GetAI()->DoAction(2);
}
void UpdateAI(uint32 diff)
{
if (me->GetEntry() != NPC_SCOURGE_ARCHER)
return;
void UpdateAI(uint32 diff)
{
if (me->GetEntry() != NPC_SCOURGE_ARCHER)
return;
timer += diff;
if (timer >= 4000)
{
Unit* target = _targetGUID ? ObjectAccessor::GetUnit(*me, _targetGUID) : NULL;
if (!target)
target = me->FindNearestCreature(NPC_INJURED_PEASANT, 60.0f);
timer += diff;
if (timer >= 4000)
{
Unit* target = _targetGUID ? ObjectAccessor::GetUnit(*me, _targetGUID) : NULL;
if (!target)
target = me->FindNearestCreature(NPC_INJURED_PEASANT, 60.0f);
if (target)
{
_targetGUID = target->GetGUID();
me->CastSpell(target, SPELL_SHOOT, true);
}
if (target)
{
_targetGUID = target->GetGUID();
me->CastSpell(target, SPELL_SHOOT, true);
}
timer = urand(0,3000);
}
}
timer = urand(0,3000);
}
}
};
};
@@ -467,11 +467,11 @@ public:
void AddSC_eastern_plaguelands()
{
// Ours
new npc_eris_hevenfire();
new npc_balance_of_light_and_shadow();
// Ours
new npc_eris_hevenfire();
new npc_balance_of_light_and_shadow();
// Theirs
// Theirs
new npc_ghoul_flayer();
new npc_augustus_the_touched();
new npc_darrowshire_spirit();

File diff suppressed because it is too large Load Diff

View File

@@ -53,7 +53,7 @@ public:
phase = 0;
mockingBlowTimer = 5000;
shieldBashTimer = 8000;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
}
void sQuestAccept(Player* player, Quest const* quest)
@@ -62,8 +62,8 @@ public:
{
Talk(SAY_CORPORAL_1, player);
npc_escortAI::Start(true, false, player->GetGUID(), quest);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
me->setFaction(250);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
me->setFaction(250);
}
}

View File

@@ -343,7 +343,7 @@ public:
case 6:
Talk(SAY_LESCOVAR_4);
if (Player* player = GetPlayerForEscort())
player->GroupEventHappens(QUEST_THE_ATTACK, me);
player->GroupEventHappens(QUEST_THE_ATTACK, me);
uiTimer = 2000;
uiPhase = 7;
break;

View File

@@ -98,8 +98,8 @@ public:
void DamageTaken(Unit* pDoneBy, uint32 &uiDamage, DamageEffectType, SpellSchoolMask)
{
if (!pDoneBy)
return;
if (!pDoneBy)
return;
if (uiDamage >= me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage))
{

View File

@@ -149,9 +149,9 @@ public:
{
if (summoned->GetEntry() == NPC_HIGHBORNE_BUNNY)
{
summoned->SetDisableGravity(true);
float speed = summoned->GetDistance(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ()+15.0f) / (1000.0f * 0.001f);
summoned->MonsterMoveWithSpeed(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ()+15.0f, speed);
summoned->SetDisableGravity(true);
float speed = summoned->GetDistance(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ()+15.0f) / (1000.0f * 0.001f);
summoned->MonsterMoveWithSpeed(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ()+15.0f, speed);
summoned->CastSpell(summoned, SPELL_RIBBON_OF_SOULS, false);
}
}

View File

@@ -114,7 +114,7 @@ public:
enum Myranda
{
QUEST_FIND_MYRANDA = 5861,
QUEST_FIND_MYRANDA = 5861,
QUEST_SUBTERFUGE = 5862,
QUEST_IN_DREAMS = 5944,
SPELL_SCARLET_ILLUSION = 17961

View File

@@ -85,23 +85,23 @@ public:
{
npc_daphne_stilwellAI(Creature* creature) : npc_escortAI(creature), summons(me) { }
SummonList summons;
uint8 textCounter;
SummonList summons;
uint8 textCounter;
void Reset()
{
summons.DespawnAll();
textCounter = SAY_DS_DOWN_1;
summons.DespawnAll();
textCounter = SAY_DS_DOWN_1;
}
void WaypointReached(uint32 waypointId)
{
Player* player = GetPlayerForEscort();
if (!player)
{
me->DespawnOrUnsummon(1);
{
me->DespawnOrUnsummon(1);
return;
}
}
switch (waypointId)
{
@@ -128,7 +128,7 @@ public:
me->SummonCreature(NPC_DEFIAS_RAIDER, -11440.96f, 1599.69f, 66.35f, 4.09f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
me->SummonCreature(NPC_DEFIAS_RAIDER, -11433.44f, 1594.24f, 66.99f, 4.05f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
me->SummonCreature(NPC_DEFIAS_RAIDER, -11428.29f, 1598.37f, 70.90f, 3.9f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
me->SummonCreature(NPC_DEFIAS_RAIDER, -11438.14f, 1607.6f, 70.94f, 4.38f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
me->SummonCreature(NPC_DEFIAS_RAIDER, -11438.14f, 1607.6f, 70.94f, 4.38f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
break;
case 10:
SetRun(false);
@@ -142,10 +142,10 @@ public:
me->HandleEmoteCommand(EMOTE_STATE_USE_STANDING_NO_SHEATHE);
break;
case 17:
SetEscortPaused(true);
SetEscortPaused(true);
player->GroupEventHappens(QUEST_TOME_VALOR, me);
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
me->DespawnOrUnsummon(60000);
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
me->DespawnOrUnsummon(60000);
break;
}
}
@@ -161,20 +161,20 @@ public:
void JustSummoned(Creature* creature)
{
creature->SetHomePosition(me->GetHomePosition());
creature->GetMotionMaster()->MoveChase(me);
creature->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
creature->AI()->AttackStart(me);
creature->AddThreat(me, 0.0f);
summons.Summon(creature);
creature->SetHomePosition(me->GetHomePosition());
creature->GetMotionMaster()->MoveChase(me);
creature->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
creature->AI()->AttackStart(me);
creature->AddThreat(me, 0.0f);
summons.Summon(creature);
}
void SummonedCreatureDies(Creature* creature, Unit*)
{
summons.Despawn(creature);
if (summons.empty())
Talk(textCounter++, GetPlayerForEscort());
}
void SummonedCreatureDies(Creature* creature, Unit*)
{
summons.Despawn(creature);
if (summons.empty())
Talk(textCounter++, GetPlayerForEscort());
}
void Update(const uint32 diff)
{
@@ -183,17 +183,17 @@ public:
if (!UpdateVictim())
return;
if (me->isAttackReady(BASE_ATTACK))
{
if (me->isAttackReady(BASE_ATTACK))
{
if (!me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE))
DoCastVictim(SPELL_SHOOT, true);
else
{
me->SetSheath(SHEATH_STATE_MELEE);
me->AttackerStateUpdate(me->GetVictim());
}
else
{
me->SetSheath(SHEATH_STATE_MELEE);
me->AttackerStateUpdate(me->GetVictim());
}
me->resetAttackTimer();
me->resetAttackTimer();
}
}
};

View File

@@ -86,7 +86,7 @@ public:
{
if (HasEscortState(STATE_ESCORT_ESCORTING) && !IsFriendSummoned && GetPlayerForEscort())
{
me->CastSpell(me, SPELL_CALL_FRIENDS, true);
me->CastSpell(me, SPELL_CALL_FRIENDS, true);
IsFriendSummoned = true;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -20,12 +20,12 @@
enum Spells
{
SPELL_GOBLIN_DISGUISE = 71450,
SPELL_GOBLIN_ALLY_COMPLETE = 71522,
SPELL_GOBLIN_HORDE_COMPLETE = 71539,
SPELL_GOBLIN_CARRY_CRATE = 71459,
SPELL_GOBLIN_DISGUISE = 71450,
SPELL_GOBLIN_ALLY_COMPLETE = 71522,
SPELL_GOBLIN_HORDE_COMPLETE = 71539,
SPELL_GOBLIN_CARRY_CRATE = 71459,
NPC_SOMETHING_STINKS_CREDIT = 37558,
NPC_SOMETHING_STINKS_CREDIT = 37558,
};
class npc_love_in_air_supply_sentry : public CreatureScript
@@ -39,31 +39,31 @@ class npc_love_in_air_supply_sentry : public CreatureScript
{
}
uint32 lock;
uint32 lock;
void MoveInLineOfSight(Unit* who)
{
if (lock > 1000 && me->GetDistance(who) < 10.0f && who->GetTypeId() == TYPEID_PLAYER && who->HasAura(SPELL_GOBLIN_DISGUISE) && !who->HasAura(SPELL_GOBLIN_CARRY_CRATE))
{
lock = 0;
if (urand(0,1))
me->MonsterSay("Time is money, friend. Go go go!", LANG_UNIVERSAL, who->ToPlayer());
else
me->MonsterSay("That crate won't deliver itself, friend. Get a move on!", LANG_UNIVERSAL, who->ToPlayer());
{
if (lock > 1000 && me->GetDistance(who) < 10.0f && who->GetTypeId() == TYPEID_PLAYER && who->HasAura(SPELL_GOBLIN_DISGUISE) && !who->HasAura(SPELL_GOBLIN_CARRY_CRATE))
{
lock = 0;
if (urand(0,1))
me->MonsterSay("Time is money, friend. Go go go!", LANG_UNIVERSAL, who->ToPlayer());
else
me->MonsterSay("That crate won't deliver itself, friend. Get a move on!", LANG_UNIVERSAL, who->ToPlayer());
if (who->ToPlayer()->GetTeamId() == TEAM_ALLIANCE)
who->CastSpell(who, SPELL_GOBLIN_ALLY_COMPLETE, true);
else
who->CastSpell(who, SPELL_GOBLIN_HORDE_COMPLETE, true);
if (who->ToPlayer()->GetTeamId() == TEAM_ALLIANCE)
who->CastSpell(who, SPELL_GOBLIN_ALLY_COMPLETE, true);
else
who->CastSpell(who, SPELL_GOBLIN_HORDE_COMPLETE, true);
me->CastSpell(who, SPELL_GOBLIN_CARRY_CRATE, true);
}
}
me->CastSpell(who, SPELL_GOBLIN_CARRY_CRATE, true);
}
}
void UpdateAI(uint32 diff)
{
lock += diff;
}
void UpdateAI(uint32 diff)
{
lock += diff;
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -74,15 +74,15 @@ class npc_love_in_air_supply_sentry : public CreatureScript
enum hotOnTrail
{
QUEST_HOT_ON_TRAIL_ALLY = 24849,
QUEST_HOT_ON_TRAIL_HORDE = 24851,
QUEST_HOT_ON_TRAIL_ALLY = 24849,
QUEST_HOT_ON_TRAIL_HORDE = 24851,
NPC_SNIVEL_ALLY = 38334,
NPC_SNIVEL_COUNTER = 38340,
NPC_SNIVEL_ALLY = 38334,
NPC_SNIVEL_COUNTER = 38340,
NPC_SNIVEL_HORDE = 38337,
NPC_SNIVEL_HORDE = 38337,
SPELL_SNIVEL_GUN = 71715,
SPELL_SNIVEL_GUN = 71715,
};
const uint32 spellTable[6] = {71713, 71745, 71752, 71759, 71760, 71758};
@@ -98,46 +98,46 @@ class npc_love_in_air_snivel : public CreatureScript
{
}
int32 delay;
int32 delay;
void Reset()
{
delay = 0;
me->SetReactState(REACT_AGGRESSIVE);
}
void Reset()
{
delay = 0;
me->SetReactState(REACT_AGGRESSIVE);
}
bool AllowAction(Player* player)
{
uint16 slot = player->FindQuestSlot(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE);
if (slot >= MAX_QUEST_LOG_SIZE)
return false;
bool AllowAction(Player* player)
{
uint16 slot = player->FindQuestSlot(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE);
if (slot >= MAX_QUEST_LOG_SIZE)
return false;
QuestStatusData& qData = player->getQuestStatusMap()[(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE)];
if (qData.CreatureOrGOCount[me->GetEntry() - NPC_SNIVEL_COUNTER] == 0)
return true;
QuestStatusData& qData = player->getQuestStatusMap()[(player->GetTeamId() == TEAM_ALLIANCE ? QUEST_HOT_ON_TRAIL_ALLY : QUEST_HOT_ON_TRAIL_HORDE)];
if (qData.CreatureOrGOCount[me->GetEntry() - NPC_SNIVEL_COUNTER] == 0)
return true;
return false;
}
return false;
}
void MoveInLineOfSight(Unit* who)
{
if (delay == 0 && me->GetDistance(who) < 7.0f && who->GetTypeId() == TYPEID_PLAYER)
{
Player* plr = who->ToPlayer();
if (AllowAction(plr))
{
delay = 25000;
uint8 index = plr->GetTeamId()*3 + (me->GetEntry() - NPC_SNIVEL_COUNTER);
plr->CastSpell(plr, spellTable[index], true);
}
}
}
{
if (delay == 0 && me->GetDistance(who) < 7.0f && who->GetTypeId() == TYPEID_PLAYER)
{
Player* plr = who->ToPlayer();
if (AllowAction(plr))
{
delay = 25000;
uint8 index = plr->GetTeamId()*3 + (me->GetEntry() - NPC_SNIVEL_COUNTER);
plr->CastSpell(plr, spellTable[index], true);
}
}
}
void UpdateAI(uint32 diff)
{
if (delay > 0)
delay -= std::min<int32>(delay, diff);
}
void UpdateAI(uint32 diff)
{
if (delay > 0)
delay -= std::min<int32>(delay, diff);
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -155,73 +155,73 @@ class npc_love_in_air_snivel_real : public CreatureScript
{
npc_love_in_air_snivel_realAI(Creature* creature) : ScriptedAI(creature)
{
actionTimer = 7000;
actionCounter = 0;
actionTimer = 7000;
actionCounter = 0;
}
uint32 actionTimer;
uint32 actionCounter;
uint32 actionTimer;
uint32 actionCounter;
bool Talk(uint32 time)
{
switch (me->GetEntry())
{
case NPC_SNIVEL_ALLY:
case NPC_SNIVEL_HORDE:
{
switch (time)
{
case 1: me->MonsterSay("What are you staring at? Haven't you ever seen a genius before?", LANG_UNIVERSAL, 0); return false;
case 2: me->MonsterSay("This'll teach you to mind your own business!", LANG_UNIVERSAL, 0); return true;
}
break;
}
case NPC_SNIVEL_ALLY+1:
case NPC_SNIVEL_HORDE+1:
{
switch (time)
{
case 1: me->MonsterSay("That's right. I'd like to list some of these 'fireworks'.", LANG_UNIVERSAL, 0); return false;
case 2: me->MonsterSay("Those'll net me a nice profit when I return from the South Seas.", LANG_UNIVERSAL, 0); return false;
case 3: me->MonsterSay("You... Don't think I don't see you. Leave me alone!", LANG_UNIVERSAL, 0); return true;
}
break;
}
bool Talk(uint32 time)
{
switch (me->GetEntry())
{
case NPC_SNIVEL_ALLY:
case NPC_SNIVEL_HORDE:
{
switch (time)
{
case 1: me->MonsterSay("What are you staring at? Haven't you ever seen a genius before?", LANG_UNIVERSAL, 0); return false;
case 2: me->MonsterSay("This'll teach you to mind your own business!", LANG_UNIVERSAL, 0); return true;
}
break;
}
case NPC_SNIVEL_ALLY+1:
case NPC_SNIVEL_HORDE+1:
{
switch (time)
{
case 1: me->MonsterSay("That's right. I'd like to list some of these 'fireworks'.", LANG_UNIVERSAL, 0); return false;
case 2: me->MonsterSay("Those'll net me a nice profit when I return from the South Seas.", LANG_UNIVERSAL, 0); return false;
case 3: me->MonsterSay("You... Don't think I don't see you. Leave me alone!", LANG_UNIVERSAL, 0); return true;
}
break;
}
case NPC_SNIVEL_ALLY+2:
case NPC_SNIVEL_HORDE+2:
{
switch (time)
{
case 1: me->MonsterSay("Thanks for the great cut and shave, buddy.", LANG_UNIVERSAL, 0); return false;
case 2: me->MonsterSay("Here's a little something extra since I'll be away.", LANG_UNIVERSAL, 0); return false;
case 3: me->MonsterSay("On second thought, keep the whole bag. I have to, uh, get going.", LANG_UNIVERSAL, 0); return false;
case 4: me->MonsterSay("Did you really think you could corner me this easily?", LANG_UNIVERSAL, 0); return true;
}
break;
}
}
case NPC_SNIVEL_ALLY+2:
case NPC_SNIVEL_HORDE+2:
{
switch (time)
{
case 1: me->MonsterSay("Thanks for the great cut and shave, buddy.", LANG_UNIVERSAL, 0); return false;
case 2: me->MonsterSay("Here's a little something extra since I'll be away.", LANG_UNIVERSAL, 0); return false;
case 3: me->MonsterSay("On second thought, keep the whole bag. I have to, uh, get going.", LANG_UNIVERSAL, 0); return false;
case 4: me->MonsterSay("Did you really think you could corner me this easily?", LANG_UNIVERSAL, 0); return true;
}
break;
}
}
return true;
}
return true;
}
void UpdateAI(uint32 diff)
{
actionTimer += diff;
if (actionTimer >= 7000)
{
actionTimer = 0;
actionCounter++;
if (Talk(actionCounter))
{
if (me->ToTempSummon())
if (Unit* owner = me->ToTempSummon()->GetSummoner())
me->CastSpell(owner, SPELL_SNIVEL_GUN, true);
void UpdateAI(uint32 diff)
{
actionTimer += diff;
if (actionTimer >= 7000)
{
actionTimer = 0;
actionCounter++;
if (Talk(actionCounter))
{
if (me->ToTempSummon())
if (Unit* owner = me->ToTempSummon()->GetSummoner())
me->CastSpell(owner, SPELL_SNIVEL_GUN, true);
me->DespawnOrUnsummon(1000);
}
}
}
me->DespawnOrUnsummon(1000);
}
}
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -236,31 +236,31 @@ class npc_love_in_air_snivel_real : public CreatureScript
enum hummel
{
QUEST_YOUVE_BEEN_SERVED = 14488,
NPC_APOTHECARY_HUMMEL = 36296,
NPC_APOTHECARY_FRYE = 36272,
NPC_APOTHECARY_BAXTER = 36565,
QUEST_YOUVE_BEEN_SERVED = 14488,
NPC_APOTHECARY_HUMMEL = 36296,
NPC_APOTHECARY_FRYE = 36272,
NPC_APOTHECARY_BAXTER = 36565,
SPELL_COLOGNE_IMMUNE = 68530,
SPELL_COLOGNE_PASSIVE_DAMAGE = 68947,
SPELL_PERFUME_PASSIVE_DAMAGE = 68641,
SPELL_COLOGNE_IMMUNE = 68530,
SPELL_COLOGNE_PASSIVE_DAMAGE = 68947,
SPELL_PERFUME_PASSIVE_DAMAGE = 68641,
SPELL_THROW_COLOGNE = 68614,
SPELL_THROW_PERFUME = 68798,
SPELL_THROW_COLOGNE = 68614,
SPELL_THROW_PERFUME = 68798,
// Real fight
SPELL_COLOGNE_SPRAY = 68948,
SPELL_ALLURING_PERFUME_SPRAY = 68607,
SPELL_CHAIN_REACTION = 68821,
// Real fight
SPELL_COLOGNE_SPRAY = 68948,
SPELL_ALLURING_PERFUME_SPRAY = 68607,
SPELL_CHAIN_REACTION = 68821,
ACTION_START_EVENT = 1,
ACTION_RELEASE_HELPER = 2,
ACTION_START_EVENT = 1,
ACTION_RELEASE_HELPER = 2,
EVENT_CALL_BAXTER = 1,
EVENT_CALL_FRYE = 2,
EVENT_SPELL_PERFUME_SPRAY = 3,
EVENT_SPELL_CHAIN_REACTION = 4,
EVENT_SPELL_THROW = 5,
EVENT_CALL_BAXTER = 1,
EVENT_CALL_FRYE = 2,
EVENT_SPELL_PERFUME_SPRAY = 3,
EVENT_SPELL_CHAIN_REACTION = 4,
EVENT_SPELL_THROW = 5,
};
class npc_love_in_air_hummel : public CreatureScript
@@ -274,112 +274,112 @@ class npc_love_in_air_hummel : public CreatureScript
{
}
SummonList summons;
EventMap events;
uint32 speachTimer;
SummonList summons;
EventMap events;
uint32 speachTimer;
void Reset()
{
speachTimer = 0;
me->setFaction(35);
summons.DespawnAll();
events.Reset();
me->SummonCreature(NPC_APOTHECARY_FRYE, -205.449f, 2219.56f, 79.7633f, 0.7f);
me->SummonCreature(NPC_APOTHECARY_BAXTER, -209.602f, 2215.42f, 79.7633f, 0.723503f);
}
void Reset()
{
speachTimer = 0;
me->setFaction(35);
summons.DespawnAll();
events.Reset();
me->SummonCreature(NPC_APOTHECARY_FRYE, -205.449f, 2219.56f, 79.7633f, 0.7f);
me->SummonCreature(NPC_APOTHECARY_BAXTER, -209.602f, 2215.42f, 79.7633f, 0.723503f);
}
void DoAction(int32 param)
{
if (param == ACTION_START_EVENT)
speachTimer = 1;
}
void DoAction(int32 param)
{
if (param == ACTION_START_EVENT)
speachTimer = 1;
}
void JustDied(Unit* )
{
me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0);
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (!players.isEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup())
sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), 288, me->FindMap());
}
void JustDied(Unit* )
{
me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0);
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (!players.isEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup())
sLFGMgr->FinishDungeon(players.begin()->GetSource()->GetGroup()->GetGUID(), 288, me->FindMap());
}
void JustSummoned(Creature* cr)
{
summons.Summon(cr);
cr->setFaction(35);
cr->SetControlled(true, UNIT_STATE_STUNNED);
cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void JustSummoned(Creature* cr)
{
summons.Summon(cr);
cr->setFaction(35);
cr->SetControlled(true, UNIT_STATE_STUNNED);
cr->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void UpdateAI(uint32 diff)
{
if (speachTimer)
{
speachTimer += diff;
if (speachTimer < 10000)
{
me->MonsterSay("Did they bother to tell you who I am and why I am doing this?", LANG_UNIVERSAL, 0);
speachTimer = 10000;
}
else if (speachTimer >= 16000 && speachTimer < 20000)
{
me->MonsterSay("...or are they just using you like they do everybody else?", LANG_UNIVERSAL, 0);
speachTimer = 20000;
}
else if (speachTimer >= 26000 && speachTimer < 30000)
{
me->MonsterSay("But what does it matter. It is time for this to end.", LANG_UNIVERSAL, 0);
speachTimer = 0;
me->setFaction(16);
me->SetInCombatWithZone();
if (Unit* target = SelectTargetFromPlayerList(40.0f))
{
AttackStart(target);
events.ScheduleEvent(EVENT_CALL_BAXTER, 10000);
events.ScheduleEvent(EVENT_CALL_FRYE, 20000);
events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000);
}
else
EnterEvadeMode();
}
return;
}
void UpdateAI(uint32 diff)
{
if (speachTimer)
{
speachTimer += diff;
if (speachTimer < 10000)
{
me->MonsterSay("Did they bother to tell you who I am and why I am doing this?", LANG_UNIVERSAL, 0);
speachTimer = 10000;
}
else if (speachTimer >= 16000 && speachTimer < 20000)
{
me->MonsterSay("...or are they just using you like they do everybody else?", LANG_UNIVERSAL, 0);
speachTimer = 20000;
}
else if (speachTimer >= 26000 && speachTimer < 30000)
{
me->MonsterSay("But what does it matter. It is time for this to end.", LANG_UNIVERSAL, 0);
speachTimer = 0;
me->setFaction(16);
me->SetInCombatWithZone();
if (Unit* target = SelectTargetFromPlayerList(40.0f))
{
AttackStart(target);
events.ScheduleEvent(EVENT_CALL_BAXTER, 10000);
events.ScheduleEvent(EVENT_CALL_FRYE, 20000);
events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000);
}
else
EnterEvadeMode();
}
return;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_CALL_BAXTER:
{
EntryCheckPredicate pred(NPC_APOTHECARY_BAXTER);
summons.DoAction(ACTION_RELEASE_HELPER, pred);
events.PopEvent();
break;
}
case EVENT_CALL_FRYE:
{
EntryCheckPredicate pred(NPC_APOTHECARY_FRYE);
summons.DoAction(ACTION_RELEASE_HELPER, pred);
events.PopEvent();
break;
}
case EVENT_SPELL_PERFUME_SPRAY:
me->CastSpell(me->GetVictim(), SPELL_ALLURING_PERFUME_SPRAY, false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_CHAIN_REACTION:
me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false);
events.RepeatEvent(12000);
break;
}
switch (events.GetEvent())
{
case EVENT_CALL_BAXTER:
{
EntryCheckPredicate pred(NPC_APOTHECARY_BAXTER);
summons.DoAction(ACTION_RELEASE_HELPER, pred);
events.PopEvent();
break;
}
case EVENT_CALL_FRYE:
{
EntryCheckPredicate pred(NPC_APOTHECARY_FRYE);
summons.DoAction(ACTION_RELEASE_HELPER, pred);
events.PopEvent();
break;
}
case EVENT_SPELL_PERFUME_SPRAY:
me->CastSpell(me->GetVictim(), SPELL_ALLURING_PERFUME_SPRAY, false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_CHAIN_REACTION:
me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false);
events.RepeatEvent(12000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -387,13 +387,13 @@ class npc_love_in_air_hummel : public CreatureScript
return new npc_love_in_air_hummelAI(creature);
}
bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest *_Quest, uint32 /*slot*/)
{
if (_Quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
creature->AI()->DoAction(ACTION_START_EVENT);
bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest *_Quest, uint32 /*slot*/)
{
if (_Quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
creature->AI()->DoAction(ACTION_START_EVENT);
return true;
}
return true;
}
};
class npc_love_in_air_hummel_helper : public CreatureScript
@@ -407,69 +407,69 @@ class npc_love_in_air_hummel_helper : public CreatureScript
{
}
EventMap events;
EventMap events;
void Reset()
{
}
void Reset()
{
}
void DoAction(int32 param)
{
if (param == ACTION_RELEASE_HELPER)
{
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->setFaction(16);
me->SetInCombatWithZone();
if (Unit* target = SelectTargetFromPlayerList(40.0f))
AttackStart(target);
void DoAction(int32 param)
{
if (param == ACTION_RELEASE_HELPER)
{
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->setFaction(16);
me->SetInCombatWithZone();
if (Unit* target = SelectTargetFromPlayerList(40.0f))
AttackStart(target);
if (me->GetEntry() == NPC_APOTHECARY_BAXTER)
{
events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000);
}
else
events.ScheduleEvent(EVENT_SPELL_THROW, 5000);
}
}
if (me->GetEntry() == NPC_APOTHECARY_BAXTER)
{
events.ScheduleEvent(EVENT_SPELL_PERFUME_SPRAY, 7000);
events.ScheduleEvent(EVENT_SPELL_CHAIN_REACTION, 12000);
}
else
events.ScheduleEvent(EVENT_SPELL_THROW, 5000);
}
}
void JustDied(Unit* ) { me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0); }
void JustDied(Unit* ) { me->MonsterSay("...please don't think less of me.", LANG_UNIVERSAL, 0); }
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_PERFUME_SPRAY:
me->CastSpell(me->GetVictim(), SPELL_COLOGNE_SPRAY, false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_CHAIN_REACTION:
me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false);
events.RepeatEvent(12000);
break;
case EVENT_SPELL_THROW:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
{
Position pos(*me);
me->Relocate(target);
me->CastSpell(me, RAND(SPELL_THROW_COLOGNE, SPELL_THROW_PERFUME), true, NULL, NULL, me->GetGUID());
me->Relocate(pos);
}
events.RepeatEvent(10000);
break;
}
switch (events.GetEvent())
{
case EVENT_SPELL_PERFUME_SPRAY:
me->CastSpell(me->GetVictim(), SPELL_COLOGNE_SPRAY, false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_CHAIN_REACTION:
me->CastSpell(me->GetVictim(), SPELL_CHAIN_REACTION, false);
events.RepeatEvent(12000);
break;
case EVENT_SPELL_THROW:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
{
Position pos(*me);
me->Relocate(target);
me->CastSpell(me, RAND(SPELL_THROW_COLOGNE, SPELL_THROW_PERFUME), true, NULL, NULL, me->GetGUID());
me->Relocate(pos);
}
events.RepeatEvent(10000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -483,55 +483,55 @@ class spell_love_in_air_perfume_immune : public SpellScriptLoader
public:
spell_love_in_air_perfume_immune() : SpellScriptLoader("spell_love_in_air_perfume_immune") { }
class spell_love_in_air_perfume_immune_AuraScript : public AuraScript
{
PrepareAuraScript(spell_love_in_air_perfume_immune_AuraScript);
class spell_love_in_air_perfume_immune_AuraScript : public AuraScript
{
PrepareAuraScript(spell_love_in_air_perfume_immune_AuraScript);
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (GetId() == SPELL_COLOGNE_IMMUNE)
{
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, true);
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, true);
target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, true);
}
else
{
target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, true);
target->ApplySpellImmune(SPELL_ALLURING_PERFUME_SPRAY, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, true);
target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, true);
}
}
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (GetId() == SPELL_COLOGNE_IMMUNE)
{
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, true);
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, true);
target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, true);
}
else
{
target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, true);
target->ApplySpellImmune(SPELL_ALLURING_PERFUME_SPRAY, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, true);
target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, true);
}
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (GetId() == SPELL_COLOGNE_IMMUNE)
{
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, false);
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, false);
target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, false);
}
else
{
target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, false);
target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, false);
target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, false);
}
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
if (GetId() == SPELL_COLOGNE_IMMUNE)
{
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_PASSIVE_DAMAGE, false);
target->ApplySpellImmune(SPELL_COLOGNE_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_COLOGNE_SPRAY, false);
target->ApplySpellImmune(68934, IMMUNITY_ID, 68934, false);
}
else
{
target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_PERFUME_PASSIVE_DAMAGE, false);
target->ApplySpellImmune(SPELL_PERFUME_PASSIVE_DAMAGE, IMMUNITY_ID, SPELL_ALLURING_PERFUME_SPRAY, false);
target->ApplySpellImmune(68927, IMMUNITY_ID, 68927, false);
}
}
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectApply, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectApply, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_love_in_air_perfume_immune_AuraScript::HandleEffectRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_love_in_air_perfume_immune_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_love_in_air_perfume_immune_AuraScript();
}
};
class spell_love_in_air_periodic_perfumes : public SpellScriptLoader
@@ -539,33 +539,33 @@ class spell_love_in_air_periodic_perfumes : public SpellScriptLoader
public:
spell_love_in_air_periodic_perfumes() : SpellScriptLoader("spell_love_in_air_periodic_perfumes") { }
class spell_love_in_air_periodic_perfumes_AuraScript : public AuraScript
{
PrepareAuraScript(spell_love_in_air_periodic_perfumes_AuraScript);
class spell_love_in_air_periodic_perfumes_AuraScript : public AuraScript
{
PrepareAuraScript(spell_love_in_air_periodic_perfumes_AuraScript);
void PeriodicTick(AuraEffect const* /*aurEff*/)
void PeriodicTick(AuraEffect const* /*aurEff*/)
{
uint64 guid = (GetCaster() ? GetCaster()->GetGUID() : 0);
uint64 guid = (GetCaster() ? GetCaster()->GetGUID() : 0);
if (Unit* target = GetTarget())
{
uint32 spellId = (GetId() == SPELL_THROW_COLOGNE ? 68934 : 68927);
if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(spellId)))
return;
{
uint32 spellId = (GetId() == SPELL_THROW_COLOGNE ? 68934 : 68927);
if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(spellId)))
return;
target->CastSpell(target, spellId, true, NULL, NULL, guid);
}
target->CastSpell(target, spellId, true, NULL, NULL, guid);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_love_in_air_periodic_perfumes_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
};
AuraScript* GetAuraScript() const
{
return new spell_love_in_air_periodic_perfumes_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_love_in_air_periodic_perfumes_AuraScript();
}
};
///////////////////////////////////////
@@ -759,19 +759,19 @@ class spell_gen_aura_service_uniform : public SpellScriptLoader
void AddSC_event_love_in_the_air()
{
// Npcs
new npc_love_in_air_supply_sentry();
new npc_love_in_air_snivel();
new npc_love_in_air_snivel_real();
// Npcs
new npc_love_in_air_supply_sentry();
new npc_love_in_air_snivel();
new npc_love_in_air_snivel_real();
// Boss
new npc_love_in_air_hummel();
new npc_love_in_air_hummel_helper();
new spell_love_in_air_perfume_immune();
new spell_love_in_air_periodic_perfumes();
// Boss
new npc_love_in_air_hummel();
new npc_love_in_air_hummel_helper();
new spell_love_in_air_perfume_immune();
new spell_love_in_air_periodic_perfumes();
// Spells
new spell_item_create_heart_candy();
new spell_love_is_in_the_air_romantic_picnic();
new spell_gen_aura_service_uniform();
// Spells
new spell_item_create_heart_candy();
new spell_love_is_in_the_air_romantic_picnic();
new spell_gen_aura_service_uniform();
}

View File

@@ -10,10 +10,10 @@
enum eBonfire
{
GO_MIDSUMMER_BONFIRE = 181288,
GO_MIDSUMMER_BONFIRE = 181288,
SPELL_STAMP_OUT_BONFIRE = 45437,
SPELL_LIGHT_BONFIRE = 29831,
SPELL_STAMP_OUT_BONFIRE = 45437,
SPELL_LIGHT_BONFIRE = 29831,
};
class go_midsummer_bonfire : public GameObjectScript
@@ -24,8 +24,8 @@ public:
bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action)
{
player->CLOSE_GOSSIP_MENU();
// we know that there is only one gossip.
player->CastSpell(player, SPELL_STAMP_OUT_BONFIRE, true);
// we know that there is only one gossip.
player->CastSpell(player, SPELL_STAMP_OUT_BONFIRE, true);
return true;
}
};
@@ -38,39 +38,39 @@ class npc_midsummer_bonfire : public CreatureScript
struct npc_midsummer_bonfireAI : public ScriptedAI
{
npc_midsummer_bonfireAI(Creature* c) : ScriptedAI(c)
{
me->IsAIEnabled = true;
goGUID = 0;
if (GameObject* go = me->SummonGameObject(GO_MIDSUMMER_BONFIRE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0))
{
goGUID = go->GetGUID();
me->RemoveGameObject(go, false);
}
}
uint64 goGUID;
{
me->IsAIEnabled = true;
goGUID = 0;
if (GameObject* go = me->SummonGameObject(GO_MIDSUMMER_BONFIRE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0))
{
goGUID = go->GetGUID();
me->RemoveGameObject(go, false);
}
}
uint64 goGUID;
void SpellHit(Unit*, SpellInfo const* spellInfo)
{
if (!goGUID)
return;
void SpellHit(Unit*, SpellInfo const* spellInfo)
{
if (!goGUID)
return;
// Extinguish fire
if (spellInfo->Id == SPELL_STAMP_OUT_BONFIRE)
{
if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID))
go->SetPhaseMask(2, true);
}
else if (spellInfo->Id == SPELL_LIGHT_BONFIRE)
{
if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID))
{
go->SetPhaseMask(1, true);
go->SendCustomAnim(1);
}
}
// Extinguish fire
if (spellInfo->Id == SPELL_STAMP_OUT_BONFIRE)
{
if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID))
go->SetPhaseMask(2, true);
}
else if (spellInfo->Id == SPELL_LIGHT_BONFIRE)
{
if (GameObject* go = ObjectAccessor::GetGameObject(*me, goGUID))
{
go->SetPhaseMask(1, true);
go->SendCustomAnim(1);
}
}
}
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -87,107 +87,107 @@ class npc_midsummer_torch_target : public CreatureScript
struct npc_midsummer_torch_targetAI : public ScriptedAI
{
npc_midsummer_torch_targetAI(Creature* c) : ScriptedAI(c)
{
teleTimer = 0;
startTimer = 1;
posVec.clear();
playerGUID = 0;
me->CastSpell(me, 43313, true);
counter = 0;
maxCount = 0;
}
{
teleTimer = 0;
startTimer = 1;
posVec.clear();
playerGUID = 0;
me->CastSpell(me, 43313, true);
counter = 0;
maxCount = 0;
}
uint64 playerGUID;
uint32 startTimer;
uint32 teleTimer;
std::vector<Position> posVec;
uint8 counter;
uint8 maxCount;
uint64 playerGUID;
uint32 startTimer;
uint32 teleTimer;
std::vector<Position> posVec;
uint8 counter;
uint8 maxCount;
void SetPlayerGUID(uint64 guid, uint8 cnt)
{
playerGUID = guid;
maxCount = cnt;
}
void SetPlayerGUID(uint64 guid, uint8 cnt)
{
playerGUID = guid;
maxCount = cnt;
}
bool CanBeSeen(Player const* seer)
{
return seer->GetGUID() == playerGUID;
}
void SpellHit(Unit* caster, SpellInfo const* spellInfo)
{
if (posVec.empty())
return;
// Triggered spell from torch
if (spellInfo->Id == 46054 && caster->GetTypeId() == TYPEID_PLAYER)
{
me->CastSpell(me, 45724, true); // hit visual anim
if (++counter >= maxCount)
{
caster->CastSpell(caster, (caster->ToPlayer()->GetTeamId() ? 46651 : 45719), true); // quest complete spell
me->DespawnOrUnsummon(1);
return;
}
bool CanBeSeen(Player const* seer)
{
return seer->GetGUID() == playerGUID;
}
void SpellHit(Unit* caster, SpellInfo const* spellInfo)
{
if (posVec.empty())
return;
// Triggered spell from torch
if (spellInfo->Id == 46054 && caster->GetTypeId() == TYPEID_PLAYER)
{
me->CastSpell(me, 45724, true); // hit visual anim
if (++counter >= maxCount)
{
caster->CastSpell(caster, (caster->ToPlayer()->GetTeamId() ? 46651 : 45719), true); // quest complete spell
me->DespawnOrUnsummon(1);
return;
}
teleTimer = 1;
}
}
teleTimer = 1;
}
}
void UpdateAI(uint32 diff)
{
if (startTimer)
{
startTimer += diff;
if (startTimer >= 200)
{
startTimer = 0;
FillPositions();
SelectPosition();
}
}
if (teleTimer)
{
teleTimer += diff;
if (teleTimer >= 750 && teleTimer < 10000)
{
teleTimer = 10000;
SelectPosition();
}
else if (teleTimer >= 10500)
{
if (Player* plr = ObjectAccessor::GetPlayer(*me, playerGUID))
plr->UpdateTriggerVisibility();
void UpdateAI(uint32 diff)
{
if (startTimer)
{
startTimer += diff;
if (startTimer >= 200)
{
startTimer = 0;
FillPositions();
SelectPosition();
}
}
if (teleTimer)
{
teleTimer += diff;
if (teleTimer >= 750 && teleTimer < 10000)
{
teleTimer = 10000;
SelectPosition();
}
else if (teleTimer >= 10500)
{
if (Player* plr = ObjectAccessor::GetPlayer(*me, playerGUID))
plr->UpdateTriggerVisibility();
teleTimer = 0;
}
}
}
teleTimer = 0;
}
}
}
void FillPositions()
{
std::list<GameObject*> gobjList;
me->GetGameObjectListWithEntryInGrid(gobjList, 187708 /*TORCH_GO*/, 30.0f);
for (std::list<GameObject*>::const_iterator itr = gobjList.begin(); itr != gobjList.end(); ++itr)
{
Position pos;
pos.Relocate(*itr);
posVec.push_back(pos);
}
}
void FillPositions()
{
std::list<GameObject*> gobjList;
me->GetGameObjectListWithEntryInGrid(gobjList, 187708 /*TORCH_GO*/, 30.0f);
for (std::list<GameObject*>::const_iterator itr = gobjList.begin(); itr != gobjList.end(); ++itr)
{
Position pos;
pos.Relocate(*itr);
posVec.push_back(pos);
}
}
void SelectPosition()
{
if (posVec.empty())
return;
int8 num = urand(0, posVec.size()-1);
Position pos;
pos.Relocate(posVec.at(num));
me->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f);
me->m_last_notify_mstime = World::GetGameTimeMS() + 10000;
void SelectPosition()
{
if (posVec.empty())
return;
int8 num = urand(0, posVec.size()-1);
Position pos;
pos.Relocate(posVec.at(num));
me->m_last_notify_position.Relocate(0.0f, 0.0f, 0.0f);
me->m_last_notify_mstime = World::GetGameTimeMS() + 10000;
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
}
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
}
};
CreatureAI* GetAI(Creature* creature) const
@@ -203,11 +203,11 @@ class npc_midsummer_torch_target : public CreatureScript
enum RibbonPole
{
SPELL_RIBBON_POLE_CHANNEL_VISUAL = 29172,
SPELL_RIBBON_POLE_XP = 29175,
SPELL_RIBBON_POLE_FIREWORKS = 46971,
SPELL_RIBBON_POLE_CHANNEL_VISUAL = 29172,
SPELL_RIBBON_POLE_XP = 29175,
SPELL_RIBBON_POLE_FIREWORKS = 46971,
NPC_RIBBON_POLE_DEBUG_TARGET = 17066,
NPC_RIBBON_POLE_DEBUG_TARGET = 17066,
};
class spell_midsummer_ribbon_pole : public SpellScriptLoader
@@ -219,47 +219,47 @@ public:
{
PrepareAuraScript(spell_midsummer_ribbon_pole_AuraScript)
void HandleEffectPeriodic(AuraEffect const * aurEff)
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
PreventDefaultAction();
if (Unit *target = GetTarget())
{
Creature* cr = target->FindNearestCreature(NPC_RIBBON_POLE_DEBUG_TARGET, 10.0f);
if (!cr)
{
target->RemoveAura(SPELL_RIBBON_POLE_CHANNEL_VISUAL);
SetDuration(1);
return;
}
PreventDefaultAction();
if (Unit *target = GetTarget())
{
Creature* cr = target->FindNearestCreature(NPC_RIBBON_POLE_DEBUG_TARGET, 10.0f);
if (!cr)
{
target->RemoveAura(SPELL_RIBBON_POLE_CHANNEL_VISUAL);
SetDuration(1);
return;
}
if (Aura* aur = target->GetAura(SPELL_RIBBON_POLE_XP))
aur->SetDuration(std::min(aur->GetDuration()+3*MINUTE*IN_MILLISECONDS, 60*MINUTE*IN_MILLISECONDS));
else
target->CastSpell(target, SPELL_RIBBON_POLE_XP, true);
if (Aura* aur = target->GetAura(SPELL_RIBBON_POLE_XP))
aur->SetDuration(std::min(aur->GetDuration()+3*MINUTE*IN_MILLISECONDS, 60*MINUTE*IN_MILLISECONDS));
else
target->CastSpell(target, SPELL_RIBBON_POLE_XP, true);
if (roll_chance_i(5))
{
cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ()-6.5f);
cr->CastSpell(cr, SPELL_RIBBON_POLE_FIREWORKS, true);
cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ()+6.5f);
}
if (roll_chance_i(5))
{
cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ()-6.5f);
cr->CastSpell(cr, SPELL_RIBBON_POLE_FIREWORKS, true);
cr->Relocate(cr->GetPositionX(), cr->GetPositionY(), cr->GetPositionZ()+6.5f);
}
// Achievement
if ((time(NULL) - GetApplyTime()) > 60 && target->GetTypeId() == TYPEID_PLAYER)
target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 58934, 0, target);
}
// Achievement
if ((time(NULL) - GetApplyTime()) > 60 && target->GetTypeId() == TYPEID_PLAYER)
target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 58934, 0, target);
}
}
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* ar = GetTarget();
ar->CastSpell(ar, SPELL_RIBBON_POLE_CHANNEL_VISUAL, true);
Unit* ar = GetTarget();
ar->CastSpell(ar, SPELL_RIBBON_POLE_CHANNEL_VISUAL, true);
}
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_midsummer_ribbon_pole_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_midsummer_ribbon_pole_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
OnEffectApply += AuraEffectApplyFn(spell_midsummer_ribbon_pole_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_midsummer_ribbon_pole_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
@@ -278,34 +278,34 @@ public:
{
PrepareAuraScript(spell_midsummer_torch_quest_AuraScript)
bool Load()
{
torchGUID = 0;
return true;
}
uint64 torchGUID;
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
bool Load()
{
Unit* ar = GetTarget();
if (Creature* cr = ar->SummonCreature(25535, ar->GetPositionX(), ar->GetPositionY(), ar->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 90000))
{
torchGUID = cr->GetGUID();
CAST_AI(npc_midsummer_torch_target::npc_midsummer_torch_targetAI, cr->AI())->SetPlayerGUID(ar->GetGUID(), (GetId() == 45716 ? 8 : 20));
}
torchGUID = 0;
return true;
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
uint64 torchGUID;
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* cr = ObjectAccessor::GetCreature(*GetTarget(), torchGUID))
cr->DespawnOrUnsummon(1);
Unit* ar = GetTarget();
if (Creature* cr = ar->SummonCreature(25535, ar->GetPositionX(), ar->GetPositionY(), ar->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 90000))
{
torchGUID = cr->GetGUID();
CAST_AI(npc_midsummer_torch_target::npc_midsummer_torch_targetAI, cr->AI())->SetPlayerGUID(ar->GetGUID(), (GetId() == 45716 ? 8 : 20));
}
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* cr = ObjectAccessor::GetCreature(*GetTarget(), torchGUID))
cr->DespawnOrUnsummon(1);
}
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_midsummer_torch_quest_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DETECT_AMORE, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_midsummer_torch_quest_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DETECT_AMORE, AURA_EFFECT_HANDLE_REAL);
OnEffectApply += AuraEffectApplyFn(spell_midsummer_torch_quest_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DETECT_AMORE, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_midsummer_torch_quest_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DETECT_AMORE, AURA_EFFECT_HANDLE_REAL);
}
};
@@ -317,12 +317,12 @@ public:
enum flingTorch
{
NPC_TORCH_TARGET = 26188,
NPC_TORCH_TARGET = 26188,
SPELL_FLING_TORCH = 45669,
SPELL_FLING_TORCH_DUMMY = 46747,
SPELL_MISSED_TORCH = 45676,
SPELL_TORCH_COUNTER = 45693,
SPELL_FLING_TORCH = 45669,
SPELL_FLING_TORCH_DUMMY = 46747,
SPELL_MISSED_TORCH = 45676,
SPELL_TORCH_COUNTER = 45693,
};
class spell_midsummer_fling_torch : public SpellScriptLoader
@@ -334,95 +334,95 @@ class spell_midsummer_fling_torch : public SpellScriptLoader
{
PrepareSpellScript(spell_midsummer_fling_torch_SpellScript);
bool handled;
bool Load() { handled = false; return true; }
bool handled;
bool Load() { handled = false; return true; }
void ThrowNextTorch(Unit* caster)
{
std::list<Creature*> crList;
caster->GetCreaturesWithEntryInRange(crList, 100.0f, NPC_TORCH_TARGET);
uint8 rand = urand(0, crList.size()-1);
Position pos;
pos.Relocate(0.0f, 0.0f, 0.0f);
for (std::list<Creature*>::const_iterator itr = crList.begin(); itr != crList.end(); ++itr, --rand)
{
if (caster->GetDistance(*itr) < 5)
{
if (!rand)
rand++;
continue;
}
if (!rand)
{
pos.Relocate(*itr);
break;
}
}
// we have any pos
if (pos.GetPositionX())
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_FLING_TORCH, true);
}
void HandleFinish()
{
Unit* caster = GetCaster();
if (!caster || !caster->ToPlayer()) // caster cant be null, but meh :p
return;
if (GetSpellInfo()->Id != SPELL_FLING_TORCH_DUMMY)
{
if (!handled)
if (const WorldLocation* loc = GetExplTargetDest())
{
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_MISSED_TORCH, true);
caster->RemoveAurasDueToSpell(SPELL_TORCH_COUNTER);
}
return;
}
ThrowNextTorch(caster);
}
void HandleScript(SpellEffIndex effIndex)
void ThrowNextTorch(Unit* caster)
{
PreventHitDefaultEffect(effIndex);
if (Player* target = GetHitPlayer())
{
if (target->GetGUID() != GetCaster()->GetGUID())
return;
std::list<Creature*> crList;
caster->GetCreaturesWithEntryInRange(crList, 100.0f, NPC_TORCH_TARGET);
handled = true;
if (Aura* aur = target->GetAura(SPELL_TORCH_COUNTER))
{
aur->ModStackAmount(1);
uint8 count = 4;
if (target->GetQuestStatus(target->GetTeamId() ? 11925 : 11924) == QUEST_STATUS_INCOMPLETE) // More Torch Catching quests
count = 10;
uint8 rand = urand(0, crList.size()-1);
Position pos;
pos.Relocate(0.0f, 0.0f, 0.0f);
for (std::list<Creature*>::const_iterator itr = crList.begin(); itr != crList.end(); ++itr, --rand)
{
if (caster->GetDistance(*itr) < 5)
{
if (!rand)
rand++;
continue;
}
if (aur->GetStackAmount() >= count)
{
//target->CastSpell(target, 46711, true); // Set Flag: all torch returning quests are complete
target->CastSpell(target, (target->GetTeamId() ? 46654 : 46081), true); // Quest completion
aur->SetDuration(1);
return;
}
}
else
target->CastSpell(target, SPELL_TORCH_COUNTER, true);
if (!rand)
{
pos.Relocate(*itr);
break;
}
}
ThrowNextTorch(GetCaster());
}
// we have any pos
if (pos.GetPositionX())
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_FLING_TORCH, true);
}
void Register()
{
AfterCast += SpellCastFn(spell_midsummer_fling_torch_SpellScript::HandleFinish);
if (m_scriptSpellId == 45671)
OnEffectHitTarget += SpellEffectFn(spell_midsummer_fling_torch_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
void HandleFinish()
{
Unit* caster = GetCaster();
if (!caster || !caster->ToPlayer()) // caster cant be null, but meh :p
return;
if (GetSpellInfo()->Id != SPELL_FLING_TORCH_DUMMY)
{
if (!handled)
if (const WorldLocation* loc = GetExplTargetDest())
{
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_MISSED_TORCH, true);
caster->RemoveAurasDueToSpell(SPELL_TORCH_COUNTER);
}
return;
}
ThrowNextTorch(caster);
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (Player* target = GetHitPlayer())
{
if (target->GetGUID() != GetCaster()->GetGUID())
return;
handled = true;
if (Aura* aur = target->GetAura(SPELL_TORCH_COUNTER))
{
aur->ModStackAmount(1);
uint8 count = 4;
if (target->GetQuestStatus(target->GetTeamId() ? 11925 : 11924) == QUEST_STATUS_INCOMPLETE) // More Torch Catching quests
count = 10;
if (aur->GetStackAmount() >= count)
{
//target->CastSpell(target, 46711, true); // Set Flag: all torch returning quests are complete
target->CastSpell(target, (target->GetTeamId() ? 46654 : 46081), true); // Quest completion
aur->SetDuration(1);
return;
}
}
else
target->CastSpell(target, SPELL_TORCH_COUNTER, true);
ThrowNextTorch(GetCaster());
}
}
void Register()
{
AfterCast += SpellCastFn(spell_midsummer_fling_torch_SpellScript::HandleFinish);
if (m_scriptSpellId == 45671)
OnEffectHitTarget += SpellEffectFn(spell_midsummer_fling_torch_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
@@ -433,14 +433,14 @@ class spell_midsummer_fling_torch : public SpellScriptLoader
enum eJuggle
{
SPELL_JUGGLE_SELF = 45638,
SPELL_JUGGLE_SLOW = 45792,
SPELL_JUGGLE_MED = 45806,
SPELL_JUGGLE_FAST = 45816,
SPELL_JUGGLE_SELF = 45638,
SPELL_JUGGLE_SLOW = 45792,
SPELL_JUGGLE_MED = 45806,
SPELL_JUGGLE_FAST = 45816,
SPELL_TORCH_CHECK = 45644,
SPELL_GIVE_TORCH = 45280,
QUEST_CHECK = 11937,
SPELL_TORCH_CHECK = 45644,
SPELL_GIVE_TORCH = 45280,
QUEST_CHECK = 11937,
};
class spell_midsummer_juggling_torch : public SpellScriptLoader
@@ -452,51 +452,51 @@ class spell_midsummer_juggling_torch : public SpellScriptLoader
{
PrepareSpellScript(spell_midsummer_juggling_torch_SpellScript);
bool handled;
bool Load() { handled = false; return true; }
void HandleFinish()
bool handled;
bool Load() { handled = false; return true; }
void HandleFinish()
{
Unit* caster = GetCaster();
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
Unit* caster = GetCaster();
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
if (const WorldLocation* loc = GetExplTargetDest())
{
if (loc->GetExactDist(caster) < 3.0f)
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_SELF, true);
else if (loc->GetExactDist(caster) < 10.0f)
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_SLOW, true);
else if (loc->GetExactDist(caster) < 25.0f)
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_MED, true);
else
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_FAST, true);
}
else
caster->CastSpell(caster, SPELL_JUGGLE_SELF, true);
if (const WorldLocation* loc = GetExplTargetDest())
{
if (loc->GetExactDist(caster) < 3.0f)
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_SELF, true);
else if (loc->GetExactDist(caster) < 10.0f)
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_SLOW, true);
else if (loc->GetExactDist(caster) < 25.0f)
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_MED, true);
else
caster->CastSpell(loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), SPELL_JUGGLE_FAST, true);
}
else
caster->CastSpell(caster, SPELL_JUGGLE_SELF, true);
}
void HandleDummy(SpellEffIndex effIndex)
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
Unit* caster = GetCaster();
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
Unit* caster = GetCaster();
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
if (Player* target = GetHitPlayer())
if (!handled && target->GetQuestRewardStatus(target->GetTeamId() == TEAM_ALLIANCE ? 11657 : 11923))
{
handled = true;
caster->CastSpell(target, SPELL_GIVE_TORCH, true);
}
if (Player* target = GetHitPlayer())
if (!handled && target->GetQuestRewardStatus(target->GetTeamId() == TEAM_ALLIANCE ? 11657 : 11923))
{
handled = true;
caster->CastSpell(target, SPELL_GIVE_TORCH, true);
}
}
void Register()
{
if (m_scriptSpellId == SPELL_TORCH_CHECK)
OnEffectHitTarget += SpellEffectFn(spell_midsummer_juggling_torch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
else
AfterCast += SpellCastFn(spell_midsummer_juggling_torch_SpellScript::HandleFinish);
}
void Register()
{
if (m_scriptSpellId == SPELL_TORCH_CHECK)
OnEffectHitTarget += SpellEffectFn(spell_midsummer_juggling_torch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
else
AfterCast += SpellCastFn(spell_midsummer_juggling_torch_SpellScript::HandleFinish);
}
};
SpellScript* GetSpellScript() const
@@ -507,14 +507,14 @@ class spell_midsummer_juggling_torch : public SpellScriptLoader
void AddSC_event_midsummer_scripts()
{
// NPCs
new go_midsummer_bonfire();
new npc_midsummer_bonfire();
new npc_midsummer_torch_target();
// NPCs
new go_midsummer_bonfire();
new npc_midsummer_bonfire();
new npc_midsummer_torch_target();
// Spells
new spell_midsummer_ribbon_pole();
new spell_midsummer_torch_quest();
new spell_midsummer_fling_torch();
new spell_midsummer_juggling_torch();
// Spells
new spell_midsummer_ribbon_pole();
new spell_midsummer_torch_quest();
new spell_midsummer_fling_torch();
new spell_midsummer_juggling_torch();
}

File diff suppressed because it is too large Load Diff

View File

@@ -60,10 +60,10 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
enum winterWondervoltTrap
{
SPELL_WINTER_WONDERVOLT_GREEN_WOMEN = 26272,
SPELL_WINTER_WONDERVOLT_GREEN_MAN = 26157,
SPELL_WINTER_WONDERVOLT_RED_WOMEN = 26274,
SPELL_WINTER_WONDERVOLT_RED_MAN = 26273,
SPELL_WINTER_WONDERVOLT_GREEN_WOMEN = 26272,
SPELL_WINTER_WONDERVOLT_GREEN_MAN = 26157,
SPELL_WINTER_WONDERVOLT_RED_WOMEN = 26274,
SPELL_WINTER_WONDERVOLT_RED_MAN = 26273,
};
class spell_winter_wondervolt_trap : public SpellScriptLoader
@@ -83,11 +83,11 @@ class spell_winter_wondervolt_trap : public SpellScriptLoader
if (target->HasAuraType(SPELL_AURA_TRANSFORM))
return;
uint32 spellId = 0;
if (target->getGender() == GENDER_MALE)
spellId = RAND<uint32>(SPELL_WINTER_WONDERVOLT_RED_MAN, SPELL_WINTER_WONDERVOLT_GREEN_MAN);
else
spellId = RAND<uint32>(SPELL_WINTER_WONDERVOLT_RED_WOMEN, SPELL_WINTER_WONDERVOLT_GREEN_WOMEN);
uint32 spellId = 0;
if (target->getGender() == GENDER_MALE)
spellId = RAND<uint32>(SPELL_WINTER_WONDERVOLT_RED_MAN, SPELL_WINTER_WONDERVOLT_GREEN_MAN);
else
spellId = RAND<uint32>(SPELL_WINTER_WONDERVOLT_RED_WOMEN, SPELL_WINTER_WONDERVOLT_GREEN_WOMEN);
// cast
target->CastSpell(target, spellId, true);
@@ -109,18 +109,18 @@ class spell_winter_wondervolt_trap : public SpellScriptLoader
enum crashinTrashin
{
SPELL_BLUE_CAR_VISUAL = 75110,
SPELL_RED_CAR_VISUAL = 49384,
NPC_RED_RACER = 27664,
NPC_BLUE_RACER = 40281,
SPELL_BLUE_CAR_VISUAL = 75110,
SPELL_RED_CAR_VISUAL = 49384,
NPC_RED_RACER = 27664,
NPC_BLUE_RACER = 40281,
SPELL_RACER_DEATH_VISUAL = 49337,
SPELL_RACER_CHARGE_TO_OBJECT = 49302,
SPELL_RACER_KILL_COUNTER = 49444,
SPELL_RACER_SLAM_HIT = 49324,
SPELL_RACER_FLAMES = 49328,
SPELL_RACER_DEATH_VISUAL = 49337,
SPELL_RACER_CHARGE_TO_OBJECT = 49302,
SPELL_RACER_KILL_COUNTER = 49444,
SPELL_RACER_SLAM_HIT = 49324,
SPELL_RACER_FLAMES = 49328,
RACER_ACHI_CRITERIA = 4090,
RACER_ACHI_CRITERIA = 4090,
};
class spell_winter_veil_racer_rocket_slam : public SpellScriptLoader
@@ -135,46 +135,46 @@ class spell_winter_veil_racer_rocket_slam : public SpellScriptLoader
void HandleTriggerSpell(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
PreventHitEffect(EFFECT_0);
PreventHitEffect(EFFECT_1);
PreventHitEffect(EFFECT_0);
PreventHitEffect(EFFECT_1);
std::list<Creature*> unitList;
Unit* target = NULL;
caster->GetCreaturesWithEntryInRange(unitList, 30.0f, NPC_BLUE_RACER);
if (!unitList.empty())
for (std::list<Creature*>::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
if (caster->HasInLine((*itr), 1.0f) && (*itr)->GetGUID() != caster->GetGUID())
{
target = (*itr);
break;
}
if (!target)
{
unitList.clear();
caster->GetCreaturesWithEntryInRange(unitList, 30.0f, NPC_RED_RACER);
if (!unitList.empty())
for (std::list<Creature*>::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
if (caster->HasInLine((*itr), 1.0f) && (*itr)->GetGUID() != caster->GetGUID())
{
target = (*itr);
break;
}
}
std::list<Creature*> unitList;
Unit* target = NULL;
caster->GetCreaturesWithEntryInRange(unitList, 30.0f, NPC_BLUE_RACER);
if (!unitList.empty())
for (std::list<Creature*>::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
if (caster->HasInLine((*itr), 1.0f) && (*itr)->GetGUID() != caster->GetGUID())
{
target = (*itr);
break;
}
if (!target)
{
unitList.clear();
caster->GetCreaturesWithEntryInRange(unitList, 30.0f, NPC_RED_RACER);
if (!unitList.empty())
for (std::list<Creature*>::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
if (caster->HasInLine((*itr), 1.0f) && (*itr)->GetGUID() != caster->GetGUID())
{
target = (*itr);
break;
}
}
if (target)
{
caster->CastSpell(target, SPELL_RACER_CHARGE_TO_OBJECT, true);
caster->CastSpell(target, SPELL_RACER_SLAM_HIT, true);
}
else
{
Position pos;
float x = caster->GetPositionX()+30*cos(caster->GetOrientation());
float y = caster->GetPositionY()+30*sin(caster->GetOrientation());
pos.Relocate(x, y, caster->GetMap()->GetHeight(x, y, MAX_HEIGHT)+0.5f);
//caster->GetFirstCollisionPosition(pos, 30.0f, caster->GetOrientation());
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_RACER_CHARGE_TO_OBJECT, true);
}
if (target)
{
caster->CastSpell(target, SPELL_RACER_CHARGE_TO_OBJECT, true);
caster->CastSpell(target, SPELL_RACER_SLAM_HIT, true);
}
else
{
Position pos;
float x = caster->GetPositionX()+30*cos(caster->GetOrientation());
float y = caster->GetPositionY()+30*sin(caster->GetOrientation());
pos.Relocate(x, y, caster->GetMap()->GetHeight(x, y, MAX_HEIGHT)+0.5f);
//caster->GetFirstCollisionPosition(pos, 30.0f, caster->GetOrientation());
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_RACER_CHARGE_TO_OBJECT, true);
}
}
void Register()
@@ -201,20 +201,20 @@ class spell_winter_veil_racer_slam_hit : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
Creature* target = GetHitCreature();
if (!target || caster == target)
return;
Creature* target = GetHitCreature();
if (!target || caster == target)
return;
target->CastSpell(target->GetPositionX()+irand(-10, 10), target->GetPositionY()+irand(-10, 10), target->GetPositionZ() , SPELL_RACER_DEATH_VISUAL, true);
target->DespawnOrUnsummon(3000);
target->CastSpell(target, SPELL_RACER_FLAMES, true);
caster->CastSpell(caster, SPELL_RACER_KILL_COUNTER, true);
target->CastSpell(target->GetPositionX()+irand(-10, 10), target->GetPositionY()+irand(-10, 10), target->GetPositionZ() , SPELL_RACER_DEATH_VISUAL, true);
target->DespawnOrUnsummon(3000);
target->CastSpell(target, SPELL_RACER_FLAMES, true);
caster->CastSpell(caster, SPELL_RACER_KILL_COUNTER, true);
if (Player* targetSummoner = target->GetCharmerOrOwnerPlayerOrPlayerItself())
{
//targetSummoner->RemoveCriteriaProgress(sAchievementCriteriaStore.LookupEntry(RACER_ACHI_CRITERIA)); !ZOMG, ADD ACCESSOR
targetSummoner->RemoveAurasDueToSpell(SPELL_RACER_KILL_COUNTER);
}
if (Player* targetSummoner = target->GetCharmerOrOwnerPlayerOrPlayerItself())
{
//targetSummoner->RemoveCriteriaProgress(sAchievementCriteriaStore.LookupEntry(RACER_ACHI_CRITERIA)); !ZOMG, ADD ACCESSOR
targetSummoner->RemoveAurasDueToSpell(SPELL_RACER_KILL_COUNTER);
}
}
void Register()
@@ -231,11 +231,11 @@ class spell_winter_veil_racer_slam_hit : public SpellScriptLoader
enum airRifle
{
SPELL_AIR_RIFLE_RIGHT_IN_THE_EYE = 65577,
SPELL_AIR_RIFLE_STARLED = 61862,
SPELL_AIR_RIFLE_HIT = 61866,
SPELL_AIR_RIFLE_HIT_TRIGGER = 65576,
SPELL_AIR_RIFLE_PELTED_DAMAGE = 67531,
SPELL_AIR_RIFLE_RIGHT_IN_THE_EYE = 65577,
SPELL_AIR_RIFLE_STARLED = 61862,
SPELL_AIR_RIFLE_HIT = 61866,
SPELL_AIR_RIFLE_HIT_TRIGGER = 65576,
SPELL_AIR_RIFLE_PELTED_DAMAGE = 67531,
};
class spell_winter_veil_shoot_air_rifle : public SpellScriptLoader
@@ -249,34 +249,34 @@ class spell_winter_veil_shoot_air_rifle : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetOriginalCaster();
Unit* target = GetHitUnit();
if (!target)
return;
Unit* caster = GetOriginalCaster();
Unit* target = GetHitUnit();
if (!target)
return;
if (GetSpellInfo()->Id == SPELL_AIR_RIFLE_HIT_TRIGGER)
{
if (!caster->IsFriendlyTo(target))
caster->CastSpell(target, SPELL_AIR_RIFLE_PELTED_DAMAGE, true, NULL, NULL, caster->GetGUID());
}
else
{
uint8 rand = urand(0, 99);
if (rand < 15)
caster->CastSpell(caster, SPELL_AIR_RIFLE_RIGHT_IN_THE_EYE, true, NULL, NULL, caster->GetGUID());
else if (rand < 35)
caster->CastSpell(target, SPELL_AIR_RIFLE_STARLED, true, NULL, NULL, caster->GetGUID());
else
caster->CastSpell(target, SPELL_AIR_RIFLE_HIT, true, NULL, NULL, caster->GetGUID());
}
if (GetSpellInfo()->Id == SPELL_AIR_RIFLE_HIT_TRIGGER)
{
if (!caster->IsFriendlyTo(target))
caster->CastSpell(target, SPELL_AIR_RIFLE_PELTED_DAMAGE, true, NULL, NULL, caster->GetGUID());
}
else
{
uint8 rand = urand(0, 99);
if (rand < 15)
caster->CastSpell(caster, SPELL_AIR_RIFLE_RIGHT_IN_THE_EYE, true, NULL, NULL, caster->GetGUID());
else if (rand < 35)
caster->CastSpell(target, SPELL_AIR_RIFLE_STARLED, true, NULL, NULL, caster->GetGUID());
else
caster->CastSpell(target, SPELL_AIR_RIFLE_HIT, true, NULL, NULL, caster->GetGUID());
}
}
void Register()
{
if (m_scriptSpellId == SPELL_AIR_RIFLE_HIT_TRIGGER)
OnEffectHitTarget += SpellEffectFn(spell_winter_veil_shoot_air_rifle_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
else
OnEffectHitTarget += SpellEffectFn(spell_winter_veil_shoot_air_rifle_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
if (m_scriptSpellId == SPELL_AIR_RIFLE_HIT_TRIGGER)
OnEffectHitTarget += SpellEffectFn(spell_winter_veil_shoot_air_rifle_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
else
OnEffectHitTarget += SpellEffectFn(spell_winter_veil_shoot_air_rifle_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
@@ -288,10 +288,10 @@ class spell_winter_veil_shoot_air_rifle : public SpellScriptLoader
void AddSC_event_winter_veil_scripts()
{
// Spells
new spell_winter_veil_mistletoe();
new spell_winter_wondervolt_trap();
new spell_winter_veil_racer_rocket_slam();
new spell_winter_veil_racer_slam_hit();
new spell_winter_veil_shoot_air_rifle();
// Spells
new spell_winter_veil_mistletoe();
new spell_winter_wondervolt_trap();
new spell_winter_veil_racer_rocket_slam();
new spell_winter_veil_racer_slam_hit();
new spell_winter_veil_shoot_air_rifle();
}

View File

@@ -7,13 +7,13 @@ REWRITTEN BY XINEF
enum Data
{
TYPE_GELIHAST = 0,
TYPE_FIRE1 = 1,
TYPE_FIRE2 = 2,
TYPE_FIRE3 = 3,
TYPE_FIRE4 = 4,
TYPE_AKU_MAI = 5,
MAX_ENCOUNTERS = 6
TYPE_GELIHAST = 0,
TYPE_FIRE1 = 1,
TYPE_FIRE2 = 2,
TYPE_FIRE3 = 3,
TYPE_FIRE4 = 4,
TYPE_AKU_MAI = 5,
MAX_ENCOUNTERS = 6
};
enum CreatureIds

View File

@@ -8,122 +8,122 @@ REWRITTEN BY XINEF
class instance_blackfathom_deeps : public InstanceMapScript
{
public:
instance_blackfathom_deeps() : InstanceMapScript("instance_blackfathom_deeps", 48) { }
public:
instance_blackfathom_deeps() : InstanceMapScript("instance_blackfathom_deeps", 48) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_blackfathom_deeps_InstanceMapScript(map);
}
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
return new instance_blackfathom_deeps_InstanceMapScript(map);
}
struct instance_blackfathom_deeps_InstanceMapScript : public InstanceScript
{
instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map) { }
struct instance_blackfathom_deeps_InstanceMapScript : public InstanceScript
{
instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map) { }
void Initialize()
{
memset(&_encounters, 0, sizeof(_encounters));
_akumaiPortalGUID = 0;
_requiredDeaths = 0;
}
void Initialize()
{
memset(&_encounters, 0, sizeof(_encounters));
_akumaiPortalGUID = 0;
_requiredDeaths = 0;
}
void OnCreatureCreate(Creature* creature)
{
if (creature->IsSummon() && (creature->GetEntry() == NPC_BARBED_CRUSTACEAN || creature->GetEntry() == NPC_AKU_MAI_SERVANT ||
creature->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || creature->GetEntry() == NPC_AKU_MAI_SNAPJAW))
++_requiredDeaths;
}
void OnCreatureCreate(Creature* creature)
{
if (creature->IsSummon() && (creature->GetEntry() == NPC_BARBED_CRUSTACEAN || creature->GetEntry() == NPC_AKU_MAI_SERVANT ||
creature->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || creature->GetEntry() == NPC_AKU_MAI_SNAPJAW))
++_requiredDeaths;
}
void OnUnitDeath(Unit* unit)
{
if (unit->IsSummon() && (unit->GetEntry() == NPC_BARBED_CRUSTACEAN || unit->GetEntry() == NPC_AKU_MAI_SERVANT ||
unit->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || unit->GetEntry() == NPC_AKU_MAI_SNAPJAW))
{
if (--_requiredDeaths == 0)
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
HandleGameObject(_akumaiPortalGUID, true);
}
}
void OnUnitDeath(Unit* unit)
{
if (unit->IsSummon() && (unit->GetEntry() == NPC_BARBED_CRUSTACEAN || unit->GetEntry() == NPC_AKU_MAI_SERVANT ||
unit->GetEntry() == NPC_MURKSHALLOW_SOFTSHELL || unit->GetEntry() == NPC_AKU_MAI_SNAPJAW))
{
if (--_requiredDeaths == 0)
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
HandleGameObject(_akumaiPortalGUID, true);
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_FIRE_OF_AKU_MAI_1:
case GO_FIRE_OF_AKU_MAI_2:
case GO_FIRE_OF_AKU_MAI_3:
case GO_FIRE_OF_AKU_MAI_4:
if (_encounters[gameobject->GetEntry() - GO_FIRE_OF_AKU_MAI_1 + 1] == DONE)
{
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
gameobject->SetGoState(GO_STATE_ACTIVE);
}
break;
case GO_SHRINE_OF_GELIHAST:
if (_encounters[TYPE_GELIHAST] == DONE)
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_ALTAR_OF_THE_DEEPS:
if (_encounters[TYPE_AKU_MAI] == DONE)
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_AKU_MAI_DOOR:
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
HandleGameObject(0, true, gameobject);
_akumaiPortalGUID = gameobject->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_FIRE_OF_AKU_MAI_1:
case GO_FIRE_OF_AKU_MAI_2:
case GO_FIRE_OF_AKU_MAI_3:
case GO_FIRE_OF_AKU_MAI_4:
if (_encounters[gameobject->GetEntry() - GO_FIRE_OF_AKU_MAI_1 + 1] == DONE)
{
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
gameobject->SetGoState(GO_STATE_ACTIVE);
}
break;
case GO_SHRINE_OF_GELIHAST:
if (_encounters[TYPE_GELIHAST] == DONE)
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_ALTAR_OF_THE_DEEPS:
if (_encounters[TYPE_AKU_MAI] == DONE)
gameobject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_AKU_MAI_DOOR:
if (_encounters[TYPE_FIRE1] == DONE && _encounters[TYPE_FIRE2] == DONE && _encounters[TYPE_FIRE3] == DONE && _encounters[TYPE_FIRE4] == DONE)
HandleGameObject(0, true, gameobject);
_akumaiPortalGUID = gameobject->GetGUID();
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_GELIHAST:
case TYPE_FIRE1:
case TYPE_FIRE2:
case TYPE_FIRE3:
case TYPE_FIRE4:
case TYPE_AKU_MAI:
_encounters[type] = data;
break;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_GELIHAST:
case TYPE_FIRE1:
case TYPE_FIRE2:
case TYPE_FIRE3:
case TYPE_FIRE4:
case TYPE_AKU_MAI:
_encounters[type] = data;
break;
}
if (data == DONE)
SaveToDB();
}
if (data == DONE)
SaveToDB();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "B L " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4] << ' ' << _encounters[5];
return saveStream.str();
}
std::string GetSaveData()
{
std::ostringstream saveStream;
saveStream << "B L " << _encounters[0] << ' ' << _encounters[1] << ' ' << _encounters[2] << ' ' << _encounters[3] << ' ' << _encounters[4] << ' ' << _encounters[5];
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
return;
void Load(const char* in)
{
if (!in)
return;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'L')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'L')
{
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
{
loadStream >> _encounters[i];
if (_encounters[i] == IN_PROGRESS)
_encounters[i] = NOT_STARTED;
}
}
}
private:
uint32 _encounters[MAX_ENCOUNTERS];
uint64 _akumaiPortalGUID;
uint8 _requiredDeaths;
};
private:
uint32 _encounters[MAX_ENCOUNTERS];
uint64 _akumaiPortalGUID;
uint8 _requiredDeaths;
};
};
void AddSC_instance_blackfathom_deeps()

View File

@@ -174,7 +174,7 @@ class spell_mark_of_kazrogal : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
}
void Register()

View File

@@ -8,22 +8,22 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
#include "SpellInfo.h"
enum Spells
{
SPELL_CURSE_OF_EXERTION = 52772,
SPELL_WOUNDING_STRIKE_N = 52771,
SPELL_WOUNDING_STRIKE_H = 58830,
SPELL_TIME_STOP = 58848,
SPELL_TIME_WARP = 52766,
SPELL_TIME_STEP_N = 52737,
SPELL_TIME_STEP_H = 58829,
SPELL_CURSE_OF_EXERTION = 52772,
SPELL_WOUNDING_STRIKE_N = 52771,
SPELL_WOUNDING_STRIKE_H = 58830,
SPELL_TIME_STOP = 58848,
SPELL_TIME_WARP = 52766,
SPELL_TIME_STEP_N = 52737,
SPELL_TIME_STEP_H = 58829,
};
enum Events
{
EVENT_SPELL_CURSE_OF_EXERTION = 1,
EVENT_SPELL_WOUNDING_STRIKE = 2,
EVENT_SPELL_TIME_STOP = 3,
EVENT_SPELL_TIME_WARP = 4,
EVENT_TIME_WARP = 5,
EVENT_SPELL_CURSE_OF_EXERTION = 1,
EVENT_SPELL_WOUNDING_STRIKE = 2,
EVENT_SPELL_TIME_STOP = 3,
EVENT_SPELL_TIME_WARP = 4,
EVENT_TIME_WARP = 5,
};
enum Yells
@@ -52,75 +52,75 @@ public:
}
EventMap events;
uint8 warps;
void Reset()
{
events.Reset();
warps = 0;
}
uint8 warps;
void Reset()
{
events.Reset();
warps = 0;
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000);
events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000);
events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000);
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000);
events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000);
events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000);
}
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N)
{
if (target == me)
return;
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N)
{
if (target == me)
return;
if (warps >= 2)
{
warps = 0;
return;
}
warps++;
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
}
}
if (warps >= 2)
{
warps = 0;
return;
}
warps++;
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_CURSE_OF_EXERTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false);
events.RepeatEvent(9000);
break;
case EVENT_SPELL_WOUNDING_STRIKE:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_TIME_STOP:
me->CastSpell(me, SPELL_TIME_STOP, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_TIME_WARP:
Talk(SAY_TIME_WARP);
me->CastSpell(me, SPELL_TIME_WARP, false);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
switch (events.GetEvent())
{
case EVENT_SPELL_CURSE_OF_EXERTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false);
events.RepeatEvent(9000);
break;
case EVENT_SPELL_WOUNDING_STRIKE:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_TIME_STOP:
me->CastSpell(me, SPELL_TIME_STOP, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_TIME_WARP:
Talk(SAY_TIME_WARP);
me->CastSpell(me, SPELL_TIME_WARP, false);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
events.RepeatEvent(25000);
break;
}
events.RepeatEvent(25000);
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -8,16 +8,16 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_CORRUPTING_BLIGHT = 60588,
SPELL_VOID_STRIKE = 60590,
SPELL_CORRUPTION_OF_TIME_AURA = 60451,
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
SPELL_CORRUPTING_BLIGHT = 60588,
SPELL_VOID_STRIKE = 60590,
SPELL_CORRUPTION_OF_TIME_AURA = 60451,
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
};
enum Events
{
EVENT_SPELL_CORRUPTING_BLIGHT = 1,
EVENT_SPELL_VOID_STRIKE = 2,
EVENT_SPELL_CORRUPTING_BLIGHT = 1,
EVENT_SPELL_VOID_STRIKE = 2,
};
enum Yells
@@ -44,96 +44,96 @@ public:
}
EventMap events;
SummonList summons;
uint32 beamTimer;
SummonList summons;
uint32 beamTimer;
void Reset()
{
events.Reset();
summons.DespawnAll();
if (InstanceScript* pInstance = me->GetInstanceScript())
if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0)
me->DespawnOrUnsummon(500);
void Reset()
{
events.Reset();
summons.DespawnAll();
if (InstanceScript* pInstance = me->GetInstanceScript())
if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0)
me->DespawnOrUnsummon(500);
me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f);
me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f);
beamTimer = 1;
}
me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f);
me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f);
beamTimer = 1;
}
void JustSummoned(Creature* cr) { summons.Summon(cr); }
void JustSummoned(Creature* cr) { summons.Summon(cr); }
void EnterCombat(Unit* /*who*/)
{
me->InterruptNonMeleeSpells(false);
events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000);
events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000);
Talk(SAY_AGGRO);
me->InterruptNonMeleeSpells(false);
events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000);
events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000);
Talk(SAY_AGGRO);
}
void JustDied(Unit* /*killer*/)
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
{
if (cr->GetEntry() == NPC_TIME_RIFT)
cr->DespawnOrUnsummon(1000);
else
{
cr->DespawnOrUnsummon(5000);
cr->RemoveAllAuras();
cr->MonsterSay("You have my thanks for saving my existence in this timeline. Now i must report back to my superiors. They must know immediately of what i just experienced.", LANG_UNIVERSAL, 0);
}
}
Talk(SAY_DEATH);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
{
if (cr->GetEntry() == NPC_TIME_RIFT)
cr->DespawnOrUnsummon(1000);
else
{
cr->DespawnOrUnsummon(5000);
cr->RemoveAllAuras();
cr->MonsterSay("You have my thanks for saving my existence in this timeline. Now i must report back to my superiors. They must know immediately of what i just experienced.", LANG_UNIVERSAL, 0);
}
}
if (InstanceScript* pInstance = me->GetInstanceScript())
pInstance->SetData(DATA_SHOW_INFINITE_TIMER, 0);
if (InstanceScript* pInstance = me->GetInstanceScript())
pInstance->SetData(DATA_SHOW_INFINITE_TIMER, 0);
}
void DoAction(int32 param)
{
if (!me->IsAlive())
return;
void DoAction(int32 param)
{
if (!me->IsAlive())
return;
if (param == ACTION_RUN_OUT_OF_TIME)
{
Talk(SAY_FAIL);
summons.DespawnAll();
me->DespawnOrUnsummon(500);
}
}
if (param == ACTION_RUN_OUT_OF_TIME)
{
Talk(SAY_FAIL);
summons.DespawnAll();
me->DespawnOrUnsummon(500);
}
}
void UpdateAI(uint32 diff)
{
if (beamTimer)
{
beamTimer += diff;
if (beamTimer >= 2000)
{
me->CastSpell(me, SPELL_CORRUPTION_OF_TIME_CHANNEL, true);
beamTimer = 0;
}
}
if (beamTimer)
{
beamTimer += diff;
if (beamTimer >= 2000)
{
me->CastSpell(me, SPELL_CORRUPTION_OF_TIME_CHANNEL, true);
beamTimer = 0;
}
}
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_VOID_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false);
events.RepeatEvent(8000);
break;
case EVENT_SPELL_CORRUPTING_BLIGHT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false);
events.RepeatEvent(12000);
break;
}
switch (events.GetEvent())
{
case EVENT_SPELL_VOID_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false);
events.RepeatEvent(8000);
break;
case EVENT_SPELL_CORRUPTING_BLIGHT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false);
events.RepeatEvent(12000);
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -9,21 +9,21 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_CARRION_SWARM_N = 52720,
SPELL_CARRION_SWARM_H = 58852,
SPELL_MIND_BLAST_N = 52722,
SPELL_MIND_BLAST_H = 58850,
SPELL_SLEEP_N = 52721,
SPELL_SLEEP_H = 58849,
SPELL_VAMPIRIC_TOUCH = 52723,
SPELL_CARRION_SWARM_N = 52720,
SPELL_CARRION_SWARM_H = 58852,
SPELL_MIND_BLAST_N = 52722,
SPELL_MIND_BLAST_H = 58850,
SPELL_SLEEP_N = 52721,
SPELL_SLEEP_H = 58849,
SPELL_VAMPIRIC_TOUCH = 52723,
};
enum Events
{
EVENT_SPELL_CARRION_SWARM = 1,
EVENT_SPELL_MIND_BLAST = 2,
EVENT_SPELL_SLEEP = 3,
EVENT_SPELL_VAMPIRIC_TOUCH = 4,
EVENT_SPELL_CARRION_SWARM = 1,
EVENT_SPELL_MIND_BLAST = 2,
EVENT_SPELL_SLEEP = 3,
EVENT_SPELL_VAMPIRIC_TOUCH = 4,
};
enum Yells
@@ -53,31 +53,31 @@ public:
{
boss_mal_ganisAI(Creature* c) : ScriptedAI(c)
{
finished = false;
finished = false;
}
EventMap events;
bool finished;
bool finished;
void Reset()
{
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
events.Reset();
if (finished)
{
Talk(SAY_OUTRO);
me->DespawnOrUnsummon(20000);
}
}
void Reset()
{
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
events.Reset();
if (finished)
{
Talk(SAY_OUTRO);
me->DespawnOrUnsummon(20000);
}
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000);
events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000);
events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000);
events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000);
events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000);
events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000);
events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000);
events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000);
}
void JustDied(Unit* /*killer*/)
@@ -92,67 +92,67 @@ public:
Talk(SAY_SLAY);
}
void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (!finished && damage >= me->GetHealth())
{
damage = 0;
finished = true;
me->SetRegeneratingHealth(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
if (InstanceScript* pInstance = me->GetInstanceScript())
{
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ARTHAS)))
cr->AI()->DoAction(ACTION_KILLED_MALGANIS);
// give credit to players
me->CastSpell(me, 58630, true);
}
// quest completion
if (who)
if (Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself())
player->RewardPlayerAndGroupAtEvent(31006, player); // Royal Escort quest, Mal'ganis bunny
EnterEvadeMode();
}
}
void UpdateAI(uint32 diff)
void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (!UpdateVictim())
return;
if (!finished && damage >= me->GetHealth())
{
damage = 0;
finished = true;
me->SetRegeneratingHealth(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
if (InstanceScript* pInstance = me->GetInstanceScript())
{
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ARTHAS)))
cr->AI()->DoAction(ACTION_KILLED_MALGANIS);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
// give credit to players
me->CastSpell(me, 58630, true);
}
switch (events.GetEvent())
{
case EVENT_SPELL_CARRION_SWARM:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false);
events.RepeatEvent(7000);
break;
case EVENT_SPELL_MIND_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_SLEEP:
Talk(SAY_SLEEP);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false);
events.RepeatEvent(17000);
break;
case EVENT_SPELL_VAMPIRIC_TOUCH:
me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true);
events.RepeatEvent(30000);
break;
}
// quest completion
if (who)
if (Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself())
player->RewardPlayerAndGroupAtEvent(31006, player); // Royal Escort quest, Mal'ganis bunny
DoMeleeAttackIfReady();
EnterEvadeMode();
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_CARRION_SWARM:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false);
events.RepeatEvent(7000);
break;
case EVENT_SPELL_MIND_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_SLEEP:
Talk(SAY_SLEEP);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false);
events.RepeatEvent(17000);
break;
case EVENT_SPELL_VAMPIRIC_TOUCH:
me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true);
events.RepeatEvent(30000);
break;
}
DoMeleeAttackIfReady();
}
};

View File

@@ -8,18 +8,18 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_CONSTRICTING_CHAINS_N = 52696,
SPELL_CONSTRICTING_CHAINS_H = 58823,
SPELL_DISEASE_EXPULSION_N = 52666,
SPELL_DISEASE_EXPULSION_H = 58824,
SPELL_FRENZY = 58841,
SPELL_CONSTRICTING_CHAINS_N = 52696,
SPELL_CONSTRICTING_CHAINS_H = 58823,
SPELL_DISEASE_EXPULSION_N = 52666,
SPELL_DISEASE_EXPULSION_H = 58824,
SPELL_FRENZY = 58841,
};
enum Events
{
EVENT_SPELL_CONSTRICTING_CHAINS = 1,
EVENT_SPELL_DISEASE_EXPULSION = 2,
EVENT_SPELL_FRENZY = 3,
EVENT_SPELL_CONSTRICTING_CHAINS = 1,
EVENT_SPELL_DISEASE_EXPULSION = 2,
EVENT_SPELL_FRENZY = 3,
};
enum Yells
@@ -47,15 +47,15 @@ public:
Talk(SAY_SPAWN);
}
EventMap events;
void Reset() { events.Reset(); }
EventMap events;
void Reset() { events.Reset(); }
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000);
events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000);
events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000);
events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000);
events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000);
events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000);
}
void JustDied(Unit* /*killer*/)
@@ -71,35 +71,35 @@ public:
Talk(SAY_SLAY);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_DISEASE_EXPULSION:
me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_FRENZY:
me->CastSpell(me, SPELL_FRENZY, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_CONSTRICTING_CHAINS:
if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true))
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false);
events.RepeatEvent(14000);
break;
}
switch (events.GetEvent())
{
case EVENT_SPELL_DISEASE_EXPULSION:
me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_FRENZY:
me->CastSpell(me, SPELL_FRENZY, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_CONSTRICTING_CHAINS:
if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true))
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false);
events.RepeatEvent(14000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
};
};

Some files were not shown because too many files have changed in this diff Show More