This commit is contained in:
INeedGames 2020-12-24 19:10:10 -06:00
parent 00fc713e5a
commit b540a8e884
4 changed files with 2476 additions and 2424 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
/* /*
_bot_utility _bot_utility
Author: INeedGames Author: INeedGames
Date: 12/20/2020 Date: 12/20/2020
The shared functions for bots The shared functions for bots
*/ */
#include common_scripts\utility; #include common_scripts\utility;
@ -10,284 +10,332 @@
#include maps\mp\gametypes\_hud_util; #include maps\mp\gametypes\_hud_util;
/* /*
Returns an array of all the bots in the game. Returns an array of all the bots in the game.
*/ */
getBotArray() getBotArray()
{ {
result = []; result = [];
playercount = level.players.size; playercount = level.players.size;
for(i = 0; i < playercount; i++) for(i = 0; i < playercount; i++)
{ {
player = level.players[i]; player = level.players[i];
if(!player is_bot()) if(!player is_bot())
continue; continue;
result[result.size] = player; result[result.size] = player;
} }
return result; return result;
} }
/* /*
Returns a good amount of players. Returns a good amount of players.
*/ */
getGoodMapAmount() getGoodMapAmount()
{ {
switch(getdvar("mapname")) switch(getdvar("mapname"))
{ {
default: default:
return 2; return 2;
} }
} }
/* /*
Rounds to the nearest whole number. Rounds to the nearest whole number.
*/ */
Round(x) Round(x)
{ {
y = int(x); y = int(x);
if(abs(x) - abs(y) > 0.5) if(abs(x) - abs(y) > 0.5)
{ {
if(x < 0) if(x < 0)
return y - 1; return y - 1;
else else
return y + 1; return y + 1;
} }
else else
return y; return y;
} }
/* /*
Picks a random thing Picks a random thing
*/ */
PickRandom(arr) PickRandom(arr)
{ {
if (!arr.size) if (!arr.size)
return undefined; return undefined;
return arr[randomInt(arr.size)]; return arr[randomInt(arr.size)];
} }
/* /*
Waits for a host player Waits for a host player
*/ */
bot_wait_for_host() bot_wait_for_host()
{ {
host = undefined; host = undefined;
while (!isDefined(level) || !isDefined(level.players)) while (!isDefined(level) || !isDefined(level.players))
wait 0.05; wait 0.05;
for(i = 0; i < 100; i++) for(i = 0; i < 100; i++)
{ {
host = GetHostPlayer(); host = GetHostPlayer();
if(isDefined(host)) if(isDefined(host))
break; break;
wait 0.05; wait 0.05;
} }
if(!isDefined(host)) if(!isDefined(host))
return; return;
for(i = 0; i < 100; i++) for(i = 0; i < 100; i++)
{ {
if(IsDefined( host.pers[ "team" ] )) if(IsDefined( host.pers[ "team" ] ))
break; break;
wait 0.05; wait 0.05;
} }
if(!IsDefined( host.pers[ "team" ] )) if(!IsDefined( host.pers[ "team" ] ))
return; return;
for(i = 0; i < 100; i++) for(i = 0; i < 100; i++)
{ {
if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis")
break; break;
wait 0.05; wait 0.05;
} }
} }
/* /*
Wrapper for setgoal Wrapper for setgoal
*/ */
SetBotGoal(where, dist) SetBotGoal(where, dist)
{ {
self SetScriptGoal(where, dist); self SetScriptGoal(where, dist);
waittillframeend; waittillframeend;
self notify("new_goal"); self notify("new_goal");
} }
/* /*
Fixes sd bomb planting Matches a num to a char
*/
keyCodeToString(a)
{
b="";
switch(a)
{
case 0: b= "a"; break;
case 1: b= "b"; break;
case 2: b= "c"; break;
case 3: b= "d"; break;
case 4: b= "e"; break;
case 5: b= "f"; break;
case 6: b= "g"; break;
case 7: b= "h"; break;
case 8: b= "i"; break;
case 9: b= "j"; break;
case 10: b= "k"; break;
case 11: b= "l"; break;
case 12: b= "m"; break;
case 13: b= "n"; break;
case 14: b= "o"; break;
case 15: b= "p"; break;
case 16: b= "q"; break;
case 17: b= "r"; break;
case 18: b= "s"; break;
case 19: b= "t"; break;
case 20: b= "u"; break;
case 21: b= "v"; break;
case 22: b= "w"; break;
case 23: b= "x"; break;
case 24: b= "y"; break;
case 25: b= "z"; break;
case 26: b= "."; break;
case 27: b= " "; break;
}
return b;
}
/*
Does the extra check when adding bots
*/
doExtraCheck()
{
maps\mp\bots\_bot_script::checkTheBots();
}
/*
Fixes sd bomb planting
*/ */
bot_onUsePlantObjectFix( player ) bot_onUsePlantObjectFix( player )
{ {
// planted the bomb // planted the bomb
if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) )
{ {
level thread bot_bombPlanted( self, player ); level thread bot_bombPlanted( self, player );
player logString( "bomb planted: " + self.label ); player logString( "bomb planted: " + self.label );
// disable all bomb zones except this one // disable all bomb zones except this one
for ( index = 0; index < level.bombZones.size; index++ ) for ( index = 0; index < level.bombZones.size; index++ )
{ {
if ( level.bombZones[index] == self ) if ( level.bombZones[index] == self )
continue; continue;
level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject();
} }
thread playSoundOnPlayers( "mus_sd_planted"+"_"+level.teamPostfix[player.pers["team"]] ); thread playSoundOnPlayers( "mus_sd_planted"+"_"+level.teamPostfix[player.pers["team"]] );
// removed plant audio until finalization of assest TODO : new plant sounds when assests are online // removed plant audio until finalization of assest TODO : new plant sounds when assests are online
// player playSound( "mpl_sd_bomb_plant" ); // player playSound( "mpl_sd_bomb_plant" );
player notify ( "bomb_planted" ); player notify ( "bomb_planted" );
level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player ); level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player );
if( isdefined(player.pers["plants"]) ) if( isdefined(player.pers["plants"]) )
{ {
player.pers["plants"]++; player.pers["plants"]++;
player.plants = player.pers["plants"]; player.plants = player.pers["plants"];
} }
player maps\mp\_medals::saboteur(); player maps\mp\_medals::saboteur();
player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 ); player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 );
maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" ); maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted" );
maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player ); maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player );
//player thread [[level.onXPEvent]]( "plant" ); //player thread [[level.onXPEvent]]( "plant" );
} }
} }
/* /*
Fixes sd bomb planting Fixes sd bomb planting
*/ */
bot_bombPlanted( destroyedObj, player ) bot_bombPlanted( destroyedObj, player )
{ {
maps\mp\gametypes\_globallogic_utils::pauseTimer(); maps\mp\gametypes\_globallogic_utils::pauseTimer();
level.bombPlanted = true; level.bombPlanted = true;
destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" ); destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" );
//Play suspense music //Play suspense music
level thread maps\mp\gametypes\sd::bombPlantedMusicDelay(); level thread maps\mp\gametypes\sd::bombPlantedMusicDelay();
//thread maps\mp\gametypes\_globallogic_audio::actionMusicSet(); //thread maps\mp\gametypes\_globallogic_audio::actionMusicSet();
level.tickingObject = destroyedObj.visuals[0]; level.tickingObject = destroyedObj.visuals[0];
level.timeLimitOverride = true; level.timeLimitOverride = true;
setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) );
setMatchFlag( "bomb_timer", 1 ); setMatchFlag( "bomb_timer", 1 );
if ( !level.multiBomb ) if ( !level.multiBomb )
{ {
level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" );
level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
level.sdBomb maps\mp\gametypes\_gameobjects::setDropped(); level.sdBomb maps\mp\gametypes\_gameobjects::setDropped();
level.sdBombModel = level.sdBomb.visuals[0]; level.sdBombModel = level.sdBomb.visuals[0];
} }
else else
{ {
for ( index = 0; index < level.players.size; index++ ) for ( index = 0; index < level.players.size; index++ )
{ {
if ( isDefined( level.players[index].carryIcon ) ) if ( isDefined( level.players[index].carryIcon ) )
level.players[index].carryIcon destroyElem(); level.players[index].carryIcon destroyElem();
} }
trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player );
tempAngle = randomfloat( 360 ); tempAngle = randomfloat( 360 );
forward = (cos( tempAngle ), sin( tempAngle ), 0); forward = (cos( tempAngle ), sin( tempAngle ), 0);
forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) ); forward = vectornormalize( forward - vector_scale( trace["normal"], vectordot( forward, trace["normal"] ) ) );
dropAngles = vectortoangles( forward ); dropAngles = vectortoangles( forward );
level.sdBombModel = spawn( "script_model", trace["position"] ); level.sdBombModel = spawn( "script_model", trace["position"] );
level.sdBombModel.angles = dropAngles; level.sdBombModel.angles = dropAngles;
level.sdBombModel setModel( "prop_suitcase_bomb" ); level.sdBombModel setModel( "prop_suitcase_bomb" );
} }
destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" );
destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
/* /*
destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined );
destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined );
destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined );
destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined ); destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined );
*/ */
label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel(); label = destroyedObj maps\mp\gametypes\_gameobjects::getLabel();
// create a new object to defuse with. // create a new object to defuse with.
trigger = destroyedObj.bombDefuseTrig; trigger = destroyedObj.bombDefuseTrig;
trigger.origin = level.sdBombModel.origin; trigger.origin = level.sdBombModel.origin;
visuals = []; visuals = [];
defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,32) ); defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,32) );
defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" );
defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime );
defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" );
defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label ); defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" + label );
defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label ); defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" + label );
defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + label ); defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + label );
defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + label ); defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + label );
defuseObject.label = label; defuseObject.label = label;
defuseObject.onBeginUse = maps\mp\gametypes\sd::onBeginUse; defuseObject.onBeginUse = maps\mp\gametypes\sd::onBeginUse;
defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse; defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse;
defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject; defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject;
defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; defuseObject.useWeapon = "briefcase_bomb_defuse_mp";
level.defuseObject = defuseObject;//every cod... level.defuseObject = defuseObject;//every cod...
player.isBombCarrier = false; player.isBombCarrier = false;
maps\mp\gametypes\sd::BombTimerWait(); maps\mp\gametypes\sd::BombTimerWait();
setMatchFlag( "bomb_timer", 0 ); setMatchFlag( "bomb_timer", 0 );
destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound(); destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound();
if ( level.gameEnded || level.bombDefused ) if ( level.gameEnded || level.bombDefused )
return; return;
level.bombExploded = true; level.bombExploded = true;
explosionOrigin = level.sdBombModel.origin+(0,0,12); explosionOrigin = level.sdBombModel.origin+(0,0,12);
level.sdBombModel hide(); level.sdBombModel hide();
if ( isdefined( player ) ) if ( isdefined( player ) )
{ {
destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" );
level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", player ); level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", player );
player maps\mp\_medals::bomber(); player maps\mp\_medals::bomber();
player maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 ); player maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 );
} }
else else
destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" );
rot = randomfloat(360); rot = randomfloat(360);
explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) );
triggerFx( explosionEffect ); triggerFx( explosionEffect );
thread playSoundinSpace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin ); thread playSoundinSpace( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin );
//thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" ); //thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "SILENT", "both" );
if ( isDefined( destroyedObj.exploderIndex ) ) if ( isDefined( destroyedObj.exploderIndex ) )
exploder( destroyedObj.exploderIndex ); exploder( destroyedObj.exploderIndex );
for ( index = 0; index < level.bombZones.size; index++ ) for ( index = 0; index < level.bombZones.size; index++ )
level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject();
defuseObject maps\mp\gametypes\_gameobjects::disableObject(); defuseObject maps\mp\gametypes\_gameobjects::disableObject();
setGameEndTime( 0 ); setGameEndTime( 0 );
wait 3; wait 3;
maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] );
} }

File diff suppressed because it is too large Load Diff