diff options
| author | w1sht0l1v3 <w1sht0l1v3@gmail.com> | 2012-09-03 15:50:08 +0300 | 
|---|---|---|
| committer | w1sht0l1v3 <w1sht0l1v3@gmail.com> | 2012-09-03 15:50:08 +0300 | 
| commit | 128d99b29b4ad974c3aa207e7c629c7b939c5141 (patch) | |
| tree | 6a03e89c435f63e044ee9890691f16a970d72a82 | |
| parent | 80b61fa584b019a298e129764cddba9fbfd458cc (diff) | |
Core/Scripts: Rewrite Cold Hearted quest.
Closes #1758 .
| -rw-r--r-- | sql/updates/world/2012_09_03_00_world_misc.sql | 36 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/storm_peaks.cpp | 217 | 
2 files changed, 164 insertions, 89 deletions
diff --git a/sql/updates/world/2012_09_03_00_world_misc.sql b/sql/updates/world/2012_09_03_00_world_misc.sql new file mode 100644 index 00000000000..e8910c78b40 --- /dev/null +++ b/sql/updates/world/2012_09_03_00_world_misc.sql @@ -0,0 +1,36 @@ +-- Cold Hearted (12856) + +SET @NPC_CAPTIVE_DRAKE        := 29708; -- Captive Proto-Drake +SET @NPC_FREED_DRAKE          := 29709; -- Freed Proto-Drake +SET @NPC_PRISONER             := 29639; -- Brunnhildar Prisoner +SET @NPC_LIBERATED            := 29734; -- Liberated Brunnhildar + +SET @SPELL_SUM_FREE_DRAKE     := 55028; -- Summon Freed Proto-Drake +SET @SPELL_ICE_SHARD          := 55046; -- Ice Shard (Rank 3) +SET @SPELL_FREE_PRISONER      := 55048; -- Free Brunnhildar Prisoner +SET @AURA_IMPRISONMENT        := 54894; -- Icy Imprisonment + + +UPDATE `creature_template` SET `speed_walk`=1,`speed_run`=1.14286,`spell1`=@SPELL_ICE_SHARD,`HoverHeight`=4,`unit_flags`=0x1000008,`InhabitType`=4,`ScriptName`='npc_freed_protodrake' WHERE `entry`=@NPC_FREED_DRAKE; +UPDATE `creature_template` SET `unit_flags`=33554432,`AIName`='SmartAI' WHERE `entry`=@NPC_LIBERATED; + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=@NPC_CAPTIVE_DRAKE; +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(@NPC_CAPTIVE_DRAKE,@SPELL_SUM_FREE_DRAKE,1,0); + +DELETE FROM `creature_template_addon` WHERE `entry`=@NPC_FREED_DRAKE; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES +(@NPC_FREED_DRAKE,0,0x3000000,0x1,'55034 61183'); + +DELETE FROM `creature_text` WHERE `entry`=@NPC_FREED_DRAKE; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@NPC_FREED_DRAKE,0,0,'Return to Brunnhildar Village!',42,0,100,0,0,0,'Freed Proto-Drake'), +(@NPC_FREED_DRAKE,0,1,'The proto-drake smells freedom and flies homeward!',41,0,100,0,0,0,'Freed Proto-Drake'); + +DELETE FROM `spell_scripts` WHERE `id`=@SPELL_FREE_PRISONER; +INSERT INTO `spell_scripts` (`id`,`effIndex`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES +(@SPELL_FREE_PRISONER,0,0,14,@AURA_IMPRISONMENT,0,0,0,0,0,0); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@NPC_LIBERATED; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC_LIBERATED,0,0,0,54,0,100,0,0,0,0,0,41,30000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Liberated Brunnhildar - On Spawn - Despawn in 30 seconds'); diff --git a/src/server/scripts/Northrend/storm_peaks.cpp b/src/server/scripts/Northrend/storm_peaks.cpp index 92ba6bada14..f33918ccd49 100644 --- a/src/server/scripts/Northrend/storm_peaks.cpp +++ b/src/server/scripts/Northrend/storm_peaks.cpp @@ -283,14 +283,12 @@ public:  ## npc_brunnhildar_prisoner  ######*/ -enum brunhildar { -    NPC_QUEST_GIVER            = 29592, - +enum BrunnhildarPrisoner {      SPELL_ICE_PRISON           = 54894, -    SPELL_KILL_CREDIT_PRISONER = 55144, -    SPELL_KILL_CREDIT_DRAKE    = 55143, -    SPELL_SUMMON_LIBERATED     = 55073, -    SPELL_ICE_LANCE            = 55046 +    SPELL_ICE_LANCE            = 55046, +    SPELL_FREE_PRISONER        = 55048, +    SPELL_RIDE_DRAKE           = 55074, +    SPELL_SHARD_IMPACT         = 55047  };  class npc_brunnhildar_prisoner : public CreatureScript @@ -302,129 +300,169 @@ public:      {          npc_brunnhildar_prisonerAI(Creature* creature) : ScriptedAI(creature) {} -        uint64 drakeGUID; -        uint16 enter_timer; -        bool hasEmptySeats; +        bool freed;          void Reset()          { +            freed = false;              me->CastSpell(me, SPELL_ICE_PRISON, true); -            enter_timer = 0; -            drakeGUID = 0; -            hasEmptySeats = false; +        } + +        void JustRespawned() +        { +            Reset();          }          void UpdateAI(const uint32 diff)          { -            //TODO: not good script -            if (!drakeGUID) +            if (!freed)                  return; -            Creature* drake = Unit::GetCreature(*me, drakeGUID); -            if (!drake) +            if (!me->HasUnitState(UNIT_STATE_ONVEHICLE))              { -                drakeGUID = 0; -                return; +                me->DespawnOrUnsummon();              } +        } -            // drake unsummoned, passengers dropped -            if (!me->IsOnVehicle(drake) && !hasEmptySeats) -                me->DespawnOrUnsummon(3000); - -            if (enter_timer <= 0) +        void SpellHit(Unit* caster, const SpellInfo* spell) +        { +            if (spell->Id != SPELL_ICE_LANCE)                  return; -            if (enter_timer < diff) +            if (caster->GetVehicleKit()->GetAvailableSeatCount() != 0)              { -                enter_timer = 0; -                if (hasEmptySeats) -                    me->JumpTo(drake, 25.0f); -                else -                    Reset(); +                me->CastSpell(me, SPELL_FREE_PRISONER, true); +                me->CastSpell(caster, SPELL_RIDE_DRAKE, true); +                me->CastSpell(me, SPELL_SHARD_IMPACT, true); +                freed = true;              } -            else -                enter_timer -= diff; +        } +    }; + +    CreatureAI* GetAI(Creature* creature) const +    { +        return new npc_brunnhildar_prisonerAI(creature); +    } +}; + +/*###### +## npc_freed_protodrake +######*/ + +enum FreedProtoDrake +{ +    AREA_VALLEY_OF_ANCIENT_WINTERS      = 4437, +    TEXT_EMOTE                          = 0, +    SPELL_KILL_CREDIT_PRISONER          = 55144, +    SPELL_SUMMON_LIBERATED              = 55073, +    SPELL_KILL_CREDIT_DRAKE             = 55143 +}; + +const Position FreedDrakeWaypoints[16] = +{ +    {7294.96f, -2418.733f, 823.869f, 0.0f}, +    {7315.984f, -2331.46f, 826.3972f, 0.0f}, +    {7271.826f, -2271.479f, 833.5917f, 0.0f}, +    {7186.253f, -2218.475f, 847.5632f, 0.0f}, +    {7113.195f, -2164.288f, 850.2301f, 0.0f}, +    {7078.018f, -2063.106f, 854.7581f, 0.0f}, +    {7073.221f, -1983.382f, 861.9246f, 0.0f}, +    {7061.455f, -1885.899f, 865.119f, 0.0f}, +    {7033.32f, -1826.775f, 876.2578f, 0.0f}, +    {6999.902f, -1784.012f, 897.4521f, 0.0f}, +    {6954.913f, -1747.043f, 897.4521f, 0.0f}, +    {6933.856f, -1720.698f, 882.2022f, 0.0f}, +    {6932.729f, -1687.306f, 866.1189f, 0.0f}, +    {6952.458f, -1663.802f, 849.8133f, 0.0f}, +    {7002.819f, -1651.681f, 831.397f, 0.0f}, +    {7026.531f, -1649.239f, 828.8406f, 0.0f} +}; + + +class npc_freed_protodrake : public CreatureScript +{ +public: +    npc_freed_protodrake() : CreatureScript("npc_freed_protodrake") { } + +    struct npc_freed_protodrakeAI : public VehicleAI +    { +        npc_freed_protodrakeAI(Creature* creature) : VehicleAI(creature) {} + +        bool autoMove; +        bool wpReached; +        uint16 CheckTimer; +        uint16 countWP; + +        void Reset() +        { +            autoMove = false; +            wpReached = false; +            CheckTimer = 5000; +            countWP = 0;          } -        void MoveInLineOfSight(Unit* who) +        void MovementInform(uint32 type, uint32 id)          { -            if (!who || !drakeGUID) +            if (type != POINT_MOTION_TYPE)                  return; -            Creature* drake = Unit::GetCreature(*me, drakeGUID); -            if (!drake) +            if (id < 15)              { -                drakeGUID = 0; -                return; +                ++countWP; +                wpReached = true;              } - -            if (!me->IsOnVehicle(drake) && !me->HasAura(SPELL_ICE_PRISON)) +            else +            // drake reached village              { -                if (who->IsVehicle() && me->IsWithinDist(who, 25.0f, true) && who->ToCreature() && who->ToCreature()->GetEntry() == 29709) +                // get player that rides drake (from seat 0) +                Unit* player = me->GetVehicleKit()->GetPassenger(0); +                if (player && player->GetTypeId() == TYPEID_PLAYER)                  { -                    uint8 seat = who->GetVehicleKit()->GetNextEmptySeat(0, true); -                    if (seat <= 0) -                        return; - -                    me->EnterVehicle(who, seat); -                    me->SendMovementFlagUpdate(); -                    hasEmptySeats = false; +                    // for each prisoner on drake,give credit +                    for (uint8 i = 1; i < 4; ++i) +                        if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i)) +                        { +                            if (prisoner->GetTypeId() != TYPEID_UNIT) +                                return; +                            prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true); +                            prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true); +                            prisoner->ExitVehicle(); +                        } +                    me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true); +                    player->ExitVehicle();                  }              } +        } -            if (who->ToCreature() && me->IsOnVehicle(drake)) +        void UpdateAI(const uint32 diff) +        { +            if (!autoMove)              { -                if (who->ToCreature()->GetEntry() == NPC_QUEST_GIVER && me->IsWithinDist(who, 15.0f, false)) +                if (CheckTimer < diff)                  { -                    Unit* rider = drake->GetVehicleKit()->GetPassenger(0); -                    if (!rider) -                        return; - -                    rider->CastSpell(rider, SPELL_KILL_CREDIT_PRISONER, true); - -                    me->ExitVehicle(); -                    me->CastSpell(me, SPELL_SUMMON_LIBERATED, true); -                    me->DespawnOrUnsummon(500); - -                    // drake is empty now, deliver credit for drake and despawn him -                    if (drake->GetVehicleKit()->HasEmptySeat(1) && -                        drake->GetVehicleKit()->HasEmptySeat(2) && -                        drake->GetVehicleKit()->HasEmptySeat(3)) +                    CheckTimer = 5000; +                    if (me->GetAreaId() == AREA_VALLEY_OF_ANCIENT_WINTERS)                      { -                        // not working rider->CastSpell(rider, SPELL_KILL_CREDIT_DRAKE, true); -                        if (rider->ToPlayer()) -                            rider->ToPlayer()->KilledMonsterCredit(29709, 0); - -                        drake->DespawnOrUnsummon(0); +                        Talk(TEXT_EMOTE, me->GetVehicleKit()->GetPassenger(0)->GetGUID()); +                        autoMove = true; +                        wpReached = true;                      }                  } +                else +                    CheckTimer -= diff;              } -        } - -        void SpellHit(Unit* hitter, const SpellInfo* spell) -        { -            if (!hitter || !spell) -                return; - -            if (spell->Id != SPELL_ICE_LANCE) -                return; - -            me->RemoveAura(SPELL_ICE_PRISON); -            enter_timer = 500; - -            if (hitter->IsVehicle()) -                drakeGUID = hitter->GetGUID(); -            else -                return; -            if (hitter->GetVehicleKit()->GetNextEmptySeat(0, true)) -                hasEmptySeats = true; +            if (wpReached && autoMove) +            { +                wpReached = false; +                me->GetMotionMaster()->MovePoint(countWP, FreedDrakeWaypoints[countWP]); +            }          }      };      CreatureAI* GetAI(Creature* creature) const      { -        return new npc_brunnhildar_prisonerAI(creature); +        return new npc_freed_protodrakeAI(creature);      }  }; @@ -532,6 +570,7 @@ void AddSC_storm_peaks()      new npc_injured_goblin();      new npc_roxi_ramrocket();      new npc_brunnhildar_prisoner(); +    new npc_freed_protodrake();      new npc_icefang();      new npc_hyldsmeet_protodrake();  }  | 
