mirror of
https://github.com/mangosfour/server.git
synced 2025-12-31 13:37:07 +00:00
Cata areas added to SD3
Maelstrom Hyjal Vashjir Twighlight Highlands Uldum
This commit is contained in:
parent
fa0711b3be
commit
ef99e52743
58 changed files with 1525 additions and 598 deletions
|
|
@ -184,7 +184,7 @@ void BattleGround::BroadcastWorker(Do& _do)
|
|||
_do(plr);
|
||||
}
|
||||
|
||||
BattleGround::BattleGround(): m_BuffChange(false), m_ArenaBuffSpawned(false), m_StartDelayTime(0), m_startMaxDist(0)
|
||||
BattleGround::BattleGround()
|
||||
{
|
||||
m_TypeID = BattleGroundTypeId(0);
|
||||
m_Status = STATUS_NONE;
|
||||
|
|
@ -197,7 +197,6 @@ BattleGround::BattleGround(): m_BuffChange(false), m_ArenaBuffSpawned(false), m_
|
|||
m_IsArena = false;
|
||||
m_Winner = TEAM_NONE;
|
||||
m_StartTime = 0;
|
||||
m_validStartPositionTimer = 0;
|
||||
m_CountdownTimer = 0;
|
||||
m_Events = 0;
|
||||
m_IsRated = false;
|
||||
|
|
@ -370,31 +369,26 @@ void BattleGround::Update(uint32 diff)
|
|||
|
||||
if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize())
|
||||
{
|
||||
float maxDist = GetStartMaxDist();
|
||||
if (maxDist > 0.0f)
|
||||
{
|
||||
if (m_validStartPositionTimer < diff)
|
||||
{
|
||||
for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||
{
|
||||
if (Player* player = sObjectMgr.GetPlayer(itr->first))
|
||||
{
|
||||
float x, y, z, o;
|
||||
GetTeamStartLoc(player->GetTeam(), x, y, z, o);
|
||||
if (!player->IsWithinDist3d(x, y, z, maxDist))
|
||||
{
|
||||
player->TeleportTo(GetMapId(), x, y, z, o);
|
||||
}
|
||||
}
|
||||
}
|
||||
m_validStartPositionTimer = CHECK_PLAYER_POSITION_INVERVAL;
|
||||
}
|
||||
else
|
||||
m_validStartPositionTimer -= diff;
|
||||
}
|
||||
|
||||
ModifyStartDelayTime(diff);
|
||||
|
||||
if (m_CountdownTimer >= 10000)
|
||||
{
|
||||
uint32 countdownMaxForBGType = isArena() ? ARENA_COUNTDOWN_MAX : BATTLEGROUND_COUNTDOWN_MAX;
|
||||
|
||||
WorldPacket data(SMSG_START_TIMER, 4+4+4);
|
||||
data << uint32(0);
|
||||
data << uint32(countdownMaxForBGType - (m_StartTime / 1000));
|
||||
data << uint32(countdownMaxForBGType);
|
||||
|
||||
for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||
if (Player* player = sObjectMgr.GetPlayer(itr->first))
|
||||
player->GetSession()->SendPacket(&data);
|
||||
|
||||
m_CountdownTimer = 0;
|
||||
}
|
||||
else
|
||||
m_CountdownTimer += diff;
|
||||
|
||||
if (!(m_Events & BG_STARTING_EVENT_1))
|
||||
{
|
||||
m_Events |= BG_STARTING_EVENT_1;
|
||||
|
|
|
|||
|
|
@ -110,7 +110,6 @@ enum BattleGroundSpells
|
|||
|
||||
enum BattleGroundTimeIntervals
|
||||
{
|
||||
CHECK_PLAYER_POSITION_INVERVAL = 1000, // ms
|
||||
RESURRECTION_INTERVAL = 30000, // ms
|
||||
INVITATION_REMIND_TIME = 20000, // ms
|
||||
INVITE_ACCEPT_WAIT_TIME = 60000, // ms
|
||||
|
|
@ -423,9 +422,6 @@ class BattleGround
|
|||
return m_Map;
|
||||
}
|
||||
|
||||
void SetStartMaxDist(float startMaxDist) { m_startMaxDist = startMaxDist; }
|
||||
float GetStartMaxDist() const { return m_startMaxDist; }
|
||||
|
||||
void SetTeamStartLoc(Team team, float X, float Y, float Z, float O);
|
||||
void GetTeamStartLoc(Team team, float& X, float& Y, float& Z, float& O) const
|
||||
{
|
||||
|
|
@ -616,7 +612,6 @@ class BattleGround
|
|||
uint32 m_StartTime;
|
||||
uint32 m_CountdownTimer;
|
||||
bool m_ArenaBuffSpawned; // to cache if arenabuff event is started (cause bool is faster than checking IsActiveEvent)
|
||||
uint32 m_validStartPositionTimer;
|
||||
int32 m_EndTime; // it is set to 120000 when bg is ending and it decreases itself
|
||||
BattleGroundBracketId m_BracketId;
|
||||
ArenaType m_ArenaType; // 2=2v2, 3=3v3, 5=5v5
|
||||
|
|
@ -665,7 +660,6 @@ class BattleGround
|
|||
float m_TeamStartLocY[PVP_TEAM_COUNT];
|
||||
float m_TeamStartLocZ[PVP_TEAM_COUNT];
|
||||
float m_TeamStartLocO[PVP_TEAM_COUNT];
|
||||
float m_startMaxDist;
|
||||
};
|
||||
|
||||
// helper functions for world state list fill
|
||||
|
|
|
|||
|
|
@ -1821,7 +1821,7 @@ BattleGround* BattleGroundMgr::CreateNewBattleGround(BattleGroundTypeId bgTypeId
|
|||
}
|
||||
|
||||
// used to create the BG templates
|
||||
uint32 BattleGroundMgr::CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char const* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO, float StartMaxDist)
|
||||
uint32 BattleGroundMgr::CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char const* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO)
|
||||
{
|
||||
// Create the BG
|
||||
BattleGround* bg = NULL;
|
||||
|
|
@ -1853,7 +1853,6 @@ uint32 BattleGroundMgr::CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsA
|
|||
bg->SetName(BattleGroundName);
|
||||
bg->SetTeamStartLoc(ALLIANCE, Team1StartLocX, Team1StartLocY, Team1StartLocZ, Team1StartLocO);
|
||||
bg->SetTeamStartLoc(HORDE, Team2StartLocX, Team2StartLocY, Team2StartLocZ, Team2StartLocO);
|
||||
bg->SetStartMaxDist(StartMaxDist);
|
||||
bg->SetLevelRange(LevelMin, LevelMax);
|
||||
|
||||
// add bg to update list
|
||||
|
|
@ -1867,8 +1866,8 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
|
|||
{
|
||||
uint32 count = 0;
|
||||
|
||||
// 0 1 2 3 4 5 6 7
|
||||
QueryResult* result = WorldDatabase.Query("SELECT id, MinPlayersPerTeam,MaxPlayersPerTeam,AllianceStartLoc,AllianceStartO,HordeStartLoc,HordeStartO,StartMaxDist FROM battleground_template");
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult* result = WorldDatabase.Query("SELECT id, MinPlayersPerTeam,MaxPlayersPerTeam,AllianceStartLoc,AllianceStartO,HordeStartLoc,HordeStartO FROM battleground_template");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
|
|
@ -1965,10 +1964,8 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
|
|||
continue;
|
||||
}
|
||||
|
||||
float startMaxDist = fields[7].GetFloat();
|
||||
|
||||
// sLog.outDetail("Creating battleground %s, %u-%u", bl->name[sWorld.GetDBClang()], MinLvl, MaxLvl);
|
||||
if (!CreateBattleGround(bgTypeID, IsArena, MinPlayersPerTeam, MaxPlayersPerTeam, bl->minLevel, bl->maxLevel, bl->name[sWorld.GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3], startMaxDist))
|
||||
if (!CreateBattleGround(bgTypeID, IsArena, MinPlayersPerTeam, MaxPlayersPerTeam, bl->minLevel, bl->maxLevel, bl->name[sWorld.GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]))
|
||||
continue;
|
||||
|
||||
++count;
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ class BattleGroundMgr
|
|||
BattleGround* GetBattleGroundTemplate(BattleGroundTypeId bgTypeId);
|
||||
BattleGround* CreateNewBattleGround(BattleGroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, ArenaType arenaType, bool isRated);
|
||||
|
||||
uint32 CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char const* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO, float StartMaxDist);
|
||||
uint32 CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char const* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO);
|
||||
|
||||
void AddBattleGround(uint32 InstanceID, BattleGroundTypeId bgTypeId, BattleGround* BG) { m_BattleGrounds[bgTypeId][InstanceID] = BG; };
|
||||
void RemoveBattleGround(uint32 instanceID, BattleGroundTypeId bgTypeId) { m_BattleGrounds[bgTypeId].erase(instanceID); }
|
||||
|
|
|
|||
|
|
@ -2401,7 +2401,22 @@ class Unit : public WorldObject
|
|||
bool isPassiveToHostile() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); }
|
||||
|
||||
virtual bool IsInWater() const;
|
||||
/**
|
||||
* Is this \ref Unit under water?
|
||||
* @return true if the \ref Unit is under water, false otherwise
|
||||
* \see Object::GetTerrain
|
||||
* \see TerrainInfo::IsUnderWater
|
||||
*/
|
||||
virtual bool IsUnderWater() const;
|
||||
/**
|
||||
* Can the given \ref Creature access this \ref Unit in some way? If this \ref Unit is in
|
||||
* water we check if the \ref Creature can swim, if so it's accessible, otherwise it's not.
|
||||
* If we're not in water the \ref Creature should be able to walk or fly and then we're
|
||||
* accessible.
|
||||
* @param c The \ref Creature to check accessibility for
|
||||
* @return true if this \ref Unit is accessible to the \ref Creature given, false otherwise
|
||||
* \todo Rename to IsInAccessablePlaceFor to follow standards?
|
||||
*/
|
||||
bool IsInAccessablePlaceFor(Creature const* c) const;
|
||||
|
||||
void SendHealSpellLog(Unit* pVictim, uint32 SpellID, uint32 Damage, uint32 OverHeal, bool critical = false, uint32 absorb = 0);
|
||||
|
|
|
|||
|
|
@ -531,6 +531,19 @@ file(GLOB sources_raid_nr_eoe scripts/northrend/nexus/eye_of_eternity/*.cpp scri
|
|||
file(GLOB sources_raid_nr_uld scripts/northrend/ulduar/ulduar/*.cpp scripts/northrend/ulduar/ulduar/*.h)
|
||||
LIST(APPEND mangosscript_LIB_SRCS ${sources_raid_nr_uld})
|
||||
source_group("Northrend Scripts\\Raids\\Ulduar" FILES ${sources_raid_nr_uld})
|
||||
|
||||
# --- THREE ONLY ---
|
||||
if ("${MANGOS_EXP}" STREQUAL "CATA")
|
||||
#Maelstrom Scripts
|
||||
file(GLOB sources_maelstrom scripts/maelstrom/*.cpp scripts/maelstrom/*.h)
|
||||
LIST(APPEND mangosscript_LIB_SRCS ${sources_maelstrom})
|
||||
source_group("Maelstrom Scripts" FILES ${sources_maelstrom})
|
||||
#Instance: Stonecore
|
||||
file(GLOB sources_instance_m_sc scripts/maelstrom/stonecore/*.cpp scripts/maelstrom/stonecore/*.h)
|
||||
LIST(APPEND mangosscript_LIB_SRCS ${sources_instance_m_sc})
|
||||
source_group("Eastern Kingdoms Scripts\\Instances\\Stonecore" FILES ${sources_instance_m_sc})
|
||||
endif()
|
||||
# --- END IF ---
|
||||
|
||||
#WorldScript: Scarlet Enclave
|
||||
file(GLOB sources_world_scarlet_enclave scripts/eastern_kingdoms/scarlet_enclave/*.cpp scripts/eastern_kingdoms/scarlet_enclave/*.h)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
# ScriptDev3
|
||||
|
||||
New EventAI engine for all MaNGOS cores. Developed from the old ScriptDev2.
|
||||
New Script engine for all MaNGOS cores. Developed from the old ScriptDev2.
|
||||
|
||||
The same code library is used unchanged as a submodule between each of the cores.
|
||||
- Special directives lock down specific core code to the required version .
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* pWho)
|
|||
return false;
|
||||
}
|
||||
|
||||
// unit state prevents (similar check is done in CanInitiateAttack which also include checking UnitFlags. We skip those here)
|
||||
// unit state prevents (similar check is done in CanInitiateAttack which also include checking unit_flags. We skip those here)
|
||||
if (m_creature->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED))
|
||||
{
|
||||
return false;
|
||||
|
|
@ -629,7 +629,7 @@ void npc_escortAI::Start(bool bRun, const Player* pPlayer, const Quest* pQuest,
|
|||
debug_log("SD3: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle.");
|
||||
}
|
||||
|
||||
// disable NpcFlagss
|
||||
// disable npcflags
|
||||
m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
|
||||
|
||||
debug_log("SD3: EscortAI started with " SIZEFMTD " waypoints. Run = %d, PlayerGuid = %s", WaypointList.size(), m_bIsRunning, m_playerGuid.GetString().c_str());
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ bool FollowerAI::AssistPlayerInCombat(Unit* pWho)
|
|||
return false;
|
||||
}
|
||||
|
||||
// unit state prevents (similar check is done in CanInitiateAttack which also include checking UnitFlags. We skip those here)
|
||||
// unit state prevents (similar check is done in CanInitiateAttack which also include checking unit_flags. We skip those here)
|
||||
if (m_creature->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED))
|
||||
{
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -58,8 +58,9 @@ bool ScriptedAI::IsVisible(Unit* pWho) const
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return m_creature->IsWithinDist(pWho, VISIBLE_RANGE) && pWho->IsVisibleForOrDetect(m_creature, m_creature, true);
|
||||
|
||||
// return m_creature->IsWithinDist(pWho, VISIBLE_RANGE) && pWho->IsVisibleForOrDetect(m_creature, m_creature, true); 166.0f
|
||||
return m_creature->IsWithinDist(pWho, 166.0f) && pWho->IsVisibleForOrDetect(m_creature, m_creature, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -123,12 +123,10 @@ struct npc_spirit_guide : public CreatureScript
|
|||
#endif
|
||||
};
|
||||
|
||||
#if defined (TBC) || defined (WOTLK) || defined (CATA)
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new npc_spirit_guideAI(pCreature);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
void AddSC_battleground()
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
* ScriptData
|
||||
* SDName: Blackrock_Depths
|
||||
* SD%Complete: 80
|
||||
* SDComment: Quest support: 4001, 4322, 4342, 7604, 9015.
|
||||
* SDComment: Quest support: 4322, 7604, 9015.
|
||||
* SDCategory: Blackrock Depths
|
||||
* EndScriptData
|
||||
*/
|
||||
|
|
@ -39,7 +39,6 @@
|
|||
* go_relic_coffer_door
|
||||
* at_ring_of_law
|
||||
* npc_grimstone
|
||||
* npc_kharan_mighthammer
|
||||
* npc_marshal_windsor
|
||||
* npc_dughal_stormwing
|
||||
* npc_tobias_seecher
|
||||
|
|
@ -516,114 +515,6 @@ struct spell_banner_of_provocation : public SpellScript
|
|||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_kharan_mighthammer
|
||||
######*/
|
||||
enum
|
||||
{
|
||||
QUEST_WHAT_IS_GOING_ON = 4001,
|
||||
QUEST_KHARANS_TALE = 4342
|
||||
};
|
||||
|
||||
#define GOSSIP_ITEM_KHARAN_1 "I need to know where the princess are, Kharan!"
|
||||
#define GOSSIP_ITEM_KHARAN_2 "All is not lost, Kharan!"
|
||||
|
||||
#define GOSSIP_ITEM_KHARAN_3 "Gor'shak is my friend, you can trust me."
|
||||
#define GOSSIP_ITEM_KHARAN_4 "Not enough, you need to tell me more."
|
||||
#define GOSSIP_ITEM_KHARAN_5 "So what happened?"
|
||||
#define GOSSIP_ITEM_KHARAN_6 "Continue..."
|
||||
#define GOSSIP_ITEM_KHARAN_7 "So you suspect that someone on the inside was involved? That they were tipped off?"
|
||||
#define GOSSIP_ITEM_KHARAN_8 "Continue with your story please."
|
||||
#define GOSSIP_ITEM_KHARAN_9 "Indeed."
|
||||
#define GOSSIP_ITEM_KHARAN_10 "The door is open, Kharan. You are a free man."
|
||||
|
||||
struct npc_kharan_mighthammer : public CreatureScript
|
||||
{
|
||||
npc_kharan_mighthammer() : CreatureScript("npc_kharan_mighthammer") {}
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
|
||||
{
|
||||
if (pCreature->IsQuestGiver())
|
||||
{
|
||||
pPlayer->PrepareQuestMenu(pCreature->GetObjectGuid());
|
||||
}
|
||||
|
||||
if (pPlayer->GetQuestStatus(QUEST_WHAT_IS_GOING_ON) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
|
||||
if (pPlayer->GetQuestStatus(QUEST_KHARANS_TALE) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
}
|
||||
|
||||
if (pPlayer->GetTeam() == HORDE)
|
||||
{
|
||||
pPlayer->SEND_GOSSIP_MENU(2473, pCreature->GetObjectGuid());
|
||||
}
|
||||
else
|
||||
{
|
||||
pPlayer->SEND_GOSSIP_MENU(2474, pCreature->GetObjectGuid());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
|
||||
{
|
||||
pPlayer->PlayerTalkClass->ClearMenus();
|
||||
switch (uiAction)
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
pPlayer->SEND_GOSSIP_MENU(2475, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
pPlayer->SEND_GOSSIP_MENU(2476, pCreature->GetObjectGuid());
|
||||
break;
|
||||
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
pPlayer->SEND_GOSSIP_MENU(2477, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
|
||||
pPlayer->SEND_GOSSIP_MENU(2478, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
|
||||
pPlayer->SEND_GOSSIP_MENU(2479, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 6:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
|
||||
pPlayer->SEND_GOSSIP_MENU(2480, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 7:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
|
||||
pPlayer->SEND_GOSSIP_MENU(2481, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 8:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
|
||||
pPlayer->SEND_GOSSIP_MENU(2482, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 9:
|
||||
pPlayer->CLOSE_GOSSIP_MENU();
|
||||
if (pPlayer->GetTeam() == HORDE)
|
||||
{
|
||||
pPlayer->AreaExploredOrEventHappens(QUEST_WHAT_IS_GOING_ON);
|
||||
}
|
||||
else
|
||||
{
|
||||
pPlayer->AreaExploredOrEventHappens(QUEST_KHARANS_TALE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_rocknot
|
||||
######*/
|
||||
|
|
@ -1254,10 +1145,6 @@ void AddSC_blackrock_depths()
|
|||
|
||||
s = new npc_grimstone();
|
||||
s->RegisterSelf();
|
||||
s = new npc_kharan_mighthammer();
|
||||
s->RegisterSelf();
|
||||
s = new npc_kharan_mighthammer();
|
||||
s->RegisterSelf();
|
||||
s = new npc_rocknot();
|
||||
s->RegisterSelf();
|
||||
s = new npc_marshal_windsor();
|
||||
|
|
@ -1294,12 +1181,6 @@ void AddSC_blackrock_depths()
|
|||
//pNewScript->pEffectDummyNPC = &EffectDummyCreature_spell_banner_of_provocation;
|
||||
//pNewScript->RegisterSelf();
|
||||
|
||||
//pNewScript = new Script;
|
||||
//pNewScript->Name = "npc_kharan_mighthammer";
|
||||
//pNewScript->pGossipHello = &GossipHello_npc_kharan_mighthammer;
|
||||
//pNewScript->pGossipSelect = &GossipSelect_npc_kharan_mighthammer;
|
||||
//pNewScript->RegisterSelf();
|
||||
|
||||
//pNewScript = new Script;
|
||||
//pNewScript->Name = "npc_rocknot";
|
||||
//pNewScript->GetAI = &GetAI_npc_rocknot;
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ enum
|
|||
GO_DRAKKISATH_DOOR_2 = 175947,
|
||||
|
||||
|
||||
#if defined (TBC) || defined (WOTLK) || defined (CATA)
|
||||
#if defined (CLASSIC)
|
||||
// upper spire entrance
|
||||
GO_DRAGONSPINE = 164725,
|
||||
GO_BRAZIER_1 = 175528,
|
||||
|
|
@ -98,7 +98,7 @@ enum
|
|||
GO_EMBERSEER_RUNE_6 = 175271,
|
||||
GO_EMBERSEER_RUNE_7 = 175272,
|
||||
|
||||
#if defined (TBC) || defined (WOTLK) || defined (CATA)
|
||||
#if defined (CLASSIC)
|
||||
ITEM_SEAL_OF_ASCENSION = 12344,
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -109,8 +109,9 @@ struct is_blackrock_spire : public InstanceScript
|
|||
m_uiFlamewreathWaveCount(0),
|
||||
m_uiStadiumEventTimer(0),
|
||||
m_uiStadiumWaves(0),
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
m_uiStadiumMobsAlive(0),
|
||||
|
||||
m_uiDragonspineDoorTimer(0),
|
||||
m_uiDragonspineGoCount(0),
|
||||
m_bUpperDoorOpened(false)
|
||||
|
|
@ -161,7 +162,7 @@ struct is_blackrock_spire : public InstanceScript
|
|||
}
|
||||
break;
|
||||
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
case GO_BRAZIER_1:
|
||||
case GO_BRAZIER_2:
|
||||
case GO_BRAZIER_3:
|
||||
|
|
@ -494,7 +495,7 @@ struct is_blackrock_spire : public InstanceScript
|
|||
}
|
||||
break;
|
||||
}
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
case MAX_ENCOUNTER:
|
||||
if (Player* pPlayer = instance->GetPlayer(ObjectGuid(guid)))
|
||||
DoOpenUpperDoorIfCan(pPlayer);
|
||||
|
|
@ -532,7 +533,7 @@ struct is_blackrock_spire : public InstanceScript
|
|||
#endif
|
||||
}
|
||||
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
void DoOpenUpperDoorIfCan(Player* pPlayer)
|
||||
{
|
||||
if (m_bUpperDoorOpened)
|
||||
|
|
@ -545,7 +546,7 @@ struct is_blackrock_spire : public InstanceScript
|
|||
m_bUpperDoorOpened = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void Update(uint32 uiDiff) override
|
||||
{
|
||||
|
|
@ -575,7 +576,7 @@ struct is_blackrock_spire : public InstanceScript
|
|||
}
|
||||
}
|
||||
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
// unlock dragon spine door
|
||||
if (m_uiDragonspineDoorTimer)
|
||||
{
|
||||
|
|
@ -891,7 +892,7 @@ struct is_blackrock_spire : public InstanceScript
|
|||
uint8 m_uiStadiumWaves;
|
||||
uint8 m_uiStadiumMobsAlive;
|
||||
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
bool m_bUpperDoorOpened;
|
||||
uint32 m_uiDragonspineGoCount;
|
||||
uint32 m_uiDragonspineDoorTimer;
|
||||
|
|
@ -926,7 +927,7 @@ struct at_blackrock_spire : public AreaTriggerScript
|
|||
if (InstanceData* pInstance = pPlayer->GetInstanceData())
|
||||
{
|
||||
pInstance->SetData(MAX_ENCOUNTER, DO_SORT_MOBS);
|
||||
#if defined (TBC) || defined(WOTLK)
|
||||
#if defined (CLASSIC)
|
||||
pInstance->SetData64(MAX_ENCOUNTER, pPlayer->GetObjectGuid().GetRawValue());
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,14 +43,11 @@ enum
|
|||
SPELL_MAGMASHACKLES = 19496,
|
||||
SPELL_ERUPTION_TRIGGER = 20482, // target script, dispel and permanent immune to banish anywhere on map
|
||||
SPELL_ENRAGE_TRIGGER = 19515, // target script, effect dummy anywhere on map
|
||||
SPELL_ENRAGE = 19516,
|
||||
|
||||
// Add spells
|
||||
SPELL_THRASH = 8876,
|
||||
SPELL_IMMOLATE = 15733,
|
||||
SPELL_ERUPTION = 19497,
|
||||
SPELL_MASSIVE_ERUPTION = 20483, // TODO possible on death
|
||||
SPELL_SEPARATION_ANXIETY_BOSSGARR = 23492, // Used if separated too far from Garr
|
||||
SPELL_IMMOLATE = 20294,
|
||||
};
|
||||
|
||||
struct boss_garr : public CreatureScript
|
||||
|
|
@ -187,10 +184,6 @@ struct mob_firesworn : public CreatureScript
|
|||
mob_fireswornAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
|
||||
Reset();
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_THRASH, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
DoCastSpellIfCan(m_creature, SPELL_IMMOLATE, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
|
@ -206,12 +199,6 @@ struct mob_firesworn : public CreatureScript
|
|||
m_bExploding = false;
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
DoCastSpellIfCan(m_creature, SPELL_THRASH, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
DoCastSpellIfCan(m_creature, SPELL_IMMOLATE, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*pDealer*/, uint32& uiDamage) override
|
||||
{
|
||||
if (!m_bExploding && m_creature->HealthBelowPctDamaged(10, uiDamage))
|
||||
|
|
|
|||
|
|
@ -43,11 +43,9 @@ enum
|
|||
SPELL_EARTHQUAKE = 19798,
|
||||
SPELL_ENRAGE = 19953,
|
||||
SPELL_GOLEMAGG_TRUST = 20553,
|
||||
SPELL_DOUBLE_ATTACK = 18943,
|
||||
|
||||
// Core Rager
|
||||
EMOTE_LOW_HP = -1409002,
|
||||
SPELL_THRASH = 12787,
|
||||
SPELL_MANGLE = 19820
|
||||
};
|
||||
|
||||
|
|
@ -62,7 +60,6 @@ struct boss_golemagg : public CreatureScript
|
|||
m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
DoCastSpellIfCan(m_creature, SPELL_MAGMA_SPLASH, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -188,9 +185,6 @@ struct mob_core_rager : public CreatureScript
|
|||
mob_core_ragerAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
|
||||
Reset();
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_THRASH, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
|
@ -214,11 +208,6 @@ struct mob_core_rager : public CreatureScript
|
|||
}
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
DoCastSpellIfCan(m_creature, SPELL_THRASH, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff) override
|
||||
{
|
||||
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
|
||||
|
|
|
|||
|
|
@ -212,72 +212,20 @@ struct is_molten_core : public InstanceScript
|
|||
}
|
||||
// no break here!
|
||||
case TYPE_LUCIFRON:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
break;
|
||||
case TYPE_MAGMADAR:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_KRESS); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_GEHENNAS:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_MOHN); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_GARR:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_BLAZ); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_SHAZZRAH:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_MAZJ); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_GEDDON:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_ZETH); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_GOLEMAGG:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_THERI); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_SULFURON:
|
||||
case TYPE_RAGNAROS:
|
||||
m_auiEncounter[uiType] = uiData;
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{ DoUseDoorOrButton(GO_RUNE_KORO); }
|
||||
#endif
|
||||
break;
|
||||
case TYPE_FLAME_DOSED:
|
||||
if (sRuneEncounters const *rstr = GetRuneStructForTrapEntry(uiData))
|
||||
{
|
||||
m_auiRuneState[rstr->getRuneType()] = DONE;
|
||||
save = true;
|
||||
if (GameObject *trap = GetSingleGameObjectFromStorage(rstr->m_uiTrapEntry))
|
||||
{
|
||||
trap->SetGoState(GO_STATE_ACTIVE);
|
||||
trap->SetLootState(GO_JUST_DEACTIVATED); //TODO fix GameObject::Use for traps
|
||||
}
|
||||
if (GameObject *rune = GetSingleGameObjectFromStorage(rstr->m_uiRuneEntry))
|
||||
rune->SetGoState(GO_STATE_READY);
|
||||
DoSpawnMajordomoIfCan(false);
|
||||
}
|
||||
case TYPE_FLAME_DOUSED:
|
||||
save = true;
|
||||
SetRuneDoused(GetRuneStructForTrapEntry(uiData));
|
||||
DoSpawnMajordomoIfCan(false);
|
||||
break;
|
||||
case TYPE_DO_FREE_GARR_ADDS:
|
||||
for (std::set<ObjectGuid>::const_iterator it = m_sFireswornGUID.begin(); it != m_sFireswornGUID.end(); ++it)
|
||||
|
|
@ -291,31 +239,24 @@ struct is_molten_core : public InstanceScript
|
|||
return;
|
||||
}
|
||||
|
||||
// Check if Majordomo can be summoned
|
||||
#if defined (CLASSIC) || defined (TBC)
|
||||
if (uiType < MAX_ENCOUNTER && uiData == DONE) // a boss just killed
|
||||
// if a rune boss is done, then: pre-WOTLK: allow to use the rune GO; WOTLK and later: set the rune as doused
|
||||
if (uiType > TYPE_LUCIFRON && uiType < TYPE_MAJORDOMO && uiData == DONE)
|
||||
{
|
||||
#if defined (CLASSIC) || defined (TBC)
|
||||
if (sRuneEncounters const *rstr = GetRuneStructForBoss(uiType))
|
||||
{
|
||||
m_auiRuneState[rstr->getRuneType()] = SPECIAL;
|
||||
if (GameObject *trap = GetSingleGameObjectFromStorage(rstr->m_uiTrapEntry))
|
||||
trap->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
{
|
||||
SetRuneDoused(GetRuneStructForBoss(uiType));
|
||||
DoSpawnMajordomoIfCan(false);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK)
|
||||
if (save)
|
||||
#endif
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (uiData == DONE)
|
||||
#endif
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
|
|
@ -416,12 +357,7 @@ struct is_molten_core : public InstanceScript
|
|||
// Check if all rune bosses are done
|
||||
for (uint8 i = TYPE_MAGMADAR; i < TYPE_MAJORDOMO; ++i)
|
||||
{
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK)
|
||||
if (m_auiEncounter[i] != SPECIAL)
|
||||
#endif
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
if (m_auiEncounter[i] != DONE)
|
||||
#endif
|
||||
if (m_auiEncounter[i] != DONE || m_auiRuneState[i - TYPE_MAGMADAR] != DONE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -477,6 +413,21 @@ struct is_molten_core : public InstanceScript
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void SetRuneDoused(sRuneEncounters const* rstr)
|
||||
{
|
||||
if (rstr)
|
||||
{
|
||||
m_auiRuneState[rstr->getRuneType()] = DONE;
|
||||
if (GameObject *trap = GetSingleGameObjectFromStorage(rstr->m_uiTrapEntry))
|
||||
{
|
||||
trap->SetGoState(GO_STATE_ACTIVE);
|
||||
trap->SetLootState(GO_JUST_DEACTIVATED); //TODO fix GameObject::Use for traps
|
||||
}
|
||||
if (GameObject *rune = GetSingleGameObjectFromStorage(rstr->m_uiRuneEntry))
|
||||
rune->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
|
||||
std::string m_strInstData;
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
uint32 m_auiRuneState[MAX_MOLTEN_RUNES];
|
||||
|
|
|
|||
|
|
@ -42,11 +42,8 @@
|
|||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK) || defined (CATA)
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK)
|
||||
#include "molten_core.h"
|
||||
#endif
|
||||
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK) || defined (CATA)
|
||||
|
||||
/*######
|
||||
## go_molten_core_rune
|
||||
|
|
@ -67,7 +64,7 @@ struct go_molten_core_rune : public GameObjectScript
|
|||
|
||||
if (pInstance->GetData(pGo->GetGOInfo()->button.linkedTrapId) == SPECIAL)
|
||||
{
|
||||
pInstance->SetData(TYPE_FLAME_DOSED, pGo->GetGOInfo()->button.linkedTrapId);
|
||||
pInstance->SetData(TYPE_FLAME_DOUSED, pGo->GetGOInfo()->button.linkedTrapId);
|
||||
return false; // this path allows the spell to have effect
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +74,7 @@ struct go_molten_core_rune : public GameObjectScript
|
|||
#endif
|
||||
void AddSC_molten_core()
|
||||
{
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK) || defined (CATA)
|
||||
#if defined (CLASSIC) || defined (TBC) || defined(WOTLK)
|
||||
Script* s;
|
||||
s = new go_molten_core_rune();
|
||||
s->RegisterSelf();
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ enum
|
|||
TYPE_SULFURON = 7, // do not change order: end
|
||||
TYPE_MAJORDOMO = 8,
|
||||
TYPE_RAGNAROS = 9,
|
||||
TYPE_FLAME_DOSED = MAX_ENCOUNTER,
|
||||
TYPE_FLAME_DOUSED = MAX_ENCOUNTER,
|
||||
TYPE_DO_FREE_GARR_ADDS = MAX_ENCOUNTER+1,
|
||||
|
||||
MAX_MOLTEN_RUNES = 7,
|
||||
|
|
|
|||
|
|
@ -28,14 +28,13 @@
|
|||
* ScriptData
|
||||
* SDName: Burning_Steppes
|
||||
* SD%Complete: 100
|
||||
* SDComment: Quest support: 4121, 4122, 4224, 4866.
|
||||
* SDComment: Quest support: 4121, 4122, 4866.
|
||||
* SDCategory: Burning Steppes
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* npc_ragged_john
|
||||
* npc_grark_lorkrub
|
||||
* EndContentData
|
||||
*/
|
||||
|
|
|
|||
49
src/modules/SD3/scripts/eastern_kingdoms/gilneas.cpp
Normal file
49
src/modules/SD3/scripts/eastern_kingdoms/gilneas.cpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Gilneas
|
||||
* SD%Complete: 0 Work in progress...
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Gilneas
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_gilneas()
|
||||
{
|
||||
}
|
||||
452
src/modules/SD3/scripts/eastern_kingdoms/gilneas_city.cpp
Normal file
452
src/modules/SD3/scripts/eastern_kingdoms/gilneas_city.cpp
Normal file
|
|
@ -0,0 +1,452 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Gilneas City
|
||||
* SD%Complete: 0 Work in progress...
|
||||
* SDComment:
|
||||
* SDCategory: Gilneas City
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* npc_prince_liam_greymane_phase1 - Fully Scripted
|
||||
* npc_prince_liam_greymane_phase2 - Fully Scripted
|
||||
* rampaging_worgen - Enrage Spell Scripted
|
||||
* frightened_citizen_quest
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
#include "escort_ai.h"
|
||||
#include <cmath>
|
||||
|
||||
/*######
|
||||
# npc_prince_liam_greymane_phase1
|
||||
######*/
|
||||
|
||||
enum {
|
||||
SAY_STORYLINE1 = -1654001,
|
||||
SAY_STORYLINE2 = -1654002,
|
||||
SAY_STORYLINE3 = -1654003
|
||||
};
|
||||
|
||||
struct npc_prince_liam_greymane_phase1 : public CreatureScript
|
||||
{
|
||||
npc_prince_liam_greymane_phase1() : CreatureScript("npc_prince_liam_greymane_phase1") {}
|
||||
|
||||
struct npc_prince_liam_greymane_phase1AI : public ScriptedAI
|
||||
{
|
||||
npc_prince_liam_greymane_phase1AI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_uiNpcFlags = pCreature->GetUInt32Value(UNIT_NPC_FLAGS);
|
||||
Reset();
|
||||
}
|
||||
|
||||
ObjectGuid m_casterGuid;
|
||||
uint32 m_uiNpcFlags;
|
||||
uint32 m_uiSayStoryDelay;
|
||||
uint32 m_uiSayStoryTimer;
|
||||
int m_uiSayStoryLast;
|
||||
|
||||
bool m_bCanSayStory;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_casterGuid.Clear();
|
||||
|
||||
m_uiSayStoryDelay = 15000;
|
||||
m_uiSayStoryTimer = m_uiSayStoryDelay;
|
||||
m_uiSayStoryLast = 0;
|
||||
|
||||
m_bCanSayStory = true;
|
||||
|
||||
m_creature->SetUInt32Value(UNIT_NPC_FLAGS, m_uiNpcFlags);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff) override
|
||||
{
|
||||
if (m_bCanSayStory)
|
||||
{
|
||||
m_uiSayStoryTimer = m_uiSayStoryDelay;
|
||||
|
||||
// Random switch between 3 texts
|
||||
switch (m_uiSayStoryLast)
|
||||
{
|
||||
case 0: DoScriptText(SAY_STORYLINE1, m_creature); m_uiSayStoryLast++; break;
|
||||
case 1: DoScriptText(SAY_STORYLINE2, m_creature); m_uiSayStoryLast++; break;
|
||||
case 2: DoScriptText(SAY_STORYLINE3, m_creature); m_uiSayStoryLast = 0; m_uiSayStoryTimer = 60000; break;
|
||||
//case 3: DoScriptText(SAY_HELP4, m_creature); break;
|
||||
}
|
||||
|
||||
m_bCanSayStory = false;
|
||||
}
|
||||
|
||||
if (m_uiSayStoryTimer < uiDiff)
|
||||
{
|
||||
m_bCanSayStory = true;
|
||||
m_uiSayStoryTimer = m_uiSayStoryDelay;
|
||||
}
|
||||
else m_uiSayStoryTimer -= uiDiff;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new npc_prince_liam_greymane_phase1AI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*######
|
||||
# npc_prince_liam_greymane_phase2
|
||||
######*/
|
||||
|
||||
enum {
|
||||
SAY_STORYLINE4 = -1654004,
|
||||
SAY_STORYLINE5 = -1654005,
|
||||
SAY_STORYLINE6 = -1654006,
|
||||
SAY_STORYLINE7 = -1654007,
|
||||
SAY_STORYLINE8 = -1654008,
|
||||
|
||||
SAY_STORY_DELAY = 30000,
|
||||
SPELL_SHOOT = 50092,
|
||||
SPELL_CNOCKING = 67869,
|
||||
|
||||
QUEST_EVAQUATE_THE_MERCHANT_SQUARE = 14098
|
||||
};
|
||||
|
||||
struct npc_prince_liam_greymane_phase2 : public CreatureScript
|
||||
{
|
||||
npc_prince_liam_greymane_phase2() : CreatureScript("npc_prince_liam_greymane_phase2") {}
|
||||
|
||||
struct npc_prince_liam_greymane_phase2AI : public ScriptedAI
|
||||
{
|
||||
npc_prince_liam_greymane_phase2AI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 m_uiNpcFlags;
|
||||
uint32 m_uiSayStoryTimer;
|
||||
|
||||
Unit* lastVictim;
|
||||
|
||||
int m_uiSayStoryLast;
|
||||
|
||||
bool m_bCanSayStory;
|
||||
bool IsSelfRooted;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_uiSayStoryTimer = SAY_STORY_DELAY;
|
||||
m_uiSayStoryLast = 0;
|
||||
lastVictim = NULL;
|
||||
|
||||
m_bCanSayStory = true;
|
||||
IsSelfRooted = false;
|
||||
|
||||
}
|
||||
|
||||
void Aggro(Unit* who) override
|
||||
{
|
||||
if (!m_creature->CanReachWithMeleeAttack(who) && !m_creature->CanUseEquippedWeapon(RANGED_ATTACK))
|
||||
{
|
||||
IsSelfRooted = true;
|
||||
}
|
||||
}
|
||||
|
||||
void AttackedBy(Unit* pAttacker) override
|
||||
{
|
||||
// Check if Liam is attacking who attack he and don't jump on multiple attackers
|
||||
if (m_creature->getVictim() && (m_creature->getVictim() == pAttacker || lastVictim == pAttacker))
|
||||
return;
|
||||
|
||||
if (m_creature->IsFriendlyTo(pAttacker))
|
||||
return;
|
||||
|
||||
lastVictim = pAttacker;
|
||||
AttackStart(pAttacker);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff) override
|
||||
{
|
||||
// Ready to say emote
|
||||
if (m_bCanSayStory)
|
||||
{
|
||||
m_uiSayStoryTimer = SAY_STORY_DELAY;
|
||||
|
||||
// Sequence switch between 3 texts
|
||||
switch (m_uiSayStoryLast)
|
||||
{
|
||||
case 0: DoScriptText(SAY_STORYLINE4, m_creature); m_uiSayStoryLast++; break;
|
||||
case 1: DoScriptText(SAY_STORYLINE5, m_creature); m_uiSayStoryLast++; break;
|
||||
case 2: DoScriptText(SAY_STORYLINE6, m_creature); m_uiSayStoryLast++; break;
|
||||
case 3: DoScriptText(SAY_STORYLINE7, m_creature); m_uiSayStoryLast++; break;
|
||||
case 4: DoScriptText(SAY_STORYLINE8, m_creature); m_uiSayStoryLast = 0; break;
|
||||
//case 3: DoScriptText(SAY_HELP4, m_creature); break;
|
||||
}
|
||||
|
||||
m_bCanSayStory = false;
|
||||
}
|
||||
|
||||
if (m_uiSayStoryTimer < uiDiff)
|
||||
{
|
||||
m_bCanSayStory = true;
|
||||
m_uiSayStoryTimer = SAY_STORY_DELAY;
|
||||
}
|
||||
else m_uiSayStoryTimer -= uiDiff;
|
||||
|
||||
|
||||
// Return since we have no target
|
||||
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
|
||||
// Equipped ranged weapon usable and not close to victim
|
||||
if (m_creature->GetCombatDistance(m_creature->getVictim(), false) > 0 && m_creature->CanUseEquippedWeapon(RANGED_ATTACK) )
|
||||
{
|
||||
// Make sure our attack is ready
|
||||
if (m_creature->isAttackReady(RANGED_ATTACK)){
|
||||
// Use spell instead of normal ranged attack that seem not working. TODO: check ranged attack!
|
||||
DoCastSpellIfCan(m_creature->getVictim(), SPELL_SHOOT);
|
||||
//m_creature->AttackerStateUpdate(m_creature->getVictim(),RANGED_ATTACK);
|
||||
m_creature->resetAttackTimer(RANGED_ATTACK);
|
||||
}
|
||||
|
||||
}
|
||||
else if (m_creature->CanReachWithMeleeAttack(m_creature->getVictim()))
|
||||
{
|
||||
// If we are within range melee the target
|
||||
// Make sure our attack is ready
|
||||
if (m_creature->isAttackReady())
|
||||
{
|
||||
printf("---> %s melee is ready %s! \n",m_creature->GetName(), m_creature->getVictim()->GetName());
|
||||
m_creature->AttackerStateUpdate(m_creature->getVictim());
|
||||
|
||||
m_creature->resetAttackTimer();
|
||||
}
|
||||
|
||||
}
|
||||
else if (IsSelfRooted)
|
||||
{
|
||||
// Cancel our current spell and then allow movement again
|
||||
m_creature->InterruptNonMeleeSpells(false);
|
||||
IsSelfRooted = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new npc_prince_liam_greymane_phase2AI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/*######
|
||||
# rampaging_worgen
|
||||
######*/
|
||||
|
||||
|
||||
enum {
|
||||
SPELL_ENRAGE = 8599,
|
||||
SPELL_ENRAGE_DELAY = 120000
|
||||
};
|
||||
|
||||
struct rampaging_worgen : public CreatureScript
|
||||
{
|
||||
rampaging_worgen() : CreatureScript("rampaging_worgen") {}
|
||||
|
||||
struct rampaging_worgenAI : public ScriptedAI
|
||||
{
|
||||
rampaging_worgenAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
uint32 spellCooldown; // This variable acts like the global cooldown that players have (2 minute)
|
||||
bool IsSelfRooted;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
spellCooldown = 0;
|
||||
IsSelfRooted = false;
|
||||
}
|
||||
|
||||
void Aggro(Unit* who) override
|
||||
{
|
||||
if (!m_creature->CanReachWithMeleeAttack(who))
|
||||
{
|
||||
IsSelfRooted = true;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff) override
|
||||
{
|
||||
// Always decrease our spell cooldown first
|
||||
if (spellCooldown > diff)
|
||||
spellCooldown -= diff;
|
||||
else spellCooldown = 0;
|
||||
|
||||
// Enrage timer (only enrage when we are alive and in combat)
|
||||
if (m_creature->IsInCombat() && m_creature->IsAlive())
|
||||
{
|
||||
// Cast enrage spell if less than 70% hp ONLY and not casted already
|
||||
if (m_creature->GetHealthPercent() < 70.0f && !spellCooldown) {
|
||||
DoCastSpellIfCan(m_creature, SPELL_ENRAGE);
|
||||
spellCooldown = SPELL_ENRAGE_DELAY;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Return since we have no target
|
||||
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
|
||||
// Return if we already cast a spell
|
||||
if (m_creature->IsNonMeleeSpellCasted(false))
|
||||
return;
|
||||
|
||||
// If we are within range melee the target
|
||||
if (m_creature->CanReachWithMeleeAttack(m_creature->getVictim()))
|
||||
{
|
||||
// Make sure our attack is ready
|
||||
if (m_creature->isAttackReady())
|
||||
{
|
||||
m_creature->AttackerStateUpdate(m_creature->getVictim());
|
||||
|
||||
m_creature->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
else if (IsSelfRooted)
|
||||
{
|
||||
// Cancel our current spell and then allow movement again
|
||||
m_creature->InterruptNonMeleeSpells(false);
|
||||
IsSelfRooted = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new rampaging_worgenAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/*######
|
||||
## creature_frightened_citizen_quest
|
||||
######*/
|
||||
enum {
|
||||
SAY_ON_ESCAPE1 = -1654009,
|
||||
SAY_ON_ESCAPE2 = -1654010,
|
||||
SAY_ON_ESCAPE3 = -1654011,
|
||||
SAY_ON_ESCAPE4 = -1654012,
|
||||
SAY_ON_ESCAPE5 = -1654013,
|
||||
SAY_ON_ESCAPE6 = -1654014,
|
||||
SAY_ON_ESCAPE7 = -1654015,
|
||||
SAY_ON_ESCAPE_DELAY = 12000
|
||||
};
|
||||
|
||||
|
||||
struct frightened_citizen_quest : public CreatureScript
|
||||
{
|
||||
frightened_citizen_quest() : CreatureScript("frightened_citizen_quest") {}
|
||||
|
||||
struct frightened_citizen_questAI : public ScriptedAI
|
||||
{
|
||||
frightened_citizen_questAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
uint32 m_uiSayOnEscapeTimer;
|
||||
bool m_bCanSayOnEscape;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_uiSayOnEscapeTimer = SAY_ON_ESCAPE_DELAY;
|
||||
m_bCanSayOnEscape = true;
|
||||
}
|
||||
|
||||
|
||||
void UpdateAI(const uint32 uiDiff) override
|
||||
{
|
||||
// Ready to say emote
|
||||
if (m_bCanSayOnEscape)
|
||||
{
|
||||
m_uiSayOnEscapeTimer = SAY_ON_ESCAPE_DELAY;
|
||||
|
||||
// switch between 7 texts randomly
|
||||
switch (urand(0, 6))
|
||||
{
|
||||
case 0: DoScriptText(SAY_ON_ESCAPE1, m_creature); break;
|
||||
case 1: DoScriptText(SAY_ON_ESCAPE2, m_creature); break;
|
||||
case 2: DoScriptText(SAY_ON_ESCAPE3, m_creature); break;
|
||||
case 3: DoScriptText(SAY_ON_ESCAPE4, m_creature); break;
|
||||
case 4: DoScriptText(SAY_ON_ESCAPE5, m_creature); break;
|
||||
case 5: DoScriptText(SAY_ON_ESCAPE6, m_creature); break;
|
||||
case 6: DoScriptText(SAY_ON_ESCAPE7, m_creature); break;
|
||||
}
|
||||
|
||||
m_bCanSayOnEscape = false;
|
||||
}
|
||||
|
||||
if (m_uiSayOnEscapeTimer < uiDiff)
|
||||
{
|
||||
m_bCanSayOnEscape = true;
|
||||
m_uiSayOnEscapeTimer = SAY_ON_ESCAPE_DELAY;
|
||||
}
|
||||
else m_uiSayOnEscapeTimer -= uiDiff;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new frightened_citizen_questAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_gilneas_city()
|
||||
{
|
||||
Script* s;
|
||||
s = new npc_prince_liam_greymane_phase1();
|
||||
s->RegisterSelf();
|
||||
s = new npc_prince_liam_greymane_phase2();
|
||||
s->RegisterSelf();
|
||||
s = new rampaging_worgen();
|
||||
s->RegisterSelf();
|
||||
s = new frightened_citizen_quest();
|
||||
s->RegisterSelf();
|
||||
}
|
||||
|
|
@ -60,7 +60,7 @@ struct npc_mountaineer_pebblebitty : public CreatureScript //TODO localisation
|
|||
|
||||
if (!pPlayer->GetQuestRewardStatus(3181) == 1)
|
||||
{
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Open the gate please, i need to get to Searing Gorge", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Open the gate please, I need to get to Searing Gorge", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
|
||||
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetObjectGuid());
|
||||
|
|
@ -74,7 +74,7 @@ struct npc_mountaineer_pebblebitty : public CreatureScript //TODO localisation
|
|||
switch (uiAction)
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "But i need to get there, now open the gate!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "But I need to get there, now open the gate!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
pPlayer->SEND_GOSSIP_MENU(1833, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
|
|
@ -82,7 +82,7 @@ struct npc_mountaineer_pebblebitty : public CreatureScript //TODO localisation
|
|||
pPlayer->SEND_GOSSIP_MENU(1834, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Doesn't matter, i'm invulnerable.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Doesn't matter, I'm invulnerable.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
pPlayer->SEND_GOSSIP_MENU(1835, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
|
|
@ -90,7 +90,7 @@ struct npc_mountaineer_pebblebitty : public CreatureScript //TODO localisation
|
|||
pPlayer->SEND_GOSSIP_MENU(1836, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5:
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Ok, i'll try to remember that.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Ok, I'll try to remember that.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
|
||||
pPlayer->SEND_GOSSIP_MENU(1837, pCreature->GetObjectGuid());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 6:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,139 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Scholomance
|
||||
* SD%Complete: 100
|
||||
* SDComment:
|
||||
* SDCategory: Scholomance
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
## npc_spectral_tutor
|
||||
######*/
|
||||
|
||||
enum
|
||||
{
|
||||
SPELL_IMAGE_PROJECTION = 17651,
|
||||
SPELL_IMAGE_PROJECTION_HEAL = 17652,
|
||||
SPELL_IMAGE_PROJECTION_SUMMON = 17653,
|
||||
SPELL_MANA_BURN = 17630,
|
||||
SPELL_SILENCE = 12528,
|
||||
};
|
||||
|
||||
|
||||
struct npc_spectral_tutor : public CreatureScript
|
||||
{
|
||||
npc_spectral_tutor() : CreatureScript("npc_spectral_tutor") {}
|
||||
|
||||
struct npc_spectral_tutorAI : public ScriptedAI
|
||||
{
|
||||
npc_spectral_tutorAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
uint32 m_uiManaBurnTimer;
|
||||
uint32 m_uiSilenceTimer;
|
||||
uint32 m_uiProjectionTimer;
|
||||
uint32 m_uiProjEndTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_uiProjEndTimer = 0;
|
||||
m_uiManaBurnTimer = urand(4000, 19000);
|
||||
m_uiSilenceTimer = urand(0, 3000);
|
||||
m_uiProjectionTimer = urand(12000, 13000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff) override
|
||||
{
|
||||
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
|
||||
if (m_uiProjEndTimer)
|
||||
{
|
||||
if (m_uiProjEndTimer <= uiDiff)
|
||||
{
|
||||
if (DoCastSpellIfCan(m_creature, SPELL_IMAGE_PROJECTION_HEAL) == CAST_OK)
|
||||
m_uiProjEndTimer = 0;
|
||||
}
|
||||
else
|
||||
m_uiProjEndTimer -= uiDiff;
|
||||
|
||||
// no other actions during Image Projection
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_uiManaBurnTimer < uiDiff)
|
||||
{
|
||||
if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_MANA_BURN) == CAST_OK)
|
||||
m_uiManaBurnTimer = urand(9000, 26000);
|
||||
}
|
||||
else
|
||||
m_uiManaBurnTimer -= uiDiff;
|
||||
|
||||
if (m_uiSilenceTimer < uiDiff)
|
||||
{
|
||||
if (DoCastSpellIfCan(m_creature, SPELL_SILENCE) == CAST_OK)
|
||||
m_uiSilenceTimer = urand(12000, 26000);
|
||||
}
|
||||
else
|
||||
m_uiSilenceTimer -= uiDiff;
|
||||
|
||||
if (m_uiProjectionTimer < uiDiff)
|
||||
{
|
||||
if (DoCastSpellIfCan(m_creature, SPELL_IMAGE_PROJECTION) == CAST_OK)
|
||||
{
|
||||
DoCastSpellIfCan(m_creature, SPELL_IMAGE_PROJECTION_SUMMON, CAST_TRIGGERED);
|
||||
m_uiProjEndTimer = 1000;
|
||||
m_uiProjectionTimer = urand(18000, 25000);
|
||||
}
|
||||
}
|
||||
else
|
||||
m_uiProjectionTimer -= uiDiff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new npc_spectral_tutorAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void AddSC_scholomance()
|
||||
{
|
||||
Script* s;
|
||||
|
||||
s = new npc_spectral_tutor();
|
||||
s->RegisterSelf();
|
||||
|
||||
}
|
||||
|
|
@ -348,7 +348,7 @@ struct npc_squire_rowe : public CreatureScript
|
|||
}
|
||||
|
||||
// Summoned npc has escort and this can trigger twice if escort state is not checked
|
||||
if (uiPointId && HasEscortState(STATE_ESCORT_PAUSED))
|
||||
if (HasEscortState(STATE_ESCORT_PAUSED))
|
||||
{
|
||||
StartNextDialogueText(NPC_WINDSOR);
|
||||
}
|
||||
|
|
@ -444,6 +444,8 @@ struct npc_squire_rowe : public CreatureScript
|
|||
|
||||
bool OnGossipHello(Player* pPlayer, Creature* pCreature) override
|
||||
{
|
||||
pPlayer->PlayerTalkClass->ClearMenus();
|
||||
|
||||
// Allow gossip if quest 6402 is completed but not yet rewarded or 6402 is rewarded but 6403 isn't yet completed
|
||||
if ((pPlayer->GetQuestStatus(QUEST_STORMWIND_RENDEZVOUS) == QUEST_STATUS_COMPLETE && !pPlayer->GetQuestRewardStatus(QUEST_STORMWIND_RENDEZVOUS)) ||
|
||||
(pPlayer->GetQuestRewardStatus(QUEST_STORMWIND_RENDEZVOUS) && pPlayer->GetQuestStatus(QUEST_THE_GREAT_MASQUERADE) != QUEST_STATUS_COMPLETE))
|
||||
|
|
@ -653,13 +655,11 @@ struct npc_reginald_windsor : public CreatureScript
|
|||
|
||||
struct npc_reginald_windsorAI : public npc_escortAI, private DialogueHelper
|
||||
{
|
||||
npc_reginald_windsorAI(Creature* m_creature) : npc_escortAI(m_creature),
|
||||
DialogueHelper(aMasqueradeDialogue)
|
||||
npc_reginald_windsorAI(Creature* m_creature) : npc_escortAI(m_creature), DialogueHelper(aMasqueradeDialogue)
|
||||
{
|
||||
m_pScriptedMap = (ScriptedMap*)m_creature->GetInstanceData();
|
||||
// Npc flag is controlled by script
|
||||
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
InitializeDialogueHelper(m_pScriptedMap);
|
||||
Reset();
|
||||
}
|
||||
|
||||
ScriptedMap* m_pScriptedMap;
|
||||
|
|
@ -678,6 +678,7 @@ struct npc_reginald_windsor : public CreatureScript
|
|||
|
||||
void Reset() override
|
||||
{
|
||||
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
m_uiGuardCheckTimer = 0;
|
||||
m_bIsKeepReady = false;
|
||||
m_bCanGuardSalute = false;
|
||||
|
|
@ -782,14 +783,17 @@ struct npc_reginald_windsor : public CreatureScript
|
|||
|
||||
void JustDidDialogueStep(int32 iEntry) override
|
||||
{
|
||||
if (!m_pScriptedMap)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!m_pScriptedMap) return;
|
||||
|
||||
switch (iEntry)
|
||||
{
|
||||
// Set orientation and prepare the npcs for the next event
|
||||
case SAY_WINDSOR_QUEST_ACCEPT:
|
||||
if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_playerGuid))
|
||||
{
|
||||
Start(false, pPlayer);
|
||||
}
|
||||
break;
|
||||
// Set orientation and prepare the npcs for the next event
|
||||
case SAY_WINDSOR_GET_READY:
|
||||
m_creature->SetFacingTo(0.6f);
|
||||
break;
|
||||
|
|
@ -882,6 +886,7 @@ struct npc_reginald_windsor : public CreatureScript
|
|||
break;
|
||||
case SAY_WINDSOR_BEFORE_KEEP:
|
||||
m_bIsKeepReady = true;
|
||||
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
break;
|
||||
case NPC_GUARD_CITY:
|
||||
|
|
@ -1136,6 +1141,8 @@ struct npc_reginald_windsor : public CreatureScript
|
|||
{
|
||||
bool bIsEventReady = false;
|
||||
|
||||
pPlayer->PlayerTalkClass->ClearMenus();
|
||||
|
||||
if (npc_reginald_windsorAI* pReginaldAI = dynamic_cast<npc_reginald_windsorAI*>(pCreature->AI()))
|
||||
{
|
||||
bIsEventReady = pReginaldAI->IsKeepEventReady();
|
||||
|
|
@ -1162,7 +1169,6 @@ struct npc_reginald_windsor : public CreatureScript
|
|||
|
||||
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction) override
|
||||
{
|
||||
pPlayer->PlayerTalkClass->ClearMenus();
|
||||
if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
|
||||
{
|
||||
if (npc_reginald_windsorAI* pReginaldAI = dynamic_cast<npc_reginald_windsorAI*>(pCreature->AI()))
|
||||
|
|
|
|||
|
|
@ -50,7 +50,8 @@ static const EventLocation aStratholmeLocation[] =
|
|||
{ 3969.357f, -3391.871f, 119.116f, 5.91f }, // Skeletons summon loc
|
||||
{ 4033.044f, -3431.031f, 119.055f, 0.0f }, // Skeletons move loc
|
||||
{ 4032.602f, -3378.506f, 119.752f, 4.74f }, // Guards summon loc
|
||||
{ 4042.575f, -3337.929f, 115.059f, 0.0f }, // Ysida move loc
|
||||
{ 4044.78f, -3333.68f, 117.26f, 4.15f}, // Ysida summon loc
|
||||
{ 4041.9f, -3337.6f, 115.06f, 3.82f}, // Ysida move/death loc
|
||||
{ 3713.681f, -3427.814f, 131.198f, 6.2f } // The Unforgiven spawn area
|
||||
};
|
||||
|
||||
|
|
@ -105,6 +106,7 @@ struct is_stratholme : public InstanceScript
|
|||
switch (pCreature->GetEntry())
|
||||
{
|
||||
case NPC_BARON:
|
||||
case NPC_YSIDA:
|
||||
case NPC_YSIDA_TRIGGER:
|
||||
case NPC_BARTHILAS:
|
||||
case NPC_PALADIN_QUEST_CREDIT:
|
||||
|
|
@ -222,7 +224,13 @@ struct is_stratholme : public InstanceScript
|
|||
break;
|
||||
}
|
||||
|
||||
DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_START, NPC_BARON);
|
||||
// Baron ultimatum starts: summon Ysida in the case
|
||||
// Baron ultimatum starts: summon Ysida in the cage
|
||||
if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON))
|
||||
{
|
||||
DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_START, NPC_BARON);
|
||||
pBaron->SummonCreature(NPC_YSIDA, aStratholmeLocation[7].m_fX, aStratholmeLocation[7].m_fY, aStratholmeLocation[7].m_fZ, aStratholmeLocation[7].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
}
|
||||
|
||||
m_uiBaronRunTimer = 45 * MINUTE * IN_MILLISECONDS;
|
||||
debug_log("SD3: Instance Stratholme: Baron run in progress.");
|
||||
|
|
@ -355,11 +363,7 @@ struct is_stratholme : public InstanceScript
|
|||
case TYPE_BARON:
|
||||
if (uiData == IN_PROGRESS)
|
||||
{
|
||||
// Reached the Baron within time-limit
|
||||
if (m_auiEncounter[TYPE_BARON_RUN] == IN_PROGRESS)
|
||||
{
|
||||
SetData(TYPE_BARON_RUN, DONE);
|
||||
}
|
||||
|
||||
|
||||
// Close Slaughterhouse door if needed
|
||||
if (m_auiEncounter[uiType] == FAIL)
|
||||
|
|
@ -369,8 +373,12 @@ struct is_stratholme : public InstanceScript
|
|||
}
|
||||
if (uiData == DONE)
|
||||
{
|
||||
if (m_auiEncounter[TYPE_BARON_RUN] == DONE)
|
||||
// Players successfully engaged Baron within the time-limit of his ultimatum
|
||||
// Note: UpdateAI() prevents TYPE_BARON_RUN to be marked as FAILED if the
|
||||
// Baron is already engaged (in progress) when the ultimatum timer expires
|
||||
if (m_auiEncounter[TYPE_BARON_RUN] == IN_PROGRESS)
|
||||
{
|
||||
SetData(TYPE_BARON_RUN, DONE);
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
|
|
@ -385,19 +393,19 @@ struct is_stratholme : public InstanceScript
|
|||
if (pPlayer->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
pPlayer->AreaExploredOrEventHappens(QUEST_DEAD_MAN_PLEA);
|
||||
|
||||
// Argent Dawn reputation reward
|
||||
pPlayer->CastSpell(pPlayer, SPELL_YSIDA_FREED, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Open cage and finish rescue event
|
||||
if (Creature* pYsidaT = GetSingleCreatureFromStorage(NPC_YSIDA_TRIGGER))
|
||||
// Open cage, finish rescue event
|
||||
if (Creature* pYsida = GetSingleCreatureFromStorage(NPC_YSIDA))
|
||||
{
|
||||
if (Creature* pYsida = pYsidaT->SummonCreature(NPC_YSIDA, pYsidaT->GetPositionX(), pYsidaT->GetPositionY(), pYsidaT->GetPositionZ(), pYsidaT->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 1800000))
|
||||
{
|
||||
DoScriptText(SAY_EPILOGUE, pYsida);
|
||||
pYsida->GetMotionMaster()->MovePoint(0, aStratholmeLocation[7].m_fX, aStratholmeLocation[7].m_fY, aStratholmeLocation[7].m_fZ);
|
||||
}
|
||||
DoScriptText(SAY_EPILOGUE, pYsida);
|
||||
DoUseDoorOrButton(GO_YSIDA_CAGE);
|
||||
pYsida->GetMotionMaster()->MovePoint(0, aStratholmeLocation[8].m_fX, aStratholmeLocation[8].m_fY, aStratholmeLocation[8].m_fZ, aStratholmeLocation[8].m_fO);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -556,6 +564,20 @@ struct is_stratholme : public InstanceScript
|
|||
m_auiEncounter[TYPE_PALLID] = SPECIAL;
|
||||
}
|
||||
|
||||
// Baron ultimatum succeed: summon Ysida outside the cage alive
|
||||
if (m_auiEncounter[TYPE_BARON_RUN] == DONE)
|
||||
{
|
||||
if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON))
|
||||
pBaron->SummonCreature(NPC_YSIDA, aStratholmeLocation[9].m_fX, aStratholmeLocation[9].m_fY, aStratholmeLocation[9].m_fZ, aStratholmeLocation[9].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
}
|
||||
// Baron ultimatum failed: summon Ysida outside the cage dead
|
||||
if (m_auiEncounter[TYPE_BARON_RUN] == FAIL)
|
||||
{
|
||||
if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON))
|
||||
if (Creature* pYsida = pBaron->SummonCreature(NPC_YSIDA, aStratholmeLocation[9].m_fX, aStratholmeLocation[9].m_fY, aStratholmeLocation[9].m_fZ, aStratholmeLocation[9].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0))
|
||||
pYsida->DealDamage(pYsida, pYsida->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, nullptr, false);
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
|
|
@ -575,8 +597,9 @@ struct is_stratholme : public InstanceScript
|
|||
case NPC_RAMSTEIN:
|
||||
SetData(TYPE_RAMSTEIN, IN_PROGRESS);
|
||||
break;
|
||||
// TODO - uncomment when proper working within core! case NPC_BARON: SetData(TYPE_BARON, IN_PROGRESS); break;
|
||||
|
||||
case NPC_BARON:
|
||||
SetData(TYPE_BARON, IN_PROGRESS);
|
||||
break;
|
||||
case NPC_ABOM_BILE:
|
||||
case NPC_ABOM_VENOM:
|
||||
// Start Slaughterhouse Event
|
||||
|
|
@ -607,8 +630,9 @@ struct is_stratholme : public InstanceScript
|
|||
case NPC_RAMSTEIN:
|
||||
SetData(TYPE_RAMSTEIN, FAIL);
|
||||
break;
|
||||
// TODO - uncomment when proper working within core! case NPC_BARON: SetData(TYPE_BARON, FAIL); break;
|
||||
|
||||
case NPC_BARON:
|
||||
SetData(TYPE_BARON, FAIL);
|
||||
break;
|
||||
case NPC_ABOM_BILE:
|
||||
case NPC_ABOM_VENOM:
|
||||
// Fail in Slaughterhouse Event before Ramstein
|
||||
|
|
@ -718,7 +742,8 @@ struct is_stratholme : public InstanceScript
|
|||
}
|
||||
}
|
||||
|
||||
if (m_uiBaronRunTimer)
|
||||
// Check changes for Baron ultimatum timer only if Baron is not already in combat
|
||||
if (m_uiBaronRunTimer && GetData(TYPE_BARON) != IN_PROGRESS)
|
||||
{
|
||||
if (m_uiYellCounter == 0 && m_uiBaronRunTimer <= 10 * MINUTE * IN_MILLISECONDS)
|
||||
{
|
||||
|
|
@ -731,14 +756,41 @@ struct is_stratholme : public InstanceScript
|
|||
++m_uiYellCounter;
|
||||
}
|
||||
|
||||
// Used to create a delay of 10s between Baron speech and Ysida's answer
|
||||
else if (m_uiYellCounter == 2 && m_uiBaronRunTimer <= (5 * MINUTE - 10) * IN_MILLISECONDS)
|
||||
{
|
||||
DoOrSimulateScriptTextForThisInstance(YSIDA_SAY_RUN_5_MIN, NPC_YSIDA);
|
||||
++m_uiYellCounter;
|
||||
}
|
||||
|
||||
if (m_uiBaronRunTimer <= uiDiff)
|
||||
{
|
||||
SetData(TYPE_BARON_RUN, FAIL);
|
||||
if (GetData(TYPE_BARON_RUN) != FAIL)
|
||||
{
|
||||
SetData(TYPE_BARON_RUN, FAIL);
|
||||
|
||||
DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_FAIL, NPC_BARON);
|
||||
// Open the cage and let Ysida face her doom
|
||||
if (Creature* pYsida = GetSingleCreatureFromStorage(NPC_YSIDA))
|
||||
{
|
||||
pYsida->GetMotionMaster()->MovePoint(0, aStratholmeLocation[8].m_fX, aStratholmeLocation[8].m_fY, aStratholmeLocation[8].m_fZ, aStratholmeLocation[8].m_fO);
|
||||
DoUseDoorOrButton(GO_YSIDA_CAGE);
|
||||
}
|
||||
DoOrSimulateScriptTextForThisInstance(SAY_ANNOUNCE_RUN_FAIL, NPC_BARON);
|
||||
|
||||
m_uiBaronRunTimer = 0;
|
||||
debug_log("SD3: Instance Stratholme: Baron run event reached end. Event has state %u.", GetData(TYPE_BARON_RUN));
|
||||
m_uiBaronRunTimer = 8000; // We reset the timer so the speech of Ysida is not said at the same time than the Baron's one
|
||||
}
|
||||
else
|
||||
{
|
||||
// Baron ultimatum failed: let the Baron kill her
|
||||
if (Creature* pYsida = GetSingleCreatureFromStorage(NPC_YSIDA))
|
||||
if (Creature* pBaron = GetSingleCreatureFromStorage(NPC_BARON))
|
||||
pBaron->CastSpell(pYsida, SPELL_BARON_SOUL_DRAIN, true);
|
||||
|
||||
DoOrSimulateScriptTextForThisInstance(YSIDA_SAY_RUN_FAIL, NPC_YSIDA);
|
||||
|
||||
m_uiBaronRunTimer = 0; // event done for good, no more speech
|
||||
debug_log("SD2: Instance Stratholme: Baron run event reached end. Event has state %u.", GetData(TYPE_BARON_RUN));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -87,7 +87,9 @@ enum
|
|||
GO_YSIDA_CAGE = 181071, // Cage to open after baron event is done
|
||||
|
||||
QUEST_DEAD_MAN_PLEA = 8945,
|
||||
SPELL_BARON_ULTIMATUM = 27861,
|
||||
SPELL_BARON_ULTIMATUM = 27861, // Aura for player during the run (visual icon)
|
||||
SPELL_BARON_SOUL_DRAIN = 27640, // Used by the Baron to kill Ysida
|
||||
SPELL_YSIDA_FREED = 27773, // Argent Dawn extra-reputation reward on successful Baron run
|
||||
SPELL_SUMMON_POSTMASTER = 24627,
|
||||
|
||||
SAY_ANNOUNCE_ZIGGURAT_1 = -1329004,
|
||||
|
|
@ -99,7 +101,9 @@ enum
|
|||
SAY_ANNOUNCE_RUN_START = -1329009,
|
||||
SAY_ANNOUNCE_RUN_10_MIN = -1329010,
|
||||
SAY_ANNOUNCE_RUN_5_MIN = -1329011,
|
||||
YSIDA_SAY_RUN_5_MIN = -1329019,
|
||||
SAY_ANNOUNCE_RUN_FAIL = -1329012,
|
||||
YSIDA_SAY_RUN_FAIL = -1329020,
|
||||
SAY_ANNOUNCE_RAMSTEIN = -1329013,
|
||||
SAY_UNDEAD_DEFEAT = -1329014,
|
||||
SAY_EPILOGUE = -1329015,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Twilight Highlands
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Twilight Highlands
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_twilight_highlands()
|
||||
{
|
||||
}
|
||||
51
src/modules/SD3/scripts/eastern_kingdoms/vashjir.cpp
Normal file
51
src/modules/SD3/scripts/eastern_kingdoms/vashjir.cpp
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
|
||||
|
||||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Vashjir
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Vashjir
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_vashjir()
|
||||
{
|
||||
}
|
||||
|
|
@ -367,12 +367,7 @@ enum
|
|||
SAY_AT_CLOSE = -1000326,
|
||||
QUEST_GYROMAST_REV = 2078,
|
||||
NPC_GELKAK = 6667,
|
||||
FACTION_HOSTILE = 14,
|
||||
|
||||
TEXT_ID_THRESH_DEFAULT = 718,
|
||||
TEXT_ID_KEY_READY = 758,
|
||||
|
||||
GOSSIP_ITEM_TURN_KEY = -3000115,
|
||||
FACTION_HOSTILE = 14
|
||||
};
|
||||
|
||||
#define GOSSIP_ITEM_INSERT_KEY "[PH] Insert key"
|
||||
|
|
@ -421,12 +416,10 @@ struct npc_threshwackonator : public CreatureScript
|
|||
{
|
||||
if (pPlayer->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_TURN_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
pPlayer->SEND_GOSSIP_MENU(TEXT_ID_KEY_READY, pCreature->GetObjectGuid());
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
else
|
||||
pPlayer->SEND_GOSSIP_MENU(TEXT_ID_THRESH_DEFAULT, pCreature->GetObjectGuid());
|
||||
|
||||
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetObjectGuid());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -171,6 +171,10 @@ struct spell_lazy_peon_awake : public SpellScript
|
|||
if (uiSpellId == SPELL_AWAKEN_PEON && uiEffIndex == EFFECT_INDEX_0)
|
||||
{
|
||||
Creature* pCreatureTarget = pTarget->ToCreature();
|
||||
if (!pCreatureTarget)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (!pCreatureTarget->HasAura(SPELL_PEON_SLEEP) || pCaster->GetTypeId() != TYPEID_PLAYER || pCreatureTarget->GetEntry() != NPC_SLEEPING_PEON)
|
||||
{
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ struct npc_kitten : public CreatureScript
|
|||
|
||||
void MoveInLineOfSight(Unit* pWho) override
|
||||
{
|
||||
// should not have NpcFlags by default, so set when expected
|
||||
// should not have npcflag by default, so set when expected
|
||||
if (!m_creature->getVictim() && !m_creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) && HasFollowState(STATE_FOLLOW_INPROGRESS) && pWho->GetEntry() == NPC_WINNA)
|
||||
{
|
||||
if (m_creature->IsWithinDistInMap(pWho, INTERACTION_DISTANCE))
|
||||
|
|
@ -460,7 +460,7 @@ struct event_npc_kroshius : public MapEventScript
|
|||
{
|
||||
event_npc_kroshius() : MapEventScript("event_npc_kroshius") {}
|
||||
|
||||
bool ProcessEventId_npc_kroshius(uint32 uiEventId, Object* pSource, Object* /*pTarget*/, bool /*bIsStart*/)
|
||||
bool OnReceived(uint32 uiEventId, Object* pSource, Object* /*pTarget*/, bool /*bIsStart*/) override
|
||||
{
|
||||
if (uiEventId == EVENT_KROSHIUS_REVIVE)
|
||||
{
|
||||
|
|
|
|||
49
src/modules/SD3/scripts/kalimdor/mount_hyjal.cpp
Normal file
49
src/modules/SD3/scripts/kalimdor/mount_hyjal.cpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Mount Hyjal
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Mount Hyjal
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_mount_hyjal()
|
||||
{
|
||||
}
|
||||
|
|
@ -817,17 +817,6 @@ struct npc_regthar_deathgate : public CreatureScript
|
|||
std::list<uint32> lSpawnListHorde;
|
||||
std::list<Creature*>::iterator itrh;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void JustRespawned()
|
||||
{
|
||||
FinishEvent();
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint64 m_uiPlayerGUID;
|
||||
uint64 m_uiEventTimer;
|
||||
uint32 m_uiSummonCountInvader;
|
||||
|
|
@ -841,24 +830,35 @@ struct npc_regthar_deathgate : public CreatureScript
|
|||
uint32 m_uiPhaseCount;
|
||||
bool m_bEventStarted;
|
||||
|
||||
void Reset() {}
|
||||
|
||||
void JustRespawned()
|
||||
{
|
||||
FinishEvent();
|
||||
Reset();
|
||||
}
|
||||
|
||||
void StartEvent(uint64 uiPlayerGUID)
|
||||
{
|
||||
m_uiPlayerGUID = uiPlayerGUID;
|
||||
m_bEventStarted = true;
|
||||
m_uiEventTimer = 1200000;
|
||||
m_uiSummonCountInvader = 0;
|
||||
m_uiSummonCountStormseer = 0;
|
||||
m_uiSummonCountHorde = 0;
|
||||
m_uiWaitSummonTimer = 0;
|
||||
m_uiWaitSummonTimerHorde = 0;
|
||||
m_uiSpawnPosition = 0;
|
||||
m_uiKillCount = 0;
|
||||
m_uiCreatureCount = 0;
|
||||
m_uiPhaseCount = 1;
|
||||
lCreatureList.clear();
|
||||
lSpawnList.clear();
|
||||
lCreatureListHorde.clear();
|
||||
lSpawnListHorde.clear();
|
||||
if (!m_bEventStarted)
|
||||
{
|
||||
m_bEventStarted = true;
|
||||
m_uiPlayerGUID = uiPlayerGUID;
|
||||
m_uiEventTimer = 1200000;
|
||||
m_uiSummonCountInvader = 0;
|
||||
m_uiSummonCountStormseer = 0;
|
||||
m_uiSummonCountHorde = 0;
|
||||
m_uiWaitSummonTimer = 0;
|
||||
m_uiWaitSummonTimerHorde = 0;
|
||||
m_uiSpawnPosition = 0;
|
||||
m_uiKillCount = 0;
|
||||
m_uiCreatureCount = 0;
|
||||
m_uiPhaseCount = 1;
|
||||
lCreatureList.clear();
|
||||
lSpawnList.clear();
|
||||
lCreatureListHorde.clear();
|
||||
lSpawnListHorde.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void FinishEvent()
|
||||
|
|
@ -986,8 +986,6 @@ struct npc_regthar_deathgate : public CreatureScript
|
|||
if (pKilled->GetEntry() == NPC_WARLORD_KROMZAR)
|
||||
{
|
||||
DoScriptText(YELL_RETREAT, m_creature);
|
||||
pKilled->SummonGameObject(164690, pKilled->GetPositionX(), pKilled->GetPositionY(), pKilled->GetPositionZ(),
|
||||
4.12f, 60000);
|
||||
m_uiPhaseCount = 4;
|
||||
}
|
||||
|
||||
|
|
@ -1158,17 +1156,16 @@ struct npc_regthar_deathgate : public CreatureScript
|
|||
|
||||
bool OnGossipHello(Player* pPlayer, Creature* pCreature) override
|
||||
{
|
||||
pPlayer->PlayerTalkClass->ClearMenus();
|
||||
if (pCreature->IsQuestGiver())
|
||||
pPlayer->PrepareQuestMenu(pCreature->GetObjectGuid());
|
||||
|
||||
if (pPlayer->GetQuestStatus(QUEST_COUNTERATTACK) == QUEST_STATUS_INCOMPLETE)
|
||||
if (npc_regthar_deathgateAI* pRegtharAI = dynamic_cast<npc_regthar_deathgateAI*>(pCreature->AI()))
|
||||
{
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Where is warlord Krom'zar?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
pPlayer->SEND_GOSSIP_MENU(2533, pCreature->GetObjectGuid());
|
||||
return true;
|
||||
if (!pRegtharAI->m_bEventStarted && (pPlayer->GetQuestStatus(QUEST_COUNTERATTACK) == QUEST_STATUS_INCOMPLETE))
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Where is warlord Krom'zar?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
else
|
||||
pPlayer->SEND_GOSSIP_MENU(2533, pCreature->GetObjectGuid());
|
||||
pPlayer->SEND_GOSSIP_MENU(2533, pCreature->GetObjectGuid());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
49
src/modules/SD3/scripts/kalimdor/uldum.cpp
Normal file
49
src/modules/SD3/scripts/kalimdor/uldum.cpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Uldum
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Uldum
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_uldum()
|
||||
{
|
||||
}
|
||||
49
src/modules/SD3/scripts/maelstrom/deepholm.cpp
Normal file
49
src/modules/SD3/scripts/maelstrom/deepholm.cpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Deepholm
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Deepholm
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_deepholm()
|
||||
{
|
||||
}
|
||||
35
src/modules/SD3/scripts/maelstrom/kezan.cpp
Normal file
35
src/modules/SD3/scripts/maelstrom/kezan.cpp
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/* Copyright (C) 2006 - 2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Kezan
|
||||
SD%Complete: 0
|
||||
SDComment: Placeholder
|
||||
SDCategory: Kezan
|
||||
EndScriptData */
|
||||
|
||||
/* ContentData
|
||||
EndContentData */
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_kezan()
|
||||
{
|
||||
}
|
||||
49
src/modules/SD3/scripts/maelstrom/lost_isles.cpp
Normal file
49
src/modules/SD3/scripts/maelstrom/lost_isles.cpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: Lost Isles
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: Lost Isles
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
/*######
|
||||
#
|
||||
######*/
|
||||
|
||||
void AddSC_lost_isles()
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: boss_corborus
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: boss_corborus
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
void AddSC_boss_corborus()
|
||||
{
|
||||
}
|
||||
40
src/modules/SD3/scripts/maelstrom/stonecore/boss_ozruk.cpp
Normal file
40
src/modules/SD3/scripts/maelstrom/stonecore/boss_ozruk.cpp
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: boss_ozruk
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: boss_ozruk
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
void AddSC_boss_ozruk()
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: boss_priestess_azil
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: boss_priestess_azil
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
void AddSC_priestess_azil()
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: boss_slabhide
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: boss_slabhide
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
void AddSC_boss_slabhide()
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ScriptData
|
||||
* SDName: instance_stonecore
|
||||
* SD%Complete: 0
|
||||
* SDComment: Placeholder
|
||||
* SDCategory: instance_stonecore
|
||||
* EndScriptData
|
||||
*/
|
||||
|
||||
/**
|
||||
* ContentData
|
||||
* EndContentData
|
||||
*/
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
void AddSC_instance_stonecore()
|
||||
{
|
||||
}
|
||||
27
src/modules/SD3/scripts/maelstrom/stonecore/stonecore.h
Normal file
27
src/modules/SD3/scripts/maelstrom/stonecore/stonecore.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/**
|
||||
* ScriptDev3 is an extension for mangos providing enhanced features for
|
||||
* area triggers, creatures, game objects, instances, items, and spells beyond
|
||||
* the default database scripting in mangos.
|
||||
*
|
||||
* Copyright (C) 2006-2013 ScriptDev2 <http://www.scriptdev2.com/>
|
||||
* Copyright (C) 2014-2016 MaNGOS <https://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -33,7 +33,6 @@ npc_captured_beryl_sorcerer
|
|||
npc_nexus_drake_hatchling
|
||||
npc_scourged_flamespitter
|
||||
npc_bonker_togglevolt
|
||||
npc_jenny
|
||||
EndContentData */
|
||||
|
||||
#include "precompiled.h"
|
||||
|
|
@ -1129,119 +1128,6 @@ struct npc_bonker_togglevolt : public CreatureScript
|
|||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_jenny
|
||||
######*/
|
||||
|
||||
enum
|
||||
{
|
||||
SPELL_CREATES_CARRIED = 46340,
|
||||
SPELL_DROP_CRATE = 46342,
|
||||
SPELL_JENNY_CREDIT = 46358,
|
||||
|
||||
NPC_FEZZIX = 25849,
|
||||
|
||||
QUEST_ID_LOADER_UP = 11881,
|
||||
};
|
||||
|
||||
struct npc_jenny : public CreatureScript
|
||||
{
|
||||
npc_jenny() : CreatureScript("npc_jenny") {}
|
||||
|
||||
struct npc_jennyAI : public FollowerAI
|
||||
{
|
||||
npc_jennyAI(Creature* pCreature) : FollowerAI(pCreature)
|
||||
{
|
||||
m_bFollowStarted = false;
|
||||
m_bEventComplete = false;
|
||||
Reset();
|
||||
}
|
||||
|
||||
bool m_bEventComplete;
|
||||
bool m_bFollowStarted;
|
||||
|
||||
uint32 m_uiDropDelayTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_uiDropDelayTimer = 0;
|
||||
}
|
||||
|
||||
void AttackedBy(Unit* pAttacker) override
|
||||
{
|
||||
if (!m_uiDropDelayTimer)
|
||||
{
|
||||
if (DoCastSpellIfCan(m_creature, SPELL_DROP_CRATE) == CAST_OK)
|
||||
{
|
||||
m_creature->RemoveAuraHolderFromStack(SPELL_CREATES_CARRIED);
|
||||
m_uiDropDelayTimer = 10000;
|
||||
|
||||
// check if all crates are dropped
|
||||
if (!m_creature->HasAura(SPELL_CREATES_CARRIED))
|
||||
{
|
||||
FollowerAI::JustDied(pAttacker);
|
||||
m_creature->ForcedDespawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* pWho) override { }
|
||||
|
||||
void MoveInLineOfSight(Unit* pWho) override
|
||||
{
|
||||
if (m_bEventComplete)
|
||||
return;
|
||||
|
||||
if (pWho->GetEntry() == NPC_FEZZIX && m_creature->IsWithinDistInMap(pWho, 10.0f))
|
||||
{
|
||||
if (DoCastSpellIfCan(m_creature, SPELL_JENNY_CREDIT) == CAST_OK)
|
||||
{
|
||||
SetFollowComplete(true);
|
||||
|
||||
float fX, fY, fZ;
|
||||
pWho->GetContactPoint(m_creature, fX, fY, fZ);
|
||||
m_creature->GetMotionMaster()->MovePoint(0, fX, fY, fZ);
|
||||
m_creature->ForcedDespawn(15000);
|
||||
|
||||
m_bEventComplete = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateFollowerAI(const uint32 uiDiff)
|
||||
{
|
||||
if (!m_bFollowStarted)
|
||||
{
|
||||
if (Player* pSummoner = m_creature->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
{
|
||||
StartFollow(pSummoner, pSummoner->getFaction(), GetQuestTemplateStore(QUEST_ID_LOADER_UP));
|
||||
|
||||
if (DoCastSpellIfCan(m_creature, SPELL_CREATES_CARRIED) == CAST_OK)
|
||||
m_bFollowStarted = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_uiDropDelayTimer)
|
||||
{
|
||||
if (m_uiDropDelayTimer <= uiDiff)
|
||||
m_uiDropDelayTimer = 0;
|
||||
else
|
||||
m_uiDropDelayTimer -= uiDiff;
|
||||
}
|
||||
|
||||
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) override
|
||||
{
|
||||
return new npc_jennyAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_borean_tundra()
|
||||
{
|
||||
Script* s;
|
||||
|
|
@ -1260,8 +1146,6 @@ void AddSC_borean_tundra()
|
|||
s->RegisterSelf();
|
||||
s = new npc_bonker_togglevolt();
|
||||
s->RegisterSelf();
|
||||
s = new npc_jenny();
|
||||
s->RegisterSelf();
|
||||
|
||||
s = new spell_throw_wolf_batt();
|
||||
s->RegisterSelf();
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@ enum
|
|||
EMOTE_INSECT_SWARM = -1533154,
|
||||
EMOTE_CORPSE_SCARABS = -1533155,
|
||||
|
||||
SPELL_DOUBLE_ATTACK = 18943,
|
||||
SPELL_IMPALE = 28783, // May be wrong spell id. Causes more dmg than I expect
|
||||
SPELL_IMPALE_H = 56090,
|
||||
SPELL_LOCUSTSWARM = 28785, // This is a self buff that triggers the dmg debuff
|
||||
|
|
@ -83,9 +82,6 @@ struct boss_anubrekhan : public CreatureScript
|
|||
m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty();
|
||||
m_introDialogue.InitializeDialogueHelper(m_pInstance);
|
||||
m_bHasTaunted = false;
|
||||
Reset();
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
|
@ -139,8 +135,6 @@ struct boss_anubrekhan : public CreatureScript
|
|||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_ANUB_REKHAN, FAIL);
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* pWho) override
|
||||
|
|
|
|||
|
|
@ -32,8 +32,7 @@ enum
|
|||
EMOTE_ZOMBIE = -1533119,
|
||||
EMOTE_BOSS_GENERIC_ENRAGED = -1000006,
|
||||
EMOTE_DECIMATE = -1533152,
|
||||
|
||||
SPELL_DOUBLE_ATTACK = 19818,
|
||||
|
||||
SPELL_MORTALWOUND = 54378, // old vanilla spell was 25646,
|
||||
SPELL_DECIMATE = 28374,
|
||||
SPELL_DECIMATE_H = 54426,
|
||||
|
|
@ -67,9 +66,6 @@ struct boss_gluth : public CreatureScript
|
|||
{
|
||||
m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
|
||||
m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty();
|
||||
Reset();
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
|
@ -122,8 +118,6 @@ struct boss_gluth : public CreatureScript
|
|||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_GLUTH, FAIL);
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* pSummoned) override
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@ enum
|
|||
EMOTE_SPRAY = -1533148,
|
||||
EMOTE_BOSS_GENERIC_FRENZY = -1000005,
|
||||
|
||||
SPELL_DOUBLE_ATTACK = 19818,
|
||||
|
||||
SPELL_WEBWRAP = 28622,
|
||||
SPELL_WEBWRAP_2 = 28673, // purpose unknown
|
||||
|
||||
|
|
@ -168,9 +166,6 @@ struct boss_maexxna : public CreatureScript
|
|||
{
|
||||
m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
|
||||
m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty();
|
||||
Reset();
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
|
@ -209,8 +204,6 @@ struct boss_maexxna : public CreatureScript
|
|||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_MAEXXNA, FAIL);
|
||||
|
||||
DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* pSummoned) override
|
||||
|
|
|
|||
|
|
@ -211,7 +211,6 @@ struct boss_freya : public CreatureScript
|
|||
|
||||
uint32 m_uiEpilogueTimer;
|
||||
uint32 m_uiBerserkTimer;
|
||||
uint32 m_uiDrainEldersTimer;
|
||||
|
||||
uint32 m_uiAlliesNatureTimer;
|
||||
uint8 m_uiAlliesWaveCount;
|
||||
|
|
@ -245,7 +244,6 @@ struct boss_freya : public CreatureScript
|
|||
m_uiUnstableEnergyTimer = 0;
|
||||
m_uiIronRootsTimer = 0;
|
||||
m_uiGroundTremorTimer = 0;
|
||||
m_uiDrainEldersTimer = 0;
|
||||
|
||||
// make the spawn spells random
|
||||
std::random_shuffle(spawnSpellsVector.begin(), spawnSpellsVector.end());
|
||||
|
|
@ -294,26 +292,17 @@ struct boss_freya : public CreatureScript
|
|||
if (Creature* pElder = m_pInstance->GetSingleCreatureFromStorage(NPC_ELDER_BRIGHTLEAF))
|
||||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->AI()->EnterEvadeMode();
|
||||
pElder->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
if (Creature* pElder = m_pInstance->GetSingleCreatureFromStorage(NPC_ELDER_IRONBRACH))
|
||||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->AI()->EnterEvadeMode();
|
||||
pElder->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
if (Creature* pElder = m_pInstance->GetSingleCreatureFromStorage(NPC_ELDER_STONEBARK))
|
||||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->AI()->EnterEvadeMode();
|
||||
pElder->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -479,7 +468,7 @@ struct boss_freya : public CreatureScript
|
|||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->CastSpell(pElder, m_bIsRegularMode ? SPELL_BRIGHTLEAF_ESSENCE_CHANNEL : SPELL_BRIGHTLEAF_ESSENCE_CHANNEL_H, false, NULL, NULL, m_creature->GetObjectGuid());
|
||||
pElder->CastSpell(pElder, m_bIsRegularMode ? SPELL_BRIGHTLEAF_ESSENCE_CHANNEL : SPELL_BRIGHTLEAF_ESSENCE_CHANNEL_H, true);
|
||||
pElder->CastSpell(pElder, SPELL_FULL_HEAL, true);
|
||||
|
||||
m_uiUnstableEnergyTimer = 25000;
|
||||
|
|
@ -490,7 +479,7 @@ struct boss_freya : public CreatureScript
|
|||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->CastSpell(pElder, m_bIsRegularMode ? SPELL_IRONBRANCH_ESSENCE_CHANNEL : SPELL_IRONBRANCH_ESSENCE_CHANNEL_H, false, NULL, NULL, m_creature->GetObjectGuid());
|
||||
pElder->CastSpell(pElder, m_bIsRegularMode ? SPELL_IRONBRANCH_ESSENCE_CHANNEL : SPELL_IRONBRANCH_ESSENCE_CHANNEL_H, true);
|
||||
pElder->CastSpell(pElder, SPELL_FULL_HEAL, true);
|
||||
|
||||
m_uiIronRootsTimer = 60000;
|
||||
|
|
@ -501,7 +490,7 @@ struct boss_freya : public CreatureScript
|
|||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->CastSpell(pElder, m_bIsRegularMode ? SPELL_STONEBARK_ESSEMCE_CHANNEL : SPELL_STONEBARK_ESSEMCE_CHANNEL_H, false, NULL, NULL, m_creature->GetObjectGuid());
|
||||
pElder->CastSpell(pElder, m_bIsRegularMode ? SPELL_STONEBARK_ESSEMCE_CHANNEL : SPELL_STONEBARK_ESSEMCE_CHANNEL_H, true);
|
||||
pElder->CastSpell(pElder, SPELL_FULL_HEAL, true);
|
||||
|
||||
m_uiGroundTremorTimer = 10000;
|
||||
|
|
@ -518,38 +507,6 @@ struct boss_freya : public CreatureScript
|
|||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
}
|
||||
|
||||
// Function that will drain elders after aggro
|
||||
void DoDrainElders()
|
||||
{
|
||||
if (!m_pInstance)
|
||||
return;
|
||||
|
||||
if (Creature* pElder = m_pInstance->GetSingleCreatureFromStorage(NPC_ELDER_BRIGHTLEAF))
|
||||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->CastSpell(pElder, SPELL_DRAINED_OF_POWER, true);
|
||||
pElder->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
if (Creature* pElder = m_pInstance->GetSingleCreatureFromStorage(NPC_ELDER_IRONBRACH))
|
||||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->CastSpell(pElder, SPELL_DRAINED_OF_POWER, true);
|
||||
pElder->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
if (Creature* pElder = m_pInstance->GetSingleCreatureFromStorage(NPC_ELDER_STONEBARK))
|
||||
{
|
||||
if (pElder->IsAlive())
|
||||
{
|
||||
pElder->CastSpell(pElder, SPELL_DRAINED_OF_POWER, true);
|
||||
pElder->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff) override
|
||||
{
|
||||
if (m_uiEpilogueTimer)
|
||||
|
|
@ -583,18 +540,6 @@ struct boss_freya : public CreatureScript
|
|||
m_uiBerserkTimer -= uiDiff;
|
||||
}
|
||||
|
||||
// Drain elders after hard mode aggro
|
||||
if (m_uiDrainEldersTimer)
|
||||
{
|
||||
if (m_uiDrainEldersTimer <= uiDiff)
|
||||
{
|
||||
DoDrainElders();
|
||||
m_uiDrainEldersTimer = 0;
|
||||
}
|
||||
else
|
||||
m_uiDrainEldersTimer -= uiDiff;
|
||||
}
|
||||
|
||||
if (m_uiThreeAlliesTimer)
|
||||
{
|
||||
if (m_uiThreeAlliesTimer <= uiDiff)
|
||||
|
|
|
|||
|
|
@ -179,12 +179,9 @@ struct npc_ancestral_wolf : public CreatureScript
|
|||
|
||||
void Reset() override
|
||||
{
|
||||
DoCastSpellIfCan(m_creature, SPELL_ANCESTRAL_WOLF_BUFF);
|
||||
m_creature->CastSpell(m_creature, SPELL_ANCESTRAL_WOLF_BUFF, true);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* /*pWho*/) override { }
|
||||
void MoveInLineOfSight(Unit* /*pWho*/) override { }
|
||||
|
||||
void WaypointReached(uint32 uiPointId) override
|
||||
{
|
||||
switch (uiPointId)
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ struct mob_lump : public CreatureScript
|
|||
m_creature->DeleteThreatList();
|
||||
m_creature->CombatStop(true);
|
||||
|
||||
// should get UnitFlags UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_PASSIVE at faction change, but unclear why/for what reason, skipped (no flags expected as default)
|
||||
// should get unit_flags UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_PASSIVE at faction change, but unclear why/for what reason, skipped (no flags expected as default)
|
||||
m_creature->SetFactionTemporary(FACTION_FRIENDLY, TEMPFACTION_RESTORE_REACH_HOME);
|
||||
|
||||
m_creature->SetStandState(UNIT_STAND_STATE_SIT);
|
||||
|
|
|
|||
|
|
@ -1774,16 +1774,6 @@ void AddSC_netherstorm()
|
|||
s = new npc_drijya();
|
||||
s->RegisterSelf();
|
||||
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
s = new npc_dimensius();
|
||||
s->RegisterSelf();
|
||||
|
||||
/*pNewScript = new Script;
|
||||
pNewScript->Name = "npc_dimensius";
|
||||
pNewScript->GetAI = &GetAI_npc_dimensius;
|
||||
pNewScript->RegisterSelf();*/
|
||||
#endif
|
||||
|
||||
//pNewScript = new Script;
|
||||
//pNewScript->Name = "go_manaforge_control_console";
|
||||
//pNewScript->pGOUse = &GOUse_go_manaforge_control_console;
|
||||
|
|
@ -1837,4 +1827,14 @@ void AddSC_netherstorm()
|
|||
//pNewScript->GetAI = &GetAI_npc_drijya;
|
||||
//pNewScript->pQuestAcceptNPC = &QuestAccept_npc_drijya;
|
||||
//pNewScript->RegisterSelf();
|
||||
|
||||
#if defined (WOTLK)
|
||||
s = new npc_dimensius();
|
||||
s->RegisterSelf();
|
||||
|
||||
/*pNewScript = new Script;
|
||||
pNewScript->Name = "npc_dimensius";
|
||||
pNewScript->GetAI = &GetAI_npc_dimensius;
|
||||
pNewScript->RegisterSelf();*/
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -472,6 +472,8 @@ struct npc_dragonmaw_peon : public CreatureScript
|
|||
m_uiPoisonTimer -= uiDiff;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -1626,7 +1628,7 @@ struct spell_totem_of_spirits : public SpellScript
|
|||
}
|
||||
};
|
||||
|
||||
#if defined (TBC) || defined (WOTLK) || defined (CATA)
|
||||
#if defined (TBC) || defined (WOTLK)
|
||||
struct aura_elemental_sieve : public AuraScript
|
||||
{
|
||||
aura_elemental_sieve() : AuraScript("aura_elemental_sieve") {}
|
||||
|
|
@ -2331,7 +2333,7 @@ void AddSC_shadowmoon_valley()
|
|||
s->RegisterSelf();
|
||||
s = new spell_totem_of_spirits();
|
||||
s->RegisterSelf();
|
||||
#if defined (TBC) || defined (WOTLK) || defined (CATA)
|
||||
#if defined (TBC) || defined (WOTLK)
|
||||
s = new aura_elemental_sieve();
|
||||
s->RegisterSelf();
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1213,9 +1213,9 @@ struct npc_guardian : public CreatureScript
|
|||
# npc_innkeeper
|
||||
#########*/
|
||||
|
||||
// Script applied to all innkeepers by NpcFlags.
|
||||
// Script applied to all innkeepers by npcflag.
|
||||
// Are there any known innkeepers that does not hape the options in the below?
|
||||
// (remember gossipHello is not called unless NpcFlags|1 is present)
|
||||
// (remember gossipHello is not called unless npcflag|1 is present)
|
||||
|
||||
enum
|
||||
{
|
||||
|
|
|
|||
|
|
@ -608,12 +608,12 @@ struct spell_apply_salve : public SpellScript
|
|||
{
|
||||
if (uiSpellId == SPELL_APPLY_SALVE && uiEffIndex == EFFECT_INDEX_0)
|
||||
{
|
||||
if (pCaster->GetTypeId() != TYPEID_PLAYER)
|
||||
Creature *pCreatureTarget = pTarget->ToCreature();
|
||||
if (pCaster->GetTypeId() != TYPEID_PLAYER || !pCreatureTarget)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Creature *pCreatureTarget = pTarget->ToCreature();
|
||||
if (pCreatureTarget->GetEntry() != NPC_SICKLY_DEER && pCreatureTarget->GetEntry() != NPC_SICKLY_GAZELLE)
|
||||
{
|
||||
return true;
|
||||
|
|
@ -638,7 +638,7 @@ struct spell_sacred_cleansing : public SpellScript
|
|||
{
|
||||
if (uiSpellId == SPELL_SACRED_CLEANSING && uiEffIndex == EFFECT_INDEX_1)
|
||||
{
|
||||
if (pTarget->ToCreature() && pTarget->GetEntry() != NPC_MORBENT)
|
||||
if (!pTarget->ToCreature() || pTarget->GetEntry() != NPC_MORBENT)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
@ -657,7 +657,7 @@ struct spell_melodious_rapture : public SpellScript
|
|||
if (uiSpellId == SPELL_MELODIOUS_RAPTURE && uiEffIndex == EFFECT_INDEX_0)
|
||||
{
|
||||
Creature *pCreatureTarget = pTarget->ToCreature();
|
||||
if (pCaster->GetTypeId() != TYPEID_PLAYER && pCreatureTarget->GetEntry() != NPC_DEEPRUN_RAT)
|
||||
if (pCaster->GetTypeId() != TYPEID_PLAYER || !pCreatureTarget || (pCreatureTarget->GetEntry() != NPC_DEEPRUN_RAT))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
@ -910,6 +910,9 @@ struct spell_orb_of_murloc_control : public SpellScript
|
|||
bool EffectDummy(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Object* pTarget, ObjectGuid /*originalCasterGuid*/) override //SPELL_ORB_OF_MURLOC_CONTROL
|
||||
{
|
||||
Creature* pCreatureTarget = pTarget->ToCreature();
|
||||
if (!pCreatureTarget)
|
||||
return true;
|
||||
|
||||
pCreatureTarget->CastSpell(pCaster, SPELL_GREENGILL_SLAVE_FREED, true);
|
||||
|
||||
// Freed Greengill Slave
|
||||
|
|
@ -928,6 +931,9 @@ struct spell_fumping : public SpellScript
|
|||
bool EffectDummy(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Object* pTarget, ObjectGuid /*originalCasterGuid*/) override
|
||||
{
|
||||
Creature *pCreatureTarget = pTarget->ToCreature();
|
||||
if (!pCreatureTarget)
|
||||
return true;
|
||||
|
||||
if (uiSpellId == SPELL_FUMPING && uiEffIndex == EFFECT_INDEX_2)
|
||||
{
|
||||
switch (urand(0, 2))
|
||||
|
|
@ -1030,6 +1036,9 @@ struct spell_throw_gordawg_boulder : public SpellScript
|
|||
bool EffectDummy(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Object* pTarget, ObjectGuid /*originalCasterGuid*/) override
|
||||
{
|
||||
Creature *pCreatureTarget = pTarget->ToCreature();
|
||||
if (!pCreatureTarget)
|
||||
return true;
|
||||
|
||||
if (uiSpellId == SPELL_THROW_GORDAWG_BOULDER && uiEffIndex == EFFECT_INDEX_0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i)
|
||||
|
|
@ -1161,7 +1170,7 @@ struct spell_throw_ice : public SpellScript
|
|||
if (uiEffIndex == EFFECT_INDEX_0)
|
||||
{
|
||||
Creature *pCreatureTarget = pTarget->ToCreature();
|
||||
if (pCreatureTarget->GetEntry() != NPC_SMOLDERING_SCRAP_BUNNY)
|
||||
if (!pCreatureTarget || pCreatureTarget->GetEntry() != NPC_SMOLDERING_SCRAP_BUNNY)
|
||||
return true;
|
||||
|
||||
if (GameObject* pScrap = GetClosestGameObjectWithEntry(pCreatureTarget, GO_SMOLDERING_SCRAP, 5.0f))
|
||||
|
|
|
|||
|
|
@ -601,11 +601,14 @@ bool SD3::AuraDummy(Aura const* pAura, bool bApply)
|
|||
InstanceData* SD3::CreateInstanceData(Map* pMap)
|
||||
{
|
||||
Script* pTempScript = m_scripts[pMap->GetScriptId()];
|
||||
|
||||
if (!pTempScript || !pTempScript->ToInstanceScript())
|
||||
{
|
||||
if (!pTempScript)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return pTempScript->ToInstanceScript()->GetInstanceData(pMap);
|
||||
if (pTempScript->ToInstanceScript())
|
||||
return pTempScript->ToInstanceScript()->GetInstanceData(pMap);
|
||||
|
||||
if (pTempScript->ToZoneScript())
|
||||
return pTempScript->ToZoneScript()->GetInstanceData(pMap);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "Common.h"
|
||||
#include "DBCStructure.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "QuestDef.h"
|
||||
|
||||
class Player;
|
||||
class Creature;
|
||||
|
|
@ -171,7 +172,7 @@ struct CreatureScript : public Script
|
|||
virtual bool OnGossipHello(Player*, Creature*) { return false; }
|
||||
virtual bool OnGossipSelect(Player*, Creature*, uint32, uint32) { return false; }
|
||||
virtual bool OnGossipSelectWithCode(Player*, Creature*, uint32, uint32, const char*) { return false; }
|
||||
virtual uint32 OnDialogEnd(Player*, Creature*) { return 0; }
|
||||
virtual uint32 OnDialogEnd(Player*, Creature*) { return DIALOG_STATUS_UNDEFINED; }
|
||||
virtual bool OnQuestAccept(Player*, Creature*, Quest const*) { return false; }
|
||||
virtual bool OnQuestRewarded(Player*, Creature*, Quest const*) { return false; }
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
|
|
@ -188,7 +189,7 @@ struct GameObjectScript : public Script
|
|||
virtual bool OnGossipHello(Player*, GameObject*) { return false; }
|
||||
virtual bool OnGossipSelect(Player*, GameObject*, uint32, uint32) { return false; }
|
||||
virtual bool OnGossipSelectWithCode(Player*, GameObject*, uint32, uint32, const char*) { return false; }
|
||||
virtual uint32 OnDialogEnd(Player*, GameObject*) { return 0; }
|
||||
virtual uint32 OnDialogEnd(Player*, GameObject*) { return DIALOG_STATUS_UNDEFINED; }
|
||||
virtual bool OnQuestAccept(Player*, GameObject*, Quest const*) { return false; }
|
||||
virtual bool OnQuestRewarded(Player*, GameObject*, Quest const*) { return false; }
|
||||
virtual bool OnUse(Player*, GameObject*) { return false; }
|
||||
|
|
|
|||
|
|
@ -226,6 +226,14 @@ void AddSC_western_plaguelands();
|
|||
void AddSC_westfall();
|
||||
void AddSC_wetlands();
|
||||
|
||||
// Cata zones
|
||||
#if defined (CATA)
|
||||
void AddSC_gilneas();
|
||||
void AddSC_gilneas_city();
|
||||
void AddSC_twilight_highlands();
|
||||
void AddSC_vashjir();
|
||||
#endif
|
||||
|
||||
void AddEasternKingdomsScripts()
|
||||
{
|
||||
AddSC_blackrock_depths(); // blackrock_depths
|
||||
|
|
@ -426,6 +434,13 @@ void AddEasternKingdomsScripts()
|
|||
AddSC_western_plaguelands();
|
||||
AddSC_westfall();
|
||||
AddSC_wetlands();
|
||||
|
||||
// Cata zones
|
||||
#if defined (CATA)
|
||||
AddSC_gilneas();
|
||||
AddSC_gilneas_city();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
// kalimdor
|
||||
|
|
@ -510,6 +525,12 @@ void AddSC_thunder_bluff();
|
|||
void AddSC_ungoro_crater();
|
||||
void AddSC_winterspring();
|
||||
|
||||
// Cata zones
|
||||
#if defined (CATA)
|
||||
void AddSC_uldum();
|
||||
void AddSC_mount_hyjal();
|
||||
#endif
|
||||
|
||||
void AddKalimdorScripts()
|
||||
{
|
||||
AddSC_instance_blackfathom_deeps(); // blackfathom deeps
|
||||
|
|
@ -592,6 +613,12 @@ void AddKalimdorScripts()
|
|||
AddSC_thunder_bluff();
|
||||
AddSC_ungoro_crater();
|
||||
AddSC_winterspring();
|
||||
|
||||
// Cata zones
|
||||
#if defined (CATA)
|
||||
AddSC_uldum();
|
||||
AddSC_mount_hyjal();
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined (WOTLK) || defined (CATA)
|
||||
|
|
@ -748,7 +775,6 @@ void AddSC_boss_exarch_maladaar(); // auchindoun, auchenai_cry
|
|||
void AddSC_boss_shirrak();
|
||||
void AddSC_boss_nexusprince_shaffar(); // auchindoun, mana_tombs
|
||||
void AddSC_boss_pandemonius();
|
||||
void AddSC_mana_tombs();
|
||||
void AddSC_boss_anzu(); // auchindoun, sethekk_halls
|
||||
void AddSC_boss_darkweaver_syth();
|
||||
void AddSC_boss_talon_king_ikiss();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue