var targetQueue, testDist, playercheck, targetAngle, obscured, rotateoffset;
nearestFriend = -1;
targetQueue = ds_priority_create();
// Build a queue of potential targets
with(Character) {
testDist = distance_to_object(other.object);
if (cloakAlpha != 0.5 and random(5)<2) or cloakAlpha == 1 or cloakAlpha == 0 {
ds_priority_add(targetQueue, id, testDist);
}
}
nearestFriend = -1
while(nearestFriend == -1 && !ds_priority_empty(targetQueue)) {
playercheck = ds_priority_delete_min(targetQueue);
targetAngle = point_direction(x,y,playercheck.x,playercheck.y);
if (playercheck.team != team
&& (collision_line(object.x,object.y,playercheck.x,playercheck.y,Obstacle,true,true)<0
// && collision_line(object.x,object.y,playercheck.x,playercheck.y,TeamGate,true,true)<0
&& collision_line(object.x,object.y,playercheck.x,playercheck.y,ControlPointSetupGate,true,true)<0
// && collision_line(object.x,object.y,playercheck.x,playercheck.y,IntelGate,true,true)<0
&& collision_line(object.x,object.y,playercheck.x,playercheck.y,BulletWall,true,true)<0)) { // Target looks valid, but it might be obscured by a sentry.
// That has to be tested individually because we have to exclude both this sentry and the target
// from the collision check
nearestTarget = playercheck
/* with(Sentry) {
if(!obscured && id != other.ownerPlayer.sentry && id != playercheck && collision_line(other.x,other.y,playercheck.x,playercheck.y,id,false,false)>=0) {
obscured = true;
}
}
if(!obscured) {
nearestTarget = playercheck;
}*/
}
}
ds_priority_destroy(targetQueue);
target_in_sight = 0
if nearestFriend != -1
{
target_in_sight = 1
}
targetQueue = ds_priority_create();// no target in sight, just take the nearest one. Just do the entire thing again.
with(Character) {
testDist = distance_to_object(other.object);
if(cloakAlpha!=0.5){
ds_priority_add(targetQueue, id, testDist);
}
}
if nearestFriend == -1
{
while(nearestFriend == -1 && !ds_priority_empty(targetQueue)) {
playercheck = ds_priority_delete_min(targetQueue);
targetAngle = point_direction(x,y,playercheck.x,playercheck.y);
if (playercheck.team != team)
{
nearestFriend = playercheck
}
}
}
ds_priority_destroy(targetQueue);
if nearestFriend != -1
{
BotAimMedic()
}
if class == CLASS_MEDIC
{
weapon_speed = 7
}
{
if sign(object.x-nearestFriend.x) == 1
{
weapon_velocity = weapon_speed*(-1)
}
else
{
weapon_velocity = weapon_speed
}
if weapon_velocity-nearestFriend.hspeed < 1
{
Target_x = nearestFriend.x
time = 0
}
else if nearestFriend.x-object.x < 0
{
Target_x = nearestFriend.x
time = 0
}
else
{
time = (nearestFriend.x-object.x)/(weapon_velocity-nearestFriend.hspeed)
Target_x = object.x+(weapon_velocity*time)
}
if !position_meeting(nearestFriend.x, nearestFriend.y+sprite_get_bbox_bottom(nearestFriend.sprite_index)+1, Obstacle)
{ // This checks, or tries to check, the y positions of the target.
calc_y = nearestFriend.y // It does this by iterating because there is no better solution.
calc_vspeed = nearestFriend.vspeed // Also, this gets completely owned by stairs.
for (i=0; i<=time; i+=1)
{
calc_y += calc_vspeed
calc_vspeed += 0.6
if position_meeting(nearestFriend.x+(nearestFriend.hspeed*i), calc_y+1, Obstacle)
{
calc_vspeed = 0
}
}
Target_y = calc_y
}
else
{
Target_y = nearestFriend.y
}
aimDirection = point_direction(object.x, object.y, Target_x, Target_y)
}
LMB = 1