@@ -3225,6 +3225,234 @@ struct MANGOS_DLL_DECL mob_warrior_of_the_frozen_wastesAI : public ScriptedAI
32253225 }
32263226};
32273227
3228+ /* ######
3229+ ## npc_mine_car
3230+ ######*/
3231+
3232+ struct MANGOS_DLL_DECL npc_mine_carAI : public ScriptedAI
3233+ {
3234+ npc_mine_carAI (Creature* pCreature) : ScriptedAI(pCreature)
3235+ {
3236+ m_creature->SetFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
3237+ Reset ();
3238+ }
3239+
3240+ uint64 m_uiScarletMinerGuid;
3241+
3242+ void Reset ()
3243+ {
3244+ }
3245+
3246+ void MoveInLineOfSight (Unit* /* pUnit*/ )
3247+ {
3248+ return ;
3249+ }
3250+
3251+ void EnterCombat (Unit* /* pUnit*/ )
3252+ {
3253+ return ;
3254+ }
3255+
3256+ void AttackStart (Unit* /* pUnit*/ )
3257+ {
3258+ return ;
3259+ }
3260+
3261+ void SetScarletMinerGuid (const uint64 &guid)
3262+ {
3263+ m_uiScarletMinerGuid = guid;
3264+ }
3265+
3266+ void FollowMiner ()
3267+ {
3268+ if (Creature* pMiner = m_creature->GetCreature (*m_creature, m_uiScarletMinerGuid))
3269+ {
3270+ // buggy sometimes...
3271+ m_creature->SetSpeedRate (MOVE_WALK, 1 .5f , true );
3272+ m_creature->SetSpeedRate (MOVE_RUN, 1 .5f , true );
3273+ m_creature->RemoveSplineFlag (SPLINEFLAG_WALKMODE);
3274+
3275+ m_creature->GetMotionMaster ()->MoveFollow (pMiner, 1 .0f , 0 );
3276+ }
3277+ }
3278+
3279+ void ExitMineCar ()
3280+ {
3281+ if (Creature* pMiner = m_creature->GetCreature (*m_creature, m_uiScarletMinerGuid))
3282+ pMiner->ForcedDespawn ();
3283+ }
3284+
3285+ void UpdateAI (const uint32 /* uiDiff*/ )
3286+ {
3287+ }
3288+ };
3289+
3290+ enum
3291+ {
3292+ SPELL_CAR_DRAG = 52465 ,
3293+ SPELL_CAR_CHECK = 54173
3294+ };
3295+
3296+ /* ######
3297+ ## npc_scarlet_miner
3298+ ######*/
3299+
3300+ struct MANGOS_DLL_DECL npc_scarlet_minerAI : public npc_escortAI
3301+ {
3302+ npc_scarlet_minerAI (Creature* pCreature) : npc_escortAI(pCreature)
3303+ {
3304+ m_creature->SetFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
3305+ Reset ();
3306+ }
3307+
3308+ uint32 m_uiMonoTimer;
3309+ uint32 m_uiMonoPhase;
3310+
3311+ uint64 m_uiMineCarGuid;
3312+ uint64 m_uiPlayerGuid;
3313+
3314+ bool m_bReachedShip;
3315+ uint32 m_uiShipDelay;
3316+
3317+ void Reset ()
3318+ {
3319+ m_uiMonoTimer = 0 ;
3320+ m_uiMonoPhase = 0 ;
3321+
3322+ m_uiMineCarGuid = 0 ;
3323+ m_uiPlayerGuid = 0 ;
3324+
3325+ m_bReachedShip = false ;
3326+ m_uiShipDelay = 3000 ;
3327+ }
3328+
3329+ void StartCarEvent (Player *pPlayer)
3330+ {
3331+ pPlayer->SetFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
3332+
3333+ m_uiMineCarGuid = pPlayer->GetVehicle ()->GetBase ()->GetGUID ();
3334+ m_uiPlayerGuid = pPlayer->GetGUID ();
3335+ Start (false , pPlayer->GetGUID ());
3336+ }
3337+
3338+ void WaypointReached (uint32 uiWp)
3339+ {
3340+ switch (uiWp)
3341+ {
3342+ case 0 :
3343+ if (Unit *pMineCar = m_creature->GetCreature (*m_creature, m_uiMineCarGuid))
3344+ m_creature->SetInFront (pMineCar);
3345+
3346+ // say something
3347+ SetRun (true );
3348+ m_uiMonoTimer = 4000 ;
3349+ m_uiMonoPhase = 1 ;
3350+ break ;
3351+ case 16 :
3352+ m_bReachedShip = true ;
3353+ break ;
3354+ default :
3355+ break ;
3356+ }
3357+ }
3358+
3359+ void UpdateAI (const uint32 uiDiff)
3360+ {
3361+ if (m_uiMonoPhase)
3362+ {
3363+ if (m_uiMonoTimer <= uiDiff)
3364+ {
3365+ if (m_uiMonoPhase == 1 )
3366+ {
3367+ if (Creature *pMineCar = m_creature->GetCreature (*m_creature, m_uiMineCarGuid))
3368+ DoCast (pMineCar, SPELL_CAR_DRAG);
3369+
3370+ m_uiMonoTimer = 800 ;
3371+ m_uiMonoPhase = 2 ;
3372+ }
3373+ else
3374+ {
3375+ if (Creature *pMineCar = m_creature->GetCreature (*m_creature, m_uiMineCarGuid))
3376+ {
3377+ if (npc_mine_carAI* pMineCarAI = dynamic_cast <npc_mine_carAI*>(pMineCar->AI ()))
3378+ {
3379+ pMineCarAI->FollowMiner ();
3380+ }
3381+ m_uiMonoPhase = 0 ;
3382+ }
3383+ }
3384+ }
3385+ else
3386+ m_uiMonoTimer -= uiDiff;
3387+ }
3388+
3389+ if (m_bReachedShip)
3390+ {
3391+ if (m_uiShipDelay <= uiDiff)
3392+ {
3393+ if (Creature *pMineCar = m_creature->GetCreature (*m_creature, m_uiMineCarGuid))
3394+ {
3395+ m_creature->SetInFront (pMineCar);
3396+
3397+ pMineCar->Relocate (pMineCar->GetPositionX (), pMineCar->GetPositionY (), pMineCar->GetPositionZ () + 1 );
3398+ pMineCar->GetMotionMaster ()->MovementExpired ();
3399+ pMineCar->StopMoving ();
3400+ pMineCar->RemoveAurasDueToSpell (SPELL_CAR_DRAG);
3401+
3402+ if (Player *pPlayer = m_creature->GetMap ()->GetPlayer (ObjectGuid (m_uiPlayerGuid)))
3403+ {
3404+ pPlayer->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
3405+ }
3406+ // Say something
3407+
3408+ if (npc_mine_carAI* pMineCarAI = dynamic_cast <npc_mine_carAI*>(pMineCar->AI ()))
3409+ {
3410+ pMineCarAI->ExitMineCar ();
3411+ }
3412+
3413+ m_bReachedShip = false ;
3414+ }
3415+ }
3416+ else
3417+ m_uiShipDelay -= uiDiff;
3418+ }
3419+ npc_escortAI::UpdateAI (uiDiff);
3420+ }
3421+ };
3422+
3423+ enum
3424+ {
3425+ QUEST_MASSACRE_AT_LIGHTS_POINT = 12701 ,
3426+
3427+ ENTRY_SCARLET_MINER = 28841 ,
3428+ ENTRY_MINE_CAR = 28817 ,
3429+
3430+ SPELL_MINE_CAR_SUMM = 52463
3431+ };
3432+
3433+ bool GOUse_inconspicous_mine_car (Player *pPlayer, GameObject* /* pGo*/ )
3434+ {
3435+ if (pPlayer->GetQuestStatus (QUEST_MASSACRE_AT_LIGHTS_POINT) == QUEST_STATUS_INCOMPLETE)
3436+ {
3437+ if (Creature *pMiner = pPlayer->SummonCreature (ENTRY_SCARLET_MINER, 2383 .869629f , -5900 .312500f , 107 .996086f , pPlayer->GetOrientation (),TEMPSUMMON_DEAD_DESPAWN, 1 ))
3438+ {
3439+ pPlayer->CastSpell (pPlayer, SPELL_MINE_CAR_SUMM, true );
3440+ if (Creature *pMineCar = (Creature*)pPlayer->GetVehicle ()->GetBase ())
3441+ {
3442+ if (npc_mine_carAI* pMineCarAI = dynamic_cast <npc_mine_carAI*>(pMineCar->AI ()))
3443+ {
3444+ pMineCarAI->SetScarletMinerGuid (pMiner->GetGUID ());
3445+ if (npc_scarlet_minerAI* pMinerAI = dynamic_cast <npc_scarlet_minerAI*>(pMiner->AI ()))
3446+ {
3447+ pMinerAI->StartCarEvent (pPlayer);
3448+ }
3449+ }
3450+ }
3451+ }
3452+ }
3453+ return true ;
3454+ }
3455+
32283456CreatureAI* GetAI_npc_highlord_darion_mograine (Creature* pCreature)
32293457{
32303458 return new npc_highlord_darion_mograineAI (pCreature);
@@ -3250,6 +3478,16 @@ CreatureAI* GetAI_mob_acherus_ghoul(Creature* pCreature)
32503478 return new mob_acherus_ghoulAI (pCreature);
32513479};
32523480
3481+ CreatureAI* GetAI_npc_mine_car (Creature* pCreature)
3482+ {
3483+ return new npc_mine_carAI (pCreature);
3484+ };
3485+
3486+ CreatureAI* GetAI_npc_scarlet_miner (Creature* pCreature)
3487+ {
3488+ return new npc_scarlet_minerAI (pCreature);
3489+ };
3490+
32533491void AddSC_ebon_hold ()
32543492{
32553493 Script* pNewScript;
@@ -3324,4 +3562,18 @@ void AddSC_ebon_hold()
33243562 pNewScript->GetAI = &GetAI_mob_warrior_of_the_frozen_wastes;
33253563 pNewScript->RegisterSelf ();
33263564
3565+ pNewScript = new Script;
3566+ pNewScript->Name = " npc_mine_car" ;
3567+ pNewScript->GetAI = &GetAI_npc_mine_car;
3568+ pNewScript->RegisterSelf ();
3569+
3570+ pNewScript = new Script;
3571+ pNewScript->Name = " npc_scarlet_miner" ;
3572+ pNewScript->GetAI = &GetAI_npc_scarlet_miner;
3573+ pNewScript->RegisterSelf ();
3574+
3575+ pNewScript = new Script;
3576+ pNewScript->Name = " go_inconspicous_mine_car" ;
3577+ pNewScript->pGOUse = &GOUse_inconspicous_mine_car;
3578+ pNewScript->RegisterSelf ();
33273579}
0 commit comments