t2-mapper/docs/base/@vl2/scripts.vl2/scripts/aiRabbit.cs
2025-09-11 16:56:30 -07:00

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");
}