Making a multiple thread

Post your scripting questions / solutions here

Moderator: Moderators

Post Reply
ShadowX
Lance Corporal
Posts: 16
Joined: Sun Mar 09, 2003 9:10 am
Location: Ohio

Making a multiple thread

Post by ShadowX »

I have FINALLY (with the very much appreciated help of jv_map) got my allies to shoot their mg42s at the germans...woohooo. Anyway, the only problem I have now is that they all shoot at the same time at the same guy. I need to work it so that each guy shoots a different axis. I'm assuming this is probably a pretty advanced question. Here is my script in case anyone needs it: (Don't laugh, I've only been scripting for about a week)

Code: Select all

exec global/loadout.scr maps/m1l1_aiPractice.scr
exec global/ai.scr
exec global/weather.scr
exec global/ambient.scr m5l1b

level waitTill prespawn

main: 
   level waittill spawn 
   println "spawning germans" 
    
   $player item weapons/colt45.tik 
   $player item weapons/m1_garand.tik 
   $player item weapons/mp40.tik 

   $mg42a_gunner exec global/disable_ai.scr 
   $mg42b_gunner exec global/disable_ai.scr 
   $mg42c_gunner exec global/disable_ai.scr
   $axis exec global/disable_ai.scr // just for testing purposes
                
   thread mg42a  // first gunner
   thread mg42b  // second gunner
   thread mg42c  // third gunner

end

mg42a: 
       
   local.gunner = $mg42a_gunner // assign gunner to local.gunner 
   local.gun = $mg42a
   local.bursts = 0 // for reloading 
    
   println "starting targeting" 
   while (isAlive local.gunner) 
   { 
      local.target = NULL 
       
      for (local.i = 1; local.i <= $axis.size; local.i++) 
      { 
         local.guy = $axis[local.i] 
         println "checking german #" local.i 
         if (isAlive local.guy) 
         { 
            if (local.gunner cansee local.guy ) // (2 * local.gun.maxYawOffset) 2000) // commented this out cause it was causing a casting error
            { 
               local.target = local.guy 
               println "found target -> #" local.i 
               break 
            } 
            else 
               println "can't see enemy" 
         } 
         else 
            println "enemy is dead" 
      } 
      if (local.target != NULL) 
      { 
         local.gun setaimtarget local.target // aim 
         wait 1 
         println "opening fire at " local.target 
         local.gun startfiring 
         wait 2 
         local.gun stopfiring 
         println "ceased fire" 
         local.bursts++ // reloading 
         if (local.bursts >= 4) 
         { 
            if (isAlive local.gunner) 
            { 
	       println "reloading gun" 
               local.gunner reload_mg42 
               local.gunner waittill animdone 
               local.bursts = 0 
            }
	
         } 
      } 
      else 
         println "no target found" 
      wait 0.5 
   } 
   println "script ended" 

end 

mg42b:
       
   local.gunner = $mg42b_gunner // assign gunner to local.gunner 
   local.gun = $mg42b
   local.bursts = 0 // for reloading 
    
   println "starting targeting" 
   while (isAlive local.gunner) 
   { 
      local.target = NULL 
       
      for (local.i = 2; local.i <= $axis.size; local.i++) 
      { 
         local.guy = $axis[local.i] 
         println "checking german #" local.i 
         if (isAlive local.guy) 
         { 
            if (local.gunner cansee local.guy ) // (2 * local.gun.maxYawOffset) 2000)  // took this out cause it was causing a casting error
            { 
               local.target = local.guy 
               println "found target -> #" local.i 
               break 
            } 
            else 
               println "can't see enemy" 
         } 
         else 
            println "enemy is dead" 
      } 
      if (local.target != NULL) 
      { 
         local.gun setaimtarget local.target // aim 
         wait 1 
         println "opening fire at " local.target 
         local.gun startfiring 
         wait 2 
         local.gun stopfiring 
         println "ceased fire" 
         local.bursts++ // reloading 
         if (local.bursts >= 4) 
         { 
            if (isAlive local.gunner) 
            { 
	       println "reloading gun" 
               local.gunner reload_mg42 
               local.gunner waittill animdone 
               local.bursts = 0 
            }
	
         } 
      } 
      else 
         println "no target found" 
      wait 0.5 
   } 
   println "script ended" 
end

