fix(Scripts/ZulAman): Fix Sacrifice timers not updating after latest … (#20490)
This commit is contained in:
@@ -15,13 +15,6 @@
|
|||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ScriptData
|
|
||||||
SDName: instance_zulaman
|
|
||||||
SD%Complete: 80
|
|
||||||
SDComment:
|
|
||||||
SDCategory: Zul'Aman
|
|
||||||
EndScriptData */
|
|
||||||
|
|
||||||
#include "InstanceMapScript.h"
|
#include "InstanceMapScript.h"
|
||||||
#include "InstanceScript.h"
|
#include "InstanceScript.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
@@ -41,15 +34,15 @@ enum Misc
|
|||||||
struct SHostageInfo
|
struct SHostageInfo
|
||||||
{
|
{
|
||||||
uint32 npc, go; // FIXME go Not used
|
uint32 npc, go; // FIXME go Not used
|
||||||
float x, y, z, o;
|
Position pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
static SHostageInfo HostageInfo[] =
|
static SHostageInfo HostageInfo[] =
|
||||||
{
|
{
|
||||||
{23790, 186648, -57, 1343, 40.77f, 3.2f}, // bear
|
{23790, 186648, { -57.0f, 1343.0f, 40.77f, 3.2f } }, // bear
|
||||||
{23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle
|
{23999, 187021, { 400.0f, 1414.0f, 74.36f, 3.3f } }, // eagle
|
||||||
{24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk
|
{24001, 186672, { -35.0f, 1134.0f, 18.71f, 1.9f } }, // dragonhawk
|
||||||
{24024, 186667, 413, 1117, 6.32f, 3.1f} // lynx
|
{24024, 186667, { 413.0f, 1117.0f, 6.32f, 3.1f } } // lynx
|
||||||
};
|
};
|
||||||
|
|
||||||
Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
|
Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
|
||||||
@@ -57,6 +50,9 @@ Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
|
|||||||
DoorData const doorData[] =
|
DoorData const doorData[] =
|
||||||
{
|
{
|
||||||
{ GO_ZULJIN_FIREWALL, DATA_ZULJIN, DOOR_TYPE_ROOM },
|
{ GO_ZULJIN_FIREWALL, DATA_ZULJIN, DOOR_TYPE_ROOM },
|
||||||
|
{ GO_DOOR_HALAZZI, DATA_HALAZZI, DOOR_TYPE_ROOM },
|
||||||
|
{ GO_DOOR_AKILZON, DATA_AKILZON, DOOR_TYPE_ROOM },
|
||||||
|
{ GO_GATE_ZULJIN, DATA_HEXLORD, DOOR_TYPE_PASSAGE },
|
||||||
{ 0, 0, DOOR_TYPE_ROOM } // END
|
{ 0, 0, DOOR_TYPE_ROOM } // END
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -68,6 +64,9 @@ ObjectData const creatureData[] =
|
|||||||
|
|
||||||
ObjectData const gameObjectData[] =
|
ObjectData const gameObjectData[] =
|
||||||
{
|
{
|
||||||
|
{ GO_STRANGE_GONG, DATA_STRANGE_GONG },
|
||||||
|
{ GO_MASSIVE_GATE, DATA_MASSIVE_GATE },
|
||||||
|
{ GO_GATE_HEXLORD, DATA_HEXLORD_GATE },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -79,93 +78,34 @@ BossBoundaryData const boundaries =
|
|||||||
class instance_zulaman : public InstanceMapScript
|
class instance_zulaman : public InstanceMapScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
instance_zulaman()
|
instance_zulaman() : InstanceMapScript("instance_zulaman", 568) { }
|
||||||
: InstanceMapScript("instance_zulaman", 568)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
struct instance_zulaman_InstanceMapScript : public InstanceScript
|
struct instance_zulaman_InstanceMapScript : public InstanceScript
|
||||||
{
|
{
|
||||||
instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map) {}
|
||||||
|
|
||||||
ObjectGuid HarkorsSatchelGUID;
|
|
||||||
ObjectGuid TanzarsTrunkGUID;
|
|
||||||
ObjectGuid AshlisBagGUID;
|
|
||||||
ObjectGuid KrazsPackageGUID;
|
|
||||||
ObjectGuid StrangeGongGUID;
|
|
||||||
|
|
||||||
ObjectGuid HexLordGateGUID;
|
|
||||||
ObjectGuid ZulJinGateGUID;
|
|
||||||
ObjectGuid MassiveGateGUID;
|
|
||||||
ObjectGuid AkilzonDoorGUID;
|
|
||||||
ObjectGuid HalazziDoorGUID;
|
|
||||||
|
|
||||||
uint32 QuestTimer;
|
|
||||||
uint16 BossKilled;
|
|
||||||
uint16 QuestMinute;
|
|
||||||
uint16 ChestLooted;
|
|
||||||
|
|
||||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
|
||||||
uint32 RandVendor[RAND_VENDOR];
|
|
||||||
|
|
||||||
void Initialize() override
|
void Initialize() override
|
||||||
{
|
{
|
||||||
SetHeaders(DataHeader);
|
SetHeaders(DataHeader);
|
||||||
LoadObjectData(creatureData, gameObjectData);
|
|
||||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
|
||||||
SetBossNumber(MAX_ENCOUNTER);
|
SetBossNumber(MAX_ENCOUNTER);
|
||||||
|
SetPersistentDataCount(PersistentDataCount);
|
||||||
|
LoadObjectData(creatureData, gameObjectData);
|
||||||
LoadBossBoundaries(boundaries);
|
LoadBossBoundaries(boundaries);
|
||||||
LoadDoorData(doorData);
|
LoadDoorData(doorData);
|
||||||
|
|
||||||
QuestTimer = 0;
|
|
||||||
QuestMinute = 0;
|
|
||||||
BossKilled = 0;
|
|
||||||
ChestLooted = 0;
|
|
||||||
|
|
||||||
for (uint8 i = 0; i < RAND_VENDOR; ++i)
|
for (uint8 i = 0; i < RAND_VENDOR; ++i)
|
||||||
RandVendor[i] = NOT_STARTED;
|
RandVendor[i] = NOT_STARTED;
|
||||||
|
}
|
||||||
|
|
||||||
m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED;
|
void OnPlayerEnter(Player* /*player*/) override
|
||||||
|
{
|
||||||
|
if (!scheduler.IsGroupScheduled(GROUP_TIMED_RUN))
|
||||||
|
DoAction(ACTION_START_TIMED_RUN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnGameObjectCreate(GameObject* go) override
|
void OnGameObjectCreate(GameObject* go) override
|
||||||
{
|
{
|
||||||
switch (go->GetEntry())
|
if (go->GetEntry() == GO_GATE_HEXLORD)
|
||||||
{
|
|
||||||
case GO_DOOR_HALAZZI:
|
|
||||||
HalazziDoorGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_GATE_ZULJIN:
|
|
||||||
ZulJinGateGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_GATE_HEXLORD:
|
|
||||||
HexLordGateGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_MASSIVE_GATE:
|
|
||||||
MassiveGateGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_DOOR_AKILZON:
|
|
||||||
AkilzonDoorGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GO_HARKORS_SATCHEL:
|
|
||||||
HarkorsSatchelGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_TANZARS_TRUNK:
|
|
||||||
TanzarsTrunkGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_ASHLIS_BAG:
|
|
||||||
AshlisBagGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_KRAZS_PACKAGE:
|
|
||||||
KrazsPackageGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
case GO_STRANGE_GONG:
|
|
||||||
StrangeGongGUID = go->GetGUID();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
CheckInstanceStatus();
|
CheckInstanceStatus();
|
||||||
|
|
||||||
InstanceScript::OnGameObjectCreate(go);
|
InstanceScript::OnGameObjectCreate(go);
|
||||||
@@ -173,210 +113,128 @@ public:
|
|||||||
|
|
||||||
void SummonHostage(uint8 num)
|
void SummonHostage(uint8 num)
|
||||||
{
|
{
|
||||||
if (!QuestMinute)
|
if (!GetPersistentData(DATA_TIMED_RUN))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Map::PlayerList const& PlayerList = instance->GetPlayers();
|
instance->SummonCreature(HostageInfo[num].npc, HostageInfo[num].pos);
|
||||||
if (PlayerList.IsEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
Map::PlayerList::const_iterator i = PlayerList.begin();
|
|
||||||
if (Player* i_pl = i->GetSource())
|
|
||||||
{
|
|
||||||
if (Unit* Hostage = i_pl->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0))
|
|
||||||
{
|
|
||||||
Hostage->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
||||||
Hostage->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DoAction(int32 actionId) override
|
||||||
|
{
|
||||||
|
if (actionId == ACTION_START_TIMED_RUN)
|
||||||
|
{
|
||||||
|
if (uint32 timer = GetPersistentData(DATA_TIMED_RUN))
|
||||||
|
{
|
||||||
|
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
|
||||||
|
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduler.Schedule(1min, GROUP_TIMED_RUN, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (uint32 timer = GetPersistentData(DATA_TIMED_RUN))
|
||||||
|
{
|
||||||
|
--timer;
|
||||||
|
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
|
||||||
|
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, timer);
|
||||||
|
StorePersistentData(DATA_TIMED_RUN, timer);
|
||||||
|
context.Repeat();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckInstanceStatus()
|
void CheckInstanceStatus()
|
||||||
{
|
{
|
||||||
if (BossKilled >= DATA_HALAZZI)
|
if (AllBossesDone({ DATA_NALORAKK, DATA_AKILZON, DATA_JANALAI, DATA_HALAZZI }))
|
||||||
HandleGameObject(HexLordGateGUID, true);
|
HandleGameObject(ObjectGuid::Empty, true, GetGameObject(DATA_HEXLORD_GATE));
|
||||||
|
|
||||||
if (BossKilled >= DATA_HEXLORD)
|
|
||||||
HandleGameObject(ZulJinGateGUID, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetSaveData() override
|
|
||||||
{
|
|
||||||
OUT_SAVE_INST_DATA;
|
|
||||||
|
|
||||||
std::ostringstream ss;
|
|
||||||
ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute;
|
|
||||||
|
|
||||||
OUT_SAVE_INST_DATA_COMPLETE;
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Load(const char* load) override
|
|
||||||
{
|
|
||||||
if (!load)
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::istringstream ss(load);
|
|
||||||
char dataHead; // S
|
|
||||||
uint16 data1, data2, data3;
|
|
||||||
ss >> dataHead >> data1 >> data2 >> data3;
|
|
||||||
|
|
||||||
if (dataHead == 'S')
|
|
||||||
{
|
|
||||||
BossKilled = data1;
|
|
||||||
ChestLooted = data2;
|
|
||||||
QuestMinute = data3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_ERROR("misc", "Zul'aman: corrupted save data.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetData(uint32 type, uint32 data) override
|
void SetData(uint32 type, uint32 data) override
|
||||||
{
|
{
|
||||||
|
if (type == TYPE_RAND_VENDOR_1)
|
||||||
|
RandVendor[0] = data;
|
||||||
|
else if (type == TYPE_RAND_VENDOR_2)
|
||||||
|
RandVendor[1] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SetBossState(uint32 type, EncounterState state) override
|
||||||
|
{
|
||||||
|
if (!InstanceScript::SetBossState(type, state))
|
||||||
|
return false;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case DATA_GONGEVENT:
|
|
||||||
m_auiEncounter[DATA_GONGEVENT] = data;
|
|
||||||
if (data == IN_PROGRESS)
|
|
||||||
SaveToDB();
|
|
||||||
else if (data == DONE)
|
|
||||||
QuestMinute = 21;
|
|
||||||
break;
|
|
||||||
case DATA_NALORAKK:
|
case DATA_NALORAKK:
|
||||||
m_auiEncounter[DATA_NALORAKK] = data;
|
if (state == DONE)
|
||||||
if (data == DONE)
|
|
||||||
{
|
{
|
||||||
if (QuestMinute)
|
if (uint32 timer = GetPersistentData(DATA_TIMED_RUN))
|
||||||
{
|
{
|
||||||
QuestMinute += 15;
|
StorePersistentData(DATA_TIMED_RUN, timer += 15);
|
||||||
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
|
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, timer);
|
||||||
}
|
}
|
||||||
SummonHostage(0);
|
SummonHostage(0);
|
||||||
SaveToDB();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DATA_AKILZON:
|
case DATA_AKILZON:
|
||||||
m_auiEncounter[DATA_AKILZON] = data;
|
if (state == DONE)
|
||||||
HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS);
|
|
||||||
if (data == DONE)
|
|
||||||
{
|
{
|
||||||
if (QuestMinute)
|
if (uint32 timer = GetPersistentData(DATA_TIMED_RUN))
|
||||||
{
|
{
|
||||||
QuestMinute += 10;
|
StorePersistentData(DATA_TIMED_RUN, timer += 10);
|
||||||
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
|
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, timer);
|
||||||
}
|
}
|
||||||
SummonHostage(1);
|
SummonHostage(1);
|
||||||
SaveToDB();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DATA_JANALAI:
|
case DATA_JANALAI:
|
||||||
m_auiEncounter[DATA_JANALAI] = data;
|
if (state == DONE)
|
||||||
if (data == DONE)
|
|
||||||
SummonHostage(2);
|
SummonHostage(2);
|
||||||
SaveToDB();
|
|
||||||
break;
|
break;
|
||||||
case DATA_HALAZZI:
|
case DATA_HALAZZI:
|
||||||
m_auiEncounter[DATA_HALAZZI] = data;
|
if (state == DONE)
|
||||||
HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS);
|
SummonHostage(3);
|
||||||
if (data == DONE) SummonHostage(3);
|
|
||||||
SaveToDB();
|
|
||||||
break;
|
break;
|
||||||
case DATA_HEXLORD:
|
case DATA_HEXLORD:
|
||||||
m_auiEncounter[DATA_HEXLORD] = data;
|
if (state == IN_PROGRESS)
|
||||||
if (data == IN_PROGRESS)
|
HandleGameObject(ObjectGuid::Empty, false, GetGameObject(DATA_HEXLORD_GATE));
|
||||||
HandleGameObject(HexLordGateGUID, false);
|
else if (state == NOT_STARTED)
|
||||||
else if (data == NOT_STARTED)
|
|
||||||
CheckInstanceStatus();
|
CheckInstanceStatus();
|
||||||
SaveToDB();
|
|
||||||
break;
|
|
||||||
case DATA_CHESTLOOTED:
|
|
||||||
++ChestLooted;
|
|
||||||
SaveToDB();
|
|
||||||
break;
|
|
||||||
case TYPE_RAND_VENDOR_1:
|
|
||||||
RandVendor[0] = data;
|
|
||||||
break;
|
|
||||||
case TYPE_RAND_VENDOR_2:
|
|
||||||
RandVendor[1] = data;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data == DONE)
|
if (state == DONE)
|
||||||
{
|
{
|
||||||
++BossKilled;
|
if (GetPersistentData(DATA_TIMED_RUN) && AllBossesDone({ DATA_NALORAKK, DATA_AKILZON, DATA_JANALAI, DATA_HALAZZI }))
|
||||||
if (QuestMinute && BossKilled >= DATA_HALAZZI)
|
|
||||||
{
|
{
|
||||||
QuestMinute = 0;
|
StorePersistentData(DATA_TIMED_RUN, 0);
|
||||||
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
|
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckInstanceStatus();
|
CheckInstanceStatus();
|
||||||
SaveToDB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GetData(uint32 type) const override
|
uint32 GetData(uint32 type) const override
|
||||||
{
|
{
|
||||||
switch (type)
|
if (type == TYPE_RAND_VENDOR_1)
|
||||||
{
|
|
||||||
case DATA_GONGEVENT:
|
|
||||||
return m_auiEncounter[DATA_GONGEVENT];
|
|
||||||
case DATA_NALORAKK:
|
|
||||||
return m_auiEncounter[DATA_NALORAKK];
|
|
||||||
case DATA_AKILZON:
|
|
||||||
return m_auiEncounter[DATA_AKILZON];
|
|
||||||
case DATA_JANALAI:
|
|
||||||
return m_auiEncounter[DATA_JANALAI];
|
|
||||||
case DATA_HALAZZI:
|
|
||||||
return m_auiEncounter[DATA_HALAZZI];
|
|
||||||
case DATA_HEXLORD:
|
|
||||||
return m_auiEncounter[DATA_HEXLORD];
|
|
||||||
case DATA_ZULJIN:
|
|
||||||
return m_auiEncounter[DATA_ZULJIN];
|
|
||||||
case DATA_CHESTLOOTED:
|
|
||||||
return ChestLooted;
|
|
||||||
case TYPE_RAND_VENDOR_1:
|
|
||||||
return RandVendor[0];
|
return RandVendor[0];
|
||||||
case TYPE_RAND_VENDOR_2:
|
else if (type == TYPE_RAND_VENDOR_2)
|
||||||
return RandVendor[1];
|
return RandVendor[1];
|
||||||
default:
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void Update(uint32 diff) override
|
void Update(uint32 diff) override
|
||||||
{
|
{
|
||||||
if (QuestMinute)
|
scheduler.Update(diff);
|
||||||
{
|
|
||||||
if (QuestTimer <= diff)
|
|
||||||
{
|
|
||||||
QuestMinute--;
|
|
||||||
SaveToDB();
|
|
||||||
QuestTimer += 60000;
|
|
||||||
if (QuestMinute)
|
|
||||||
{
|
|
||||||
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
|
|
||||||
DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
|
|
||||||
}
|
|
||||||
else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
|
|
||||||
}
|
|
||||||
QuestTimer -= diff;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectGuid GetGuidData(uint32 type) const override
|
private:
|
||||||
{
|
uint32 RandVendor[RAND_VENDOR];
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case GO_STRANGE_GONG:
|
|
||||||
return StrangeGongGUID;
|
|
||||||
case GO_MASSIVE_GATE:
|
|
||||||
return MassiveGateGUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ObjectGuid::Empty;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||||
|
|||||||
@@ -63,87 +63,23 @@ enum ForestFrog
|
|||||||
NPC_BRENNAN = 24453,
|
NPC_BRENNAN = 24453,
|
||||||
NPC_HOLLEE = 24455,
|
NPC_HOLLEE = 24455,
|
||||||
|
|
||||||
// Says
|
// Adarrah is spawned elsewhere.
|
||||||
SAY_MANNUTH_0 = 0,
|
// So her text 0 isn't used in this instance.
|
||||||
SAY_MANNUTH_1 = 1,
|
SAY_THANKS_FREED = 0,
|
||||||
SAY_MANNUTH_2 = 2,
|
SAY_CHEST_SPAWN = 1,
|
||||||
SAY_MANNUTH_3 = 3,
|
SAY_CHEST_TALK = 2,
|
||||||
|
SAY_GOODBYE = 3,
|
||||||
|
|
||||||
SAY_DEEZ_0 = 0,
|
POINT_DESPAWN = 1,
|
||||||
SAY_DEEZ_1 = 1,
|
|
||||||
SAY_DEEZ_2 = 2,
|
|
||||||
SAY_DEEZ_3 = 3,
|
|
||||||
|
|
||||||
SAY_GALATHRYN_0 = 0,
|
|
||||||
SAY_GALATHRYN_1 = 1,
|
|
||||||
SAY_GALATHRYN_2 = 2,
|
|
||||||
SAY_GALATHRYN_3 = 3,
|
|
||||||
|
|
||||||
SAY_ADARRAH_1 = 1,
|
|
||||||
SAY_ADARRAH_2 = 2,
|
|
||||||
SAY_ADARRAH_3 = 3,
|
|
||||||
SAY_ADARRAH_4 = 4,
|
|
||||||
|
|
||||||
SAY_DARWEN_0 = 0,
|
|
||||||
SAY_DARWEN_1 = 1,
|
|
||||||
SAY_DARWEN_2 = 2,
|
|
||||||
SAY_DARWEN_3 = 3,
|
|
||||||
|
|
||||||
SAY_FUDGERICK_0 = 0,
|
|
||||||
SAY_FUDGERICK_1 = 1,
|
|
||||||
SAY_FUDGERICK_2 = 2,
|
|
||||||
SAY_FUDGERICK_3 = 3,
|
|
||||||
|
|
||||||
SAY_GUNTER_0 = 0,
|
|
||||||
SAY_GUNTER_1 = 1,
|
|
||||||
SAY_GUNTER_2 = 2,
|
|
||||||
|
|
||||||
SAY_KYREN_0 = 0,
|
|
||||||
SAY_KYREN_1 = 1,
|
|
||||||
SAY_KYREN_2 = 2,
|
|
||||||
|
|
||||||
SAY_MITZI_0 = 0,
|
|
||||||
SAY_MITZI_1 = 1,
|
|
||||||
SAY_MITZI_2 = 2,
|
|
||||||
SAY_MITZI_3 = 3,
|
|
||||||
|
|
||||||
SAY_CHRISTIAN_0 = 0,
|
|
||||||
SAY_CHRISTIAN_1 = 1,
|
|
||||||
SAY_CHRISTIAN_2 = 2,
|
|
||||||
SAY_CHRISTIAN_3 = 3,
|
|
||||||
|
|
||||||
SAY_BRENNAN_0 = 0,
|
|
||||||
SAY_BRENNAN_1 = 1,
|
|
||||||
SAY_BRENNAN_2 = 2,
|
|
||||||
SAY_BRENNAN_3 = 3,
|
|
||||||
|
|
||||||
SAY_HOLLEE_0 = 0,
|
|
||||||
SAY_HOLLEE_1 = 1,
|
|
||||||
SAY_HOLLEE_2 = 2,
|
|
||||||
SAY_HOLLEE_3 = 3,
|
|
||||||
|
|
||||||
POINT_DESPAWN = 1
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class npc_forest_frog : public CreatureScript
|
struct npc_forest_frog : public ScriptedAI
|
||||||
{
|
{
|
||||||
public:
|
npc_forest_frog(Creature* creature) : ScriptedAI(creature)
|
||||||
npc_forest_frog() : CreatureScript("npc_forest_frog") { }
|
|
||||||
|
|
||||||
struct npc_forest_frogAI : public ScriptedAI
|
|
||||||
{
|
|
||||||
npc_forest_frogAI(Creature* creature) : ScriptedAI(creature)
|
|
||||||
{
|
{
|
||||||
instance = creature->GetInstanceScript();
|
instance = creature->GetInstanceScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceScript* instance;
|
|
||||||
EventMap events;
|
|
||||||
uint8 eventTimer;
|
|
||||||
ObjectGuid PlayerGUID;
|
|
||||||
|
|
||||||
void Reset() override { }
|
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override { }
|
void JustEngagedWith(Unit* /*who*/) override { }
|
||||||
|
|
||||||
void MovementInform(uint32 type, uint32 data) override
|
void MovementInform(uint32 type, uint32 data) override
|
||||||
@@ -161,45 +97,12 @@ public:
|
|||||||
switch (events.ExecuteEvent())
|
switch (events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
switch (me->GetEntry())
|
|
||||||
{
|
if (me->GetEntry() == NPC_ADARRAH)
|
||||||
case NPC_MANNUTH:
|
Talk(SAY_THANKS_FREED + 1, player);
|
||||||
Talk(SAY_MANNUTH_0, player);
|
else
|
||||||
break;
|
Talk(SAY_THANKS_FREED, player);
|
||||||
case NPC_DEEZ:
|
|
||||||
Talk(SAY_DEEZ_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_GALATHRYN:
|
|
||||||
Talk(SAY_GALATHRYN_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_ADARRAH:
|
|
||||||
Talk(SAY_ADARRAH_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_DARWEN:
|
|
||||||
Talk(SAY_DARWEN_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_FUDGERICK:
|
|
||||||
Talk(SAY_FUDGERICK_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_GUNTER:
|
|
||||||
Talk(SAY_GUNTER_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_KYREN:
|
|
||||||
Talk(SAY_KYREN_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_MITZI:
|
|
||||||
Talk(SAY_MITZI_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_CHRISTIAN:
|
|
||||||
Talk(SAY_CHRISTIAN_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_BRENNAN:
|
|
||||||
Talk(SAY_BRENNAN_0, player);
|
|
||||||
break;
|
|
||||||
case NPC_HOLLEE:
|
|
||||||
Talk(SAY_HOLLEE_0, player);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
eventTimer = 2;
|
eventTimer = 2;
|
||||||
events.ScheduleEvent(eventTimer, urand(4000, 5000));
|
events.ScheduleEvent(eventTimer, urand(4000, 5000));
|
||||||
break;
|
break;
|
||||||
@@ -210,52 +113,31 @@ public:
|
|||||||
switch (me->GetEntry())
|
switch (me->GetEntry())
|
||||||
{
|
{
|
||||||
case NPC_MANNUTH:
|
case NPC_MANNUTH:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true);
|
|
||||||
Talk(SAY_MANNUTH_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_DEEZ:
|
case NPC_DEEZ:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true);
|
|
||||||
Talk(SAY_DEEZ_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_GALATHRYN:
|
case NPC_GALATHRYN:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true);
|
DoCastSelf(SPELL_SUMMON_AMANI_CHARM_CHEST_2, true);
|
||||||
Talk(SAY_GALATHRYN_1, player);
|
Talk(SAY_CHEST_SPAWN, player);
|
||||||
break;
|
break;
|
||||||
case NPC_ADARRAH:
|
case NPC_ADARRAH:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_2, true);
|
DoCastSelf(SPELL_SUMMON_AMANI_CHARM_CHEST_2, true);
|
||||||
Talk(SAY_ADARRAH_2, player);
|
Talk(SAY_CHEST_SPAWN + 1, player);
|
||||||
break;
|
break;
|
||||||
case NPC_DARWEN:
|
case NPC_DARWEN:
|
||||||
DoCast(me, SPELL_SUMMON_MONEY_BAG, true);
|
|
||||||
me->LoadEquipment(0, true);
|
|
||||||
Talk(SAY_DARWEN_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_FUDGERICK:
|
case NPC_FUDGERICK:
|
||||||
DoCast(me, SPELL_SUMMON_MONEY_BAG, true);
|
DoCastSelf(SPELL_SUMMON_MONEY_BAG, true);
|
||||||
me->LoadEquipment(0, true);
|
me->LoadEquipment(0, true);
|
||||||
Talk(SAY_FUDGERICK_1, player);
|
Talk(SAY_CHEST_SPAWN, player);
|
||||||
break;
|
|
||||||
case NPC_GUNTER:
|
|
||||||
Talk(SAY_GUNTER_1, player);
|
|
||||||
break;
|
break;
|
||||||
case NPC_KYREN:
|
case NPC_KYREN:
|
||||||
Talk(SAY_KYREN_1, player);
|
case NPC_GUNTER:
|
||||||
|
Talk(SAY_CHEST_SPAWN, player);
|
||||||
break;
|
break;
|
||||||
case NPC_MITZI:
|
case NPC_MITZI:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true);
|
|
||||||
Talk(SAY_MITZI_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_CHRISTIAN:
|
case NPC_CHRISTIAN:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true);
|
|
||||||
Talk(SAY_CHRISTIAN_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_BRENNAN:
|
case NPC_BRENNAN:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true);
|
|
||||||
Talk(SAY_BRENNAN_1, player);
|
|
||||||
break;
|
|
||||||
case NPC_HOLLEE:
|
case NPC_HOLLEE:
|
||||||
DoCast(me, SPELL_SUMMON_AMANI_CHARM_CHEST_1, true);
|
DoCastSelf(SPELL_SUMMON_AMANI_CHARM_CHEST_1, true);
|
||||||
Talk(SAY_HOLLEE_1, player);
|
Talk(SAY_CHEST_SPAWN, player);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
eventTimer = 3;
|
eventTimer = 3;
|
||||||
@@ -263,45 +145,12 @@ public:
|
|||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
me->SetStandState(EMOTE_ONESHOT_NONE);
|
me->SetStandState(EMOTE_ONESHOT_NONE);
|
||||||
switch (me->GetEntry())
|
|
||||||
{
|
if (me->GetEntry() == NPC_ADARRAH)
|
||||||
case NPC_MANNUTH:
|
Talk(SAY_CHEST_TALK + 1, player);
|
||||||
Talk(SAY_MANNUTH_2, player);
|
else
|
||||||
break;
|
Talk(SAY_CHEST_TALK);
|
||||||
case NPC_DEEZ:
|
|
||||||
Talk(SAY_DEEZ_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_GALATHRYN:
|
|
||||||
Talk(SAY_GALATHRYN_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_ADARRAH:
|
|
||||||
Talk(SAY_ADARRAH_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_DARWEN:
|
|
||||||
Talk(SAY_DARWEN_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_FUDGERICK:
|
|
||||||
Talk(SAY_FUDGERICK_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_GUNTER:
|
|
||||||
Talk(SAY_GUNTER_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_KYREN:
|
|
||||||
Talk(SAY_KYREN_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_MITZI:
|
|
||||||
Talk(SAY_MITZI_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_CHRISTIAN:
|
|
||||||
Talk(SAY_CHRISTIAN_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_BRENNAN:
|
|
||||||
Talk(SAY_BRENNAN_2, player);
|
|
||||||
break;
|
|
||||||
case NPC_HOLLEE:
|
|
||||||
Talk(SAY_HOLLEE_2, player);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
eventTimer = 4;
|
eventTimer = 4;
|
||||||
if (me->GetEntry() == NPC_GUNTER || me->GetEntry() == NPC_KYREN)
|
if (me->GetEntry() == NPC_GUNTER || me->GetEntry() == NPC_KYREN)
|
||||||
events.ScheduleEvent(eventTimer, 5 * MINUTE * IN_MILLISECONDS); // vendors wait for 5 minutes before running away and despawning
|
events.ScheduleEvent(eventTimer, 5 * MINUTE * IN_MILLISECONDS); // vendors wait for 5 minutes before running away and despawning
|
||||||
@@ -310,49 +159,20 @@ public:
|
|||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE);
|
me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE);
|
||||||
switch (me->GetEntry())
|
|
||||||
{
|
if (me->GetEntry() == NPC_ADARRAH)
|
||||||
case NPC_MANNUTH:
|
Talk(SAY_GOODBYE + 1, player);
|
||||||
Talk(SAY_MANNUTH_3, player);
|
else
|
||||||
break;
|
Talk(SAY_GOODBYE);
|
||||||
case NPC_DEEZ:
|
|
||||||
Talk(SAY_DEEZ_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_GALATHRYN:
|
|
||||||
Talk(SAY_GALATHRYN_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_ADARRAH:
|
|
||||||
Talk(SAY_ADARRAH_4, player);
|
|
||||||
break;
|
|
||||||
case NPC_DARWEN:
|
|
||||||
Talk(SAY_DARWEN_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_FUDGERICK:
|
|
||||||
Talk(SAY_FUDGERICK_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_MITZI:
|
|
||||||
Talk(SAY_MITZI_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_CHRISTIAN:
|
|
||||||
Talk(SAY_CHRISTIAN_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_BRENNAN:
|
|
||||||
Talk(SAY_BRENNAN_3, player);
|
|
||||||
break;
|
|
||||||
case NPC_HOLLEE:
|
|
||||||
Talk(SAY_HOLLEE_3, player);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
eventTimer = 5;
|
eventTimer = 5;
|
||||||
events.ScheduleEvent(eventTimer, 2000);
|
events.ScheduleEvent(eventTimer, 2000);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
switch (me->GetEntry())
|
|
||||||
{
|
if (me->GetEntry() == NPC_ADARRAH)
|
||||||
case NPC_ADARRAH:
|
DoCastSelf(SPELL_STEALTH_, true);
|
||||||
DoCast(me, SPELL_STEALTH_, true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (me->GetPositionY() > 1290.0f)
|
if (me->GetPositionY() > 1290.0f)
|
||||||
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, 118.2742f, 1400.657f, -9.118711f);
|
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, 118.2742f, 1400.657f, -9.118711f);
|
||||||
else
|
else
|
||||||
@@ -365,39 +185,13 @@ public:
|
|||||||
|
|
||||||
void DoSpawnRandom()
|
void DoSpawnRandom()
|
||||||
{
|
{
|
||||||
if (instance)
|
auto const& entries =
|
||||||
{
|
{
|
||||||
uint32 cEntry = NPC_MANNUTH;
|
NPC_MANNUTH, NPC_DEEZ, NPC_GALATHRYN, NPC_ADARRAH, NPC_FUDGERICK, NPC_DARWEN, NPC_MITZI,
|
||||||
switch (urand(0, 9))
|
NPC_CHRISTIAN, NPC_BRENNAN, NPC_HOLLEE
|
||||||
{
|
};
|
||||||
case 1:
|
|
||||||
cEntry = NPC_DEEZ;
|
uint32 cEntry = Acore::Containers::SelectRandomContainerElement(entries);
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
cEntry = NPC_GALATHRYN;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
cEntry = NPC_ADARRAH;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
cEntry = NPC_FUDGERICK;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
cEntry = NPC_DARWEN;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
cEntry = NPC_MITZI;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
cEntry = NPC_CHRISTIAN;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
cEntry = NPC_BRENNAN;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
cEntry = NPC_HOLLEE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!instance->GetData(TYPE_RAND_VENDOR_1) && roll_chance_i(10))
|
if (!instance->GetData(TYPE_RAND_VENDOR_1) && roll_chance_i(10))
|
||||||
{
|
{
|
||||||
@@ -416,7 +210,6 @@ public:
|
|||||||
|
|
||||||
me->UpdateEntry(cEntry);
|
me->UpdateEntry(cEntry);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void SpellHit(Unit* caster, SpellInfo const* spell) override
|
void SpellHit(Unit* caster, SpellInfo const* spell) override
|
||||||
{
|
{
|
||||||
@@ -429,18 +222,18 @@ public:
|
|||||||
if (roll_chance_i(2))
|
if (roll_chance_i(2))
|
||||||
{
|
{
|
||||||
DoCast(caster, SPELL_PUSH_MOJO, true);
|
DoCast(caster, SPELL_PUSH_MOJO, true);
|
||||||
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ());
|
me->GetMotionMaster()->MovePoint(POINT_DESPAWN, caster->GetPosition());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DoSpawnRandom();
|
DoSpawnRandom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
private:
|
||||||
{
|
InstanceScript* instance;
|
||||||
return GetZulAmanAI<npc_forest_frogAI>(creature);
|
EventMap events;
|
||||||
}
|
uint8 eventTimer;
|
||||||
|
ObjectGuid PlayerGUID;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*######
|
/*######
|
||||||
@@ -467,8 +260,6 @@ public:
|
|||||||
bool IsLoot;
|
bool IsLoot;
|
||||||
ObjectGuid PlayerGUID;
|
ObjectGuid PlayerGUID;
|
||||||
|
|
||||||
void Reset() override { }
|
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override { }
|
void JustEngagedWith(Unit* /*who*/) override { }
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
@@ -508,23 +299,16 @@ public:
|
|||||||
|
|
||||||
creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||||
|
|
||||||
InstanceScript* instance = creature->GetInstanceScript();
|
|
||||||
if (instance)
|
|
||||||
{
|
|
||||||
//uint8 progress = instance->GetData(DATA_CHESTLOOTED);
|
|
||||||
instance->SetData(DATA_CHESTLOOTED, 0);
|
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
creature->GetPosition(x, y, z);
|
creature->GetPosition(x, y, z);
|
||||||
uint32 entry = creature->GetEntry();
|
|
||||||
for (uint8 i = 0; i < 4; ++i)
|
for (uint8 i = 0; i < 4; ++i)
|
||||||
{
|
{
|
||||||
if (HostageEntry[i] == entry)
|
if (HostageEntry[i] == creature->GetEntry())
|
||||||
{
|
{
|
||||||
creature->SummonGameObject(ChestEntry[i], x - 2, y, z, 0, 0, 0, 0, 0, 0);
|
creature->SummonGameObject(ChestEntry[i], x - 2, y, z, 0, 0, 0, 0, 0, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -591,26 +375,13 @@ enum Weapons
|
|||||||
WEAPON_SPEAR = 13631
|
WEAPON_SPEAR = 13631
|
||||||
};
|
};
|
||||||
|
|
||||||
class npc_harrison_jones : public CreatureScript
|
struct npc_harrison_jones : public ScriptedAI
|
||||||
{
|
{
|
||||||
public:
|
npc_harrison_jones(Creature* creature) : ScriptedAI(creature)
|
||||||
npc_harrison_jones() : CreatureScript("npc_harrison_jones")
|
|
||||||
{
|
{
|
||||||
|
_instance = creature->GetInstanceScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct npc_harrison_jonesAI : public ScriptedAI
|
|
||||||
{
|
|
||||||
npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature)
|
|
||||||
{
|
|
||||||
instance = creature->GetInstanceScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceScript* instance;
|
|
||||||
|
|
||||||
uint8 _gongEvent;
|
|
||||||
uint32 _gongTimer;
|
|
||||||
ObjectGuid uiTargetGUID;
|
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
_gongEvent = 0;
|
_gongEvent = 0;
|
||||||
@@ -643,7 +414,8 @@ public:
|
|||||||
me->SetTarget();
|
me->SetTarget();
|
||||||
me->SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_STAND_STATE, UNIT_STAND_STATE_DEAD);
|
me->SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_STAND_STATE, UNIT_STAND_STATE_DEAD);
|
||||||
me->SetDynamicFlag(UNIT_DYNFLAG_DEAD);
|
me->SetDynamicFlag(UNIT_DYNFLAG_DEAD);
|
||||||
instance->SetData(DATA_GONGEVENT, DONE);
|
_instance->StorePersistentData(DATA_TIMED_RUN, 21);
|
||||||
|
_instance->DoAction(ACTION_START_TIMED_RUN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -663,39 +435,27 @@ public:
|
|||||||
case GONG_EVENT_2:
|
case GONG_EVENT_2:
|
||||||
me->SetFacingTo(6.235659f);
|
me->SetFacingTo(6.235659f);
|
||||||
Talk(SAY_HARRISON_1);
|
Talk(SAY_HARRISON_1);
|
||||||
DoCast(me, SPELL_BANGING_THE_GONG);
|
DoCastSelf(SPELL_BANGING_THE_GONG);
|
||||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE));
|
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE));
|
||||||
me->SetSheath(SHEATH_STATE_MELEE);
|
me->SetSheath(SHEATH_STATE_MELEE);
|
||||||
_gongEvent = GONG_EVENT_3;
|
_gongEvent = GONG_EVENT_3;
|
||||||
_gongTimer = 4000;
|
_gongTimer = 4000;
|
||||||
break;
|
break;
|
||||||
case GONG_EVENT_3:
|
case GONG_EVENT_3:
|
||||||
if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG)))
|
if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG))
|
||||||
gong->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
gong->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
||||||
_gongEvent = GONG_EVENT_4;
|
_gongEvent = GONG_EVENT_4;
|
||||||
_gongTimer = 105000;
|
_gongTimer = 105000;
|
||||||
break;
|
break;
|
||||||
case GONG_EVENT_4:
|
case GONG_EVENT_4:
|
||||||
me->RemoveAura(SPELL_BANGING_THE_GONG);
|
me->RemoveAura(SPELL_BANGING_THE_GONG);
|
||||||
if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG)))
|
if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG))
|
||||||
gong->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
gong->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
||||||
|
|
||||||
// trigger or gong will need to be scripted to set IN_PROGRESS after enough hits.
|
|
||||||
// This is temp workaround.
|
|
||||||
instance->SetData(DATA_GONGEVENT, IN_PROGRESS); // to be removed.
|
|
||||||
|
|
||||||
if (instance->GetData(DATA_GONGEVENT) == IN_PROGRESS)
|
|
||||||
{
|
|
||||||
// Players are Now Saved to instance at SPECIAL (Player should be notified?)
|
// Players are Now Saved to instance at SPECIAL (Player should be notified?)
|
||||||
me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false);
|
me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false);
|
||||||
_gongEvent = GONG_EVENT_5;
|
_gongEvent = GONG_EVENT_5;
|
||||||
_gongTimer = 5000;
|
_gongTimer = 5000;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_gongTimer = 1000;
|
|
||||||
_gongEvent = GONG_EVENT_9;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GONG_EVENT_5:
|
case GONG_EVENT_5:
|
||||||
me->SetEntry(NPC_HARRISON_JONES_1);
|
me->SetEntry(NPC_HARRISON_JONES_1);
|
||||||
@@ -717,35 +477,32 @@ public:
|
|||||||
GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
|
GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
|
||||||
if (!targetList.empty())
|
if (!targetList.empty())
|
||||||
{
|
{
|
||||||
for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
|
for (auto const& creature : targetList)
|
||||||
{
|
{
|
||||||
if (Creature* ptarget = *itr)
|
if (creature)
|
||||||
{
|
{
|
||||||
if (ptarget->GetPositionX() > 120)
|
creature->SetImmuneToPC(true);
|
||||||
|
creature->SetReactState(REACT_PASSIVE);
|
||||||
|
|
||||||
|
if (creature->GetPositionX() > 120)
|
||||||
{
|
{
|
||||||
ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
|
creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
|
||||||
ptarget->SetImmuneToPC(true);
|
creature->AI()->SetData(0, 1);
|
||||||
ptarget->SetReactState(REACT_PASSIVE);
|
|
||||||
ptarget->AI()->SetData(0, 1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
creature->AI()->SetData(0, 2);
|
||||||
ptarget->SetImmuneToPC(true);
|
|
||||||
ptarget->SetReactState(REACT_PASSIVE);
|
|
||||||
ptarget->AI()->SetData(0, 2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetGuidData(GO_MASSIVE_GATE)))
|
if (GameObject* gate = _instance->GetGameObject(DATA_MASSIVE_GATE))
|
||||||
gate->SetGoState(GO_STATE_ACTIVE);
|
gate->SetGoState(GO_STATE_ACTIVE);
|
||||||
_gongTimer = 2000;
|
_gongTimer = 2000;
|
||||||
_gongEvent = GONG_EVENT_8;
|
_gongEvent = GONG_EVENT_8;
|
||||||
break;
|
break;
|
||||||
case GONG_EVENT_8:
|
case GONG_EVENT_8:
|
||||||
DoCast(me, SPELL_STEALTH);
|
DoCastSelf(SPELL_STEALTH);
|
||||||
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
|
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
|
||||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
|
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
|
||||||
me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false);
|
me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false);
|
||||||
@@ -764,8 +521,6 @@ public:
|
|||||||
break;
|
break;
|
||||||
case GONG_EVENT_11:
|
case GONG_EVENT_11:
|
||||||
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||||
|
|
||||||
instance->SetData(DATA_GONGEVENT, NOT_STARTED);
|
|
||||||
_gongEvent = 0;
|
_gongEvent = 0;
|
||||||
_gongTimer = 1000;
|
_gongTimer = 1000;
|
||||||
break;
|
break;
|
||||||
@@ -775,17 +530,17 @@ public:
|
|||||||
_gongTimer -= diff;
|
_gongTimer -= diff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
private:
|
||||||
{
|
InstanceScript* _instance;
|
||||||
return GetZulAmanAI<npc_harrison_jonesAI>(creature);
|
uint8 _gongEvent;
|
||||||
}
|
uint32 _gongTimer;
|
||||||
|
ObjectGuid uiTargetGUID;
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_zulaman()
|
void AddSC_zulaman()
|
||||||
{
|
{
|
||||||
new npc_forest_frog();
|
RegisterZulAmanCreatureAI(npc_forest_frog);
|
||||||
new npc_zulaman_hostage();
|
new npc_zulaman_hostage();
|
||||||
new npc_harrison_jones();
|
RegisterZulAmanCreatureAI(npc_harrison_jones);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,18 +25,19 @@
|
|||||||
|
|
||||||
enum DataTypes
|
enum DataTypes
|
||||||
{
|
{
|
||||||
DATA_GONGEVENT = 0,
|
DATA_NALORAKK = 0,
|
||||||
DATA_NALORAKK = 1,
|
DATA_AKILZON = 1,
|
||||||
DATA_AKILZON = 2,
|
DATA_JANALAI = 2,
|
||||||
DATA_JANALAI = 3,
|
DATA_HALAZZI = 3,
|
||||||
DATA_HALAZZI = 4,
|
DATA_HEXLORD = 4,
|
||||||
DATA_HEXLORD = 5,
|
DATA_ZULJIN = 5,
|
||||||
DATA_ZULJIN = 6,
|
MAX_ENCOUNTER = 6,
|
||||||
MAX_ENCOUNTER = 7,
|
DATA_SPIRIT_LYNX = 7,
|
||||||
DATA_SPIRIT_LYNX = 8,
|
TYPE_RAND_VENDOR_1 = 8,
|
||||||
DATA_CHESTLOOTED = 9,
|
TYPE_RAND_VENDOR_2 = 9,
|
||||||
TYPE_RAND_VENDOR_1 = 10,
|
DATA_STRANGE_GONG = 10,
|
||||||
TYPE_RAND_VENDOR_2 = 11
|
DATA_MASSIVE_GATE = 11,
|
||||||
|
DATA_HEXLORD_GATE = 12
|
||||||
};
|
};
|
||||||
|
|
||||||
enum CreatureIds
|
enum CreatureIds
|
||||||
@@ -69,6 +70,15 @@ enum GameobjectIds
|
|||||||
GO_STRANGE_GONG = 187359
|
GO_STRANGE_GONG = 187359
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum MiscIds
|
||||||
|
{
|
||||||
|
DATA_TIMED_RUN = 0,
|
||||||
|
ACTION_START_TIMED_RUN = 0,
|
||||||
|
GROUP_TIMED_RUN = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32 constexpr PersistentDataCount = 1;
|
||||||
|
|
||||||
template <class AI, class T>
|
template <class AI, class T>
|
||||||
inline AI* GetZulAmanAI(T* obj)
|
inline AI* GetZulAmanAI(T* obj)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user