Advertisement
Guest User

Untitled

a guest
Sep 25th, 2012
438
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.35 KB | None | 0 0
  1. //SpellMgr.cpp
  2.  
  3.         case 42436: // Braufest: Drink!
  4.             spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ANY;
  5.             spellInfo->EffectImplicitTargetB[0] = 0;
  6.             break;
  7.  
  8. //npcs_special.cpp
  9.  
  10. // Dark Iron Guzzler in the Brewfest achievement 'Down With The Dark Iron'
  11. enum DarkIronGuzzler
  12. {
  13.     NPC_DARK_IRON_GUZZLER = 23709,
  14.     NPC_DARK_IRON_HERALD = 24536,
  15.     NPC_DARK_IRON_SPAWN_BUNNY = 23894,
  16.  
  17.     NPC_FESTIVE_KEG_1 = 23702, // Thunderbrew Festive Keg
  18.     NPC_FESTIVE_KEG_2 = 23700, // Barleybrew Festive Keg
  19.     NPC_FESTIVE_KEG_3 = 23706, // Gordok Festive Keg
  20.     NPC_FESTIVE_KEG_4 = 24373, // T'chalis's Festive Keg
  21.     NPC_FESTIVE_KEG_5 = 24372, // Drohn's Festive Keg
  22.  
  23.     SPELL_GO_TO_NEW_TARGET = 42498,
  24.     SPELL_ATTACK_KEG = 42393,
  25.     SPELL_RETREAT = 42341,
  26.     SPELL_DRINK = 42436,
  27.  
  28.     SAY_RANDOM = 0,
  29. };
  30.  
  31. class npc_dark_iron_guzzler : public CreatureScript
  32. {
  33. public:
  34.     npc_dark_iron_guzzler() : CreatureScript("npc_dark_iron_guzzler") { }
  35.  
  36.     CreatureAI *GetAI(Creature* creature) const
  37.     {
  38.         return new npc_dark_iron_guzzlerAI(creature);
  39.     }
  40.  
  41.     struct npc_dark_iron_guzzlerAI : public ScriptedAI
  42.     {
  43.         npc_dark_iron_guzzlerAI(Creature* creature) : ScriptedAI(creature) { }
  44.  
  45.         bool atKeg;
  46.         bool playersLost;
  47.         bool barleyAlive;
  48.         bool thunderAlive;
  49.         bool gordokAlive;
  50.         bool drohnAlive;
  51.         bool tchaliAlive;
  52.  
  53.         uint32 AttackKegTimer;
  54.         uint32 TalkTimer;
  55.  
  56.         void Reset()
  57.         {
  58.             AttackKegTimer = 5000;
  59.             TalkTimer = (urand(1000, 120000));
  60.             me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
  61.         }
  62.  
  63.         void IsSummonedBy(Unit* summoner)
  64.         {
  65.             // Only cast the spell on spawn
  66.             DoCast(me, SPELL_GO_TO_NEW_TARGET);
  67.         }
  68.  
  69.         // These values are set through SAI - when a Festive Keg dies it will set data to all Dark Iron Guzzlers within 3 yards (the killers)
  70.         void SetData(uint32 type, uint32 data)
  71.         {
  72.             if (type == 10 && data == 10)
  73.             {
  74.                 DoCast(me, SPELL_GO_TO_NEW_TARGET);
  75.                 thunderAlive = false;
  76.             }
  77.  
  78.             if (type == 11 && data == 11)
  79.             {
  80.                 DoCast(me, SPELL_GO_TO_NEW_TARGET);
  81.                 barleyAlive = false;
  82.             }
  83.  
  84.             if (type == 12 && data == 12)
  85.             {
  86.                 DoCast(me, SPELL_GO_TO_NEW_TARGET);
  87.                 gordokAlive = false;
  88.             }
  89.  
  90.             if (type == 13 && data == 13)
  91.             {
  92.                 DoCast(me, SPELL_GO_TO_NEW_TARGET);
  93.                 drohnAlive = false;
  94.             }
  95.  
  96.             if (type == 14 && data == 14)
  97.             {
  98.                 DoCast(me, SPELL_GO_TO_NEW_TARGET);
  99.                 tchaliAlive = false;
  100.             }
  101.         }
  102.  
  103.         // As you can see here we do not have to use a spellscript for this
  104.         void SpellHit(Unit* caster, const SpellInfo* spell)
  105.         {
  106.             if (spell->Id == SPELL_DRINK)
  107.             {
  108.                 // Fake death - it's only visual!
  109.                 me->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
  110.                 me->StopMoving();
  111.  
  112.                 // Time based on information from videos
  113.                 me->DespawnOrUnsummon(7000);
  114.             }
  115.  
  116.             // Retreat - run back
  117.             if (spell->Id == SPELL_RETREAT)
  118.             {
  119.                 // Remove walking flag so we start running
  120.                 me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
  121.  
  122.                 if (me->GetAreaId() == 1296)
  123.                 {
  124.                     me->GetMotionMaster()->MovePoint(1, 1197.63f, -4293.571f, 21.243f);
  125.                 }
  126.                 else if (me->GetAreaId() == 1)
  127.                 {
  128.                     me->GetMotionMaster()->MovePoint(2, -5152.3f, -603.529f, 398.356f);
  129.                 }
  130.             }
  131.  
  132.             if (spell->Id == SPELL_GO_TO_NEW_TARGET)
  133.             {
  134.                 // If we're at Durotar we target different kegs if we are at at Dun Morogh
  135.                 if (me->GetAreaId() == 1296)
  136.                 {
  137.                     if (drohnAlive && gordokAlive && tchaliAlive)
  138.                     {
  139.                         switch (urand(0, 2))
  140.                         {
  141.                         case 0: // Gordok Festive Keg
  142.                             me->GetMotionMaster()->MovePoint(4, 1220.86f, -4297.37f, 21.192f);
  143.                             break;
  144.                         case 1: // Drohn's Festive Keg
  145.                             me->GetMotionMaster()->MovePoint(5, 1185.98f, -4312.98f, 21.294f);
  146.                             break;
  147.                         case 2: // Ti'chali's Festive Keg
  148.                             me->GetMotionMaster()->MovePoint(6, 1184.12f, -4275.21f, 21.191f);
  149.                             break;
  150.                         }
  151.                     }
  152.                     else if (!drohnAlive)
  153.                     {
  154.                         switch (urand(0, 1))
  155.                         {
  156.                         case 0: // Gordok Festive Keg
  157.                             me->GetMotionMaster()->MovePoint(4, 1220.86f, -4297.37f, 21.192f);
  158.                             break;
  159.                         case 1: // Ti'chali's Festive Keg
  160.                             me->GetMotionMaster()->MovePoint(6, 1184.12f, -4275.21f, 21.191f);
  161.                             break;
  162.                         }
  163.                     }
  164.                     else if (!gordokAlive)
  165.                     {
  166.                         switch (urand(0, 1))
  167.                         {
  168.                         case 0: // Drohn's Festive Keg
  169.                             me->GetMotionMaster()->MovePoint(5, 1185.98f, -4312.98f, 21.294f);
  170.                             break;
  171.                         case 1: // Ti'chali's Festive Keg
  172.                             me->GetMotionMaster()->MovePoint(6, 1184.12f, -4275.21f, 21.191f);
  173.                             break;
  174.                         }
  175.                     }
  176.                     else if (!tchaliAlive)
  177.                     {
  178.                         switch (urand(0, 1))
  179.                         {
  180.                         case 0: // Gordok Festive Keg
  181.                             me->GetMotionMaster()->MovePoint(4, 1220.86f, -4297.37f, 21.192f);
  182.                             break;
  183.                         case 1: // Drohn's Festive Keg
  184.                             me->GetMotionMaster()->MovePoint(5, 1185.98f, -4312.98f, 21.294f);
  185.                             break;
  186.                         }
  187.                     }
  188.                 }
  189.                 // If we're at Dun Morogh we target different kegs if we are at Durotar
  190.                 else if (me->GetAreaId() == 1)
  191.                 {
  192.                     if (barleyAlive && gordokAlive && thunderAlive)
  193.                     {
  194.                         switch (urand(0, 2))
  195.                         {
  196.                         case 0: // Barleybrew Festive Keg
  197.                             me->GetMotionMaster()->MovePoint(7, -5183.67f, -599.58f, 397.177f);
  198.                             break;
  199.                         case 1: // Thunderbrew Festive Keg
  200.                             me->GetMotionMaster()->MovePoint(8, -5159.53f, -629.52f, 397.213f);
  201.                             break;
  202.                         case 2: // Gordok Festive Keg
  203.                             me->GetMotionMaster()->MovePoint(9, -5148.01f, -578.34f, 397.177f);
  204.                             break;
  205.                         }
  206.                     }
  207.                     else if (!barleyAlive)
  208.                     {
  209.                         switch (urand(0, 1))
  210.                         {
  211.                         case 0: // Thunderbrew Festive Keg
  212.                             me->GetMotionMaster()->MovePoint(8, -5159.53f, -629.52f, 397.213f);
  213.                             break;
  214.                         case 1: // Gordok Festive Keg
  215.                             me->GetMotionMaster()->MovePoint(9, -5148.01f, -578.34f, 397.177f);
  216.                             break;
  217.                         }
  218.                     }
  219.                     else if (!gordokAlive)
  220.                     {
  221.                         switch (urand(0, 1))
  222.                         {
  223.                         case 0: // Barleybrew Festive Keg
  224.                             me->GetMotionMaster()->MovePoint(7, -5183.67f, -599.58f, 397.177f);
  225.                             break;
  226.                         case 1: // Thunderbrew Festive Keg
  227.                             me->GetMotionMaster()->MovePoint(8, -5159.53f, -629.52f, 397.213f);
  228.                             break;
  229.                         }
  230.                     }
  231.                     else if (!thunderAlive)
  232.                     {
  233.                         switch (urand(0, 1))
  234.                         {
  235.                         case 0: // Barleybrew Festive Keg
  236.                             me->GetMotionMaster()->MovePoint(7, -5183.67f, -599.58f, 397.177f);
  237.                             break;
  238.                         case 1: // Gordok Festive Keg
  239.                             me->GetMotionMaster()->MovePoint(9, -5148.01f, -578.34f, 397.177f);
  240.                             break;
  241.                         }
  242.                     }
  243.                 }
  244.                 atKeg = false;
  245.             }
  246.         }
  247.  
  248.         void MovementInform(uint32 Type, uint32 PointId)
  249.         {
  250.             if (Type != POINT_MOTION_TYPE)
  251.                 return;
  252.  
  253.             // Arrived at the retreat spot, we should despawn
  254.             if (PointId == 1 || PointId == 2)
  255.                 me->DespawnOrUnsummon(7000);
  256.  
  257.             // Arrived at the new keg - the spell has conditions in database
  258.             if (PointId == 4 || PointId == 5 || PointId == 6 || PointId == 7 || PointId == 8 || PointId == 9)
  259.             {
  260.                 DoCast(SPELL_ATTACK_KEG);
  261.                 me->SetByteFlag(UNIT_FIELD_BYTES_1, 1, 0x01); // Sit down
  262.                 atKeg = true;
  263.             }
  264.         }
  265.  
  266.         void UpdateAI(const uint32 diff)
  267.         {
  268.             if (!IsHolidayActive(HOLIDAY_BREWFEST))
  269.                 return;
  270.  
  271.             // If all kegs are dead we should retreat because we have won
  272.             if ((!gordokAlive && !thunderAlive && !barleyAlive) || (!gordokAlive && !drohnAlive && !tchaliAlive))
  273.             {
  274.                 DoCast(me, SPELL_RETREAT);
  275.  
  276.                 // We are doing this because we'll have to reset our scripts when we won
  277.                 if (Creature* herald = me->FindNearestCreature(NPC_DARK_IRON_HERALD, 100.0f))
  278.                     herald->AI()->SetData(20, 20);
  279.  
  280.                 // Despawn all summon bunnies so they will stop summoning guzzlers
  281.                 if (Creature* spawnbunny = me->FindNearestCreature(NPC_DARK_IRON_SPAWN_BUNNY, 100.0f))
  282.                     spawnbunny->DespawnOrUnsummon();
  283.             }
  284.  
  285.             if (TalkTimer <= diff)
  286.             {
  287.                 me->AI()->Talk(SAY_RANDOM);
  288.                 TalkTimer = (urand(44000, 120000));
  289.             } else TalkTimer -= diff;
  290.  
  291.             // Only happens if we're at keg
  292.             if (atKeg)
  293.             {
  294.                 if (AttackKegTimer <= diff)
  295.                 {
  296.                     DoCast(SPELL_ATTACK_KEG);
  297.                     AttackKegTimer = 5000;
  298.                 } else AttackKegTimer -= diff;
  299.             }
  300.         }
  301.     };
  302. };
  303.  
  304. // in void AddSC_npcs_special()
  305. new npc_dark_iron_guzzler();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement