Page 1 of 1
Get my mg guys to attack bots as well :) er anyone really
Posted: Thu Jan 22, 2004 5:31 am
by small_sumo
The setup works well as far as animations go the gunner and spotter seam to work, gunner dies spotter takes over. But they shoot at no-one, not bots not regular ai. This is the script of yours I have been useing and how I execute is.
$sb4_mg42_gunner.enableEnemy = 0
$sb4_mg42 thread global/jv_mp_mg42_active.scr::mg42 3000
the jv_mp_mg42_active.scr looks like below........
-----------------------------------------------------------------
mg42 local.range:
if(level.main_player_handler != 1)
exec global/jv_mp_players.scr
local.gunner_location = self.origin - (self.forwardvector * 64)
if(local.range == NIL)
{
if($world.farplane == NIL)
self.range = 4096
else
self.range = $world.farplane * 0.8
}
else
self.range = local.range
self burstfiresettings 1 2.5 0.2 1
self.maxyawoffset = 45 // !!
self.spotter = $(self.targetname + "_spotter")
if(self.spotter != NIL)
self.spotter waitthread setup_spotter
self.gunner = $(self.targetname + "_gunner")
self.gunner waitthread setup_gunner self
self thread targeting
self.gunner waittill death
wait 0.3
if(isalive self.spotter)
{
self.gunner = self.spotter
self.spotter = -1
wait 0.3
if(isAlive self.gunner)
{
self.gunner runto local.gunner_location
self.gunner waittill movedone
self.gunner waitthread setup_gunner self
self thread targeting
}
}
end
set_team:
// later to be put in a global AI script
if(self.team == german)
self.dmteam = axis
else
self.dmteam = allies
end
setup_gunner local.mg:
//*** turn the gunner into a machinegunner
self unholster // just to be sure he doesn't try to holster the mg turret
self.enableEnemy = 0
self type_idle machinegunner
self type_attack machinegunner
self type_disguise machinegunner
self type_grenade machinegunner
self turret local.mg
self health 5
self.deathanim = "death_fall_back"
self waitthread set_team
end
setup_spotter:
self.enableEnemy = 0
self holster
self waitthread set_team
end
spotter_tap local.target:
if (((local.target.origin - self.origin) * self.leftvector) >= 0)
self.spotter anim MG42_spotter_stand_left
else
self.spotter anim MG42_spotter_stand_right
end
targeting:
while(isAlive self.gunner && self.gunner.activate != 1)
{
local.targets = waitthread global/jv_mp_players.scr::get_active_players $player
if(self.gunner.dmteam == allies)
local.targets = waitthread global/jv_mp_players.scr::get_team_players local.targets axis
else
local.targets = waitthread global/jv_mp_players.scr::get_team_players local.targets allies
local.targets = waitthread global/jv_mp_players.scr::get_area_entities local.targets self.origin self.range
if(local.targets.size > 0)
{
local.unluckynumber = randomint (local.targets.size - 1) + 1 // randomint from 1 to .size
local.target = local.targets[local.unluckynumber]
if(self.spotter && self.spotter != -1 && local.target != local.previoustarget)
self waitthread spotter_tap local.target
local.previoustarget = local.target
self waitthread attack local.target
wait 0.1
}
else
wait 0.5
}
end
attack local.target:
local.time = 0
while(isAlive self.gunner && isAlive local.target && local.time < 4)
{
if(self.gunner cansee local.target (2 * self.maxyawoffset) self.range)
{
self setaimtarget local.target
wait 0.3
local.time += 0.3
self startfiring
while(isAlive self.gunner && isAlive local.target && local.time < 4 && self.gunner cansee local.target (2 * self.maxyawoffset) self.range)
{
wait 0.2
local.time += 0.2
}
self stopfiring
if(isAlive self.gunner)
{
self.gunner reload_mg42
local.starttime = level.time
self.gunner waittill animdone
local.time += (level.time - local.starttime)
}
}
wait 0.5
local.time += 0.5
}
self setaimtarget NULL
end
----------------------------------------------------------------------------
So anyway when i chatted to you last you said to try to implement the code for the tank into the mg, I have failed after many hours of trying and so now am here for a lil help.
Thanks
Tanks code. Targeting bit anyway.
get_targets:
// find player targets
local.players = waitthread global/jv_mp_players.scr::get_active_players $player
local.enemy_players = waitthread global/jv_mp_players.scr::get_team_players local.players allies
local.enemy_players_inrange = waitthread global/jv_mp_players.scr::get_area_entities local.enemy_players self.origin self.maxrange
// find bot targets
local.j = 0
if(level.botlastid != NIL)
{
for(local.i = 1; local.i <= level.botlastid; local.i++)
{
local.bot = level.actualbots[local.i]
if(isAlive local.bot)
{
if(local.bot.dmteam == allies)
{
if(vector_within local.bot.origin self.origin self.maxrange)
{
local.j++
local.enemy_bots_inrange[local.j] = local.bot
}
}
}
}
}
for(local.i = 1; local.i <= local.enemy_players_inrange.size; local.i++)
local.targets[local.i] = local.enemy_players_inrange[local.i]
for(local.i = local.enemy_players_inrange.size + 1; local.i <= local.enemy_players_inrange.size + local.enemy_bots_inrange.size; local.i++)
local.targets[local.i] = local.enemy_bots_inrange[local.i]
end local.targets
targeting:
// panzer tank barrel targeting
while(self)
{
local.targets = waitthread get_targets
// ready!
self.turret.targetlist = local.targets
// self.mg.targetlist = local.targets // new
waitframe
}
end
Posted: Thu Jan 22, 2004 6:44 am
by jv_map
Hmm that's odd... I would expect the gunner not to attack bots but yet to attack players
Maybe for some reason the gunner can't see his target? I.e. if there is a bounding box of a model in front? Or, maybe it is a maxyawoffset problem

Posted: Thu Jan 22, 2004 7:52 am
by small_sumo
I'll send you a mini map..........
Posted: Sat Jan 24, 2004 1:08 pm
by small_sumo
Yes he does shoot at players but not ai, not any ai, bot or otherwise.
Posted: Sat Jan 24, 2004 2:46 pm
by jv_map
In that case, replace the targeting thread of the mg42 script with the targeting thread from the tank script (include the 'get_targets' thread as well) and change this line:
self.turret.targetlist = local.targets
to s/th like this:
Code: Select all
if(local.targets.size > 0)
{
local.unluckynumber = randomint (local.targets.size - 1) + 1
local.target = local.targets[local.unluckynumber]
if(self.spotter && self.spotter != -1 && local.target != local.previoustarget)
self waitthread spotter_tap local.target
local.previoustarget = local.target
self waitthread attack local.target
wait 0.1
}
Yay 4000th post

damn that's a lot

Posted: Mon Jan 26, 2004 3:51 pm
by small_sumo
Ok great, I tried it and got a bad error that spammed and killed the level then i just did // (in orange) where the error seamed to come from and now it works, my only complaint might be is he seams to be reloading the mg every time he gives it sa burst, busy little soldier lol.
Thanks a million, I am very pleased. this will give me more control over what I want to happen out there.
get_targets:
// find player targets
local.players = waitthread global/jv_mp_players.scr::get_active_players $player
local.enemy_players = waitthread global/jv_mp_players.scr::get_team_players local.players allies
local.enemy_players_inrange = waitthread global/jv_mp_players.scr::get_area_entities local.enemy_players self.origin self.maxrange
// find bot targets
local.j = 0
if(level.botlastid != NIL)
{
for(local.i = 1; local.i <= level.botlastid; local.i++)
{
local.bot = level.actualbots[local.i]
if(isAlive local.bot)
{
if(local.bot.dmteam == allies)
{
// if(vector_within local.bot.origin self.origin self.maxrange)
{
local.j++
local.enemy_bots_inrange[local.j] = local.bot
}
}
}
}
}
for(local.i = 1; local.i <= local.enemy_players_inrange.size; local.i++)
local.targets[local.i] = local.enemy_players_inrange[local.i]
for(local.i = local.enemy_players_inrange.size + 1; local.i <= local.enemy_players_inrange.size + local.enemy_bots_inrange.size; local.i++)
local.targets[local.i] = local.enemy_bots_inrange[local.i]
end local.targets
Posted: Mon Jan 26, 2004 7:44 pm
by jv_map
Could it be the errors are caused by the lack of a .maxrange variable for the machinegun?
Posted: Tue Jan 27, 2004 12:59 am
by small_sumo
I havent added anything to the mg in radient, maybe when i do that he might act better.
Still I am very pleased with the outcome, now I will spawn ai to control mgs and set bots to defending the bomb and camping. Camp camp camp lol.

