Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.30 KB | None | 0 0
  1. -----------------------------------------------------------------------------
  2. -- File : /units/cybran/ucx0103/ucx0104D1_script.lua
  3. -- Author(s): Mike Robbins
  4. -- Summary : SC2 Cybran Experimental Bomb Bouncer: UCX0103
  5. -- Copyright © 2009 Gas Powered Games, Inc. All rights reserved.
  6. -----------------------------------------------------------------------------
  7. local ExperimentalMobileUnit = import('/lua/sim/ExperimentalMobileUnit.lua').ExperimentalMobileUnit
  8. local MobileUnit = import('/lua/sim/MobileUnit.lua').MobileUnit
  9. local utilities = import('/lua/system/Utilities.lua')
  10. local GetRandomFloat = utilities.GetRandomFloat
  11.  
  12. UCX0104D1 = Class(ExperimentalMobileUnit) {
  13.  
  14. OnCreate = function(self, createArgs)
  15. ExperimentalMobileUnit.OnCreate(self, createArgs)
  16. self:InitSatBones()
  17. self.activatedEmitters = {}
  18. self.ambientEmitters = {}
  19. self.StealthOn = false
  20. end,
  21.  
  22. -- Override the setup intel function so we don't enable the radar/sonar/cloak field when constructed.
  23. SetupIntel = function(self)
  24. local bp = self:GetBlueprint().Intel
  25. self:EnableIntel('Vision')
  26. if bp then
  27. self.IntelDisables = {
  28. Radar = 1,
  29. Sonar = 1,
  30. Omni = 1,
  31. RadarStealth = 1,
  32. SonarStealth = 1,
  33. RadarStealthField = 1,
  34. SonarStealthField = 1,
  35. Cloak = 1,
  36. CloakField = 1,
  37. Spoof = 1,
  38. Jammer = 1,
  39. }
  40. return true
  41. end
  42. return false
  43. end,
  44.  
  45. InitSatBones = function(self)
  46. self.SatBones = {
  47. {Bone = 'sat_arm', Axis = 'y', AngleOn = -20, AngleOff = 65},
  48. {Bone = 'sat_head', Axis = 'y', AngleOn = -15, AngleOff = 130},
  49. --{Bone = 'sat_spin', Axis = 'x', AngleOn = 0, AngleOff = 0},
  50. {Bone = 'sat_finger1_01', Axis = 'x', AngleOn = -20, AngleOff = -89},
  51. {Bone = 'sat_finger1_02', Axis = 'x', AngleOn = -20, AngleOff = -99},
  52. {Bone = 'sat_finger2_01', Axis = 'x', AngleOn = -20, AngleOff = -89},
  53. {Bone = 'sat_finger2_02', Axis = 'x', AngleOn = -20, AngleOff = -99},
  54. {Bone = 'sat_finger3_01', Axis = 'x', AngleOn = -20, AngleOff = -89},
  55. {Bone = 'sat_finger3_02', Axis = 'x', AngleOn = -20, AngleOff = -99},
  56. {Bone = 'sat_finger4_01', Axis = 'x', AngleOn = -20, AngleOff = -89},
  57. {Bone = 'sat_finger4_02', Axis = 'x', AngleOn = -20, AngleOff = -99},
  58. {Bone = 'sat_finger5_01', Axis = 'x', AngleOn = -20, AngleOff = -89},
  59. {Bone = 'sat_finger5_02', Axis = 'x', AngleOn = -20, AngleOff = -99},
  60. {Bone = 'sat_finger6_01', Axis = 'x', AngleOn = -20, AngleOff = -89},
  61. {Bone = 'sat_finger6_02', Axis = 'x', AngleOn = -20, AngleOff = -99},
  62. }
  63. --PZ CreateRotator(unit, bone, axis, [goal], [startspeed], [accel], [goalspeed])
  64. self.SatSpinner = CreateRotator(self, 'sat_spin', 'x', nil, 0, 20 )
  65. self.SatRotators = {}
  66. for k, v in self.SatBones do
  67. local rotator = CreateRotator(self, v.Bone, v.Axis, v.AngleOff, 100, 90, 180 )
  68. table.insert( self.SatRotators, { Rotator = rotator, AngleOn = v.AngleOn, AngleOff = v.AngleOff })
  69. self.Trash:Add( rotator )
  70. end
  71. end,
  72.  
  73. SneakMode = function(self, bToggle)
  74. if bToggle == true then
  75. for k, v in self.SatRotators do
  76. v.Rotator:SetGoal(v.AngleOn)
  77. end
  78. self.SatSpinner:SetTargetSpeed(180)
  79. self:PlayUnitSound('Unpack')
  80. elseif bToggle == false then
  81. for k, v in self.SatRotators do
  82. v.Rotator:SetGoal(v.AngleOff)
  83. end
  84. self.SatSpinner:SetTargetSpeed(0)
  85. self:PlayUnitSound('Pack')
  86. else
  87. LOG("ERROR: SneakStance Toggle is not a boolean")
  88. end
  89.  
  90. end,
  91.  
  92. ActivationEffects = function(self)
  93. WaitSeconds(1.7)
  94. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0104D1.Activate01 do
  95. table.insert( self.activatedEmitters, CreateAttachedEmitter( self, 'sat_head', self:GetArmy(), v ) )
  96. end
  97. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0104D1.Activate02 do
  98. table.insert( self.activatedEmitters, CreateAttachedEmitter( self, -2, self:GetArmy(), v ) )
  99. end
  100. end,
  101.  
  102. OnIntelEnabled = function(self)
  103. if not self.StealthOn then
  104. self.StealthOn = true
  105. self:SneakMode(true)
  106.  
  107. self:PlayUnitAmbientSound( 'CloakActive' )
  108. self:ForkThread(self.ActivationEffects)
  109. end
  110. end,
  111.  
  112. OnIntelDisabled = function(self)
  113. if self.StealthOn then
  114. self.StealthOn = false
  115. if self.activatedEmitters then
  116. for k, v in self.activatedEmitters do
  117. v:Destroy()
  118. end
  119. self.activatedEmitters = {}
  120. end
  121. self:SneakMode(false)
  122. self:StopUnitAmbientSound( 'CloakActive' )
  123.  
  124. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0104D1.Deactivate01 do
  125. table.insert( self.activatedEmitters, CreateAttachedEmitter( self, -2, self:GetArmy(), v ) )
  126. end
  127. end
  128. end,
  129.  
  130. OnAddToStorage = function(self, unit)
  131. if self.StealthOn then
  132. self:DisableIntel('CloakField')
  133. self:DisableIntel('RadarStealthField')
  134. self:DisableIntel('SonarStealthField')
  135. self:OnIntelDisabled()
  136. end
  137. ExperimentalMobileUnit.OnAddToStorage(self, unit)
  138. end,
  139.  
  140. OnRemoveFromStorage = function(self, unit)
  141. if not self.StealthOn and self:IsAbilityActive('StealthField') and self:IsUnitAbilityState('StealthField', 'Activated') then
  142. self:EnableIntel('CloakField')
  143. self:EnableIntel('RadarStealthField')
  144. self:EnableIntel('SonarStealthField')
  145. self:OnIntelEnabled()
  146. end
  147. ExperimentalMobileUnit.OnRemoveFromStorage(self, unit)
  148. end,
  149.  
  150. OnStopBeingBuilt = function(self,builder,layer)
  151. ExperimentalMobileUnit.OnStopBeingBuilt(self,builder,layer)
  152.  
  153. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0104D1.Ambient01 do
  154. table.insert( self.ambientEmitters, CreateAttachedEmitter( self, 'Root', self:GetArmy(), v ) )
  155. end
  156.  
  157. self.SpinnerTarget = false
  158. self:ForkThread( self.SpinnerThread )
  159. end,
  160.  
  161. OnKilled = function(self, instigator, type, overkillRatio)
  162. MobileUnit.OnKilled(self, instigator, type, overkillRatio)
  163. self:SneakMode(false)
  164. end,
  165.  
  166. CreateFirePlumes = function( self, army, bones, yBoneOffset )
  167. local proj, position, offset, velocity
  168. local basePosition = self:GetPosition()
  169. for k, vBone in bones do
  170. position = self:GetPosition(vBone)
  171. offset = utilities.GetDifferenceVector( position, basePosition )
  172. velocity = utilities.GetDirectionVector( position, basePosition )
  173. velocity.x = velocity.x + GetRandomFloat(-0.3, 0.3)
  174. velocity.z = velocity.z + GetRandomFloat(-0.3, 0.3)
  175. velocity.y = velocity.y + GetRandomFloat( 0.0, 0.3)
  176. proj = self:CreateProjectile('/effects/entities/DestructionFirePlume01/DestructionFirePlume01_proj.bp', offset.x, offset.y + yBoneOffset, offset.z, velocity.x, velocity.y, velocity.z)
  177. proj:SetBallisticAcceleration(utilities.GetRandomFloat(-1, -2)):SetVelocity(utilities.GetRandomFloat(3, 4)):SetCollision(false)
  178.  
  179. local emitter = CreateEmitterOnEntity(proj, army, '/effects/emitters/units/general/event/death/destruction_explosion_fire_plume_02_emit.bp')
  180.  
  181. local lifetime = GetRandomFloat( 12, 22 )
  182. end
  183. end,
  184.  
  185. DeathThread = function(self)
  186. -- Destroy idle animation
  187. if(self.Animator) then
  188. self.Animator:Destroy()
  189. self.Animator = false
  190. end
  191.  
  192. self:PlayUnitSound('Destroyed')
  193. local army = self:GetArmy()
  194.  
  195. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0117d1.Death02 do
  196. CreateEmitterAtBone( self, 'Root', army, v ):ScaleEmitter(0.2)
  197. end
  198.  
  199. self:CreateFirePlumes( army, {'foot_fr', 'knee_bl', 'foot_br',}, 0.5 )
  200. WaitSeconds(0.5)
  201. self:CreateFirePlumes( army, {'foot_cl', 'knee_br', 'foot_bl',}, 0.5 )
  202.  
  203. WaitSeconds(0.2)
  204.  
  205. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0117d1.Death02 do
  206. CreateEmitterAtBone( self, 'Root', army, v ):ScaleEmitter(0.3)
  207. end
  208.  
  209. WaitSeconds( 0.2 )
  210.  
  211. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0117d1.Death02 do
  212. CreateEmitterAtBone( self, 'sat_arm', army, v ):ScaleEmitter(0.5)
  213. end
  214.  
  215. self:CreateUnitDestructionDebris()
  216.  
  217. WaitSeconds(1.0)
  218.  
  219. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0117d1.Death02 do
  220. CreateEmitterAtBone( self, 'Root', army, v ):ScaleEmitter(0.3)
  221. end
  222.  
  223. self:ShakeCamera(20, 4, 1, 2.0)
  224.  
  225. WaitSeconds( 0.5 )
  226.  
  227. for k, v in EffectTemplates.Units.Cybran.Experimental.UCX0117d1.Death01 do
  228. CreateEmitterAtBone( self, -2, army, v )
  229. end
  230.  
  231. local bp = self:GetBlueprint()
  232. local scale = (bp.SizeX + bp.SizeZ) * 1.5
  233. CreateDecal(self:GetPosition(),GetRandomFloat(0,2*math.pi),'/textures/Terrain/Decals/scorch_001_diffuse.dds', '', '', scale , scale, GetRandomFloat(200,350), GetRandomFloat(300,600), self:GetArmy(), 4 )
  234.  
  235. local bp = self:GetUnitWeaponBlueprint('MegalithDeath')
  236. if bp then
  237. DamageArea(self, self:GetPosition(), bp.DamageRadius, bp.Damage, bp.DamageType, bp.DamageFriendly)
  238. end
  239.  
  240. self:CreateWreckage()
  241. self:ShakeCamera(2, 1, 0, 0.03)
  242.  
  243. self:Destroy()
  244. end,
  245. }
  246. TypeClass = UCX0104D1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement