mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-01-20 12:44:59 +00:00
231 lines
6.3 KiB
C#
231 lines
6.3 KiB
C#
//-----------------------------------------------
|
|
// AI functions for Rabbit
|
|
//---------------------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
function RabbitGame::onAIRespawn(%game, %client)
|
|
{
|
|
//add the default task
|
|
if (! %client.defaultTasksAdded)
|
|
{
|
|
%client.defaultTasksAdded = true;
|
|
%client.addTask(AIPickupItemTask);
|
|
%client.addTask(AIUseInventoryTask);
|
|
%client.addTask(AITauntCorpseTask);
|
|
%client.rabbitTask = %client.addTask(AIRabbitTask);
|
|
}
|
|
|
|
//set the inv flag
|
|
%client.spawnUseInv = true;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
function RabbitGame::AIInit(%game)
|
|
{
|
|
//call the default AIInit() function
|
|
AIInit();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//AIRabbitTask functions
|
|
//---------------------------------------------------------------------------
|
|
function AIRabbitTask::init(%task, %client)
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
function AIRabbitTask::assume(%task, %client)
|
|
{
|
|
%task.setWeightFreq(20);
|
|
%task.setMonitorFreq(20);
|
|
%task.findLocation = true;
|
|
}
|
|
|
|
function AIRabbitTask::retire(%task, %client)
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
function AIRabbitTask::weight(%task, %client)
|
|
{
|
|
%player = %client.player;
|
|
|
|
//see if I have the flag
|
|
if ($AIRabbitFlag.carrier == %player)
|
|
%task.setWeight($AIRabbitWeightDefault);
|
|
|
|
//else see if I'm close to the flag
|
|
else
|
|
{
|
|
if (isObject($AIRabbitFlag.carrier))
|
|
%distToFlag = %client.getPathDistance($AIRabbitFlag.carrier.getWorldBoxCenter());
|
|
else
|
|
%distToFlag = %client.getPathDistance($AIRabbitFlag.getWorldBoxCenter());
|
|
|
|
//if the flag is pretty close, or the inv station is quite far...
|
|
if (%distToFlag > 0 && %distToFlag < 50)
|
|
%task.setWeight($AIRabbitWeightDefault);
|
|
else
|
|
%task.setWeight($AIRabbitWeightNeedInv);
|
|
|
|
//see if the spawnUseInv flag should be reset
|
|
if (%client.spawnUseInv)
|
|
{
|
|
if (!isObject($AIRabbitFlag.carrier))
|
|
{
|
|
//see if there are any bots closer to a dropped flag
|
|
%found = false;
|
|
for (%i = 0; %i < ClientGroup.getCount(); %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if (%cl != %client && %cl.isAIControlled() && isObject(%cl.player))
|
|
{
|
|
%dist = VectorDist(%cl.player.position, $AIRabbitFlag.position);
|
|
if (%dist < %distToFlag)
|
|
{
|
|
%found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//reset the spawnUseInv flag if we're the closest
|
|
if (!%found)
|
|
%client.spawnUsInv = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
function AIRabbitTask::monitor(%task, %client)
|
|
{
|
|
%player = %client.player;
|
|
|
|
//if we have the flag - run
|
|
if ($AIRabbitFlag.carrier == %player)
|
|
{
|
|
if (%task.findLocation)
|
|
{
|
|
%damage = %player.getDamagePercent();
|
|
if (%damage > 0.3)
|
|
{
|
|
//search for a health kit
|
|
%closestHealth = AIFindSafeItem(%client, "Health");
|
|
if (%closestHealth > 0)
|
|
{
|
|
%task.seekLocation = %closestHealth.getWorldBoxCenter();
|
|
%foundItemLocation = true;
|
|
}
|
|
}
|
|
else if (!%foundItemLocation && AIEngageOutOfAmmo(%client))
|
|
{
|
|
//search for a Ammo or a weapon...
|
|
%closestItem = AIFindSafeItem(%client, "Ammo");
|
|
if (%closestItem > 0)
|
|
{
|
|
%task.seekLocation = %closestItem.getWorldBoxCenter();
|
|
%foundItemLocation = true;
|
|
}
|
|
}
|
|
|
|
//now see if we don't really have good equipment...
|
|
else if (!%foundItemLocation && AIEngageWeaponRating(%client) < 20)
|
|
{
|
|
//search for any useful item
|
|
%closestItem = AIFindSafeItem(%client, "Any");
|
|
if (%closestItem > 0)
|
|
{
|
|
%task.seekLocation = %closestItem.getWorldBoxCenter();
|
|
%foundItemLocation = true;
|
|
}
|
|
}
|
|
|
|
//else, search for any spot on the map that isn't covered with enemies...
|
|
else
|
|
{
|
|
//try 10 times
|
|
%task.seekLocation = %player.position;
|
|
%farthestLocation = "";
|
|
%farthestDist = 0;
|
|
%occupiedLocation = "";
|
|
|
|
for (%i = 0; %i < 10; %i++)
|
|
{
|
|
%testLocation = Game.pickPlayerSpawn(%client, true);
|
|
if (%testLocation == -1)
|
|
break;
|
|
|
|
%dist = %client.getPathDistance(%testLocation);
|
|
if (%dist < 0 || %dist > %farthestDist)
|
|
{
|
|
//see if it's unoccupied...
|
|
%result = AIFindClosestEnemyToLoc(%client, %task.location, 50, $AIClientLOSTimeout, true);
|
|
%closestEnemy = getWord(%result, 0);
|
|
%closestdist = getWord(%result, 1);
|
|
|
|
if (!AIClientIsAlive(%closestEnemy))
|
|
%farthestLocation = %testLocation;
|
|
else
|
|
%occupiedLocation = %testLocation;
|
|
}
|
|
}
|
|
|
|
if (%farthestLocation $= "")
|
|
%task.seekLocation = %occupiedLocation;
|
|
else
|
|
%task.seekLocation = %farthestLocation;
|
|
}
|
|
|
|
//set the flag and go there
|
|
%task.findLocation = false;
|
|
%client.stepMove(%task.seekLocation, 8);
|
|
}
|
|
else
|
|
{
|
|
//keep going there...
|
|
%client.stepMove(%task.seekLocation, 8);
|
|
|
|
//see if we've arrived
|
|
%distToDest = %client.getPathDistance(%task.seekLocation);
|
|
if (%distToDest > 0 && %distToDest < 10)
|
|
{
|
|
%task.findLocation = true;
|
|
}
|
|
}
|
|
|
|
//don't forget to shoot back at whoever shot me last
|
|
if (%client.lastDamageClient != %client)
|
|
%client.setEngageTarget(%client.lastDamageClient);
|
|
}
|
|
|
|
//else if someone else has the flag - shoot them
|
|
else if (isObject($AIRabbitFlag.carrier))
|
|
{
|
|
%client.clientDetected($AIRabbitFlag.carrier.client);
|
|
%client.stepEngage($AIRabbitFlag.carrier.client);
|
|
}
|
|
|
|
//else the flag has been dropped
|
|
else
|
|
{
|
|
%client.stepMove($AIRabbitFlag.position, 0.25);
|
|
%client.setEngageTarget(-1);
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// AIRabbit utility functions
|
|
//---------------------------------------------------------------------------
|
|
function air()
|
|
{
|
|
exec("scripts/aiRabbit.cs");
|
|
}
|
|
|
|
|