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
} 
8-)

Yay 4000th post :wink: damn that's a lot :shock:

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.

:)