mg42c:

       
   local.gunner = $mg42c_gunner // assign gunner to local.gunner 
   local.gun = $mg42c
   local.bursts = 0 // for reloading 
    
   println "starting targeting" 
   while (isAlive local.gunner) 
   { 
      local.target = NULL 
       
      for (local.i = 3; local.i <= $axis.size; local.i++) 
      { 
         local.guy = $axis[local.i] 
         println "checking german #" local.i 
         if (isAlive local.guy) 
         { 
            if (local.gunner cansee local.guy ) // (2 * local.gun.maxYawOffset) 2000)  // commented this out cause it was causing a casting error
            { 
               local.target = local.guy 
               println "found target -> #" local.i 
               break 
            } 
            else 
               println "can't see enemy" 
         } 
         else 
            println "enemy is dead" 
      } 
      if (local.target != NULL) 
      { 
         local.gun setaimtarget local.target // aim 
         wait 1 
         println "opening fire at " local.target 
         local.gun startfiring 
         wait 2 
         local.gun stopfiring 
         println "ceased fire" 
         local.bursts++ // reloading 
         if (local.bursts >= 4) 
         { 
            if (isAlive local.gunner) 
            { 
	       println "reloading gun" 
               local.gunner reload_mg42 
               local.gunner waittill animdone 
               local.bursts = 0 
            }
	
         } 
      } 
      else 
         println "no target found" 
      wait 0.5 
   } 
   println "script ended" 
end

Any assistance is appreciated.

ShadowX
You may have over 100 skydives, but until you've jumped into pitch black darkness at 1200 feet, carrying over 150lbs of equipment, you just haven't lived! Airborne.
Angex
Major
Posts: 293
Joined: Mon Dec 30, 2002 1:23 pm
Contact:

Post by Angex »

Made a little mistake, this code:

Code: Select all

local.i + (local.i + 3)
should read:

Code: Select all

local.i = (local.i + 3)
jv_map
Site Admin
Posts: 6521
Joined: Tue Sep 03, 2002 2:53 pm
Location: The Netherlands
Contact:

Post by jv_map »

Hmm using three almost identical threads doesn't seem very useful, especially not if you'd have about 20 gunners ;).

You can do all with just one thread. I think something like this would work fine:

Code: Select all

mg42 local.gunner: 
  // self is gun
  local.bursts = 0 // for reloading 
  println "starting targeting for " self " (gunner: " local.gunner ")."
  while (isAlive local.gunner) 
  { 
    local.target = NULL 
    for(local.j = 1; local.j <= 2; local.j++) // 2 targeting passes
    {
      for (local.i = 1; local.i <= $axis.size; local.i++) 
      { 
          local.guy = $axis[local.i] 
          println "checking german #" local.i 
          if (isAlive local.guy)
          { 
            if(local.guy.underattack != 1 || local.j == 2)
            {		
              if (local.gunner cansee local.guy )
              // (2 * self.maxYawOffset) 2000) 
              // commented this out cause it was causing a casting error 
              //---> note from jv: did you set a #maxyawoffset key?
              { 
                local.target = local.guy 
                println "found target -> #" local.i 
                break  // out of first for loop
              } 
              else 
                println "can't see enemy" 
            }
            else
              println "enemy is already under attack"
          } 
          else 
            println "enemy is dead" 
        }
        if(local.target != NULL)
          break // out of second for loop
      }
      if (local.target != NULL) 
      { 
        local.target.underattack = 1
        self setaimtarget local.target // aim 
        wait 1 
        println "opening fire at " local.target 
        self startfiring 
        wait 2 
        self stopfiring 
        println "ceased fire" 
        local.bursts++ // reloading 
        if (local.bursts >= 4) 
        { 
          if (isAlive local.gunner) 
          { 
            println "reloading gun" 
            local.gunner reload_mg42 
            local.gunner waittill animdone 
            local.bursts = 0 
          } 
        }
        local.target.underattack = 0 
      } 
      else 
       println "no target found" 
      wait 0.5 
   } 
   println local.gunner " died." 
end
Start the threads in the following manner:

Code: Select all

$mg42a thread mg42  $mg42a_gunner // first gunner
$mg42b thread mg42  $mg42b_gunner // second gunner
$mg42c thread mg42  $mg42c_gunner // third gunner
Logic implies this helps 8).
Last edited by jv_map on Fri Mar 14, 2003 12:40 pm, edited 1 time in total.
Image
User avatar
mohaa_rox
Field Marshal
Posts: 2760
Joined: Mon Nov 11, 2002 7:05 am
Contact:

Post by mohaa_rox »

That is some hard s*** scripting I haven't understood correctly.
Live to map, not map to live.
-mohaa_rox, .map
moderator
jv_map
Site Admin
Posts: 6521
Joined: Tue Sep 03, 2002 2:53 pm
Location: The Netherlands
Contact:

Post by jv_map »

mohaa_rox wrote:That is some hard s*** scripting I haven't understood correctly.
What part don't you understand?
Image
Post Reply