Merge
--HG-- branch : trunk
This commit is contained in:
+186
-99
@@ -2367,7 +2367,6 @@ void ObjectMgr::LoadItemPrototypes()
|
||||
void ObjectMgr::LoadVehicleAccessories()
|
||||
{
|
||||
m_VehicleAccessoryMap.clear(); // needed for reload case
|
||||
VehicleAccessoryList mVehicleList;
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
@@ -2408,9 +2407,7 @@ void ObjectMgr::LoadVehicleAccessories()
|
||||
continue;
|
||||
}
|
||||
|
||||
mVehicleList = GetVehicleAccessoryList(uiEntry);
|
||||
mVehicleList.push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion));
|
||||
m_VehicleAccessoryMap[uiEntry] = mVehicleList;
|
||||
m_VehicleAccessoryMap[uiEntry].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion));
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
@@ -8148,6 +8145,124 @@ void ObjectMgr::LoadMailLevelRewards()
|
||||
sLog.outString( ">> Loaded %u level dependent mail rewards,", count );
|
||||
}
|
||||
|
||||
bool ObjectMgr::AddSpellToTrainer(int32 entry, int32 spell, Field *fields, std::set<uint32> *skip_trainers, std::set<uint32> *talentIds)
|
||||
{
|
||||
CreatureInfo const* cInfo = GetCreatureTemplate(entry);
|
||||
|
||||
if(!cInfo && entry > 0)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` have entry for not existed creature template (Entry: %u), ignore", entry);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!(cInfo->npcflag & UNIT_NPC_FLAG_TRAINER))
|
||||
{
|
||||
if (skip_trainers->find(entry) == skip_trainers->end())
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` have data for not creature template (Entry: %u) without trainer flag, ignore", entry);
|
||||
skip_trainers->insert(entry);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
SpellEntry const *spellinfo = sSpellStore.LookupEntry(spell);
|
||||
if(!spellinfo)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` for Trainer (Entry: %u ) has non existing spell %u, ignore", entry,spell);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!SpellMgr::IsSpellValid(spellinfo))
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` for Trainer (Entry: %u) has broken learning spell %u, ignore", entry, spell);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(GetTalentSpellCost(spell))
|
||||
{
|
||||
if(talentIds->count(spell)==0)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` has talent as learning spell %u, ignore", spell);
|
||||
talentIds->insert(spell);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
TrainerSpellData& data = m_mCacheTrainerSpellMap[entry];
|
||||
|
||||
TrainerSpell& trainerSpell = data.spellList[spell];
|
||||
trainerSpell.spell = spell;
|
||||
trainerSpell.spellCost = fields[2].GetUInt32();
|
||||
trainerSpell.reqSkill = fields[3].GetUInt32();
|
||||
trainerSpell.reqSkillValue = fields[4].GetUInt32();
|
||||
trainerSpell.reqLevel = fields[5].GetUInt32();
|
||||
|
||||
if(!trainerSpell.reqLevel)
|
||||
trainerSpell.reqLevel = spellinfo->spellLevel;
|
||||
|
||||
// calculate learned spell for profession case when stored cast-spell
|
||||
trainerSpell.learnedSpell[0] = spell;
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
{
|
||||
if(spellinfo->Effect[i] != SPELL_EFFECT_LEARN_SPELL)
|
||||
continue;
|
||||
if (trainerSpell.learnedSpell[0] == spell)
|
||||
trainerSpell.learnedSpell[0] = 0;
|
||||
// player must be able to cast spell on himself
|
||||
if (spellinfo->EffectImplicitTargetA[i] != 0 && spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_TARGET_ALLY
|
||||
&& spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_TARGET_ANY && spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_CASTER)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` has spell %u for trainer entry %u with learn effect which has incorrect target type, ignoring learn effect!", spell, entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
trainerSpell.learnedSpell[i] = spellinfo->EffectTriggerSpell[i];
|
||||
}
|
||||
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
{
|
||||
if (!trainerSpell.learnedSpell[i])
|
||||
continue;
|
||||
if(SpellMgr::IsProfessionSpell(trainerSpell.learnedSpell[i]))
|
||||
{
|
||||
data.trainerType = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int ObjectMgr::LoadReferenceTrainer(int32 trainer, int32 spell, std::set<uint32> *skip_trainers, std::set<uint32> *talentIds)
|
||||
{
|
||||
QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT entry, spell,spellcost,reqskill,reqskillvalue,reqlevel FROM npc_trainer WHERE entry='%d'", spell);
|
||||
if ( !result )
|
||||
{
|
||||
barGoLink bar( 1 );
|
||||
|
||||
bar.step();
|
||||
return 0;
|
||||
}
|
||||
|
||||
barGoLink bar( result->GetRowCount() );
|
||||
|
||||
uint32 count = 0;
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
int32 spell = fields[1].GetInt32();
|
||||
if ( spell < 0 )
|
||||
count += this->LoadReferenceTrainer(trainer, -spell, skip_trainers, talentIds);
|
||||
else if ( this->AddSpellToTrainer(trainer, spell, fields, skip_trainers, talentIds) )
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadTrainerSpell()
|
||||
{
|
||||
// For reload case
|
||||
@@ -8182,92 +8297,11 @@ void ObjectMgr::LoadTrainerSpell()
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
uint32 spell = fields[1].GetUInt32();
|
||||
|
||||
CreatureInfo const* cInfo = GetCreatureTemplate(entry);
|
||||
|
||||
if(!cInfo)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` have entry for not existed creature template (Entry: %u), ignore", entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!(cInfo->npcflag & UNIT_NPC_FLAG_TRAINER))
|
||||
{
|
||||
if (skip_trainers.find(entry) == skip_trainers.end())
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` have data for not creature template (Entry: %u) without trainer flag, ignore", entry);
|
||||
skip_trainers.insert(entry);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
SpellEntry const *spellinfo = sSpellStore.LookupEntry(spell);
|
||||
if(!spellinfo)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` for Trainer (Entry: %u ) has non existing spell %u, ignore", entry,spell);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!SpellMgr::IsSpellValid(spellinfo))
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` for Trainer (Entry: %u) has broken learning spell %u, ignore", entry, spell);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(GetTalentSpellCost(spell))
|
||||
{
|
||||
if(talentIds.count(spell)==0)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` has talent as learning spell %u, ignore", spell);
|
||||
talentIds.insert(spell);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
TrainerSpellData& data = m_mCacheTrainerSpellMap[entry];
|
||||
|
||||
TrainerSpell& trainerSpell = data.spellList[spell];
|
||||
trainerSpell.spell = spell;
|
||||
trainerSpell.spellCost = fields[2].GetUInt32();
|
||||
trainerSpell.reqSkill = fields[3].GetUInt32();
|
||||
trainerSpell.reqSkillValue = fields[4].GetUInt32();
|
||||
trainerSpell.reqLevel = fields[5].GetUInt32();
|
||||
|
||||
if(!trainerSpell.reqLevel)
|
||||
trainerSpell.reqLevel = spellinfo->spellLevel;
|
||||
|
||||
// calculate learned spell for profession case when stored cast-spell
|
||||
trainerSpell.learnedSpell[0] = spell;
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
{
|
||||
if(spellinfo->Effect[i] != SPELL_EFFECT_LEARN_SPELL)
|
||||
continue;
|
||||
if (trainerSpell.learnedSpell[0] == spell)
|
||||
trainerSpell.learnedSpell[0] = 0;
|
||||
// player must be able to cast spell on himself
|
||||
if (spellinfo->EffectImplicitTargetA[i] != 0 && spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_TARGET_ALLY
|
||||
&& spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_TARGET_ANY && spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_CASTER)
|
||||
{
|
||||
sLog.outErrorDb("Table `npc_trainer` has spell %u for trainer entry %u with learn effect which has incorrect target type, ignoring learn effect!", spell, entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
trainerSpell.learnedSpell[i] = spellinfo->EffectTriggerSpell[i];
|
||||
}
|
||||
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
{
|
||||
if (!trainerSpell.learnedSpell[i])
|
||||
continue;
|
||||
if(SpellMgr::IsProfessionSpell(trainerSpell.learnedSpell[i]))
|
||||
{
|
||||
data.trainerType = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
++count;
|
||||
int32 spell = fields[1].GetInt32();
|
||||
if ( spell < 0 )
|
||||
count += this->LoadReferenceTrainer(entry, -spell, &skip_trainers, &talentIds);
|
||||
else if ( this->AddSpellToTrainer(entry, spell, fields, &skip_trainers, &talentIds) )
|
||||
++count;
|
||||
|
||||
} while (result->NextRow());
|
||||
|
||||
@@ -8275,6 +8309,52 @@ void ObjectMgr::LoadTrainerSpell()
|
||||
sLog.outString( ">> Loaded %d Trainers", count );
|
||||
}
|
||||
|
||||
int ObjectMgr::LoadReferenceVendor(int32 vendor, int32 item, std::set<uint32> *skip_vendors)
|
||||
{
|
||||
// find all items from the reference vendor
|
||||
QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT entry, item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry='%d'", item);
|
||||
if( !result )
|
||||
{
|
||||
barGoLink bar( 1 );
|
||||
|
||||
bar.step();
|
||||
return 0;
|
||||
}
|
||||
|
||||
barGoLink bar( result->GetRowCount() );
|
||||
|
||||
uint32 count = 0;
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
int32 item_id = fields[1].GetInt32();
|
||||
|
||||
// if item is a negative, its a reference
|
||||
if ( item_id < 0 )
|
||||
count += LoadReferenceVendor(vendor, -item_id, skip_vendors);
|
||||
else
|
||||
{
|
||||
int32 maxcount = fields[2].GetInt32();
|
||||
uint32 incrtime = fields[3].GetUInt32();
|
||||
uint32 ExtendedCost = fields[4].GetUInt32();
|
||||
|
||||
if(!IsVendorItemValid(vendor,item_id,maxcount,incrtime,ExtendedCost,NULL,skip_vendors))
|
||||
continue;
|
||||
|
||||
VendorItemData& vList = m_mCacheVendorItemMap[vendor];
|
||||
|
||||
vList.AddItem(item_id,maxcount,incrtime,ExtendedCost);
|
||||
++count;
|
||||
}
|
||||
|
||||
} while (result->NextRow());
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadVendors()
|
||||
{
|
||||
// For reload case
|
||||
@@ -8305,18 +8385,25 @@ void ObjectMgr::LoadVendors()
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
uint32 item_id = fields[1].GetUInt32();
|
||||
int32 maxcount = fields[2].GetInt32();
|
||||
uint32 incrtime = fields[3].GetUInt32();
|
||||
uint32 ExtendedCost = fields[4].GetUInt32();
|
||||
int32 item_id = fields[1].GetInt32();
|
||||
|
||||
if(!IsVendorItemValid(entry,item_id,maxcount,incrtime,ExtendedCost,NULL,&skip_vendors))
|
||||
continue;
|
||||
// if item is a negative, its a reference
|
||||
if ( item_id < 0 )
|
||||
count += LoadReferenceVendor(entry, -item_id, &skip_vendors);
|
||||
else
|
||||
{
|
||||
int32 maxcount = fields[2].GetInt32();
|
||||
uint32 incrtime = fields[3].GetUInt32();
|
||||
uint32 ExtendedCost = fields[4].GetUInt32();
|
||||
|
||||
VendorItemData& vList = m_mCacheVendorItemMap[entry];
|
||||
if(!IsVendorItemValid(entry,item_id,maxcount,incrtime,ExtendedCost,NULL,&skip_vendors))
|
||||
continue;
|
||||
|
||||
vList.AddItem(item_id,maxcount,incrtime,ExtendedCost);
|
||||
++count;
|
||||
VendorItemData& vList = m_mCacheVendorItemMap[entry];
|
||||
|
||||
vList.AddItem(item_id,maxcount,incrtime,ExtendedCost);
|
||||
++count;
|
||||
}
|
||||
|
||||
} while (result->NextRow());
|
||||
|
||||
|
||||
@@ -429,6 +429,7 @@ class ObjectMgr
|
||||
Player* GetPlayer(uint64 guid) const { return ObjectAccessor::FindPlayer(guid); }
|
||||
|
||||
static GameObjectInfo const *GetGameObjectInfo(uint32 id) { return sGOStorage.LookupEntry<GameObjectInfo>(id); }
|
||||
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32> *skip_vendors);
|
||||
|
||||
void LoadGameobjectInfo();
|
||||
void AddGameobjectInfo(GameObjectInfo *goinfo);
|
||||
@@ -582,13 +583,12 @@ class ObjectMgr
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VehicleAccessoryList GetVehicleAccessoryList(uint32 uiEntry)
|
||||
VehicleAccessoryList const* GetVehicleAccessoryList(uint32 uiEntry) const
|
||||
{
|
||||
VehicleAccessoryList mVehList;
|
||||
VehicleAccessoryMap::const_iterator itr = m_VehicleAccessoryMap.find(uiEntry);
|
||||
if (itr != m_VehicleAccessoryMap.end())
|
||||
mVehList = itr->second;
|
||||
return mVehList;
|
||||
return &itr->second;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void LoadGuilds();
|
||||
@@ -691,6 +691,8 @@ class ObjectMgr
|
||||
|
||||
void LoadVendors();
|
||||
void LoadTrainerSpell();
|
||||
bool AddSpellToTrainer(int32 entry, int32 spell, Field *fields, std::set<uint32> *skip_trainers, std::set<uint32> *talentIds);
|
||||
int LoadReferenceTrainer(int32 trainer, int32 spell, std::set<uint32> *skip_trainers, std::set<uint32> *talentIds);
|
||||
void LoadGMTickets();
|
||||
|
||||
std::string GeneratePetName(uint32 entry);
|
||||
|
||||
+6
-50
@@ -91,56 +91,12 @@ void Vehicle::Install()
|
||||
|
||||
void Vehicle::InstallAllAccessories()
|
||||
{
|
||||
VehicleAccessoryList mVehicleList = objmgr.GetVehicleAccessoryList(me->GetEntry());
|
||||
if (mVehicleList.size())
|
||||
for (VehicleAccessoryList::iterator itr2 = mVehicleList.begin(); itr2 < mVehicleList.end(); ++itr2)
|
||||
InstallAccessory(itr2->uiAccessory, itr2->uiSeat, itr2->bMinion);
|
||||
/*switch(me->GetEntry())
|
||||
{
|
||||
//case 27850:InstallAccessory(27905,1);break;
|
||||
case 28782:InstallAccessory(28768,0,false);break; // Acherus Deathcharger
|
||||
case 28312:InstallAccessory(28319,7);break;
|
||||
case 32627:InstallAccessory(32629,7);break;
|
||||
case 32930:
|
||||
InstallAccessory(32933,0);
|
||||
InstallAccessory(32934,1);
|
||||
break;
|
||||
case 33109:InstallAccessory(33167,1);break;
|
||||
case 33060:InstallAccessory(33067,7);break;
|
||||
case 33113:
|
||||
InstallAccessory(33114,0);
|
||||
InstallAccessory(33114,1);
|
||||
InstallAccessory(33114,2);
|
||||
InstallAccessory(33114,3);
|
||||
InstallAccessory(33139,7);
|
||||
break;
|
||||
case 33114:
|
||||
InstallAccessory(33143,2); // Overload Control Device
|
||||
InstallAccessory(33142,1); // Leviathan Defense Turret
|
||||
break;
|
||||
case 33214:InstallAccessory(33218,1,false);break; // Mechanolift 304-A
|
||||
case 35637:InstallAccessory(34705,0,false);break;
|
||||
case 35633:InstallAccessory(34702,0,false);break;
|
||||
case 35768:InstallAccessory(34701,0,false);break;
|
||||
case 34658:InstallAccessory(34657,0,false);break;
|
||||
case 35636:InstallAccessory(34703,0,false);break;
|
||||
case 35638:InstallAccessory(35572,0,false);break;
|
||||
case 35635:InstallAccessory(35569,0,false);break;
|
||||
case 35640:InstallAccessory(35571,0,false);break;
|
||||
case 35641:InstallAccessory(35570,0,false);break;
|
||||
case 35634:InstallAccessory(35617,0,false);break;
|
||||
case 33298:InstallAccessory(35332,0);break; //Darnassian Nightsaber
|
||||
case 33416:InstallAccessory(35330,0);break; //Exodar Elekk
|
||||
case 33297:InstallAccessory(35328,0);break; //Stormwind Steed
|
||||
case 33414:InstallAccessory(35327,0);break; //Forsaken Warhorse
|
||||
case 33301:InstallAccessory(35331,0);break; //Gnomeregan Mechanostrider
|
||||
case 33408:InstallAccessory(35329,0);break; //Ironforge Ram
|
||||
case 33300:InstallAccessory(35325,0);break; //Thunder Bluff Kodo
|
||||
case 33409:InstallAccessory(35314,0);break; //Orgrimmar Wolf
|
||||
case 33418:InstallAccessory(35326,0);break; //Silvermoon Hawkstrider
|
||||
case 33299:InstallAccessory(35323,0);break; //Darkspear Raptor
|
||||
case 35491:InstallAccessory(35451,0,false);break; //Black Knight
|
||||
}*/
|
||||
VehicleAccessoryList const* mVehicleList = objmgr.GetVehicleAccessoryList(me->GetEntry());
|
||||
if (!mVehicleList)
|
||||
return;
|
||||
|
||||
for (VehicleAccessoryList::const_iterator itr = mVehicleList->begin(); itr != mVehicleList->end(); ++itr)
|
||||
InstallAccessory(itr->uiAccessory, itr->uiSeat, itr->bMinion);
|
||||
}
|
||||
|
||||
void Vehicle::Uninstall()
|
||||
|
||||
@@ -52,6 +52,11 @@ bool GOHello_go_shadowforge_brazier(Player* pPlayer, GameObject* pGo)
|
||||
pInstance->SetData(TYPE_LYCEUM, DONE);
|
||||
else
|
||||
pInstance->SetData(TYPE_LYCEUM, IN_PROGRESS);
|
||||
// If used brazier open linked doors (North or South)
|
||||
if(pGo->GetGUID() == pInstance->GetData64(DATA_SF_BRAZIER_N))
|
||||
pInstance->HandleGameObject(pInstance->GetData64(DATA_GOLEM_DOOR_N), true);
|
||||
else if(pGo->GetGUID() == pInstance->GetData64(DATA_SF_BRAZIER_S))
|
||||
pInstance->HandleGameObject(pInstance->GetData64(DATA_GOLEM_DOOR_S), true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,14 @@ enum eTypes
|
||||
DATA_GO_CHALICE = 19,
|
||||
|
||||
DATA_GHOSTKILL = 20,
|
||||
DATA_EVENSTARTER = 21
|
||||
DATA_EVENSTARTER = 21,
|
||||
|
||||
DATA_GOLEM_DOOR_N = 22,
|
||||
DATA_GOLEM_DOOR_S = 23,
|
||||
|
||||
DATA_THRONE_DOOR = 24,
|
||||
|
||||
DATA_SF_BRAZIER_N = 25,
|
||||
DATA_SF_BRAZIER_S = 26
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -29,6 +29,11 @@ enum Spells
|
||||
SPELL_WARSTOMP = 24375
|
||||
};
|
||||
|
||||
enum eEnums
|
||||
{
|
||||
DATA_THRONE_DOOR = 24 // not id or guid of doors but number of enum in blackrock_depths.h
|
||||
};
|
||||
|
||||
struct boss_magmusAI : public ScriptedAI
|
||||
{
|
||||
boss_magmusAI(Creature *c) : ScriptedAI(c) {}
|
||||
@@ -71,6 +76,12 @@ struct boss_magmusAI : public ScriptedAI
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
// When he die open door to last chamber
|
||||
void JustDied(Unit *who)
|
||||
{
|
||||
if(ScriptedInstance* pInstance = who->GetInstanceData())
|
||||
pInstance->HandleGameObject(pInstance->GetData64(DATA_THRONE_DOOR), true);
|
||||
}
|
||||
};
|
||||
CreatureAI* GetAI_boss_magmus(Creature* pCreature)
|
||||
{
|
||||
|
||||
@@ -47,6 +47,7 @@ enum eEnums
|
||||
NPC_SEETHREL = 9038,
|
||||
NPC_GLOOMREL = 9037,
|
||||
NPC_DOOMREL = 9039,
|
||||
NPC_MAGMUS = 9938,
|
||||
|
||||
GO_ARENA1 = 161525,
|
||||
GO_ARENA2 = 161522,
|
||||
@@ -62,9 +63,11 @@ enum eEnums
|
||||
GO_TOMB_ENTER = 170576,
|
||||
GO_TOMB_EXIT = 170577,
|
||||
GO_LYCEUM = 170558,
|
||||
GO_GOLEM_ROOM_N = 170573,
|
||||
GO_GOLEM_ROOM_S = 170574,
|
||||
GO_THONE_ROOM = 170575,
|
||||
GO_SF_N = 174745, // Shadowforge Brazier North
|
||||
GO_SF_S = 174744, // Shadowforge Brazier South
|
||||
GO_GOLEM_ROOM_N = 170573, // Magmus door North
|
||||
GO_GOLEM_ROOM_S = 170574, // Magmus door Soutsh
|
||||
GO_THRONE_ROOM = 170575, // Throne door
|
||||
|
||||
GO_SPECTRAL_CHALICE = 164869,
|
||||
GO_CHEST_SEVEN = 169243
|
||||
@@ -79,6 +82,7 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
|
||||
uint64 EmperorGUID;
|
||||
uint64 PhalanxGUID;
|
||||
uint64 MagmusGUID;
|
||||
|
||||
uint64 GoArena1GUID;
|
||||
uint64 GoArena2GUID;
|
||||
@@ -94,9 +98,11 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
uint64 GoTombEnterGUID;
|
||||
uint64 GoTombExitGUID;
|
||||
uint64 GoLyceumGUID;
|
||||
uint64 GoSFSGUID;
|
||||
uint64 GoSFNGUID;
|
||||
uint64 GoGolemNGUID;
|
||||
uint64 GoGolemSGUID;
|
||||
uint64 GoThoneGUID;
|
||||
uint64 GoThroneGUID;
|
||||
uint64 GoChestGUID;
|
||||
|
||||
uint32 BarAleCount;
|
||||
@@ -112,6 +118,7 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
|
||||
EmperorGUID = 0;
|
||||
PhalanxGUID = 0;
|
||||
MagmusGUID = 0;
|
||||
|
||||
GoArena1GUID = 0;
|
||||
GoArena2GUID = 0;
|
||||
@@ -127,9 +134,11 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
GoTombEnterGUID = 0;
|
||||
GoTombExitGUID = 0;
|
||||
GoLyceumGUID = 0;
|
||||
GoSFSGUID = 0;
|
||||
GoSFNGUID = 0;
|
||||
GoGolemNGUID = 0;
|
||||
GoGolemSGUID = 0;
|
||||
GoThoneGUID = 0;
|
||||
GoThroneGUID = 0;
|
||||
GoChestGUID = 0;
|
||||
|
||||
BarAleCount = 0;
|
||||
@@ -155,6 +164,11 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
case NPC_SEETHREL: TombBossGUIDs[4] = pCreature->GetGUID(); break;
|
||||
case NPC_GLOOMREL: TombBossGUIDs[5] = pCreature->GetGUID(); break;
|
||||
case NPC_ANGERREL: TombBossGUIDs[6] = pCreature->GetGUID(); break;
|
||||
case NPC_MAGMUS:
|
||||
MagmusGUID = pCreature->GetGUID();
|
||||
if(!pCreature->isAlive())
|
||||
HandleGameObject(GetData64(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,9 +196,11 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
HandleGameObject(0, false, pGo);
|
||||
break;
|
||||
case GO_LYCEUM: GoLyceumGUID = pGo->GetGUID(); break;
|
||||
case GO_SF_S: GoSFSGUID = pGo->GetGUID(); break;
|
||||
case GO_SF_N: GoSFNGUID = pGo->GetGUID(); break;
|
||||
case GO_GOLEM_ROOM_N: GoGolemNGUID = pGo->GetGUID(); break;
|
||||
case GO_GOLEM_ROOM_S: GoGolemSGUID = pGo->GetGUID(); break;
|
||||
case GO_THONE_ROOM: GoThoneGUID = pGo->GetGUID(); break;
|
||||
case GO_THRONE_ROOM: GoThroneGUID = pGo->GetGUID(); break;
|
||||
case GO_CHEST_SEVEN: GoChestGUID = pGo->GetGUID(); break;
|
||||
}
|
||||
}
|
||||
@@ -301,6 +317,16 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
return GoBarDoorGUID;
|
||||
case DATA_EVENSTARTER:
|
||||
return TombEventStarterGUID;
|
||||
case DATA_SF_BRAZIER_N:
|
||||
return GoSFNGUID;
|
||||
case DATA_SF_BRAZIER_S:
|
||||
return GoSFSGUID;
|
||||
case DATA_THRONE_DOOR:
|
||||
return GoThroneGUID;
|
||||
case DATA_GOLEM_DOOR_N:
|
||||
return GoGolemNGUID;
|
||||
case DATA_GOLEM_DOOR_S:
|
||||
return GoGolemSGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -329,7 +355,7 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
if (GhostKillCount > 0 && GhostKillCount < 7)
|
||||
GhostKillCount = 0;//reset tomb of seven event
|
||||
if (GhostKillCount > 7)
|
||||
if (GhostKillCount >= 7)
|
||||
GhostKillCount = 7;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
@@ -401,6 +427,17 @@ struct instance_blackrock_depths : public ScriptedInstance
|
||||
TombTimer = TIMER_TOMBOFTHESEVEN;
|
||||
++TombEventCounter;
|
||||
TombOfSevenEvent();
|
||||
// Check Killed bosses
|
||||
for (uint8 i = 0; i < 7; ++i)
|
||||
{
|
||||
if (Creature* boss = instance->GetCreature(TombBossGUIDs[i]))
|
||||
{
|
||||
if (!boss->isAlive())
|
||||
{
|
||||
GhostKillCount = i+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else TombTimer -= diff;
|
||||
}
|
||||
if (GhostKillCount >= 7 && TombEventStarterGUID)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2010 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
@@ -59,7 +59,7 @@ struct boss_drakkari_colossusAI : public ScriptedAI
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
m_creature->clearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT);
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
MightyBlowTimer = 10000;
|
||||
MightyBlowTimer = 10*IN_MILISECONDS;
|
||||
bHealth = false;
|
||||
bHealth1 = false;
|
||||
}
|
||||
@@ -96,7 +96,7 @@ struct boss_drakkari_colossusAI : public ScriptedAI
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (!bHealth && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() >= 6)
|
||||
if (!bHealth && HealthBelowPct(50) && !HealthBelowPct(6))
|
||||
{
|
||||
CreatureState(m_creature, false);
|
||||
DoCast(m_creature,SPELL_FREEZE_ANIM);
|
||||
@@ -104,7 +104,7 @@ struct boss_drakkari_colossusAI : public ScriptedAI
|
||||
bHealth = true;
|
||||
}
|
||||
|
||||
if (!bHealth1 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 5)
|
||||
if (!bHealth1 && HealthBelowPct(5))
|
||||
{
|
||||
DoCast(m_creature,SPELL_EMERGE);
|
||||
CreatureState(m_creature, false);
|
||||
@@ -115,7 +115,7 @@ struct boss_drakkari_colossusAI : public ScriptedAI
|
||||
if (MightyBlowTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_MIGHTY_BLOW, true);
|
||||
MightyBlowTimer = 10000;
|
||||
MightyBlowTimer = 10*IN_MILISECONDS;
|
||||
} else MightyBlowTimer -= diff;
|
||||
|
||||
if (!m_creature->hasUnitState(UNIT_STAT_STUNNED))
|
||||
@@ -130,7 +130,7 @@ struct boss_drakkari_colossusAI : public ScriptedAI
|
||||
|
||||
void JustSummoned(Creature* pSummon)
|
||||
{
|
||||
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 5)
|
||||
if (HealthBelowPct(5))
|
||||
pSummon->DealDamage(pSummon, pSummon->GetHealth() * 0.5 , NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
|
||||
pSummon->AI()->AttackStart(m_creature->getVictim());
|
||||
}
|
||||
@@ -160,7 +160,7 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
{
|
||||
if (pColossus)
|
||||
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(m_creature, true);
|
||||
uiSurgeTimer = 7000;
|
||||
uiSurgeTimer = 7*IN_MILISECONDS;
|
||||
bGoToColossus = false;
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
if(!UpdateVictim())
|
||||
return;
|
||||
|
||||
if(!bGoToColossus && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && pColossus->GetHealth()*100 / pColossus->GetMaxHealth() >= 6)
|
||||
if(!bGoToColossus && HealthBelowPct(50) && !CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6))
|
||||
{
|
||||
m_creature->InterruptNonMeleeSpells(true);
|
||||
if (pColossus)
|
||||
@@ -195,7 +195,7 @@ struct boss_drakkari_elementalAI : public ScriptedAI
|
||||
if (uiSurgeTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_SURGE);
|
||||
uiSurgeTimer = 7000;
|
||||
uiSurgeTimer = 7*IN_MILISECONDS;
|
||||
} else uiSurgeTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
@@ -225,8 +225,8 @@ struct npc_living_mojoAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiMojoWaveTimer = 2000;
|
||||
uiMojoPuddleTimer = 7000;
|
||||
uiMojoWaveTimer = 2*IN_MILISECONDS;
|
||||
uiMojoPuddleTimer = 7*IN_MILISECONDS;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
@@ -266,13 +266,13 @@ struct npc_living_mojoAI : public ScriptedAI
|
||||
if (uiMojoWaveTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_MOJO_WAVE, H_SPELL_MOJO_WAVE));
|
||||
uiMojoWaveTimer = 15000;
|
||||
uiMojoWaveTimer = 15*IN_MILISECONDS;
|
||||
} else uiMojoWaveTimer -= diff;
|
||||
|
||||
if (uiMojoPuddleTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_MOJO_PUDDLE, H_SPELL_MOJO_PUDDLE));
|
||||
uiMojoPuddleTimer = 18000;
|
||||
uiMojoPuddleTimer = 18*IN_MILISECONDS;
|
||||
} else uiMojoPuddleTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2010 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
@@ -21,11 +21,11 @@
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_ECK_BERSERK = 55816, //Eck goes berserk, increasing his attack speed by 150% and all damage he deals by 500%.
|
||||
SPELL_ECK_BITE = 55813, //Eck bites down hard, inflicting 150% of his normal damage to an enemy.
|
||||
SPELL_ECK_SPIT = 55814, //Eck spits toxic bile at enemies in a cone in front of him, inflicting 2970 Nature damage and draining 220 mana every 1 sec for 3 sec.
|
||||
SPELL_ECK_SPRING_1 = 55815, //Eck leaps at a distant target. --> Drops aggro and charges a random player. Tank can simply taunt him back.
|
||||
SPELL_ECK_SPRING_2 = 55837 //Eck leaps at a distant target.
|
||||
SPELL_ECK_BERSERK = 55816, //Eck goes berserk, increasing his attack speed by 150% and all damage he deals by 500%.
|
||||
SPELL_ECK_BITE = 55813, //Eck bites down hard, inflicting 150% of his normal damage to an enemy.
|
||||
SPELL_ECK_SPIT = 55814, //Eck spits toxic bile at enemies in a cone in front of him, inflicting 2970 Nature damage and draining 220 mana every 1 sec for 3 sec.
|
||||
SPELL_ECK_SPRING_1 = 55815, //Eck leaps at a distant target. --> Drops aggro and charges a random player. Tank can simply taunt him back.
|
||||
SPELL_ECK_SPRING_2 = 55837 //Eck leaps at a distant target.
|
||||
};
|
||||
|
||||
static Position EckSpawnPoint = { 1643.877930, 936.278015, 107.204948, 0.668432 };
|
||||
@@ -48,10 +48,10 @@ struct boss_eckAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiBerserkTimer = 60000 + rand()%30000; //60-90 secs according to wowwiki
|
||||
uiBiteTimer = 5000;
|
||||
uiSpitTimer = 10000;
|
||||
uiSpringTimer = 8000;
|
||||
uiBerserkTimer = urand(60*IN_MILISECONDS,90*IN_MILISECONDS); //60-90 secs according to wowwiki
|
||||
uiBiteTimer = 5*IN_MILISECONDS;
|
||||
uiSpitTimer = 10*IN_MILISECONDS;
|
||||
uiSpringTimer = 8*IN_MILISECONDS;
|
||||
|
||||
bBerserk = false;
|
||||
|
||||
@@ -74,13 +74,13 @@ struct boss_eckAI : public ScriptedAI
|
||||
if (uiBiteTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_ECK_BITE);
|
||||
uiBiteTimer = 8000 + rand()%4000;
|
||||
uiBiteTimer = urand(8*IN_MILISECONDS,12*IN_MILISECONDS);
|
||||
} else uiBiteTimer -= diff;
|
||||
|
||||
if (uiSpitTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_ECK_SPIT);
|
||||
uiSpitTimer = 6000 + rand()%8000;
|
||||
uiSpitTimer = urand(6*IN_MILISECONDS,14*IN_MILISECONDS);
|
||||
} else uiSpitTimer -= diff;
|
||||
|
||||
if (uiSpringTimer <= diff)
|
||||
@@ -89,7 +89,7 @@ struct boss_eckAI : public ScriptedAI
|
||||
if(pTarget && pTarget->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
DoCast(pTarget, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2));
|
||||
uiSpringTimer = 5000 + rand()%10000;
|
||||
uiSpringTimer = urand(5*IN_MILISECONDS,10*IN_MILISECONDS);
|
||||
}
|
||||
} else uiSpringTimer -= diff;
|
||||
|
||||
@@ -104,7 +104,7 @@ struct boss_eckAI : public ScriptedAI
|
||||
else
|
||||
{
|
||||
uiBerserkTimer -= diff;
|
||||
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 20)
|
||||
if (HealthBelowPct(20))
|
||||
{
|
||||
DoCast(m_creature, SPELL_ECK_BERSERK);
|
||||
bBerserk = true;
|
||||
|
||||
@@ -1,14 +1,21 @@
|
||||
/* Script Data Start
|
||||
SDName: Boss gal_darah
|
||||
SDAuthor: LordVanMartin
|
||||
SD%Complete:
|
||||
SDComment:
|
||||
SDCategory:
|
||||
Script Data End */
|
||||
/*
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*** SQL START ***
|
||||
update creature_template set scriptname = '' where entry = '';
|
||||
*** SQL END ***/
|
||||
#include "ScriptedPch.h"
|
||||
#include "gundrak.h"
|
||||
|
||||
@@ -20,36 +27,41 @@ enum Spells
|
||||
SPELL_IMPALING_CHARGE = 54956,
|
||||
H_SPELL_IMPALING_CHARGE = 59827,
|
||||
SPELL_STOMP = 55292,
|
||||
H_SPELL_STOMP = 59826,
|
||||
H_SPELL_STOMP = 59829,
|
||||
SPELL_PUNCTURE = 55276,
|
||||
H_SPELL_PUNCTURE = 59826,
|
||||
SPELL_STAMPEDE = 55218,
|
||||
SPELL_WHIRLING_SLASH = 55249,
|
||||
H_SPELL_WHIRLING_SLASH = 55825,
|
||||
SPELL_WHIRLING_SLASH = 55250,
|
||||
H_SPELL_WHIRLING_SLASH = 59824,
|
||||
SPELL_ECK_RESIDUE = 55817
|
||||
};
|
||||
|
||||
//Yells
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1604000,
|
||||
SAY_SLAY_1 = -1604001,
|
||||
SAY_SLAY_2 = -1604002,
|
||||
SAY_SLAY_3 = -1604003,
|
||||
SAY_DEATH = -1604004,
|
||||
SAY_SUMMON_RHINO_1 = -1604005,
|
||||
SAY_SUMMON_RHINO_2 = -1604006,
|
||||
SAY_SUMMON_RHINO_3 = -1604007,
|
||||
SAY_TRANSFORM_1 = -1604008, //Phase change
|
||||
SAY_TRANSFORM_2 = -1604009
|
||||
SAY_AGGRO = -1604000,
|
||||
SAY_SLAY_1 = -1604001,
|
||||
SAY_SLAY_2 = -1604002,
|
||||
SAY_SLAY_3 = -1604003,
|
||||
SAY_DEATH = -1604004,
|
||||
SAY_SUMMON_RHINO_1 = -1604005,
|
||||
SAY_SUMMON_RHINO_2 = -1604006,
|
||||
SAY_SUMMON_RHINO_3 = -1604007,
|
||||
SAY_TRANSFORM_1 = -1604008, //Phase change
|
||||
SAY_TRANSFORM_2 = -1604009
|
||||
};
|
||||
|
||||
enum Achievements
|
||||
{
|
||||
ACHIEVEMENT_WHAT_THE_ECK = 1864,
|
||||
ACHIEVEMENT_SHARE_THE_LOVE = 2152
|
||||
ACHIEV_WHAT_THE_ECK = 1864,
|
||||
ACHIEV_SHARE_THE_LOVE = 2152
|
||||
};
|
||||
|
||||
enum Displays
|
||||
{
|
||||
DISPLAY_RHINO = 26265,
|
||||
DISPLAY_TROLL = 27061
|
||||
};
|
||||
|
||||
enum CombatPhase
|
||||
{
|
||||
@@ -70,28 +82,36 @@ struct boss_gal_darahAI : public ScriptedAI
|
||||
uint32 uiEnrageTimer;
|
||||
uint32 uiImpalingChargeTimer;
|
||||
uint32 uiStompTimer;
|
||||
uint32 uiTransformationTimer;
|
||||
std::set<uint64> lImpaledPlayers;
|
||||
|
||||
CombatPhase Phase;
|
||||
|
||||
uint8 uiPhaseCounter;
|
||||
|
||||
bool bStartOfTransformation;
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiStampedeTimer = 10000;
|
||||
uiWhirlingSlashTimer = 20000;
|
||||
uiPunctureTimer = 10000;
|
||||
uiEnrageTimer = 15000;
|
||||
uiImpalingChargeTimer = 20000;
|
||||
uiStompTimer = 25000;
|
||||
uiStampedeTimer = 10*IN_MILISECONDS;
|
||||
uiWhirlingSlashTimer = 21*IN_MILISECONDS;
|
||||
uiPunctureTimer = 10*IN_MILISECONDS;
|
||||
uiEnrageTimer = 15*IN_MILISECONDS;
|
||||
uiImpalingChargeTimer = 21*IN_MILISECONDS;
|
||||
uiStompTimer = 25*IN_MILISECONDS;
|
||||
uiTransformationTimer = 9*IN_MILISECONDS;
|
||||
uiPhaseCounter = 0;
|
||||
|
||||
lImpaledPlayers.clear();
|
||||
|
||||
bStartOfTransformation = true;
|
||||
|
||||
Phase = TROLL;
|
||||
|
||||
m_creature->SetDisplayId(DISPLAY_TROLL);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_GAL_DARAH_EVENT, NOT_STARTED);
|
||||
}
|
||||
@@ -115,10 +135,28 @@ struct boss_gal_darahAI : public ScriptedAI
|
||||
case TROLL:
|
||||
if (uiPhaseCounter == 2)
|
||||
{
|
||||
//FIX: implement transformation
|
||||
Phase = RHINO;
|
||||
uiPhaseCounter = 0;
|
||||
DoScriptText(SAY_TRANSFORM_1,m_creature);
|
||||
if (uiTransformationTimer <= diff)
|
||||
{
|
||||
m_creature->SetDisplayId(DISPLAY_RHINO);
|
||||
Phase = RHINO;
|
||||
uiPhaseCounter = 0;
|
||||
DoScriptText(SAY_TRANSFORM_1, m_creature);
|
||||
uiTransformationTimer = 5*IN_MILISECONDS;
|
||||
bStartOfTransformation = true;
|
||||
m_creature->clearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
else
|
||||
{
|
||||
uiTransformationTimer -= diff;
|
||||
|
||||
if (bStartOfTransformation)
|
||||
{
|
||||
bStartOfTransformation = false;
|
||||
m_creature->addUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -126,13 +164,13 @@ struct boss_gal_darahAI : public ScriptedAI
|
||||
{
|
||||
DoCast(m_creature, SPELL_STAMPEDE);
|
||||
DoScriptText(RAND(SAY_SUMMON_RHINO_1,SAY_SUMMON_RHINO_2,SAY_SUMMON_RHINO_3),m_creature);
|
||||
uiStampedeTimer = 15000;
|
||||
uiStampedeTimer = 15*IN_MILISECONDS;
|
||||
} else uiStampedeTimer -= diff;
|
||||
|
||||
if (uiWhirlingSlashTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_WHIRLING_SLASH, H_SPELL_WHIRLING_SLASH));
|
||||
uiWhirlingSlashTimer = 20000;
|
||||
uiWhirlingSlashTimer = 21*IN_MILISECONDS;
|
||||
++uiPhaseCounter;
|
||||
} else uiWhirlingSlashTimer -= diff;
|
||||
}
|
||||
@@ -140,39 +178,57 @@ struct boss_gal_darahAI : public ScriptedAI
|
||||
case RHINO:
|
||||
if (uiPhaseCounter == 2)
|
||||
{
|
||||
//FIX: implement transformation
|
||||
Phase = TROLL;
|
||||
uiPhaseCounter = 0;
|
||||
DoScriptText(SAY_TRANSFORM_2,m_creature);
|
||||
if (uiTransformationTimer <= diff)
|
||||
{
|
||||
m_creature->SetDisplayId(DISPLAY_TROLL);
|
||||
Phase = TROLL;
|
||||
uiPhaseCounter = 0;
|
||||
DoScriptText(SAY_TRANSFORM_2, m_creature);
|
||||
uiTransformationTimer = 9*IN_MILISECONDS;
|
||||
bStartOfTransformation = true;
|
||||
m_creature->clearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
else
|
||||
{
|
||||
uiTransformationTimer -= diff;
|
||||
|
||||
if (bStartOfTransformation)
|
||||
{
|
||||
bStartOfTransformation = false;
|
||||
m_creature->addUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (uiPunctureTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_PUNCTURE, H_SPELL_PUNCTURE));
|
||||
uiPunctureTimer = 8000;
|
||||
uiPunctureTimer = 8*IN_MILISECONDS;
|
||||
} else uiPunctureTimer -= diff;
|
||||
|
||||
if (uiEnrageTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_ENRAGE, H_SPELL_ENRAGE));
|
||||
uiEnrageTimer = 20000;
|
||||
uiEnrageTimer = 20*IN_MILISECONDS;
|
||||
} else uiEnrageTimer -= diff;
|
||||
|
||||
if (uiStompTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_STOMP, H_SPELL_STOMP));
|
||||
uiStompTimer = 20000;
|
||||
uiStompTimer = 20*IN_MILISECONDS;
|
||||
} else uiStompTimer -= diff;
|
||||
|
||||
if (uiImpalingChargeTimer <= diff)
|
||||
{
|
||||
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
|
||||
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
DoCast(pTarget, DUNGEON_MODE(SPELL_IMPALING_CHARGE, H_SPELL_IMPALING_CHARGE));
|
||||
lImpaledPlayers.insert(pTarget->GetGUID());
|
||||
}
|
||||
uiImpalingChargeTimer = 30000;
|
||||
uiImpalingChargeTimer = 31*IN_MILISECONDS;
|
||||
++uiPhaseCounter;
|
||||
} else uiImpalingChargeTimer -= diff;
|
||||
}
|
||||
@@ -186,27 +242,25 @@ struct boss_gal_darahAI : public ScriptedAI
|
||||
{
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
|
||||
if (IsHeroic())
|
||||
if (pInstance)
|
||||
{
|
||||
AchievementEntry const *achievWhatTheEck = GetAchievementStore()->LookupEntry(ACHIEVEMENT_WHAT_THE_ECK);
|
||||
if (achievWhatTheEck)
|
||||
if (IsHeroic())
|
||||
{
|
||||
Map* pMap = m_creature->GetMap();
|
||||
if (pMap && pMap->IsDungeon())
|
||||
if (lImpaledPlayers.size() == 5)
|
||||
pInstance->DoCompleteAchievement(ACHIEV_SHARE_THE_LOVE);
|
||||
|
||||
AchievementEntry const *achievWhatTheEck = GetAchievementStore()->LookupEntry(ACHIEV_WHAT_THE_ECK);
|
||||
if (achievWhatTheEck)
|
||||
{
|
||||
Map::PlayerList const &players = pMap->GetPlayers();
|
||||
Map::PlayerList const &players = pInstance->instance->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (itr->getSource()->HasAura(SPELL_ECK_RESIDUE))
|
||||
itr->getSource()->CompletedAchievement(achievWhatTheEck);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pInstance && IsHeroic() && lImpaledPlayers.size() == 5)
|
||||
pInstance->DoCompleteAchievement(ACHIEVEMENT_SHARE_THE_LOVE);
|
||||
|
||||
if (pInstance)
|
||||
|
||||
pInstance->SetData(DATA_GAL_DARAH_EVENT, DONE);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2010 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
@@ -25,7 +25,7 @@ enum eSpells
|
||||
SPELL_GROUND_TREMOR = 55142,
|
||||
SPELL_NUMBING_SHOUT = 55106,
|
||||
SPELL_DETERMINED_GORE = 55102,
|
||||
SPELL_DETERMINED_GORE_1 = 59444,
|
||||
H_SPELL_DETERMINED_GORE = 59444,
|
||||
SPELL_QUAKE = 55101,
|
||||
SPELL_NUMBING_ROAR = 55100,
|
||||
SPELL_MOJO_FRENZY = 55163,
|
||||
@@ -34,19 +34,19 @@ enum eSpells
|
||||
|
||||
enum eArchivements
|
||||
{
|
||||
ACHIEVEMENT_LESS_RABI = 2040
|
||||
ACHIEV_LESS_RABI = 2040
|
||||
};
|
||||
|
||||
enum eSays
|
||||
{
|
||||
SAY_AGGRO = -1604010,
|
||||
//SAY_SLAY_1 = -1604011, // not in db
|
||||
SAY_SLAY_2 = -1604012,
|
||||
SAY_SLAY_3 = -1604013,
|
||||
SAY_DEATH = -1604014,
|
||||
SAY_TRANSFORM = -1604015,
|
||||
SAY_QUAKE = -1604016,
|
||||
EMOTE_TRANSFORM = -1604017
|
||||
SAY_AGGRO = -1604010,
|
||||
//SAY_SLAY_1 = -1604011, // not in db
|
||||
SAY_SLAY_2 = -1604012,
|
||||
SAY_SLAY_3 = -1604013,
|
||||
SAY_DEATH = -1604014,
|
||||
SAY_TRANSFORM = -1604015,
|
||||
SAY_QUAKE = -1604016,
|
||||
EMOTE_TRANSFORM = -1604017
|
||||
};
|
||||
|
||||
struct boss_moorabiAI : public ScriptedAI
|
||||
@@ -67,10 +67,10 @@ struct boss_moorabiAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiGroundTremorTimer = 18000;
|
||||
uiNumblingShoutTimer = 10000;
|
||||
uiDeterminedStabTimer = 20000;
|
||||
uiTransformationTImer = 12000;
|
||||
uiGroundTremorTimer = 18*IN_MILISECONDS;
|
||||
uiNumblingShoutTimer = 10*IN_MILISECONDS;
|
||||
uiDeterminedStabTimer = 20*IN_MILISECONDS;
|
||||
uiTransformationTImer = 12*IN_MILISECONDS;
|
||||
bPhase = false;
|
||||
|
||||
if (pInstance)
|
||||
@@ -105,7 +105,7 @@ struct boss_moorabiAI : public ScriptedAI
|
||||
DoCast(m_creature->getVictim(), SPELL_QUAKE, true);
|
||||
else
|
||||
DoCast(m_creature->getVictim(), SPELL_GROUND_TREMOR, true);
|
||||
uiGroundTremorTimer = 10000;
|
||||
uiGroundTremorTimer = 10*IN_MILISECONDS;
|
||||
} else uiGroundTremorTimer -= uiDiff;
|
||||
|
||||
if (uiNumblingShoutTimer <= uiDiff)
|
||||
@@ -114,16 +114,16 @@ struct boss_moorabiAI : public ScriptedAI
|
||||
DoCast(m_creature->getVictim(), SPELL_NUMBING_ROAR, true);
|
||||
else
|
||||
DoCast(m_creature->getVictim(), SPELL_NUMBING_SHOUT, true);
|
||||
uiNumblingShoutTimer = 10000;
|
||||
uiNumblingShoutTimer = 10*IN_MILISECONDS;
|
||||
} else uiNumblingShoutTimer -=uiDiff;
|
||||
|
||||
if (uiDeterminedStabTimer <= uiDiff)
|
||||
{
|
||||
if (bPhase)
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_DETERMINED_GORE, SPELL_DETERMINED_GORE_1));
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_DETERMINED_GORE, H_SPELL_DETERMINED_GORE));
|
||||
else
|
||||
DoCast(m_creature->getVictim(), SPELL_DETERMINED_STAB, true);
|
||||
uiDeterminedStabTimer = 8000;
|
||||
uiDeterminedStabTimer = 8*IN_MILISECONDS;
|
||||
} else uiDeterminedStabTimer -=uiDiff;
|
||||
|
||||
if (!bPhase && uiTransformationTImer <= uiDiff)
|
||||
@@ -131,7 +131,7 @@ struct boss_moorabiAI : public ScriptedAI
|
||||
DoScriptText(EMOTE_TRANSFORM, m_creature);
|
||||
DoScriptText(SAY_TRANSFORM, m_creature);
|
||||
DoCast(m_creature, SPELL_TRANSFORMATION, false);
|
||||
uiTransformationTImer = 10000;
|
||||
uiTransformationTImer = 10*IN_MILISECONDS;
|
||||
} else uiTransformationTImer -= uiDiff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
@@ -146,7 +146,7 @@ struct boss_moorabiAI : public ScriptedAI
|
||||
pInstance->SetData(DATA_MOORABI_EVENT, DONE);
|
||||
|
||||
if (IsHeroic() && !bPhase)
|
||||
pInstance->DoCompleteAchievement(ACHIEVEMENT_LESS_RABI);
|
||||
pInstance->DoCompleteAchievement(ACHIEV_LESS_RABI);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2010 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
@@ -33,28 +33,28 @@ enum Spells
|
||||
//Yell
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1604017,
|
||||
SAY_SLAY_1 = -1604018,
|
||||
SAY_SLAY_2 = -1604019,
|
||||
SAY_SLAY_3 = -1604020,
|
||||
SAY_DEATH = -1604021,
|
||||
SAY_SUMMON_SNAKES = -1604022,
|
||||
SAY_SUMMON_CONSTRICTORS = -1604023
|
||||
SAY_AGGRO = -1604017,
|
||||
SAY_SLAY_1 = -1604018,
|
||||
SAY_SLAY_2 = -1604019,
|
||||
SAY_SLAY_3 = -1604020,
|
||||
SAY_DEATH = -1604021,
|
||||
SAY_SUMMON_SNAKES = -1604022,
|
||||
SAY_SUMMON_CONSTRICTORS = -1604023
|
||||
};
|
||||
|
||||
//Creatures
|
||||
enum Creatures
|
||||
{
|
||||
CREATURE_SNAKE = 29680,
|
||||
CREATURE_CONSTRICTORS = 29713
|
||||
CREATURE_SNAKE = 29680,
|
||||
CREATURE_CONSTRICTORS = 29713
|
||||
};
|
||||
|
||||
//Creatures' spells
|
||||
enum ConstrictorSpells
|
||||
{
|
||||
SPELL_GRIP_OF_SLAD_RAN = 55093,
|
||||
SPELL_VENOMOUS_BITE = 54987,
|
||||
H_SPELL_VENOMOUS_BITE = 58996
|
||||
SPELL_GRIP_OF_SLAD_RAN = 55093,
|
||||
SPELL_VENOMOUS_BITE = 54987,
|
||||
H_SPELL_VENOMOUS_BITE = 58996
|
||||
};
|
||||
|
||||
static Position SpawnLoc[]=
|
||||
@@ -86,10 +86,10 @@ struct boss_slad_ranAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiPoisonNovaTimer = 10000;
|
||||
uiPowerfullBiteTimer = 3000;
|
||||
uiVenomBoltTimer = 15000;
|
||||
uiSpawnTimer = 5000;
|
||||
uiPoisonNovaTimer = 10*IN_MILISECONDS;
|
||||
uiPowerfullBiteTimer = 3*IN_MILISECONDS;
|
||||
uiVenomBoltTimer = 15*IN_MILISECONDS;
|
||||
uiSpawnTimer = 5*IN_MILISECONDS;
|
||||
uiPhase = 0;
|
||||
|
||||
lSummons.DespawnAll();
|
||||
@@ -115,19 +115,19 @@ struct boss_slad_ranAI : public ScriptedAI
|
||||
if (uiPoisonNovaTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_POISON_NOVA, H_SPELL_POISON_NOVA));
|
||||
uiPoisonNovaTimer = 15000;
|
||||
uiPoisonNovaTimer = 15*IN_MILISECONDS;
|
||||
} else uiPoisonNovaTimer -= diff;
|
||||
|
||||
if (uiPowerfullBiteTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_POWERFULL_BITE, H_SPELL_POWERFULL_BITE));
|
||||
uiPowerfullBiteTimer = 10000;
|
||||
uiPowerfullBiteTimer = 10*IN_MILISECONDS;
|
||||
} else uiPowerfullBiteTimer -= diff;
|
||||
|
||||
if (uiVenomBoltTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_VENOM_BOLT, H_SPELL_VENOM_BOLT));
|
||||
uiVenomBoltTimer = 10000;
|
||||
uiVenomBoltTimer = 10*IN_MILISECONDS;
|
||||
} else uiVenomBoltTimer -= diff;
|
||||
|
||||
if (uiPhase)
|
||||
@@ -136,11 +136,11 @@ struct boss_slad_ranAI : public ScriptedAI
|
||||
{
|
||||
if (uiPhase == 1)
|
||||
for (uint8 i = 0; i < DUNGEON_MODE(3, 5); ++i)
|
||||
m_creature->SummonCreature(CREATURE_SNAKE, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000);
|
||||
m_creature->SummonCreature(CREATURE_SNAKE, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN,20*IN_MILISECONDS);
|
||||
if (uiPhase == 2)
|
||||
for (uint8 i = 0; i < DUNGEON_MODE(3, 5); ++i)
|
||||
m_creature->SummonCreature(CREATURE_CONSTRICTORS, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000);
|
||||
uiSpawnTimer = 5000;
|
||||
m_creature->SummonCreature(CREATURE_CONSTRICTORS, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN,20*IN_MILISECONDS);
|
||||
uiSpawnTimer = 5*IN_MILISECONDS;
|
||||
} else uiSpawnTimer -= diff;
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@ struct mob_slad_ran_constrictorAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiGripOfSladRanTimer = 1000;
|
||||
uiGripOfSladRanTimer = 1*IN_MILISECONDS;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -197,7 +197,7 @@ struct mob_slad_ran_constrictorAI : public ScriptedAI
|
||||
if (uiGripOfSladRanTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_GRIP_OF_SLAD_RAN);
|
||||
uiGripOfSladRanTimer = 5000;
|
||||
uiGripOfSladRanTimer = 5*IN_MILISECONDS;
|
||||
} else uiGripOfSladRanTimer -= diff;
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ struct mob_slad_ran_viperAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiVenomousBiteTimer = 2000;
|
||||
uiVenomousBiteTimer = 2*IN_MILISECONDS;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -225,7 +225,7 @@ struct mob_slad_ran_viperAI : public ScriptedAI
|
||||
if (uiVenomousBiteTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_VENOMOUS_BITE, H_SPELL_VENOMOUS_BITE));
|
||||
uiVenomousBiteTimer = 10000;
|
||||
uiVenomousBiteTimer = 10*IN_MILISECONDS;
|
||||
} else uiVenomousBiteTimer -= diff;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2010 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2010 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* 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
|
||||
|
||||
Reference in New Issue
Block a user