function Create(self) self.mapwrapx = SceneMan.SceneWrapsX; self.startchargetimer = Timer(); self.chargetimer = Timer(); self.energycounter = 0; self.startcharge = false; --Marking things down here to make sure there are no problems later self.energymeter = nil; self.pullamountnumber = 0; -------------------- ----- The variables here can be changed to alter various properties of the shield. self.startchargedelay = 2000; -- time before the shield starts to charge up after it got hit. self.chargedelay = 20; -- charges one energy point after every X miliseconds. self.maxenergy = 60; -- maximum amount of energy for the shield. self.shieldradius = 35; -- pixel radius of shield. ----- --------------------PresetMan:ReloadAllScripts() self.parent = nil; self.parentpickingdone = false; local actor = MovableMan:GetMOFromID(self.RootID); if MovableMan:IsActor(actor) then self.parent = ToActor(actor); self.parentpickingdone = true; end end function Update(self) --It seems checking for a parent in the create doesn't work if the actor is manually ejected from a rocket. What the hell. --So we check for one here but only if we haven't already, if we have already then we can just assume it's messed up and give up (because that's what the original script did and I don't want to change that). if self.parentpickingdone == false then if self.parent == nil then print ("no parent update"); local actor = MovableMan:GetMOFromID(self.RootID); if MovableMan:IsActor(actor) then self.parent = ToActor(actor); self.parentpickingdone = true; end end --Otherwise, if it's old and there's no parent we delete it and forget about it elseif self.parentpickingdone == true then if self.parent == nil then self.ToDelete = true; end end --Do the actual shield stuff if we have a parent if self.parentpickingdone == true and self.parent ~= nil and MovableMan:IsActor(self.parent) then if self.energymeter == nil then --not(MovableMan:IsParticle(self.energymeter)) then self.energymeter = CreateMOSRotating("Mjolnir Shield Meter"); self.energymeter.Pos = self.parent.AboveHUDPos + Vector(-8,-18); MovableMan:AddParticle(self.energymeter); elseif MovableMan:IsParticle(self.energymeter) then self.energymeter.ToDelete = false; self.energymeter.ToSettle = false; self.energymeter.HitsMOs = false; self.energymeter.PinStrength = 1000; self.energymeter.Pos = self.parent.AboveHUDPos; self.energymeter.Frame = math.ceil((self.energycounter/self.maxenergy)*10); end if self.startchargetimer:IsPastSimMS(self.startchargedelay) and self.chargetimer:IsPastSimMS(self.chargedelay) and self.energycounter < self.maxenergy then if self.startcharge == true then local startChargeFX = CreateAEmitter("Mjolnir Sound Shield Charge Start"); startChargeFX.Pos = self.parent.Pos; MovableMan:AddParticle(startChargeFX); self.startcharge = false; end self.chargetimer:Reset(); self.energycounter = self.energycounter + 1; end if self.energycounter > 0 then for particle in MovableMan.Particles do if particle.HitsMOs == true then self.pardist = SceneMan:ShortestDistance(self.parent.Pos,particle.Pos,self.mapwrapx); if self.pardist.Magnitude < self.shieldradius then self.pullamountnumber = particle.Vel.AbsRadAngle-self.pardist.AbsRadAngle; if self.pullamountnumber < 0 then self.pullamountnumber = self.pullamountnumber * -1; end self.pullamountnumber = self.pullamountnumber/(math.pi*2); if self.pullamountnumber > 0.2 then if (particle.ClassName == "MOPixel" or particle.ClassName == "MOSParticle") and (particle.Team ~= self.parent.Team or (particle.Team == self.parent.Team and particle.IgnoresTeamHits == false)) then local shieldflash = CreateMOPixel("Particle Mjolnir Shield Hit Glow","UNSC.rte"); shieldflash.Pos = particle.Pos; MovableMan:AddParticle(shieldflash); local shieldsound = CreateAEmitter("Mjolnir Sound Shield Hit","UNSC.rte"); shieldsound.Pos = particle.Pos; MovableMan:AddParticle(shieldsound); particle.ToDelete = true; self.energycounter = self.energycounter - 1; self.chargetimer:Reset(); self.startchargetimer:Reset(); self.startcharge = true; if self.energycounter <= 0 then break; end end end end end end end end end function Destroy(self) if MovableMan:IsParticle(self.energymeter) then self.energymeter.ToDelete = true; end end