Basic Gravity Gun fired through Lua
I know there have been several of these, but not only do many of them not work anymore, they're far more complicated than I require. Pretty much I'm looking for this, mounted on a MOSRotating and firing either through lua or an emitter - when the beam is on, it pulls whatever it hits in towards the emitter (slowly, not snapping in) and when you let it go, it pushes it out gently rather than firing it out. The closest thing I can find is
the mech's gravity gun in this mod, but even that is too heavy duty. I want the most basic possible way of doing it, but I'm no good at rays just yet.
EDIT: Nope, disregard, I just ripped that gun apart and reverse-engineered it.
Code:
function Create(self)
self.LTimer = Timer();
self.firemode = 0; -- 0 is inactive, 1 is gravitate, 2 is launch
self.launchsound = false;
self.canlaunchsound = true;
--------------------
----- The variables here can be changed to alter various properties of the phys cannon.
self.launchpower = 0; -- strength of the launch. 120 is default.
self.pickuppower = 100; -- strength of the pull. 120 is default.
self.launchrange = 5; -- size of the area to check for objects to launch. 35 is default.
self.pickuprange = 20; -- size of the area to check for objects to pull. 35 is default.
--------------------
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;
local dist = math.sqrt(avgx ^ 2 + avgy ^ 2);
if dist < curdist and actor:HasObject("Brainfighter") then
self.parent = actor;
end
end
end
function Update(self)
--GRABBING THE OBJECT
if self.firemode == 0 and self.LTimer:IsPastSimMS(5) then
self.firemode = 1;
end
if self.firemode == 1 and MovableMan:IsActor(self.parent) then
for particle in MovableMan.Particles do
if particle.ClassName == "MOSRotating" or particle.ClassName == "AEmitter" then
local paravgx = particle.Pos.X - self.Pos.X;
local paravgy = particle.Pos.Y - self.Pos.Y;
local dist = math.sqrt(paravgx ^ 2 + paravgy ^ 2);
if dist < self.pickuprange then
particle.Vel = Vector((self.Pos.X - particle.Pos.X), (self.Pos.Y - particle.Pos.Y)) / (1 + (particle.Mass / self.pickuppower));
particle:SetWhichMOToNotHit(self.parent,0.3);
particle.RotSpeed = 0
end
end
end
end
-- RELEASING THE OBJECT
if MovableMan:IsActor(self.parent) then
if not (self.parent:GetController():IsState(Controller.WEAPON_FIRE)) then
self.firemode = 2;
end
end
if self.firemode == 2 and MovableMan:IsActor(self.parent) then
for particle in MovableMan.Particles do
if particle.ClassName == "MOSRotating" or particle.ClassName == "AEmitter" then
local paravgx = particle.Pos.X - self.Pos.X;
local paravgy = particle.Pos.Y - self.Pos.Y;
local dist = math.sqrt(paravgx ^ 2 + paravgy ^ 2);
if dist < self.launchrange then
particle.Vel = self.Vel / (1 + (particle.Mass / self.launchpower));
particle.RotSpeed = 0
--self.launchsound = true;
end
end
end
end
--[[if self.firemode == 1 and MovableMan:IsActor(self.parent) then
for actor in MovableMan.Actors do
local avgx = actor.Pos.X - self.Pos.X;
local avgy = actor.Pos.Y - self.Pos.Y;
local dist = math.sqrt(avgx ^ 2 + avgy ^ 2);
if dist < self.pickuprange and actor.ID ~= self.parent.ID then
actor.Vel = Vector((self.Pos.X - actor.Pos.X), (self.Pos.Y - actor.Pos.Y)) / (1 + (actor.Mass / self.pickuppower));
actor:SetWhichMOToNotHit(self.parent,0.3);
end
end
end]]
--[[if self.firemode == 2 and MovableMan:IsActor(self.parent) then
for actor in MovableMan.Actors do
local avgx = actor.Pos.X - self.Pos.X;
local avgy = actor.Pos.Y - self.Pos.Y;
local dist = math.sqrt(avgx ^ 2 + avgy ^ 2);
if dist < self.launchrange and actor.ID ~= self.parent.ID then
actor.Vel = self.Vel / (1 + (actor.Mass / self.launchpower));
--self.launchsound = true;
end
end
end]]
--[[if self.launchsound == true and self.canlaunchsound == true then
local firesound = CreateAEmitter("Mech Gravi Gun Sound Fire","D9.rte");
firesound.Pos = self.parent.Pos;
MovableMan:AddParticle(firesound);
self.launchsound = false;
self.canlaunchsound = false;
end]]
end
The code in question - all I want it to be able to do is pick up objects, so I commented out the ability for it to pick up items and actors.