aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2013_07_04_01_world_razorfen_kraul.sql26
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp1
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp150
3 files changed, 165 insertions, 12 deletions
diff --git a/sql/updates/world/2013_07_04_01_world_razorfen_kraul.sql b/sql/updates/world/2013_07_04_01_world_razorfen_kraul.sql
new file mode 100644
index 00000000000..a05037d791f
--- /dev/null
+++ b/sql/updates/world/2013_07_04_01_world_razorfen_kraul.sql
@@ -0,0 +1,26 @@
+SET @GUID := 56185;
+
+DELETE FROM `gameobject` WHERE `id`=20920 OR `id`=300011;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES
+(@GUID, 20920, 47, 1, 1, 2082.74, 1671.82, 61.2396, 3.66079, 0, 0, 0.966493, -0.256693, -43200, 100, 1),
+(@GUID+1, 20920, 47, 1, 1, 2159.43, 1687.49, 57.5433, 3.66079, 0, 0, 0.966493, -0.256693, -43200, 100, 1),
+(@GUID+2, 20920, 47, 1, 1, 2080.89, 1703.36, 56.6447, 0.553757, 0, 0, 0.273354, 0.961913, -43200, 100, 1),
+(@GUID+3, 20920, 47, 1, 1, 2055.28, 1767.7, 58.4559, 2.98378, 0, 0, 0.996889, 0.0788245, -43200, 100, 1),
+(@GUID+4, 20920, 47, 1, 1, 2196.64, 1827.96, 61.4706, 2.11277, 0, 0, 0.870583, 0.492022, -43200, 100, 1),
+(@GUID+5, 20920, 47, 1, 1, 2030.32, 1867.61, 56.2866, 5.6777, 0, 0, 0.298139, -0.954522, -43200, 100, 1),
+(@GUID+6, 20920, 47, 1, 1, 2091.33, 1861.73, 51.0341, 1.25355, 0, 0, 0.586536, 0.809923, -43200, 100, 1),
+(@GUID+7, 20920, 47, 1, 1, 2200.15, 1897.64, 71.3191, 2.6492, 0, 0, 0.969846, 0.243717, -43200, 100, 1),
+(@GUID+8, 20920, 47, 1, 1, 2075.75, 1742.04, 76.7184, 1.33994, 0, 0, 0.620962, 0.78384, -43200, 100, 1),
+(@GUID+9, 20920, 47, 1, 1, 2126, 1661.15, 82.4824, 0.0220437, 0, 0, 0.0110216, 0.999939, -43200, 100, 1),
+(@GUID+10, 20920, 47, 1, 1, 2207.92, 1596.91, 80.7375, 3.60582, 0, 0, 0.973182, -0.230035, -43200, 100, 1),
+(@GUID+11, 20920, 47, 1, 1, 2156.98, 1542.26, 72.849, 2.43086, 0, 0, 0.937519, 0.347934, -43200, 100, 1),
+(@GUID+12, 20920, 47, 1, 1, 2179.95, 1514.06, 69.0709, 0.778385, 0, 0, 0.379441, 0.925216, -43200, 100, 1),
+(@GUID+13, 20920, 47, 1, 1, 2000.85, 1533.93, 80.3971, 4.919, 0, 0, 0.630419, -0.776255, -43200, 100, 1),
+(@GUID+14, 20920, 47, 1, 1, 1991.49, 1608.53, 81.1601, 1.1004, 0, 0, 0.522858, 0.85242, -43200, 100, 1),
+(@GUID+15, 300011, 47, 1, 1, 2072.84, 1582.57, 82.14, 0, 0, 0, 0, 1, -43200, 0, 1);
+
+UPDATE `creature_template` SET `ScriptName`='npc_snufflenose_gopher' WHERE `entry`=4781;
+
+DELETE FROM `spell_script_names` WHERE `spell_id`=8283;
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(8283, 'spell_snufflenose_command');
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
index ff775c1a031..242a1c4258b 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
@@ -74,6 +74,7 @@ public:
switch (go->GetEntry())
{
case 21099: DoorWardGUID = go->GetGUID(); break;
+ case 20920: go->SetUInt32Value(GAMEOBJECT_FACTION, 0); break; // big fat fugly hack
}
}
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
index 55e81f1408f..cdf2aec7e52 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * Copyright (C) 2006-2013 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,22 +16,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Razorfen Kraul
-SD%Complete: 100
-SDComment: Quest support: 1144
-SDCategory: Razorfen Kraul
-EndScriptData */
-
-/* ContentData
-npc_willix
-EndContentData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "razorfen_kraul.h"
#include "Player.h"
+#include "PetAI.h"
enum Willix
{
@@ -148,7 +138,143 @@ public:
};
+enum SnufflenoseGopher
+{
+ NPC_SNUFFLENOSE_GOPHER = 4781,
+ GO_BLUELEAF_TUBBER = 20920,
+ ACTION_FIND_NEW_TUBBER = 0x4B726F66,
+ POINT_TUBBER = 0x6E615748
+};
+
+struct DistanceOrder : public std::binary_function<GameObject, GameObject, bool>
+{
+ DistanceOrder(Creature* me) : me(me) {}
+
+ bool operator() (GameObject* first, GameObject* second)
+ {
+ return me->GetDistanceOrder(first, second);
+ }
+
+ Creature* me;
+};
+
+struct npc_snufflenose_gopher : public CreatureScript
+{
+public:
+ npc_snufflenose_gopher() : CreatureScript("npc_snufflenose_gopher") { }
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_snufflenose_gopherAI(creature);
+ }
+
+ struct npc_snufflenose_gopherAI : public PetAI
+ {
+ npc_snufflenose_gopherAI(Creature* creature) : PetAI(creature) { }
+
+ void Reset()
+ {
+ IsMovementActive = false;
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type == POINT_MOTION_TYPE && id == POINT_TUBBER)
+ {
+ if (GameObject* go = me->GetMap()->GetGameObject(TargetTubberGUID))
+ {
+ go->SetRespawnTime(5 * MINUTE);
+ go->Refresh();
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ }
+
+ IsMovementActive = false;
+ }
+ else
+ PetAI::MovementInform(type, id);
+ }
+
+ void DoFindNewTubber()
+ {
+ std::list<GameObject*> tubbersInRange;
+ GetGameObjectListWithEntryInGrid(tubbersInRange, me, GO_BLUELEAF_TUBBER, 40.0f);
+
+ if (tubbersInRange.empty())
+ return;
+
+ tubbersInRange.sort(DistanceOrder(me));
+ GameObject* nearestTubber = NULL;
+
+ for (std::list<GameObject*>::const_iterator itr = tubbersInRange.begin(); itr != tubbersInRange.end(); ++itr)
+ {
+ if (!(*itr)->isSpawned() && (*itr)->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND))
+ {
+ nearestTubber = *itr;
+ break;
+ }
+ }
+
+ if (!nearestTubber)
+ return;
+
+ TargetTubberGUID = nearestTubber->GetGUID();
+
+ // XFurry was wrong...
+ me->GetMotionMaster()->MovePoint(POINT_TUBBER, nearestTubber->GetPositionX(),
+ nearestTubber->GetPositionY(),
+ nearestTubber->GetPositionZ());
+ IsMovementActive = true;
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!IsMovementActive)
+ PetAI::UpdateAI(diff);
+ }
+
+ void DoAction(int32 action)
+ {
+ if (action == ACTION_FIND_NEW_TUBBER)
+ DoFindNewTubber();
+ }
+
+ bool IsMovementActive;
+ uint64 TargetTubberGUID;
+ };
+};
+
+class spell_snufflenose_command : public SpellScriptLoader
+{
+ public:
+ spell_snufflenose_command() : SpellScriptLoader("spell_snufflenose_command") { }
+
+ class spell_snufflenose_commandSpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_snufflenose_commandSpellScript);
+
+ void HandleAfterCast()
+ {
+ if (Unit* target = ((Player*)GetCaster())->GetSelectedUnit())
+ if (target->GetEntry() == NPC_SNUFFLENOSE_GOPHER)
+ if (Creature* ctarget = dynamic_cast<Creature*>(target))
+ ctarget->AI()->DoAction(ACTION_FIND_NEW_TUBBER);
+ }
+
+ void Register()
+ {
+ AfterCast += SpellCastFn(spell_snufflenose_commandSpellScript::HandleAfterCast);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_snufflenose_commandSpellScript();
+ }
+};
+
void AddSC_razorfen_kraul()
{
+ new spell_snufflenose_command();
new npc_willix();
+ new npc_snufflenose_gopher();
}