function Create(self) self.debugTimer = Timer() self.updateDebugCallTime = 1000 self.debug = false self.controlled = false self.friendlyFound = false self.EnemyFound = false ----------------------------- AVOID OBSTACLE OPTIONS -------------------------------- -- WEAK | | | | | | | | STRONG -- -- 1 2 3 4 5 6 7 8 9 10 ----- self.avoidStrength = 2.75 -- 2.75 self.avoidDampening = 7.5 -- 7.5 ------------------------------------------------------------------------------------- self.avSt = (self.avoidStrength * -10) self.avDm = (self.avoidDampening / -100) self.altLock = self:GetAltitude(0,0) self.radarRefreshRate = 10 self.radarDist = 250 self.tick = math.ceil(math.random(360)) self.ticker = Timer() self.laserHitDist = self.radarDist self.laserRepeat = 0 self.laserDelay = Timer() end function Update(self) -- DIRECTIONAL CHECKS -- self.hitPos = Vector() self.lastPos = Vector() for i = 1, 3 do self.side = SceneMan:CastObstacleRay(self.Pos, Vector(30,0):RadRotate(math.rad(math.random(360))), self.hitPos, self.lastPos, self.ID, -2, 0, 0) end self.hitDist = SceneMan:ShortestDistance(self.Pos, self.hitPos, false) -- IF THE DIRECTIONAL CHECK HIT SOMETHING if self.hitDist.Magnitude < 30 and self.Vel.Magnitude < 10 then self:AddImpulseForce(Vector((self.avSt+(self.hitDist.Magnitude*self.avDm)),0):RadRotate(self.hitDist.AbsRadAngle),Vector(0,0)) end -- ALTITUDE self.alt = self:GetAltitude(0,0) -- ALTITUDE CHECK if self.alt < 30 then -- or (self.alt < self.altLock and not self.controlled) then -- AUTOMATIC ALTITUDE LOCK if self.Vel.Y > -3 then self:AddImpulseForce(Vector(0, -15+(self.alt*-0.15)),Vector(0,0)) end end -- MOVEMENT -- self.Operator = self:GetController() -- MOVEMENT DAMPENING AND CAP SPEED if not(self.Vel.Magnitude < 15) or not(self.controlled) then self.Vel.Y = self.Vel.Y + (self.Vel.Y*-0.075) self.Vel.X = self.Vel.X + (self.Vel.X*-0.075) else -- MOVEMENT STRENGTH if self.Operator:IsState(Controller.BODY_JUMP) --[[or self.Operator:IsState(Controller.MOVE_UP)]] then self:AddImpulseForce(Vector(0,-15.75),Vector(0,0)) end if self.Operator:IsState(Controller.BODY_CROUCH) --[[or self.Operator:IsState(Controller.MOVE_DOWN)]] then self:AddImpulseForce(Vector(0,12.75),Vector(0,0)) end if self.Operator:IsState(Controller.HOLD_LEFT) --[[or self.Operator:IsState(Controller.MOVE_LEFT)]] then self:AddImpulseForce(Vector(-12.75,0),Vector(0,0)) end if self.Operator:IsState(Controller.HOLD_RIGHT) --[[or self.Operator:IsState(Controller.MOVE_RIGHT)]] then self:AddImpulseForce(Vector(12.75,0),Vector(0,0)) end end -- ROTATION STABILITY if self.RotAngle ~= 0 then self.RotAngle = self.RotAngle + (self.RotAngle*-0.35) end -- AI BEHAVIOUR -- if self.ticker:IsPastSimMS(self.radarRefreshRate) then self.tick = self.tick + 1 self.ticker:Reset() if self.tick >= 360 then self.tick = 0 end end if self:IsPlayerControlled() == false then if not(self.foundActor) or self.foundActor == nil then self.radarCircle = Vector(self.radarDist,0):RadRotate(math.rad(self.tick)) self.radarHitPos = Vector() self.radarLastPos = Vector() self.radarCast = SceneMan:CastObstacleRay(self.Pos, self.radarCircle, self.radarHitPos, self.radarLastPos, self.ID, -2, 0 ,0) if self.radarCast > 0 then self.radarHitDist = SceneMan:ShortestDistance(self.Pos, self.radarHitPos, false).Magnitude for i = 1, self.radarCast, (self.radarCast/self.radarHitDist)*10 do self.radarEffect = CreateMOPixel("Aco.rte/Tiny Blue Laser Glow") self.radarEffect.Pos = self.Pos + self.radarCircle * (i/self.radarDist) self.radarEffect.PinStrength = 1000 MovableMan:AddParticle(self.radarEffect) end self.radarTipEffect = CreateMOPixel("Aco.rte/Tiny Blue Glow") self.radarTipEffect.Pos = self.radarHitPos self.radarTipEffect.PinStrength = 1000 MovableMan:AddParticle(self.radarTipEffect) else self.radarHitDist = self.radarDist for i = 1, self.radarDist, (self.radarDist/self.radarHitDist)*10 do self.radarEffect = CreateMOPixel("Aco.rte/Tiny Blue Laser Glow") self.radarEffect.Pos = self.Pos + self.radarCircle * (i/self.radarDist) self.radarEffect.PinStrength = 1000 MovableMan:AddParticle(self.radarEffect) end self.radarTipEffect = CreateMOPixel("Aco.rte/Tiny Blue Glow") self.radarTipEffect.Pos = self.radarLastPos self.radarTipEffect.PinStrength = 1000 MovableMan:AddParticle(self.radarTipEffect) end self.radarCheck = SceneMan:CastMORay(self.Pos, self.radarCircle, self.ID, -2, 0, false, 0) if self.radarCheck ~= 255 then self.foundObject = MovableMan:GetMOFromID(MovableMan:GetRootMOID(self.radarCheck)) -- if self.foundObject.PresetName ~= self.PresetName and (self.foundObject.ClassName == "ACrab" or self.foundObject.ClassName == "AHuman") then if (self.foundObject.ClassName == "ACrab" or self.foundObject.ClassName == "AHuman") then if self.foundObject.ClassName == "AHuman" then self.foundActor = ToAHuman(self.foundObject) elseif self.foundObject.ClassName == "ACrab" then self.foundActor = ToACrab(self.foundObject) end self.actorDist = SceneMan:ShortestDistance(self.Pos, self.foundActor.Pos, false) end end elseif self.foundActor then self.actorDist = SceneMan:ShortestDistance(self.Pos, self.foundActor.Pos, false) if self.actorDist.Magnitude > 45 and self.friendlyFound and self.Vel.Magnitude < self.actorDist.Magnitude/10 and self.laserRepeat == 3 then self:SetWhichMOToNotHit(self.foundActor,-1) self.foundActor:SetWhichMOToNotHit(self,-1) self:AddImpulseForce(Vector(self.actorDist.Magnitude/2,0):RadRotate(SceneMan:ShortestDistance(self.Pos, self.foundActor.Pos + Vector(0,-15), false).AbsRadAngle),Vector(0,0)) self.controlled = true else self.controlled = false end if self.foundActor:IsStatus(4) or self.foundActor.Health <= 0 or self.foundActor:IsSetToDelete() or not(MovableMan:IsActor(self.foundActor)) then self.foundActor = nil self.friendlyFound = false self.EnemyFound = false self.controlled = false self.laserRepeat = 0 end self.foundObject = nil end if self.laserRepeat < 3 and self.foundActor then if self.laserDelay:IsPastSimMS(175) then if self.foundActor.Team == self.Team then for i = 1, self.actorDist.Magnitude, (self.actorDist.Magnitude/self.actorDist.Magnitude)*3 do self.foundAllyEffect = CreateMOPixel("Aco.rte/Tiny Green Glow") self.foundAllyEffect.Pos = self.Pos + Vector(self.actorDist.Magnitude,0):RadRotate(self.actorDist.AbsRadAngle) * (i/self.actorDist.Magnitude) self.foundAllyEffect.PinStrength = 1000 MovableMan:AddParticle(self.foundAllyEffect) end self.friendlyFound = true else for i = 1, self.actorDist.Magnitude, (self.actorDist.Magnitude/self.actorDist.Magnitude)*3 do self.foundEnemyEffect = CreateMOPixel("Aco.rte/Tiny Red Glow") self.foundEnemyEffect.Pos = self.Pos + Vector(self.actorDist.Magnitude,0):RadRotate(self.actorDist.AbsRadAngle) * (i/self.actorDist.Magnitude) self.foundEnemyEffect.PinStrength = 1000 MovableMan:AddParticle(self.foundEnemyEffect) end self.EnemyFound = true self.aimedAngle = SceneMan:ShortestDistance(self.Pos,self.foundActor.Pos,false).AbsRadAngle self:SetAimAngle(self.aimedAngle) if self.aimedAngle < 0 and self.HFlipped then self.HFlipped = false elseif self.aimedAngle > 0 and not(self.HFlipped) then self.HFlipped = true end end self.laserDelay:Reset() self.laserRepeat = self.laserRepeat + 1 end end else self.laserRepeat = 0 self.foundActor = nil self.friendlyFound = false self.EnemyFound = false if not(self.Operator:IsState(Controller.HOLD_RIGHT) or self.Operator:IsState(Controller.HOLD_LEFT) or self.Operator:IsState(Controller.BODY_CROUCH) or self.Operator:IsState(Controller.BODY_JUMP)) then self.controlled = false else self.controlled = true self.altLock = self:GetAltitude(0,0) end end -- DEBUG TOOLS -- if UInputMan:KeyPressed(26) and self.debug then self.dup = CreateACrab(self.PresetName) self.dup.Team = self.Team self.dup.Pos = self.Pos self.dup.Vel = self.Vel MovableMan:AddActor(self.dup) ActivityMan:GetActivity():SwitchToActor(self.dup,0,0); self.ToDelete = true end if self.HFlipped then self.aimAngle = self:GetAimAngle(true) else self.aimAngle = self:GetAimAngle(false) end -- LASER POINTER -- --[[ self.laserHitPos = Vector() self.laserLastPos = Vector() self.laserCast = SceneMan:CastObstacleRay(self.Pos, Vector(self.radarDist,0):RadRotate(self.aimAngle), self.laserHitPos, self.laserLastPos, self.ID, 0 ,0) if self.laserCast >= 0 then self.laserHitDist = SceneMan:ShortestDistance(self.Pos, self.laserHitPos, true).Magnitude for i = 1, self.laserCast, (self.laserCast/self.laserHitDist)*15 do self.laserEffect = CreateMOPixel("Aco.rte/Tiny Blue Glow") self.laserEffect.Pos = self.Pos + Vector(self.radarDist,0):RadRotate(self.aimAngle) * (i/self.radarDist) self.laserEffect.PinStrength = 1000 MovableMan:AddParticle(self.laserEffect) end else self.laserHitDist = self.radarDist for i = 1, self.radarDist, (self.radarDist/self.laserHitDist)*15 do self.laserEffect = CreateMOPixel("Aco.rte/Tiny Blue Glow") self.laserEffect.Pos = self.Pos + Vector(self.radarDist,0):RadRotate(self.aimAngle) * (i/self.radarDist) self.laserEffect.PinStrength = 1000 MovableMan:AddParticle(self.laserEffect) end end ]] if self.debugTimer:IsPastSimMS(self.updateDebugCallTime) and self.debug then print("ALTITUDE: "..math.ceil(self.alt).."\n".."VERTICAL VELOCITY: "..math.ceil(self.Vel.Y).."\n".."TOTAL VELOCITY: "..self.Vel.Magnitude.."\n") print(self.tick) self.debugTimer:Reset() end end function Destroy(self) end -- PresetMan:ReloadAllScripts()