From 888ea67bab11ba1a6917e3e4ff26bfc2e5233235 Mon Sep 17 00:00:00 2001 From: IronClawTrem Date: Sat, 7 Mar 2020 20:52:29 +0000 Subject: add !range command --- src/game/g_admin.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/game/g_admin.h | 1 + src/game/g_client.c | 5 +++++ src/game/g_local.h | 6 ++++++ src/game/g_weapon.c | 18 ++++++++++++------ 5 files changed, 78 insertions(+), 6 deletions(-) diff --git a/src/game/g_admin.c b/src/game/g_admin.c index dcc8ecf..ea6a896 100644 --- a/src/game/g_admin.c +++ b/src/game/g_admin.c @@ -441,6 +441,11 @@ g_admin_cmd_t g_admin_cmds[ ] = {"god", G_admin_god, "god", "makes a player invincible", "[^3name|slot#^7]" + }, + + {"range", G_admin_range, "range", + "changes a player's bite/swipe/chomp range", + "[^3name|slot#^7] [^5range^7]" } }; @@ -8377,3 +8382,52 @@ qboolean G_admin_god( gentity_t *ent, int skiparg ) return qtrue; } + +qboolean G_admin_range( gentity_t *ent, int skiparg ) +{ + int pids[ MAX_CLIENTS ]; + char name[ MAX_NAME_LENGTH ], err[ MAX_STRING_CHARS ]; + int minargc; + gentity_t *vic; + adminRangeBoosts_t *newRange; + char rangeInt[ MAX_STRING_CHARS ]; + float value; + minargc = 3 + skiparg; + + if( G_SayArgc() < minargc ) + { + ADMP( "^3!range: ^7usage: !range [name|slot#] [range]\n" ); + return qfalse; + } + + G_SayArgv( 1 + skiparg, name, sizeof( name ) ); + G_SayArgv( 2 + skiparg, rangeInt, sizeof( rangeInt ) ); + + if( G_ClientNumbersFromString( name, pids ) != 1 ) + { + G_MatchOnePlayer( pids, err, sizeof( err ) ); + ADMP( va( "^3!range: ^7%s\n", err ) ); + return qfalse; + } + + vic = &g_entities[ pids[ 0 ] ]; + + if( !admin_higher( ent, &g_entities[ pids[ 0 ] ] ) ) + { + ADMP( "^3!range: ^7sorry, but that player has a higher admin" + " level than you\n" ); + return qfalse; + } + + newRange = &vic->client->newRange; + value = atof( rangeInt ); + newRange->rangeBoost = value - 1.0f; + + AP( va( "print \"^3!range: ^7range for %s ^7was multipled by ^2%s ^7by %s^7\n\"", + vic->client->pers.netname, + rangeInt, + ( ent ) ? G_admin_adminPrintName( ent ) : "console" ) ); + + return qtrue; + +} diff --git a/src/game/g_admin.h b/src/game/g_admin.h index 7f5fba8..a7653d9 100644 --- a/src/game/g_admin.h +++ b/src/game/g_admin.h @@ -294,6 +294,7 @@ qboolean G_admin_print2( gentity_t *ent, int skiparg ); qboolean G_admin_switch( gentity_t *ent, int skiparg ); qboolean G_admin_drug( gentity_t *ent, int skiparg ); qboolean G_admin_god( gentity_t *ent, int skiparg ); +qboolean G_admin_range( gentity_t *ent, int skiparg ); void G_admin_print( gentity_t *ent, char *m ); void G_admin_buffer_print( gentity_t *ent, char *m ); diff --git a/src/game/g_client.c b/src/game/g_client.c index 09a09ec..97c02eb 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -1663,6 +1663,7 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn, vec3_t origin, vec3_t angles vec3_t up = { 0.0f, 0.0f, 1.0f }; int maxAmmo, maxClips; weapon_t weapon; + adminRangeBoosts_t savedRanges; index = ent - g_entities; @@ -1744,6 +1745,8 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn, vec3_t origin, vec3_t angles for( i = 0; i < MAX_PERSISTANT; i++ ) persistant[ i ] = client->ps.persistant[ i ]; + memcpy( &savedRanges, &client->newRange, sizeof( adminRangeBoosts_t ) ); + eventSequence = client->ps.eventSequence; memset( client, 0, sizeof( *client ) ); @@ -1752,6 +1755,8 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn, vec3_t origin, vec3_t angles client->ps.ping = savedPing; client->lastkilled_client = -1; + memcpy( &client->newRange, &savedRanges, sizeof( adminRangeBoosts_t ) ); + for( i = 0; i < MAX_PERSISTANT; i++ ) client->ps.persistant[ i ] = persistant[ i ]; diff --git a/src/game/g_local.h b/src/game/g_local.h index 7c96014..2d73b5f 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -463,6 +463,10 @@ typedef struct unlagged_s { qboolean used; } unlagged_t; +typedef struct { + float rangeBoost; +} adminRangeBoosts_t; + // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' struct gclient_s @@ -562,6 +566,8 @@ struct gclient_s int tkcredits[ MAX_CLIENTS ]; + adminRangeBoosts_t newRange; + }; diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index 92dddf2..46d0128 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -885,6 +885,8 @@ qboolean CheckVenomAttack( gentity_t *ent ) gentity_t *traceEnt; vec3_t mins, maxs; int damage = LEVEL0_BITE_DMG; + adminRangeBoosts_t *newRange; + newRange = &ent->client->newRange; VectorSet( mins, -LEVEL0_BITE_WIDTH, -LEVEL0_BITE_WIDTH, -LEVEL0_BITE_WIDTH ); VectorSet( maxs, LEVEL0_BITE_WIDTH, LEVEL0_BITE_WIDTH, LEVEL0_BITE_WIDTH ); @@ -894,7 +896,7 @@ qboolean CheckVenomAttack( gentity_t *ent ) CalcMuzzlePoint( ent, forward, right, up, muzzle ); - VectorMA( muzzle, LEVEL0_BITE_RANGE, forward, end ); + VectorMA( muzzle, LEVEL0_BITE_RANGE * ( newRange->rangeBoost + 1.0f ), forward, end ); G_UnlaggedOn( ent, muzzle, LEVEL0_BITE_RANGE ); trap_Trace( &tr, muzzle, mins, maxs, end, ent->s.number, MASK_SHOT ); @@ -1574,6 +1576,10 @@ FireWeapon */ void FireWeapon( gentity_t *ent ) { + + adminRangeBoosts_t *newRange; + newRange = &ent->client->newRange; + if( level.paused ) return; if( ent->client ) @@ -1593,20 +1599,20 @@ void FireWeapon( gentity_t *ent ) { case WP_ALEVEL1: case WP_ALEVEL1_UPG: - meleeAttack( ent, LEVEL1_CLAW_RANGE, LEVEL1_CLAW_WIDTH, LEVEL1_CLAW_DMG, MOD_LEVEL1_CLAW ); + meleeAttack( ent, LEVEL1_CLAW_RANGE * ( newRange->rangeBoost + 1.0f ), LEVEL1_CLAW_WIDTH, LEVEL1_CLAW_DMG, MOD_LEVEL1_CLAW ); break; case WP_ALEVEL3: case WP_ALEVEL3_UPG: - meleeAttack( ent, LEVEL3_CLAW_RANGE, LEVEL3_CLAW_WIDTH, LEVEL3_CLAW_DMG, MOD_LEVEL3_CLAW ); + meleeAttack( ent, LEVEL3_CLAW_RANGE * ( newRange->rangeBoost + 1.0f ), LEVEL3_CLAW_WIDTH, LEVEL3_CLAW_DMG, MOD_LEVEL3_CLAW ); break; case WP_ALEVEL2: - meleeAttack( ent, LEVEL2_CLAW_RANGE, LEVEL2_CLAW_WIDTH, LEVEL2_CLAW_DMG, MOD_LEVEL2_CLAW ); + meleeAttack( ent, LEVEL2_CLAW_RANGE * ( newRange->rangeBoost + 1.0f ), LEVEL2_CLAW_WIDTH, LEVEL2_CLAW_DMG, MOD_LEVEL2_CLAW ); break; case WP_ALEVEL2_UPG: - meleeAttack( ent, LEVEL2_CLAW_RANGE, LEVEL2_CLAW_WIDTH, LEVEL2_CLAW_DMG, MOD_LEVEL2_CLAW ); + meleeAttack( ent, LEVEL2_CLAW_RANGE * ( newRange->rangeBoost + 1.0f ), LEVEL2_CLAW_WIDTH, LEVEL2_CLAW_DMG, MOD_LEVEL2_CLAW ); break; case WP_ALEVEL4: - meleeAttack( ent, LEVEL4_CLAW_RANGE, LEVEL4_CLAW_WIDTH, LEVEL4_CLAW_DMG, MOD_LEVEL4_CLAW ); + meleeAttack( ent, LEVEL4_CLAW_RANGE * ( newRange->rangeBoost + 1.0f ), LEVEL4_CLAW_WIDTH, LEVEL4_CLAW_DMG, MOD_LEVEL4_CLAW ); break; case WP_BLASTER: -- cgit