Posted: Wed Jan 28, 2004 9:28 am
by small_sumo
At the moment my script looks like this.
----------------------------------------------------------------
mg42 local.range:
if(level.main_player_handler != 1)
exec global/jv_mp_players.scr
local.gunner_location = self.origin - (self.forwardvector * 64)
if(local.range == NIL)
{
if($world.farplane == NIL)
self.range = 4096
else
self.range = $world.farplane * 0.8
}
else
self.range = local.range
self burstfiresettings 1 2.5 0.2 1
self.maxyawoffset = 45 // !!
self.spotter = $(self.targetname + "_spotter")
if(self.spotter != NIL)
self.spotter waitthread setup_spotter
self.gunner = $(self.targetname + "_gunner")
self.gunner waitthread setup_gunner self
self thread targeting
self.gunner waittill death
wait 0.3
if(isalive self.spotter)
{
self.gunner = self.spotter
self.spotter = -1
wait 0.3
if(isAlive self.gunner)
{
self.gunner runto local.gunner_location
self.gunner waittill movedone
self.gunner waitthread setup_gunner self
self thread targeting
}
}
end
set_team:
// later to be put in a global AI script
if(self.team == german)
self.dmteam = axis
else
self.dmteam = allies
end
setup_gunner local.mg:
//*** turn the gunner into a machinegunner
self unholster // just to be sure he doesn't try to holster the mg turret
self.enableEnemy = 0
self type_idle machinegunner
self type_attack machinegunner
self type_disguise machinegunner
self type_grenade machinegunner
self turret local.mg
self health 5
self.deathanim = "death_fall_back"
self waitthread set_team
end
setup_spotter:
self.enableEnemy = 0
self holster
self waitthread set_team
end
spotter_tap local.target:
if (((local.target.origin - self.origin) * self.leftvector) >= 0)
self.spotter anim MG42_spotter_stand_left
else
self.spotter anim MG42_spotter_stand_right
end
get_targets:
// find player targets
local.players = waitthread global/jv_mp_players.scr::get_active_players $player
local.enemy_players = waitthread global/jv_mp_players.scr::get_team_players local.players allies
local.enemy_players_inrange = waitthread global/jv_mp_players.scr::get_area_entities local.enemy_players self.origin self.maxrange
// find bot targets
local.j = 0
if(level.botlastid != NIL)
{
for(local.i = 1; local.i <= level.botlastid; local.i++)
{
local.bot = level.actualbots[local.i]
if(isAlive local.bot)
{
if(local.bot.dmteam == allies)
{
// if(vector_within local.bot.origin self.origin self.maxrange)
{
local.j++
local.enemy_bots_inrange[local.j] = local.bot
}
}
}
}
}
for(local.i = 1; local.i <= local.enemy_players_inrange.size; local.i++)
local.targets[local.i] = local.enemy_players_inrange[local.i]
for(local.i = local.enemy_players_inrange.size + 1; local.i <= local.enemy_players_inrange.size + local.enemy_bots_inrange.size; local.i++)
local.targets[local.i] = local.enemy_bots_inrange[local.i]
end local.targets
targeting:
// panzer tank barrel targeting
while(self)
{
local.targets = waitthread get_targets
// ready!
// self.turret.targetlist = local.targets
// self.mg.targetlist = local.targets // new
if(local.targets.size > 0)
{
local.unluckynumber = randomint (local.targets.size - 1) + 1
local.target = local.targets[local.unluckynumber]
if(self.spotter && self.spotter != -1 && local.target != local.previoustarget)
self waitthread spotter_tap local.target
local.previoustarget = local.target
self waitthread attack local.target
wait 0.1
}
waitframe
}
end
attack local.target:
local.time = 0
while(isAlive self.gunner && isAlive local.target && local.time < 2)
{
if(self.gunner cansee local.target (2 * self.maxyawoffset) self.range)
{
self setaimtarget local.target
wait 0.3
local.time += 0.3
self startfiring
while(isAlive self.gunner && isAlive local.target && local.time < 4 && self.gunner cansee local.target (2 * self.maxyawoffset) self.range)
{
wait 1.2 //--------------------------------sumo
local.time += 0.2
}
self stopfiring
if(isAlive self.gunner)
{
self.gunner reload_mg42
local.starttime = level.time
self.gunner waittill animdone
local.time += (level.time - local.starttime)
}
}
wait 0.5
local.time += 0.5
}
self setaimtarget NULL
end
But I cannot spawn a guy to keep up to the mg with the script like this, I get an error,
^~^~^ Script Error: command 'thread' applied to NULL listener
self.gunner thread setup_gunner self (global/jv_mp_mg42_active.scr, 23)
self.gunner ^
So some how I need to spawn my ai he and the spotter run to the mg and get to work till they are both dead and then a new pair are spawned and so it goes. I need the mgs to be manned full time for the effect I want, fussy I know but thats where you get ................. anyway.
Thanks
Posted: Wed Jan 28, 2004 5:17 pm
by jv_map
Try this mg42 thread.
Code: Select all
mg42 local.range:
if(level.main_player_handler != 1)
exec global/jv_mp_players.scr
local.gunner_location = self.origin - (self.forwardvector * 64)
if(local.range == NIL)
{
if($world.farplane == NIL)
self.range = 4096
else
self.range = $world.farplane * 0.8
}
else
self.range = local.range
self burstfiresettings 1 2.5 0.2 1
self.maxyawoffset = 45 // !!
local.basegunner = $(self.targetname + "_gunner")
local.gunner_model = local.basegunner.brushmodel
local.gunner_origin = local.basegunner.origin
local.gunner_angles = local.basegunner.angles
local.gunner_weapon = local.basegunner.weapon
local.basegunner remove
local.basespotter = $(self.targetname + "_spotter")
local.spotter_model = local.basespotter.brushmodel
local.spotter_origin = local.basespotter.origin
local.spotter_angles = local.basespotter.angles
local.spotter_weapon = local.basespotter.weapon
local.basespotter remove
while(1)
{
self.spotter = spawn local.spotter_model origin local.spotter_origin angles local.spotter_angles weapon local.spotter_weapon
self.spotter waitthread setup_spotter
self.gunner = spawn local.gunner_model origin local.gunner_origin angles local.gunner_angles weapon local.gunner_weapon
self.gunner waitthread setup_gunner self
self thread targeting
self.gunner waittill death
wait 0.3
if(isalive self.spotter)
{
self.gunner = self.spotter
self.spotter = -1
wait 0.3
if(isAlive self.gunner)
{
self.gunner runto local.gunner_location
self.gunner waittill movedone
self.gunner waitthread setup_gunner self
self thread targeting
}
}
}
end
Posted: Thu Jan 29, 2004 4:12 am
by small_sumo
Hey if you pop by here again would you jot down a little how to for implementing the script in the main scr and also in radient. bdbodger is working on it with me i asked him today, so like any hints or help would be appreciated.
Thanks mate.

