Data Realms Fan Forums
http://45.55.195.193/

Mine Launcher
http://45.55.195.193/viewtopic.php?f=75&t=45753
Page 1 of 1

Author:  doomedbeksinski [ Mon Jun 30, 2014 7:32 pm ]
Post subject:  Mine Launcher

I've been messing around with weapons lately. Mostly because I'm taking a Java object oriented design class and I can actually understand code now.

I've made a bunch of weapons that are just downright awesome. One of the items on my to-do list though is to make a weapon that shoots mines. I have no idea where to start but I'm not advanced enough to make everything from scratch, and the code surrounding both the cluster mine bomb and grenade launcher is a bit too convoluted for my level of skill (which I will admit at this moment is the very bottom, but at least I'm on some level..).

Another problem I have with mines in general is that they don't seem to work very well. Either they don't ever go off or they go off only on your actors even though they set them. I really need to fix this because It bugs the ♥♥♥♥ out of me. At least show me how I can make mines go off no matter who steps on them. Because it seems the IFF on them is FUBAR.

And I love the hell out of minefields, that work...

Author:  CaveCricket48 [ Mon Jun 30, 2014 10:53 pm ]
Post subject:  Re: Mine Launcher

For a basic mine, the script usually looks something like this:

Code:
function Create(self)

   self.scanTimer = Timer();

end

function Update(self)

   if self.scanTimer:IsPastSimMS( 500 ); -- half second delay in between detection
      self.scanTimer:Reset();

      -- some method of detecting actors or appropriate targets

      if <appropriate target is detected> then

         -- gib self, or create explosion effects and then delete self

      end

   end

end


There are two main ways to do detection.

You have the basic distance check, which goes through every actor on the map and does a distance check with them. If an actor is within a specified distance, the mine explodes.

Then there are ray casts, which check pixels forming a line in some direction, which are more efficient than distance checks but have a narrower "vision."

Multiple ray casts can form a decent area check, or you can make your own pattern with the pixel checks ( SceneMan:GetMOIDPixel( x, y) ). Fermat's spiral works nicely.

Team checks should also be done during this part, so the mine ignores allied actors.



The timer and timer check is for putting a time delay in between detection runs. Depending on how costly your detection system is, you want to only run it every so milliseconds instead of every frame, unless if it's fast and simple (a single line ray cast).



Detonating the mine can be simply forcing it to gib using Lua ( self:GibThis() ) or spawning a separate explosion effect and then deleting the mine.


An example of a simple mine script that can be attached to an MO that is fired from a gun:

Code:
function Create(self)

   self.scanTimer = Timer();

end

function Update(self)

   if self.scanTimer:IsPastSimMS( 500 ); -- half second delay in between detections
      self.scanTimer:Reset();

      -- go through all actors
      for actor in MovableMan.Actors do

         -- if the actor's team is not the mine's team, and if the distance between the mine and the actor is less than 100 pixels...
         if actor.Team ~= self.Team and SceneMan:ShortestDistance( self.Pos, actor.Pos, SceneMan.SceneWrapsX).Magnitude < 100;

            -- make the mine gib itself
            self:GibThis();

         end
      end

   end

end



Since a projectile's Team value is inherited from the gun, you can have a plain unscripted HDFirearm for the mine launcher.

Author:  Arcalane [ Tue Jul 01, 2014 10:09 am ]
Post subject:  Re: Mine Launcher

The Fermat's Spiral technique works surprisingly well, I have to admit. I was skeptical at first (in terms of performance-demanding it would be), but it worked like a charm for the flak shells and airburst grenades which can both be hammered out at a decent rate, so it should work fine for mines as well as long as you're not throwing billions of them all over the map.

Unfortunately I think the only example(s) of the script I have on hand might be triggered by terrain?

Author:  CaveCricket48 [ Tue Jul 01, 2014 10:35 am ]
Post subject:  Re: Mine Launcher

Here's one for MOs only:

Code:
function Create(self)

   self.delayTimer = Timer();

   self.delayTime = 100; -- Delay time in MS before prox sensor starts

   self.pointCount = 100; -- number of points in the spiral
   self.spiralScale = 5; -- spiral scale
   self.skipPoints = 10; -- skips the first X points

end

function Update(self)

   if self.delayTimer:IsPastSimMS(self.delayTime) then
      for i = self.skipPoints, self.pointCount - 1 do
         local radius = self.spiralScale*math.sqrt(i);
         local angle = i * 137.508;
         local checkPos = self.Pos + Vector(radius,0):DegRotate(angle);
         if SceneMan.SceneWrapsX == true then
            if checkPos.X > SceneMan.SceneWidth then
               checkPos = Vector(checkPos.X - SceneMan.SceneWidth,checkPos.Y);
            elseif checkPos.X < 0 then
               checkPos = Vector(SceneMan.SceneWidth + checkPos.X,checkPos.Y);
            end
         end

         local moCheck = SceneMan:GetMOIDPixel(checkPos.X,checkPos.Y);
         if moCheck ~= 255 then
            local actor = MovableMan:GetMOFromID( MovableMan:GetMOFromID(moCheck).RootID );
            if actor.Team ~= self.Team then
               self:GibThis();
               break;
            end
         end

      end
   end

end



The timer in this one is just to prevent it from blowing up too early.

Author:  Bad Boy [ Tue Jul 01, 2014 8:26 pm ]
Post subject:  Re: Mine Launcher

A bit of a side note but does anyone know how efficient it would be to make a scenearea and check if actors are within that, versus raycasting or proximity checks?

Author:  CaveCricket48 [ Fri Jul 04, 2014 12:48 am ]
Post subject:  Re: Mine Launcher

It would probably be more efficient than a distance check, but I'm not 100% sure about scene area vs GetMoidPixel, but I'd lean more towards GetMOIDPixel if you don't have a gigantic search area.

Author:  doomedbeksinski [ Fri Jul 04, 2014 1:24 am ]
Post subject:  Re: Mine Launcher

I kinda need a little prodding more in the .ini department. ironically LUA is much easier to understand with a bit of java training.

Author:  CaveCricket48 [ Sat Jul 05, 2014 6:55 am ]
Post subject:  Re: Mine Launcher

This should help.


Code:
// This is the actual mine
AddAmmo = MOSRotating
   PresetName = Mine Launcher Mine
   Mass = 2
   RestThreshold = -1
   HitsMOs = 1
   GetsHitByMOs = 0
   ScriptPath = MyMod.rte/MyMineScript.lua
   SpriteFile = ContentFile
      FilePath = Coalition.rte/Devices/Sprites/BulletGrenadeA.bmp
   FrameCount = 1
   SpriteOffset = Vector
      X = -3
      Y = -2
   AtomGroup = AtomGroup
      AutoGenerate = 1
      Material = Material
         CopyOf = Bullet Metal
      Resolution = 2
      Depth = 0
   DeepGroup = AtomGroup
      AutoGenerate = 1
      Material = Material
         CopyOf = Bullet Metal
      Resolution = 4
      Depth = 1
   DeepCheck = 0

   // Gib effects

   AddGib = Gib
      GibParticle = MOSParticle
         CopyOf = Side Thruster Blast Ball 1
      Count = 10
      MinVelocity = 30
      MaxVelocity = 55
   AddGib = Gib
      GibParticle = MOPixel
         CopyOf = Grenade Fragment Gray
      Count = 25
      MinVelocity = 50
      MaxVelocity = 150
   AddGib = Gib
      GibParticle = MOPixel
         CopyOf = Grenade Fragment Yellow
      Count = 25
      MinVelocity = 50
      MaxVelocity = 150
   AddGib = Gib
      GibParticle = MOPixel
         CopyOf = Air Blast
      Count = 20
      MinVelocity = 50
      MaxVelocity = 150
   AddGib = Gib
      GibParticle = MOSParticle
         CopyOf = Explosion Smoke 2
      Count = 15
      Spread = 3.1
      MaxVelocity = 10
      MinVelocity = 0
      LifeVariation = 0.70
      InheritsVel = 1
   AddGib = Gib
      GibParticle = MOSParticle
         CopyOf = Explosion Smoke 2 Glow
      Count = 6
      Spread = 3.1
      MaxVelocity = 10
      MinVelocity = 0
      LifeVariation = 0.60
      InheritsVel = 1
   AddGib = Gib
      GibParticle = AEmitter
         CopyOf = Explosion Trail 1
      Count = 3
      Spread = 3.1
      MaxVelocity = 40
      MinVelocity = 20
      LifeVariation = 0.50
      InheritsVel = 1
   EffectOnGib = 1
   EffectAlwaysShows = 1
   ScreenEffect = ContentFile
      Path = Base.rte/Effects/Glows/YellowHuge.bmp
   GibSound = Sound
      Priority = 1000
      AddSample = ContentFile
         Path = Base.rte/Sounds/Explode1.wav
      AddSample = ContentFile
         Path = Base.rte/Sounds/Explode2.wav



// Round for the Mine Launcher
AddAmmo = Round
   PresetName = Round Mine Launcher
   ParticleCount = 1
   Particle = MOSRotating
      CopyOf = Mine Launcher Mine
   FireVelocity = 30
   Separation = 0



// Magazine
AddAmmo = Magazine
   PresetName = Magazine Mine Launcher

   ...

   RegularRound = Round
      CopyOf = Round Mine Launcher



// Gun
AddDevice = HDFirearm
   PresetName = Mine Launcher

   ...

   Magazine = Magazine
      CopyOf = Magazine Mine Launcher

   ...




Page 1 of 1 All times are UTC [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/