Core/Scripts: Rewrite Cold Hearted quest.

Closes #1758 .
This commit is contained in:
w1sht0l1v3
2012-09-03 15:50:08 +03:00
parent 80b61fa584
commit 128d99b29b
2 changed files with 181 additions and 106 deletions
@@ -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');
+145 -106
View File
@@ -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,123 +300,42 @@ 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;
}
// drake unsummoned, passengers dropped
if (!me->IsOnVehicle(drake) && !hasEmptySeats)
me->DespawnOrUnsummon(3000);
if (enter_timer <= 0)
return;
if (enter_timer < diff)
{
enter_timer = 0;
if (hasEmptySeats)
me->JumpTo(drake, 25.0f);
else
Reset();
}
else
enter_timer -= diff;
}
void MoveInLineOfSight(Unit* who)
{
if (!who || !drakeGUID)
return;
Creature* drake = Unit::GetCreature(*me, drakeGUID);
if (!drake)
{
drakeGUID = 0;
return;
}
if (!me->IsOnVehicle(drake) && !me->HasAura(SPELL_ICE_PRISON))
{
if (who->IsVehicle() && me->IsWithinDist(who, 25.0f, true) && who->ToCreature() && who->ToCreature()->GetEntry() == 29709)
{
uint8 seat = who->GetVehicleKit()->GetNextEmptySeat(0, true);
if (seat <= 0)
return;
me->EnterVehicle(who, seat);
me->SendMovementFlagUpdate();
hasEmptySeats = false;
me->DespawnOrUnsummon();
}
}
if (who->ToCreature() && me->IsOnVehicle(drake))
void SpellHit(Unit* caster, const SpellInfo* spell)
{
if (who->ToCreature()->GetEntry() == NPC_QUEST_GIVER && me->IsWithinDist(who, 15.0f, false))
{
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))
{
// not working rider->CastSpell(rider, SPELL_KILL_CREDIT_DRAKE, true);
if (rider->ToPlayer())
rider->ToPlayer()->KilledMonsterCredit(29709, 0);
drake->DespawnOrUnsummon(0);
}
}
}
}
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 (caster->GetVehicleKit()->GetAvailableSeatCount() != 0)
{
me->CastSpell(me, SPELL_FREE_PRISONER, true);
me->CastSpell(caster, SPELL_RIDE_DRAKE, true);
me->CastSpell(me, SPELL_SHARD_IMPACT, true);
freed = true;
}
}
};
@@ -428,6 +345,127 @@ public:
}
};
/*######
## 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 MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE)
return;
if (id < 15)
{
++countWP;
wpReached = true;
}
else
// drake reached village
{
// get player that rides drake (from seat 0)
Unit* player = me->GetVehicleKit()->GetPassenger(0);
if (player && player->GetTypeId() == TYPEID_PLAYER)
{
// 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();
}
}
}
void UpdateAI(const uint32 diff)
{
if (!autoMove)
{
if (CheckTimer < diff)
{
CheckTimer = 5000;
if (me->GetAreaId() == AREA_VALLEY_OF_ANCIENT_WINTERS)
{
Talk(TEXT_EMOTE, me->GetVehicleKit()->GetPassenger(0)->GetGUID());
autoMove = true;
wpReached = true;
}
}
else
CheckTimer -= diff;
}
if (wpReached && autoMove)
{
wpReached = false;
me->GetMotionMaster()->MovePoint(countWP, FreedDrakeWaypoints[countWP]);
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_freed_protodrakeAI(creature);
}
};
class npc_icefang : public CreatureScript
{
public:
@@ -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();
}