Page 1 of 1

Making a multiple thread

Posted: Wed Mar 12, 2003 6:18 pm
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

Posted: Wed Mar 12, 2003 8:55 pm
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)

Posted: Thu Mar 13, 2003 1:44 pm
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).

Posted: Fri Mar 14, 2003 6:43 am
by mohaa_rox
That is some hard s*** scripting I haven't understood correctly.

Posted: Fri Mar 14, 2003 11:40 am
by jv_map
mohaa_rox wrote:That is some hard s*** scripting I haven't understood correctly.
What part don't you understand?