Posted: Tue Feb 03, 2004 4:40 am
by small_sumo
Ok mate I got bdbodger to work on your mg code and he came up with the following. It works great the the enable bots line commented out but when they are enabled we get an error and our mg guys loose the plot only doing it right for a little while or not at all.
So were back to you now for some more advice, can you fix this to work with the jv_bot01.pk3?
Thanks
the error:
^~^~^ Script Error: Cannot cast 'NIL' to float
if(vector_within local.ent.origin local.origin local.radius) (global/jv_mp_players.scr, 503)
if(^
The latest version of jv_mp_mg42_active.scr:
mg42 local.range:
if(level.main_player_handler != 1)
exec global/jv_mp_players.scr
local.gunner_location = self.origin - (self.forwardvector * 64)
local.spotter_location = self.origin - (self.forwardvector * 64)+(self.leftvector * 32)
if(local.range == NIL)
{
if($world.farplane == NIL)
self.range = 4096
else
self.range = $world.farplane * 0.8
}
else
self.range = local.range
self burstfiresettings 1 2.5 0.2 1
self.maxyawoffset = 45 // !!
local.basegunner = $(self.targetname + "_gunner")
local.gunner_model = local.basegunner.model // brushmodel
local.gunner_origin = local.basegunner.origin
local.gunner_angles = local.basegunner.angles
local.gunner_weapon = local.basegunner.weapon
local.basegunner remove
local.basespotter = $(self.targetname + "_spotter")
local.spotter_model = local.basespotter.model // brushmodel
local.spotter_origin = local.basespotter.origin
local.spotter_angles = local.basespotter.angles
local.spotter_weapon = local.basespotter.weapon
local.basespotter remove
while(1)
{
wait 5/////////////////bdb//////////////////////
self.spotter = spawn local.spotter_model origin local.spotter_origin angles local.spotter_angles weapon local.spotter_weapon
self.gunner = spawn local.gunner_model origin local.gunner_origin angles local.gunner_angles weapon local.gunner_weapon
if ($(self.targetname + "_gunner_path"))
{
self.gunner exec global/disable_ai.scr
self.gunner exec global/crouchrunto.scr $(self.targetname + "_gunner_path")
//self.gunner waittill movedone
while(vector_length(self.origin - self.gunner.origin) > 128)
waitframe
self.gunner exec global/enable_ai.scr
//self.gunner exec global/runto.scr $(self.targetname + "_gunner_path")
}
else
self.gunner runto local.gunner_location
if($(self.targetname + "_spotter_path"))
{
self.spotter exec global/disable_ai.scr
self.spotter exec global/crouchrunto.scr $(self.targetname + "_spotter_path")
//self.spotter waittill movedone
while(vector_length(self.origin - self.spotter.origin) > 128)
waitframe
self.spotter exec global/enable_ai.scr
//self.spotter exec global/runto.scr $(self.targetname + "_spotter_path")
}
else
self.spotter runto local.spotter_location
self.gunner waitthread setup_gunner self
self.spotter waitthread setup_spotter
self thread targeting
self.gunner waittill death
wait 0.3
if(isalive self.spotter)
{
self.gunner = self.spotter
self.spotter = -1
wait 0.3
if(isAlive self.gunner)
{
self.gunner runto local.gunner_location
self.gunner waitthread setup_gunner self
self thread targeting
self.gunner waittill death
}
}
}
end
set_team:
// later to be put in a global AI script
if(self.team == german)
self.dmteam = axis
else
self.dmteam = allies
end
setup_gunner local.mg:
//*** turn the gunner into a machinegunner
self unholster // just to be sure he doesn't try to holster the mg turret
self.enableEnemy = 0
self type_idle machinegunner
self type_attack machinegunner
self type_disguise machinegunner
self type_grenade machinegunner
self turret local.mg
self health 5
self.deathanim = "death_fall_back"
self waitthread set_team
end
setup_spotter:
while(vector_length(self.origin - self.spotter.origin) <= 128)
waitframe
self.enableEnemy = 0
self holster
self waitthread set_team
end
spotter_tap local.target:
if (((local.target.origin - self.origin) * self.leftvector) >= 0)
self.spotter anim MG42_spotter_stand_left
else
self.spotter anim MG42_spotter_stand_right
end
get_targets:
// find player targets
local.players = waitthread global/jv_mp_players.scr::get_active_players $player
local.enemy_players = waitthread global/jv_mp_players.scr::get_team_players local.players allies
local.enemy_players_inrange = waitthread global/jv_mp_players.scr::get_area_entities local.enemy_players self.origin self.maxrange
// find bot targets
local.j = 0
if(level.botlastid != NIL)
{
for(local.i = 1; local.i <= level.botlastid; local.i++)
{
local.bot = level.actualbots[local.i]
if(isAlive local.bot)
{
if(local.bot.dmteam == allies)
{
// if(vector_within local.bot.origin self.origin self.maxrange)
{
local.j++
local.enemy_bots_inrange[local.j] = local.bot
}
}
}
}
}
for(local.i = 1; local.i <= local.enemy_players_inrange.size; local.i++)
local.targets[local.i] = local.enemy_players_inrange[local.i]
for(local.i = local.enemy_players_inrange.size + 1; local.i <= local.enemy_players_inrange.size + local.enemy_bots_inrange.size; local.i++)
local.targets[local.i] = local.enemy_bots_inrange[local.i]
end local.targets
targeting:
// panzer tank barrel targeting
while(self)
{
local.targets = waitthread get_targets
// ready!
// self.turret.targetlist = local.targets
// self.mg.targetlist = local.targets // new
if(local.targets.size > 0)
{
local.unluckynumber = randomint (local.targets.size - 1) + 1
local.target = local.targets[local.unluckynumber]
if(self.spotter && self.spotter != -1 && local.target != local.previoustarget)
self waitthread spotter_tap local.target
local.previoustarget = local.target
self waitthread attack local.target
wait 0.1
}
waitframe
}
end
attack local.target:
local.time = 0
while(isAlive self.gunner && isAlive local.target && local.time < 2)
{
if(self.gunner cansee local.target (2 * self.maxyawoffset) self.range)
{
self setaimtarget local.target
wait 0.3
local.time += 0.3
self startfiring
while(isAlive self.gunner && isAlive local.target && local.time < 4 && self.gunner cansee local.target (2 * self.maxyawoffset) self.range)
{
wait 1.2 //--------------------------------sumo
local.time += 0.2
}
self stopfiring
if(isAlive self.gunner)
{
self.gunner reload_mg42
local.starttime = level.time
self.gunner waittill animdone
local.time += (level.time - local.starttime)
}
}
wait 0.5
local.time += 0.5
}
self setaimtarget NULL
end
Posted: Tue Feb 03, 2004 8:58 am
by jv_map
Set a self.maxrange for the gun, e.g.
self.maxrange = 4000
Posted: Wed Feb 04, 2004 1:23 am
by small_sumo
I thought it had max range?
The latest version of jv_mp_mg42_active.scr:
mg42 local.range:
if(level.main_player_handler != 1)
exec global/jv_mp_players.scr
local.gunner_location = self.origin - (self.forwardvector * 64)
local.spotter_location = self.origin - (self.forwardvector * 64)+(self.leftvector * 32)
if(local.range == NIL)
{
if($world.farplane == NIL)
self.range = 4096
else
self.range = $world.farplane * 0.8
}
else
self.range = local.range
self burstfiresettings 1 2.5 0.2 1
self.maxyawoffset = 45 // !!
Anyway I will add it in to the ........
setup_gunner local.mg:
//*** turn the gunner into a machinegunner
self unholster // just to be sure he doesn't try to holster the mg turret
self.enableEnemy = 0
self type_idle machinegunner
self type_attack machinegunner
self type_disguise machinegunner
self type_grenade machinegunner
self turret local.mg
self health 5
self.maxrange = 4000
self.deathanim = "death_fall_back"
self waitthread set_team
end
and see how I go. Thanks so much my friend.
