diff options
10 files changed, 128 insertions, 102 deletions
diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql index e46b2a37dda..b85b4b8cbb1 100644 --- a/sql/FULL/world_scripts_full.sql +++ b/sql/FULL/world_scripts_full.sql @@ -438,6 +438,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_deserter_agitator' WHERE `entry UPDATE `creature_template` SET `ScriptName`='npc_lady_jaina_proudmoore' WHERE `entry`=4968; UPDATE `creature_template` SET `ScriptName`='npc_nat_pagle' WHERE `entry`=12919; UPDATE `creature_template` SET `ScriptName`='npc_restless_apparition' WHERE `entry`=23861; +UPDATE `creature_template` SET `ScriptName`='npc_private_hendel' WHERE `entry`=4966; /* EASTERN PLAGUELANDS */ UPDATE `creature_template` SET `ScriptName`='mobs_ghoul_flayer' WHERE `entry` IN (8530,8531,8532); diff --git a/sql/updates/5020_world_scripts.sql b/sql/updates/5020_world_scripts.sql new file mode 100644 index 00000000000..6ce3fe82f5a --- /dev/null +++ b/sql/updates/5020_world_scripts.sql @@ -0,0 +1 @@ +UPDATE creature_template SET ScriptName='npc_private_hendel' WHERE entry=4966; diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp index bde31d5c8af..78a5cbbf1de 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp @@ -95,25 +95,11 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance NextPortal_Timer = 0; } - void UpdateBMWorldState(uint32 id, uint32 state) - { - Map::PlayerList const& players = instance->GetPlayers(); - - if (!players.isEmpty()) - { - for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - if (Player* pPlayer = itr->getSource()) - pPlayer->SendUpdateWorldState(id,state); - } - }else debug_log("TSCR: Instance Black Portal: UpdateBMWorldState, but PlayerList is empty!"); - } - void InitWorldState(bool Enable = true) { - UpdateBMWorldState(WORLD_STATE_BM,Enable ? 1 : 0); - UpdateBMWorldState(WORLD_STATE_BM_SHIELD,100); - UpdateBMWorldState(WORLD_STATE_BM_RIFT,0); + DoUpdateWorldState(WORLD_STATE_BM,Enable ? 1 : 0); + DoUpdateWorldState(WORLD_STATE_BM_SHIELD, 100); + DoUpdateWorldState(WORLD_STATE_BM_RIFT, 0); } bool IsEncounterInProgress() @@ -172,7 +158,8 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance if (data == SPECIAL && m_auiEncounter[0] == IN_PROGRESS) { --mShieldPercent; - UpdateBMWorldState(WORLD_STATE_BM_SHIELD,mShieldPercent); + + DoUpdateWorldState(WORLD_STATE_BM_SHIELD, mShieldPercent); if (!mShieldPercent) { @@ -337,7 +324,8 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance if (NextPortal_Timer <= diff) { ++mRiftPortalCount; - UpdateBMWorldState(WORLD_STATE_BM_RIFT,mRiftPortalCount); + + DoUpdateWorldState(WORLD_STATE_BM_RIFT, mRiftPortalCount); DoSpawnPortal(); NextPortal_Timer = RiftWaves[GetRiftWaveId()].NextPortalTime; diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp index 528cfb64583..4683acbc8dc 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp @@ -396,9 +396,9 @@ void hyjalAI::Reset() if ((!pInstance->GetData(DATA_ALLIANCE_RETREAT) && m_creature->GetEntry() == JAINA) || (pInstance->GetData(DATA_ALLIANCE_RETREAT) && m_creature->GetEntry() == THRALL)) { //Reset World States - UpdateWorldState(WORLD_STATE_WAVES, 0); - UpdateWorldState(WORLD_STATE_ENEMY, 0); - UpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_WAVES, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0); pInstance->SetData(DATA_RESET_TRASH_COUNT, 0); } }else error_log(ERROR_INST_DATA); @@ -548,8 +548,11 @@ void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3]) uint32 stateValue = Count+1; if (FirstBossDead) stateValue -= 9; // Subtract 9 from it to give the proper wave number if we are greater than 8 - UpdateWorldState(WORLD_STATE_WAVES, stateValue); // Set world state to our current wave number - UpdateWorldState(WORLD_STATE_ENEMY, 1); // Enable world state + + // Set world state to our current wave number + pInstance->DoUpdateWorldState(WORLD_STATE_WAVES, stateValue); // Set world state to our current wave number + // Enable world state + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 1); // Enable world state pInstance->SetData(DATA_TRASH, EnemyCount); // Send data for instance script to update count @@ -563,9 +566,13 @@ void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3]) } else { - UpdateWorldState(WORLD_STATE_WAVES, 0); // Set world state for waves to 0 to disable it. - UpdateWorldState(WORLD_STATE_ENEMY, 1); - UpdateWorldState(WORLD_STATE_ENEMYCOUNT, 1); // Set World State for enemies invading to 1. + // Set world state for waves to 0 to disable it. + pInstance->DoUpdateWorldState(WORLD_STATE_WAVES, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 1); + + // Set World State for enemies invading to 1. + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 1); + Summon = false; } CheckTimer = 5000; @@ -573,7 +580,7 @@ void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3]) void hyjalAI::StartEvent(Player* pPlayer) { - if (!pPlayer || IsDummy) + if (!pPlayer || IsDummy || !pInstance) return; Talk(BEGIN); @@ -587,9 +594,9 @@ void hyjalAI::StartEvent(Player* pPlayer) m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - UpdateWorldState(WORLD_STATE_WAVES, 0); - UpdateWorldState(WORLD_STATE_ENEMY, 0); - UpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_WAVES, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0); DeSpawnVeins(); } @@ -639,25 +646,6 @@ void hyjalAI::Talk(uint32 id) DoScriptText(YellId, m_creature); } -void hyjalAI::UpdateWorldState(uint32 id, uint32 state) -{ - Map* pMap = m_creature->GetMap(); - - if (!pMap->IsDungeon()) - return; - - Map::PlayerList const& players = pMap->GetPlayers(); - - if (!players.isEmpty()) - { - for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - if (Player* pPlayer = itr->getSource()) - pPlayer->SendUpdateWorldState(id,state); - } - }else debug_log("TSCR: HyjalAI: UpdateWorldState, but PlayerList is empty"); -} - void hyjalAI::Retreat() { if (pInstance) @@ -879,7 +867,7 @@ void hyjalAI::UpdateAI(const uint32 diff) CheckTimer = 0; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); BossGUID[i] = 0; - UpdateWorldState(WORLD_STATE_ENEMY, 0); // Reset world state for enemies to disable it + pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); // Reset world state for enemies to disable it } } } diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h index 8f7e40cfdfe..5663516460d 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h @@ -195,7 +195,6 @@ struct TRINITY_DLL_DECL hyjalAI : public npc_escortAI void Talk(uint32 id); // Searches for the appropriate yell and sound and uses it to inform the raid of various things - void UpdateWorldState(uint32 field, uint32 value); // NYI: Requires core support. Updates the world state counter at the top of the UI. public: ScriptedInstance* pInstance; diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp index f4acc668f21..c55a02c50a9 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp @@ -211,7 +211,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance case DATA_TRASH: if (data) Trash = data; else Trash--; - UpdateWorldState(WORLD_STATE_ENEMYCOUNT, Trash); + DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, Trash); break; case TYPE_RETREAT: if (data == SPECIAL) @@ -283,20 +283,6 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance return 0; } - void UpdateWorldState(uint32 id, uint32 state) - { - Map::PlayerList const& players = instance->GetPlayers(); - - if (!players.isEmpty()) - { - for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - if (Player* pPlayer = itr->getSource()) - pPlayer->SendUpdateWorldState(id,state); - } - }else debug_log("TSCR: Instance Hyjal: UpdateWorldState, but PlayerList is empty!"); - } - std::string GetSaveData() { return str_data; diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp index f5529f3480f..d8fe0694367 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp @@ -29,17 +29,15 @@ EndScriptData */ ## go_barrel_old_hillsbrad ######*/ -bool GOHello_go_barrel_old_hillsbrad(Player* pPlayer, GameObject* _GO) +bool GOHello_go_barrel_old_hillsbrad(Player* pPlayer, GameObject* pGO) { - ScriptedInstance* pInstance = _GO->GetInstanceData(); - - if (!pInstance) - return false; - - if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE) - return false; + if (ScriptedInstance* pInstance = pGO->GetInstanceData()) + { + if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE) + return false; - pInstance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + pInstance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + } return false; } diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp index 1471733c67f..86a0628520c 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp @@ -75,7 +75,7 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance return NULL; } - void UpdateOHWorldState() + void UpdateQuestCredit() { Map::PlayerList const& players = instance->GetPlayers(); @@ -84,15 +84,9 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { if (Player* pPlayer = itr->getSource()) - { - pPlayer->SendUpdateWorldState(WORLD_STATE_OH,mBarrelCount); - - if (mBarrelCount == 5) - pPlayer->KilledMonsterCredit(LODGE_QUEST_TRIGGER,0); - } + pPlayer->KilledMonsterCredit(LODGE_QUEST_TRIGGER,0); } - }else - debug_log("TSCR: Instance Old Hillsbrad: UpdateOHWorldState, but PlayerList is empty!"); + } } void OnCreatureCreate(Creature *creature, bool add) @@ -131,7 +125,7 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance return; ++mBarrelCount; - UpdateOHWorldState(); + DoUpdateWorldState(WORLD_STATE_OH, mBarrelCount); debug_log("TSCR: Instance Old Hillsbrad: go_barrel_old_hillsbrad count %u",mBarrelCount); @@ -139,8 +133,9 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance if (mBarrelCount == 5) { - pPlayer->SummonCreature(DRAKE_ENTRY,2128.43,71.01,64.42,1.74,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000); - m_auiEncounter[0] = DONE; + UpdateQuestCredit(); + pPlayer->SummonCreature(DRAKE_ENTRY, 2128.43, 71.01, 64.42, 1.74, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1800000); + m_auiEncounter[0] = DONE; } } break; diff --git a/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp b/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp index 3a186a855a1..d8648d605b0 100644 --- a/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp +++ b/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp @@ -17,7 +17,7 @@ /* ScriptData SDName: Dustwallow_Marsh SD%Complete: 95 -SDComment: Quest support: 11180, 558, 11126, 11142, Vendor Nat Pagle +SDComment: Quest support: 11180, 558, 11126, 11142, 11180. Vendor Nat Pagle SDCategory: Dustwallow Marsh EndScriptData */ @@ -27,6 +27,8 @@ npc_restless_apparition npc_deserter_agitator npc_lady_jaina_proudmoore npc_nat_pagle +npc_private_hendel +npc_cassa_crimsonwing - handled by npc_taxi EndContentData */ #include "precompiled.h" @@ -222,6 +224,75 @@ bool GossipSelect_npc_nat_pagle(Player* pPlayer, Creature* pCreature, uint32 uiS } /*###### +## npc_private_hendel +######*/ + +enum +{ + SAY_PROGRESS_1_TER = -1000411, + SAY_PROGRESS_2_HEN = -1000412, + SAY_PROGRESS_3_TER = -1000413, + SAY_PROGRESS_4_TER = -1000414, + EMOTE_SURRENDER = -1000415, + + QUEST_MISSING_DIPLO_PT16 = 1324, + FACTION_HOSTILE = 168, //guessed, may be different + + NPC_SENTRY = 5184, //helps hendel + NPC_JAINA = 4968, //appears once hendel gives up + NPC_TERVOSH = 4967 +}; + +//TODO: develop this further, end event not created +struct TRINITY_DLL_DECL npc_private_hendelAI : public ScriptedAI +{ + npc_private_hendelAI(Creature* pCreature) : ScriptedAI(pCreature) { } + + void Reset() + { + me->RestoreFaction(); + } + + void AttackedBy(Unit* pAttacker) + { + if (m_creature->getVictim()) + return; + + if (m_creature->IsFriendlyTo(pAttacker)) + return; + + AttackStart(pAttacker); + } + + void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) + { + if (uiDamage > m_creature->GetHealth() || ((m_creature->GetHealth() - uiDamage)*100 / m_creature->GetMaxHealth() < 20)) + { + uiDamage = 0; + + if (Player* pPlayer = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself()) + pPlayer->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, m_creature); + + DoScriptText(EMOTE_SURRENDER, m_creature); + EnterEvadeMode(); + } + } +}; + +bool QuestAccept_npc_private_hendel(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if (pQuest->GetQuestId() == QUEST_MISSING_DIPLO_PT16) + pCreature->setFaction(FACTION_HOSTILE); + + return true; +} + +CreatureAI* GetAI_npc_private_hendel(Creature* pCreature) +{ + return new npc_private_hendelAI(pCreature); +} + +/*###### ## ######*/ @@ -256,5 +327,11 @@ void AddSC_dustwallow_marsh() newscript->pGossipHello = &GossipHello_npc_nat_pagle; newscript->pGossipSelect = &GossipSelect_npc_nat_pagle; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "npc_private_hendel"; + newscript->GetAI = &GetAI_npc_private_hendel; + newscript->pQuestAccept = &QuestAccept_npc_private_hendel; + newscript->RegisterSelf(); } diff --git a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp index e4cfa97b2f9..716c5876c0b 100644 --- a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp +++ b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp @@ -166,13 +166,6 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance HandleGameObject(ZulJinGateGUID, true); } - void UpdateWorldState(uint32 field, uint32 value) - { - WorldPacket data(SMSG_UPDATE_WORLD_STATE, 8); - data << field << value; - instance->SendToPlayers(&data); - } - std::string GetSaveData() { std::ostringstream ss; @@ -211,7 +204,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance if (QuestMinute) { QuestMinute += 15; - UpdateWorldState(3106, QuestMinute); + DoUpdateWorldState(3106, QuestMinute); } SummonHostage(0); } @@ -224,7 +217,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance if (QuestMinute) { QuestMinute += 10; - UpdateWorldState(3106, QuestMinute); + DoUpdateWorldState(3106, QuestMinute); } SummonHostage(1); } @@ -267,7 +260,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance if (QuestMinute && BossKilled >= 4) { QuestMinute = 0; - UpdateWorldState(3104, 0); + DoUpdateWorldState(3104, 0); } CheckInstanceStatus(); SaveToDB(); @@ -302,9 +295,9 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance QuestTimer += 60000; if (QuestMinute) { - UpdateWorldState(3104, 1); - UpdateWorldState(3106, QuestMinute); - }else UpdateWorldState(3104, 0); + DoUpdateWorldState(3104, 1); + DoUpdateWorldState(3106, QuestMinute); + }else DoUpdateWorldState(3104, 0); } QuestTimer -= diff; } |