@@ -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');
|
||||||
@@ -283,14 +283,12 @@ public:
|
|||||||
## npc_brunnhildar_prisoner
|
## npc_brunnhildar_prisoner
|
||||||
######*/
|
######*/
|
||||||
|
|
||||||
enum brunhildar {
|
enum BrunnhildarPrisoner {
|
||||||
NPC_QUEST_GIVER = 29592,
|
|
||||||
|
|
||||||
SPELL_ICE_PRISON = 54894,
|
SPELL_ICE_PRISON = 54894,
|
||||||
SPELL_KILL_CREDIT_PRISONER = 55144,
|
SPELL_ICE_LANCE = 55046,
|
||||||
SPELL_KILL_CREDIT_DRAKE = 55143,
|
SPELL_FREE_PRISONER = 55048,
|
||||||
SPELL_SUMMON_LIBERATED = 55073,
|
SPELL_RIDE_DRAKE = 55074,
|
||||||
SPELL_ICE_LANCE = 55046
|
SPELL_SHARD_IMPACT = 55047
|
||||||
};
|
};
|
||||||
|
|
||||||
class npc_brunnhildar_prisoner : public CreatureScript
|
class npc_brunnhildar_prisoner : public CreatureScript
|
||||||
@@ -302,123 +300,42 @@ public:
|
|||||||
{
|
{
|
||||||
npc_brunnhildar_prisonerAI(Creature* creature) : ScriptedAI(creature) {}
|
npc_brunnhildar_prisonerAI(Creature* creature) : ScriptedAI(creature) {}
|
||||||
|
|
||||||
uint64 drakeGUID;
|
bool freed;
|
||||||
uint16 enter_timer;
|
|
||||||
bool hasEmptySeats;
|
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
|
freed = false;
|
||||||
me->CastSpell(me, SPELL_ICE_PRISON, true);
|
me->CastSpell(me, SPELL_ICE_PRISON, true);
|
||||||
enter_timer = 0;
|
}
|
||||||
drakeGUID = 0;
|
|
||||||
hasEmptySeats = false;
|
void JustRespawned()
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
//TODO: not good script
|
if (!freed)
|
||||||
if (!drakeGUID)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Creature* drake = Unit::GetCreature(*me, drakeGUID);
|
if (!me->HasUnitState(UNIT_STATE_ONVEHICLE))
|
||||||
if (!drake)
|
|
||||||
{
|
{
|
||||||
drakeGUID = 0;
|
me->DespawnOrUnsummon();
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (who->ToCreature() && me->IsOnVehicle(drake))
|
|
||||||
{
|
|
||||||
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)
|
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||||
{
|
{
|
||||||
if (!hitter || !spell)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (spell->Id != SPELL_ICE_LANCE)
|
if (spell->Id != SPELL_ICE_LANCE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
me->RemoveAura(SPELL_ICE_PRISON);
|
if (caster->GetVehicleKit()->GetAvailableSeatCount() != 0)
|
||||||
enter_timer = 500;
|
{
|
||||||
|
me->CastSpell(me, SPELL_FREE_PRISONER, true);
|
||||||
if (hitter->IsVehicle())
|
me->CastSpell(caster, SPELL_RIDE_DRAKE, true);
|
||||||
drakeGUID = hitter->GetGUID();
|
me->CastSpell(me, SPELL_SHARD_IMPACT, true);
|
||||||
else
|
freed = true;
|
||||||
return;
|
}
|
||||||
|
|
||||||
if (hitter->GetVehicleKit()->GetNextEmptySeat(0, true))
|
|
||||||
hasEmptySeats = 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
|
class npc_icefang : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -532,6 +570,7 @@ void AddSC_storm_peaks()
|
|||||||
new npc_injured_goblin();
|
new npc_injured_goblin();
|
||||||
new npc_roxi_ramrocket();
|
new npc_roxi_ramrocket();
|
||||||
new npc_brunnhildar_prisoner();
|
new npc_brunnhildar_prisoner();
|
||||||
|
new npc_freed_protodrake();
|
||||||
new npc_icefang();
|
new npc_icefang();
|
||||||
new npc_hyldsmeet_protodrake();
|
new npc_hyldsmeet_protodrake();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user