Advertisement
tjc12821

WIP imp spawn delay

Jul 19th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1.     struct hand_of_guldan_t : public demonology_spell_t
  2.     {
  3.       struct umbral_blaze_t : public demonology_spell_t
  4.       {
  5.         umbral_blaze_t( warlock_t* p ) : demonology_spell_t( "Umbral Blaze", p, p->find_spell( 273526 ) )
  6.         {
  7.           base_td = p->azerite.umbral_blaze.value();
  8.           hasted_ticks = false;
  9.         }
  10.       };
  11.  
  12.       struct imp_delay_event_t : public player_event_t
  13.       {
  14.         imp_delay_event_t( warlock_t* p, int delay ) :
  15.           player_event_t( *p, timespan_t::from_millis( delay ) ) {}
  16.  
  17.         virtual const char* name() const override
  18.         {
  19.           return  "imp_delay";
  20.         }
  21.  
  22.         virtual void execute() override
  23.         {
  24.           warlock_t* p = static_cast< warlock_t* >( player() );
  25.  
  26.           p->warlock_pet_list.wild_imps.spawn();
  27.         }
  28.       };
  29.  
  30.       int shards_used;
  31.       umbral_blaze_t* blaze;
  32.       const spell_data_t* summon_spell;
  33.       imp_delay_event_t* imp_delay_event;
  34.  
  35.       hand_of_guldan_t( warlock_t* p, const std::string& options_str ) :
  36.         demonology_spell_t( p, "Hand of Gul'dan" ), shards_used( 0 ), blaze( new umbral_blaze_t( p ) ),
  37.         summon_spell( p->find_spell( 104317 ) )
  38.       {
  39.         parse_options( options_str );
  40.         aoe = -1;
  41.         if ( p->azerite.umbral_blaze.ok() )
  42.         {
  43.           add_child( blaze );
  44.         }
  45.         parse_effect_data( p->find_spell( 86040 )->effectN( 1 ) );
  46.         if ( p->sets->has_set_bonus( WARLOCK_DEMONOLOGY, T21, B4 ) )
  47.           base_multiplier *= 1.1;
  48.       }
  49.  
  50.       timespan_t travel_time() const override
  51.       {
  52.         return timespan_t::from_millis( 700 );
  53.       }
  54.  
  55.       bool ready() override
  56.       {
  57.         if ( p()->resources.current[RESOURCE_SOUL_SHARD] == 0.0 )
  58.         {
  59.           return false;
  60.         }
  61.         return demonology_spell_t::ready();
  62.       }
  63.  
  64.       double bonus_da( const action_state_t* s ) const override
  65.       {
  66.         double da = demonology_spell_t::bonus_da( s );
  67.         da += p()->azerite.demonic_meteor.value();
  68.         return da;
  69.       }
  70.  
  71.       double action_multiplier() const override
  72.       {
  73.         double m = demonology_spell_t::action_multiplier();
  74.  
  75.         m *= last_resource_cost;
  76.  
  77.         return m;
  78.       }
  79.  
  80.       void consume_resource() override
  81.       {
  82.         demonology_spell_t::consume_resource();
  83.  
  84.         shards_used = as<int>( last_resource_cost );
  85.  
  86.         if ( rng().roll( p()->azerite.demonic_meteor.spell_ref().effectN( 2 ).percent()*shards_used ) ) {
  87.           p()->resource_gain( RESOURCE_SOUL_SHARD, 1.0, p()->gains.demonic_meteor );
  88.         }
  89.  
  90.         if ( last_resource_cost == 1.0 )
  91.           p()->procs.one_shard_hog->occur();
  92.         if ( last_resource_cost == 2.0 )
  93.           p()->procs.two_shard_hog->occur();
  94.         if ( last_resource_cost == 3.0 )
  95.           p()->procs.three_shard_hog->occur();
  96.       }
  97.  
  98.       void impact( action_state_t* s ) override
  99.       {
  100.         demonology_spell_t::impact( s );
  101.  
  102.         if ( shards_used >= 1 )
  103.           imp_delay_event = make_event<imp_delay_event_t>( *sim, p(), 400 );
  104.         if ( shards_used >= 2 )
  105.           imp_delay_event = make_event<imp_delay_event_t>( *sim, p(), 800 );
  106.         if ( shards_used >= 3 )
  107.           imp_delay_event = make_event<imp_delay_event_t>( *sim, p(), 1200 );
  108.  
  109.         // Only trigger wild imps once for the original target impact.
  110.         // Still keep it in impact instead of execute because of travel delay.
  111.         if ( result_is_hit( s->result ) && s->target == target )
  112.         {
  113.           if ( p()->azerite.umbral_blaze.ok() )
  114.           {
  115.             blaze->set_target( target );
  116.             blaze->execute();
  117.           }
  118.           for ( int i = 0;
  119.             p()->sets->has_set_bonus( WARLOCK_DEMONOLOGY, T21, B2 ) && i < shards_used;
  120.             i++ )
  121.           {
  122.             p()->buffs.rage_of_guldan->trigger();
  123.           }
  124.         }
  125.       }
  126.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement