Code: Select all
[FerBotz.Botz]
bSuperAim=True
Code: Select all
[FerBotz.Botz]
bSuperAim=True
I sort of like sektor's way of doing that, where you just pick the mbot class (m male commando) in the botlist to have that specific type of bot join matches regularly without activating any mutators or commands. You can easily play with two different types - mbots and bots - if you care, that is.UTNerd24 wrote:I hope one day you'll find a way to replace the botlist so that It could be possible to customize them from the in-game menus rather than having to summon them through the console.
You can also customize it in the botz ini as well, if you didn't check.UTNerd24 wrote:Loving it so far! I hope one day you'll find a way to replace the botlist so that It could be possible to customize them from the in-game menus rather than having to summon them through the console.
That's all cool, but some of us like to see the bots/botz skins and here the voices before we enable them for a bot game.Chamberly wrote:You can also customize it in the botz ini as well, if you didn't check.UTNerd24 wrote:Loving it so far! I hope one day you'll find a way to replace the botlist so that It could be possible to customize them from the in-game menus rather than having to summon them through the console.
Child Bot. That's what I meant. Thanks for the correction.sektor2111 wrote:MBot is a Bot child not a Player, btw...
Else last version released if I well recall contains a more enhanced INT file allowing some BOT access in "Preferences" which UT doesn't have in default config.
demoix wrote:I noticed that I need a custom engine called XC_Engine v19. But I tried to find it over all internet but can't find it.
Code: Select all
//Change where the bot is attracted to based on objective (good for Defering to navigation points)
function Actor ModifyAttraction( Botz Seeker, Actor PathTarget, out byte ForceTarget)
{
return PathTarget;
}
Code: Select all
function ModifyPathCosts( Botz Seeker); //Called during route-mapping, allows modification of 'Cost' in order to modify route weights
Code: Select all
function Actor SuggestAttack( Botz CheckFor, optional bool bOnlyTest)
{
local bool bJustSpawned;
//This is set to a low value everytime the bot respawns, used to detect respawns
if ( CheckFor.RespawnTime < 5 )
{
CheckFor.RespawnTime = Level.TimeSeconds;
bJustSpawned = true;
}
//********* Attempt to map the path network - ModifyPathCosts called during MapRoutes
if ( !CheckFor.LocateStartAnchor() )
return None;
CheckFor.MapRoutes( CheckFor.StartAnchor, CheckFor.CollisionRadius, CheckFor.CollisionHeight, 0, 'GlobalModifyCost');
//********* Validate this objective - can be modified here (kept if True)
//********* If primary objective isn't valid, attempt to use ALT objective if there is one
while ( CheckFor.GameTarget != None )
{
if ( ValidateObjective( CheckFor) )
return CheckFor.GameTarget;
CheckFor.GameTarget = CheckFor.GameTargetAlt;
CheckFor.GameTargetAlt = None;
}
//********* Find new objectives
return SelectObjective( CheckFor, bJustSpawned);
}
Code: Select all
function bool ValidateObjective( Botz CheckFor)
{
local Inventory Inv;
local NavigationPoint N;
local Pawn P;
if ( CheckFor.GameTarget == None || CheckFor.bDeleteMe )
return false;
if ( Inventory(CheckFor.GameTarget) != None ) return ValidateObjInventory( CheckFor, Inventory(CheckFor.GameTarget) );
if ( NavigationPoint(CheckFor.GameTarget) != None ) return ValidateObjNavigation( CheckFor, NavigationPoint(CheckFor.GameTarget) );
if ( Pawn(CheckFor.GameTarget) != None ) return ValidateObjPawn( CheckFor, Pawn(CheckFor.GameTarget) );
return false; //Don't validate other objectives
}
Code: Select all
/* Precaucion: the higher this is the more likely the bot is to take detours to find items
- 1.0 is normal-ish behaviour
- 0.0 means the bot will almost ignore all items
- 2.0 or above mean the bot will try to reach the objective with armor and more than one weapon
*/
function Actor SelectObjective( Botz CheckFor, bool bJustSpawned)
{
local Actor Result;
if ( bJustSpawned )
{
CheckFor.Precaucion = 1 - CheckFor.Aggresiveness * FRand();
Result = FindNearbyWeapon( CheckFor, 1500);
if ( Result != None )
return Result;
}
//'Or' is a skip operator, if parameter 1 exists, paramater 2 code isn't executed so don't worry about execution speed
if ( CheckFor.Orders == 'Attack' )
{
CheckFor.Precaucion = 0.6 + FRand() * 0.3;
Result = FindNewItem(CheckFor) Or FindRandomDest(CheckFor);
}
else if ( CheckFor.Orders == 'Defend' )
{
CheckFor.Precaucion = 1.0 + FRand() - int(CheckFor.Weapon != None && CheckFor.Weapon.AiRating > 0.5);
if ( (CheckFor.ArmaFavorita != None) && (FRand() < 0.1) && (CheckFor.FindInventoryType(CheckFor.ArmaFavorita) == None) )
Result = FindNearestItemFamily( CheckFor, CheckFor.ArmaFavorita, 5000);
Result = Result Or FindAmbushPoint(CheckFor) Or FindNearbyWeapon(CheckFor) Or FindNewItem(CheckFor);
}
else
{
CheckFor.Precaucion = 1.0 + FRand();
Result = FindNewItem(CheckFor) Or FindAmbushPoint(CheckFor) Or FindRandomDest(CheckFor);
}
return Result;
}