function Create(self) --print("-------------Script Aim is running-------------"); -- First, we need to find the nearest actor, and then set it to be our parent. local curdist = 50; for actor in MovableMan.Actors do local avgx = actor.Pos.X - self.Pos.X; local avgy = actor.Pos.Y - self.Pos.Y; -- Here we are looking at all actors, and seeing which one is very close. local dist = math.sqrt(avgx ^ 2 + avgy ^ 2); if dist < curdist then curdist = dist; self.parent = actor; end end -- Ok, now that we have found him, we just need his aiming angle. self.angle = ToActor(self.parent):GetAimAngle(true); self.mortarshot = CreateAEmitter("Particle Auto Mortar"); self.targetpainterbad = CreateAEmitter("Target Painter Bad"); self.targetpaintergood = CreateAEmitter("Target Painter Good"); self.firevel = 25; -- fire velocity of the gun self.arcmode = -1; -- 1 is low, -1 is high self.gravacc = -1; -- stupid CC gravity self.maxrange = 2000; --maximum range for the turret to have (in case you do not want it firing for miles off mountains) self.range = 25; self.blowingupinface = 30 -- distance before it will alow you to shoot yourself in the foot -- First tricky part local AimAngle = Vector(math.cos(self.angle) * self.maxrange, math.sin(self.angle) * self.maxrange * -1); self.AimDistance = SceneMan:CastObstacleRay(self.Pos, AimAngle, Vector(0,0), Vector(0,0), self.ID ,-1 ,0); self.targetx = self.AimDistance*math.cos(self.angle); self.targety = -self.AimDistance*math.sin(self.angle); --Test for range, so we do not kill ourselves with this self.rangetest = self.firevel^4 - self.gravacc^2*self.targetx^2 - 2*self.gravacc*self.firevel^2*self.targety; if self.rangetest > 100 and self.AimDistance > self.blowingupinface then -- Here I generate a big glowing thing so I can see if it's going to the right place or not. self.targetpaintergood.Pos = Vector(self.Pos.X + self.targetx, self.Pos.Y + self.targety); MovableMan:AddParticle(self.targetpaintergood); -- Well that was easy. -- Oh No! Lots of hard to explain math! (it does fancy stuff and gets you a new firing angle) self.mortarshot.Vel.X = (self.targetx*math.sqrt((self.firevel^2 - self.gravacc*self.targety + self.arcmode * math.sqrt(self.rangetest))/(self.targetx^2 + self.targety^2)))/math.sqrt(2); self.mortarshot.Vel.Y = (self.gravacc*self.targetx^2 + self.targety*(self.firevel^2 + self.arcmode * math.sqrt(self.rangetest)))/(math.sqrt(2)*math.sqrt(self.arcmode*(self.targetx^2 + self.targety^2)*(self.arcmode*(self.firevel^2 - self.gravacc*self.targety) + math.sqrt(self.rangetest)))); --That was not so hard, was it? (yes, yes it was) --Fire! self.mortarshot.Angle = self.angle; self.mortarshot.Pos = self.Pos; MovableMan:AddParticle(self.mortarshot); self.ToDelete = true; else -- Here I generate a big glowing thing to show you that the target is out of range. self.targetpainterbad.Pos = Vector(self.Pos.X + self.targetx, self.Pos.Y + self.targety); MovableMan:AddParticle(self.targetpainterbad); FrameMan:SetScreenText("Out Of Range!", 0, 0, 1000, false); -- Well that was easy. self.ToDelete = true; end self.ToDelete = true; end function Destroy(self) --print("-------------Script Complete-------------"); end