mirror of
https://github.com/id-Software/quake2-rerelease-dll.git
synced 2026-03-20 08:59:28 +01:00
Initial commit
This commit is contained in:
151
rerelease/bots/bot_exports.cpp
Normal file
151
rerelease/bots/bot_exports.cpp
Normal file
@@ -0,0 +1,151 @@
|
||||
// Copyright (c) ZeniMax Media Inc.
|
||||
// Licensed under the GNU General Public License 2.0.
|
||||
|
||||
#include "../g_local.h"
|
||||
#include "bot_exports.h"
|
||||
|
||||
/*
|
||||
================
|
||||
Bot_SetWeapon
|
||||
================
|
||||
*/
|
||||
void Bot_SetWeapon( edict_t * bot, const int weaponIndex, const bool instantSwitch ) {
|
||||
if ( weaponIndex <= IT_NULL || weaponIndex > IT_TOTAL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ( bot->svflags & SVF_BOT ) == 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
gclient_t * client = bot->client;
|
||||
if ( client == nullptr || !client->pers.inventory[ weaponIndex ] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const item_id_t weaponItemID = static_cast<item_id_t>( weaponIndex );
|
||||
|
||||
const gitem_t * currentGun = client->pers.weapon;
|
||||
if ( currentGun != nullptr ) {
|
||||
if ( currentGun->id == weaponItemID ) {
|
||||
return;
|
||||
} // already have the gun in hand.
|
||||
}
|
||||
|
||||
const gitem_t * pendingGun = client->newweapon;
|
||||
if ( pendingGun != nullptr ) {
|
||||
if ( pendingGun->id == weaponItemID ) {
|
||||
return;
|
||||
} // already in the process of switching to that gun, just be patient!
|
||||
}
|
||||
|
||||
gitem_t * item = &itemlist[ weaponIndex ];
|
||||
if ( ( item->flags & IF_WEAPON ) == 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( item->use == nullptr ) {
|
||||
return;
|
||||
}
|
||||
|
||||
bot->client->no_weapon_chains = true;
|
||||
item->use( bot, item );
|
||||
|
||||
if ( instantSwitch ) {
|
||||
// FIXME: ugly, maybe store in client later
|
||||
const int temp_instant_weapon = g_instant_weapon_switch->integer;
|
||||
g_instant_weapon_switch->integer = 1;
|
||||
ChangeWeapon( bot );
|
||||
g_instant_weapon_switch->integer = temp_instant_weapon;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Bot_TriggerEdict
|
||||
================
|
||||
*/
|
||||
void Bot_TriggerEdict( edict_t * bot, edict_t * edict ) {
|
||||
if ( !bot->inuse || !edict->inuse ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ( bot->svflags & SVF_BOT ) == 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( edict->use ) {
|
||||
edict->use( edict, bot, bot );
|
||||
}
|
||||
|
||||
trace_t unUsed;
|
||||
if ( edict->touch ) {
|
||||
edict->touch( edict, bot, unUsed, true );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Bot_UseItem
|
||||
================
|
||||
*/
|
||||
void Bot_UseItem( edict_t * bot, const int32_t itemID ) {
|
||||
if ( !bot->inuse ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ( bot->svflags & SVF_BOT ) == 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const item_id_t desiredItemID = item_id_t( itemID );
|
||||
bot->client->pers.selected_item = desiredItemID;
|
||||
|
||||
ValidateSelectedItem( bot );
|
||||
|
||||
if ( bot->client->pers.selected_item == IT_NULL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( bot->client->pers.selected_item != desiredItemID ) {
|
||||
return;
|
||||
} // the itemID changed on us - don't use it!
|
||||
|
||||
gitem_t * item = &itemlist[ bot->client->pers.selected_item ];
|
||||
bot->client->pers.selected_item = IT_NULL;
|
||||
|
||||
if ( item->use == nullptr ) {
|
||||
return;
|
||||
}
|
||||
|
||||
bot->client->no_weapon_chains = true;
|
||||
item->use( bot, item );
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
Bot_GetItemID
|
||||
================
|
||||
*/
|
||||
int32_t Bot_GetItemID( const char * classname ) {
|
||||
if ( classname == nullptr || classname[ 0 ] == '\0' ) {
|
||||
return Item_Invalid;
|
||||
}
|
||||
|
||||
if ( Q_strcasecmp( classname, "none" ) == 0 ) {
|
||||
return Item_Null;
|
||||
}
|
||||
|
||||
for ( int i = 0; i < IT_TOTAL; ++i ) {
|
||||
const gitem_t * item = itemlist + i;
|
||||
if ( item->classname == nullptr || item->classname[ 0 ] == '\0' ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( Q_strcasecmp( item->classname, classname ) == 0 ) {
|
||||
return item->id;
|
||||
}
|
||||
}
|
||||
|
||||
return Item_Invalid;
|
||||
}
|
||||
Reference in New Issue
Block a user