Advertisement
cressidagp

ia_soldier

Dec 30th, 2024 (edited)
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.30 KB | None | 0 0
  1. ARCMERCS = {}
  2. ARCMERCS.SOLDIER = {}
  3.  
  4. math.randomseed(os.time()); math.random(); math.random(); math.random();
  5.  
  6. function ARCMERCS.SOLDIER.OnSpawn( unit, event )
  7.  
  8.     -- not start aiupdate if merc dont have owner
  9.     if unit:GetUInt64Value( 0x0006 + 0x0008 ) ~= nil then
  10.  
  11.         unit:RegisterAIUpdateEvent( 2000 )
  12.        
  13.     end
  14.    
  15.     local sUnit = tostring(unit)
  16.    
  17.     ARCMERCS[tostring(sUnit)] = {
  18.        
  19.         spellTimer = math.random( 6, 10 ),
  20.         spellNumber = 1
  21.        
  22.     };
  23.  
  24. end
  25.  
  26. function ARCMERCS.SOLDIER.OnAggro( unit, event, attacker )
  27.    
  28.     -- soldier has 'battle stance'
  29.     if ARCMERCS[tostring(unit)].soldierStance == 1 then
  30.        
  31.         -- check if enemy is in range
  32.         if unit:GetDistanceYards( attacker ) < 27 then
  33.  
  34.             -- cast 'charge' on attacker
  35.             unit:CastSpellOnTarget( 100, attacker )
  36.            
  37.         end
  38.        
  39.     end
  40.  
  41. end
  42.  
  43. function ARCMERCS.SOLDIER.OnAIUpdate( unit, event )
  44.  
  45.     --
  46.     -- merc its idle
  47.     --
  48.  
  49.     if unit:GetAIState() == 0 then
  50.    
  51.         if unit:GetByteValue( 0x0006 + 0x0044, 0 ) ~= 1 then
  52.        
  53.             -- sit on the ground
  54.             unit:SetByteValue( 0x0006 + 0x0044, 0, 1 )
  55.            
  56.         end
  57.        
  58.     end
  59.  
  60.     --
  61.     -- merc its attacking
  62.     --
  63.    
  64.     if unit:GetAIState() == 1 then
  65.    
  66.         local target = unit:GetUInt64Value( 0x0006 + 0x000C )
  67.        
  68.         -- dont bother with this if no target
  69.         if target == nil then return; end
  70.        
  71.         local sUnit = tostring(unit)
  72.        
  73.         ARCMERCS[sUnit].spellTimer = ARCMERCS[sUnit].spellTimer - 1
  74.        
  75.         if ARCMERCS[sUnit].spellTimer <= 0 then
  76.            
  77.             local s = ARCMERCS[sUnit].soldierStance
  78.             local n = ARCMERCS[sUnit].spellNumber
  79.             local lv = unit:GetLevel()
  80.            
  81.             local q = WorldDBQuery("SELECT spellId, target FROM arcmercs.spells WHERE entry = "..unit:GetEntry().." AND stance = "..s.." AND slot = "..n.." AND minlv <= "..lv.." AND maxlv >= "..lv.." ")
  82.            
  83.             if q then
  84.            
  85.                 local value = q:GetColumn( 1 ):GetShort()
  86.            
  87.                 if value == 0 then
  88.                
  89.                     unit:CastSpell( q:GetColumn( 0 ):GetULong() )
  90.                
  91.                 elseif value == 1 then
  92.                
  93.                     local target = unit:GetMainTank()
  94.                    
  95.                     if target then
  96.                
  97.                         unit:CastSpellOnTarget( q:GetColumn( 0 ):GetULong(), target )
  98.                        
  99.                     end
  100.                
  101.                 end
  102.            
  103.                 ARCMERCS[sUnit].spellTimer = math.random( 6, 10 )
  104.                
  105.             end
  106.            
  107.             ARCMERCS[sUnit].spellSlot = ARCMERCS[sUnit].spellSlot + 1
  108.            
  109.             if ARCMERCS[sUnit].spellSlot == 5 then
  110.            
  111.                 ARCMERCS[sUnit].spellSlot = 1
  112.            
  113.             end
  114.  
  115.         end
  116.    
  117.     end
  118.    
  119.     --
  120.     -- merc its casting
  121.     --
  122.  
  123.     if unit:GetAIState() == 2 then return; end
  124.    
  125.     --
  126.     -- merc its following
  127.     --
  128.  
  129.     if unit:GetAIState() == 4 then
  130.    
  131.         if unit:GetByteValue( 0x0006 + 0x0044, 0 ) ~= 0 then
  132.        
  133.             -- stand up
  134.             unit:SetByteValue( 0x0006 + 0x0044, 0, 0 )
  135.            
  136.         end
  137.    
  138.         -- dont bother with this if merc its moving
  139.         if unit:IsCreatureMoving() == true then return; end
  140.        
  141.         -- dont bother with this if eating of drinking
  142.         if unit:HasAura( 430 ) or unit:HasAura( 433 ) then return; end
  143.        
  144.         if unit:GetHealthPct() < 35 then
  145.        
  146.             unit:CastSpell( 433 )
  147.            
  148.         end
  149.    
  150.         local f = math.random( 0, 100 )
  151.        
  152.         if( f > 0 and f <= 15 ) then
  153.        
  154.             unit:Emote( 1, 0 ) -- talk
  155.    
  156.         elseif( f > 20 and f <= 22 ) then
  157.        
  158.             unit:Emote( 23, 0 ) -- flex
  159.            
  160.         elseif( f > 31 and f <= 33 ) then
  161.        
  162.             unit:Emote( 16, 0 ) -- dance
  163.  
  164.         else
  165.        
  166.         end
  167.    
  168.     end
  169.  
  170. end
  171.  
  172. function ARCMERCS.SOLDIER.OnLeaveCombat( unit, event, target )
  173.  
  174.     --unit:RemoveAIUpdateEvent()
  175.  
  176. end
  177.  
  178. function ARCMERCS.SOLDIER.OnTargetDied( unit, event, target )
  179.  
  180.     --unit:RemoveAIUpdateEvent()
  181.  
  182. end
  183.  
  184. function ARCMERCS.SOLDIER.OnDied( unit, event, killer )
  185.  
  186.     -- Not need to RemoveAIUpdateEvent() here since its auto handled
  187.  
  188. end
  189.  
  190. RegisterUnitEvent( 43284, 18, ARCMERCS.SOLDIER.OnSpawn );
  191. RegisterUnitEvent( 43285, 18, ARCMERCS.SOLDIER.OnSpawn );
  192.  
  193. RegisterUnitEvent( 43284, 1, ARCMERCS.SOLDIER.OnAggro );
  194. RegisterUnitEvent( 43285, 1, ARCMERCS.SOLDIER.OnAggro );
  195.  
  196. RegisterUnitEvent( 43284, 2, ARCMERCS.SOLDIER.OnLeaveCombat );
  197. RegisterUnitEvent( 43285, 2, ARCMERCS.SOLDIER.OnLeaveCombat );
  198.  
  199. RegisterUnitEvent( 43284, 3, ARCMERCS.SOLDIER.OnTargetDied );
  200. RegisterUnitEvent( 43285, 3, ARCMERCS.SOLDIER.OnTargetDied );
  201.  
  202. RegisterUnitEvent( 43284, 4, ARCMERCS.SOLDIER.OnDied );
  203. RegisterUnitEvent( 43285, 4, ARCMERCS.SOLDIER.OnDied );
  204.  
  205. RegisterUnitEvent( 43284, 21, ARCMERCS.SOLDIER.OnAIUpdate );
  206. RegisterUnitEvent( 43285, 21, ARCMERCS.SOLDIER.OnAIUpdate );
  207.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement