From 9a5647df1d7c057b20ff38e73d062fe343a7b044 Mon Sep 17 00:00:00 2001 From: Paradox460 Date: Sat, 15 Mar 2008 20:00:49 +0000 Subject: [PATCH] * Added bugfixes for builder, now much more useful command. (See Issue 64) * Added extreme mod * `g_modBuildableHealth`: Buildable health *(Percent)* * `g_modBuildableSpeed`: Buildable fire rate *(Percent)* * `g_modHumanStamina`: Human stamina *(Percent)* * `g_modHumanHealth`: Human health *(Percent)* * `g_modAlienHealth`: Alien health *(Percent)* * `g_modHumanRate`: Human fire rate *(Percent)* * `g_modAlienRate`: Alien fire rate *(Percent)* * `g_modWeaponAmmo`: Weapon ammo per clip *(Percent)* * `g_modWeaponReload`: Adjust's Weapon reload time *(Percent)* Wiki updated as well. This matches release 1.5.0.4 --- src/game/bg_misc.c | 119 +++++++++++++++++++++++++++++++++++++++++ src/game/bg_public.h | 18 +++++++ src/game/g_active.c | 13 ++++- src/game/g_buildable.c | 29 ++++++++-- src/game/g_cmds.c | 30 ++++++----- src/game/g_local.h | 14 ++++- src/game/g_main.c | 38 +++++++++++++ src/game/g_missile.c | 9 ++++ src/game/g_weapon.c | 4 ++ 9 files changed, 253 insertions(+), 21 deletions(-) diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c index b5ba247..e661c4b 100644 --- a/src/game/bg_misc.c +++ b/src/game/bg_misc.c @@ -32,6 +32,8 @@ void trap_FS_Write( const void *buffer, int len, fileHandle_t f ); void trap_FS_FCloseFile( fileHandle_t f ); void trap_FS_Seek( fileHandle_t f, long offset, fsOrigin_t origin ); // fsOrigin_t +modExtremeType_t modEntry[ MOD_BG_COUNT ]; + buildableAttributes_t bg_buildableList[ ] = { { @@ -5767,4 +5769,121 @@ void BG_ClientListParse( clientList_t *list, const char *s ) sscanf( s, "%x%x", &list->hi, &list->lo ); } +void BG_MOD_set( modExtremeType_t entry, int value ) +{ + if( entry >= 0 && entry < MOD_BG_COUNT ) + { + if( value < 0 ) + value = 0; + + modEntry[ entry ] = value; + } +} + +void BG_MOD_update( void ) +{ + static qboolean updated = qfalse; + int i; + + if( updated ) return; + updated = qtrue; + + for( i = 0; i < bg_numBuildables; i++ ) + { + if( modEntry[ MOD_BG_BUILDABLE_HEALTH ] ) + { + bg_buildableList[ i ].health = + bg_buildableList[ i ].health * modEntry[ MOD_BG_BUILDABLE_HEALTH ] / 100; + } + + if( modEntry[ MOD_BG_BUILDABLE_SPEED ] ) + { + bg_buildableList[ i ].turretFireSpeed = + bg_buildableList[ i ].turretFireSpeed * 100 / modEntry[ MOD_BG_BUILDABLE_SPEED ]; + } + } + + for( i = 0; i < bg_numPclasses; i++ ) + { + if( bg_classList[ i ].classNum == PCL_HUMAN || + bg_classList[ i ].classNum == PCL_HUMAN_BSUIT ) + { + if( modEntry[ MOD_BG_HUMAN_HEALTH ] ) + { + bg_classList[ i ].health = + bg_classList[ i ].health * modEntry[ MOD_BG_HUMAN_HEALTH ] / 100; + } + } + else + { + if( modEntry[ MOD_BG_ALIEN_HEALTH ] ) + bg_classList[ i ].health = + bg_classList[ i ].health * modEntry[ MOD_BG_ALIEN_HEALTH ] / 100; + } + } + + for( i = 0; i < bg_numWeapons; i++ ) + { + if( modEntry[ MOD_BG_WEAPON_AMMO ] && + bg_weapons[ i ].weaponNum != WP_ALEVEL3_UPG ) + { + bg_weapons[ i ].maxAmmo = + bg_weapons[ i ].maxAmmo * modEntry[ MOD_BG_WEAPON_AMMO ] / 100; + } + + if( modEntry[ MOD_BG_ALIEN_RATE ] && + bg_weapons[ i ].weaponNum >= WP_ALEVEL0 && + bg_weapons[ i ].weaponNum <= WP_ALEVEL4 ) + { + bg_weapons[ i ].repeatRate1 = + bg_weapons[ i ].repeatRate1 * 100 / modEntry[ MOD_BG_ALIEN_RATE ]; + bg_weapons[ i ].repeatRate2 = + bg_weapons[ i ].repeatRate2 * 100 / modEntry[ MOD_BG_ALIEN_RATE ]; + bg_weapons[ i ].repeatRate3 = + bg_weapons[ i ].repeatRate3 * 100 / modEntry[ MOD_BG_ALIEN_RATE ]; + } + + if( modEntry[ MOD_BG_HUMAN_RATE ] && + bg_weapons[ i ].weaponNum >= WP_BLASTER && + bg_weapons[ i ].weaponNum <= WP_LUCIFER_CANNON ) + { + bg_weapons[ i ].repeatRate1 = + bg_weapons[ i ].repeatRate1 * 100 / modEntry[ MOD_BG_HUMAN_RATE ]; + bg_weapons[ i ].repeatRate2 = + bg_weapons[ i ].repeatRate2 * 100 / modEntry[ MOD_BG_HUMAN_RATE ]; + bg_weapons[ i ].repeatRate3 = + bg_weapons[ i ].repeatRate3 * 100 / modEntry[ MOD_BG_HUMAN_RATE ]; + } + + if( modEntry[ MOD_BG_BUILDABLE_HEALTH ] && + modEntry[ MOD_BG_HUMAN_RATE ] && + ( bg_weapons[ i ].weaponNum == WP_ABUILD || bg_weapons[ i ].weaponNum == WP_ABUILD2 ) ) + { + int avg; + + avg = ( modEntry[ MOD_BG_BUILDABLE_HEALTH ] + MOD_BG_HUMAN_RATE ) / 2; + bg_weapons[ i ].repeatRate1 = bg_weapons[ i ].repeatRate1 * 100 / avg; + bg_weapons[ i ].repeatRate2 = bg_weapons[ i ].repeatRate2 * 100 / avg; + bg_weapons[ i ].repeatRate3 = bg_weapons[ i ].repeatRate3 * 100 / avg; + } + + if( modEntry[ MOD_BG_BUILDABLE_HEALTH ] && + modEntry[ MOD_BG_ALIEN_RATE ] && + ( bg_weapons[ i ].weaponNum == WP_HBUILD || bg_weapons[ i ].weaponNum == WP_HBUILD2 ) ) + { + int avg; + + avg = ( modEntry[ MOD_BG_BUILDABLE_HEALTH ] + MOD_BG_ALIEN_RATE ) / 2; + bg_weapons[ i ].repeatRate1 = bg_weapons[ i ].repeatRate1 * 100 / avg; + bg_weapons[ i ].repeatRate2 = bg_weapons[ i ].repeatRate2 * 100 / avg; + bg_weapons[ i ].repeatRate3 = bg_weapons[ i ].repeatRate3 * 100 / avg; + } + + if( modEntry[ MOD_BG_WEAPON_RELOAD ] ) + { + bg_weapons[ i ].reloadTime = + bg_weapons[ i ].reloadTime * 100 / modEntry[ MOD_BG_WEAPON_RELOAD ]; + } + } +} diff --git a/src/game/bg_public.h b/src/game/bg_public.h index 6d7e8ba..c69c32d 100644 --- a/src/game/bg_public.h +++ b/src/game/bg_public.h @@ -1332,3 +1332,21 @@ void BG_ClientListParse( clientList_t *list, const char *s ); #define FFF_ALIENS 2 #define FFF_BUILDABLES 4 +// value mods equal to g_mod cvars on server +typedef enum +{ + MOD_BG_BUILDABLE_HEALTH, // Buildable health + MOD_BG_BUILDABLE_SPEED, // Buildable fire rate + MOD_BG_HUMAN_STAMINA, // Human stamina + MOD_BG_HUMAN_HEALTH, // Human health + MOD_BG_ALIEN_HEALTH, // Alien health + MOD_BG_HUMAN_RATE, // Human fire rate + MOD_BG_ALIEN_RATE, // Alien fire rate + MOD_BG_WEAPON_AMMO, // Weapon ammo per clip + MOD_BG_WEAPON_RELOAD, // Weapon reload time + MOD_BG_COUNT // number of entries +} modExtremeType_t; + +void BG_MOD_set( modExtremeType_t entry, int value ); +void BG_MOD_update( void ); + diff --git a/src/game/g_active.c b/src/game/g_active.c index d1e9ae0..4360330 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -531,6 +531,8 @@ void ClientTimerActions( gentity_t *ent, int msec ) usercmd_t *ucmd; int aForward, aRight; int foundTurrets = 0; + int staminaLarmour = STAMINA_LARMOUR_TAKE; + int staminaSprint = STAMINA_SPRINT_TAKE; ucmd = &ent->client->pers.cmd; @@ -542,6 +544,13 @@ void ClientTimerActions( gentity_t *ent, int msec ) client->time1000 += msec; client->time10000 += msec; + if( ( client->ps.stats[ STAT_STATE ] & SS_SPEEDBOOST ) && + g_modHumanStamina.integer > 0 ) + { + staminaLarmour = staminaLarmour * 100 / g_modHumanStamina.integer; + staminaSprint = staminaSprint * 100 / g_modHumanStamina.integer; + } + while ( client->time100 >= 100 ) { client->time100 -= 100; @@ -557,9 +566,9 @@ void ClientTimerActions( gentity_t *ent, int msec ) { //subtract stamina if( BG_InventoryContainsUpgrade( UP_LIGHTARMOUR, client->ps.stats ) ) - client->ps.stats[ STAT_STAMINA ] -= STAMINA_LARMOUR_TAKE; + client->ps.stats[ STAT_STAMINA ] -= staminaLarmour; else - client->ps.stats[ STAT_STAMINA ] -= STAMINA_SPRINT_TAKE; + client->ps.stats[ STAT_STAMINA ] -= staminaSprint; if( client->ps.stats[ STAT_STAMINA ] < -MAX_STAMINA ) client->ps.stats[ STAT_STAMINA ] = -MAX_STAMINA; diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 24c0cb0..4680b26 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -3532,11 +3532,10 @@ static gentity_t *G_Build( gentity_t *builder, buildable_t buildable, vec3_t ori new->fate = BF_BUILT; } - built->madeby = ( builder->client ) ? builder->client->pers.netname : ""; - if( !builder->client ) - built->bdnumb = -1; + if( builder && builder->client ) + built->bdnumb = new->ID; else - built->bdnumb = new->ID ; + built->bdnumb = -1; return built; } @@ -4312,3 +4311,25 @@ int G_CountBuildLog( void ) } return i; } + +char *G_FindBuildLogName( int id ) +{ + buildHistory_t *ptr; + + for( ptr = level.buildHistory; ptr && ptr->ID != id; ptr = ptr->next ); + if( ptr ) + { + if( ptr->ent ) + { + if( ptr->ent->client ) + return ptr->ent->client->pers.netname; + } + else if( ptr->name[ 0 ] ) + { + return ptr->name; + } + } + + return ""; +} + diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index ec50106..2c655e9 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -3392,29 +3392,33 @@ Cmd_Builder_f */ void Cmd_Builder_f( gentity_t *ent ) { - vec3_t forward, end; + vec3_t forward, right, up; + vec3_t start, end; trace_t tr; gentity_t *traceEnt; char bdnumbchr[21]; if( !G_admin_permission( ent, ADMF_BUILDCHECK ) ) - return; + return; - AngleVectors( ent->client->ps.viewangles, forward, NULL, NULL ); - VectorMA( ent->client->ps.origin, 100, forward, end ); + AngleVectors( ent->client->ps.viewangles, forward, right, up ); + if( ent->client->pers.teamSelection != PTE_NONE ) + CalcMuzzlePoint( ent, forward, right, up, start ); + else + VectorCopy( ent->client->ps.origin, start ); + VectorMA( start, 1000, forward, end ); - trap_Trace( &tr, ent->client->ps.origin, NULL, NULL, end, ent->s.number, - MASK_PLAYERSOLID ); + trap_Trace( &tr, start, NULL, NULL, end, ent->s.number, MASK_PLAYERSOLID ); traceEnt = &g_entities[ tr.entityNum ]; Com_sprintf( bdnumbchr, sizeof(bdnumbchr), "%i", traceEnt->bdnumb ); - - if( tr.fraction < 1.0f && ( traceEnt->s.eType == ET_BUILDABLE ) && - ( traceEnt->biteam == ent->client->pers.teamSelection ) ) + + if( tr.fraction < 1.0f && ( traceEnt->s.eType == ET_BUILDABLE ) ) { - - trap_SendServerCommand( ent-g_entities, va( - "print \"Building was built by: %s^7, buildlog number: %s^7\n\"", traceEnt->madeby, (traceEnt->bdnumb != -1) ? bdnumbchr : "none" ) ); + trap_SendServerCommand( ent-g_entities, va( + "print \"Building was built by: %s^7, buildlog number: %s^7\n\"", + G_FindBuildLogName( traceEnt->bdnumb ), + (traceEnt->bdnumb != -1) ? bdnumbchr : "none" ) ); } } @@ -4273,7 +4277,7 @@ commands_t cmds[ ] = { { "donate", CMD_TEAM, Cmd_Donate_f }, { "protect", CMD_TEAM|CMD_LIVING, Cmd_Protect_f }, { "resign", CMD_TEAM, Cmd_Resign_f }, - { "builder", CMD_TEAM, Cmd_Builder_f } + { "builder", 0, Cmd_Builder_f } }; static int numCmds = sizeof( cmds ) / sizeof( cmds[ 0 ] ); diff --git a/src/game/g_local.h b/src/game/g_local.h index 20e41d6..c9e85de 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -241,8 +241,7 @@ struct gentity_s int lastDamageTime; - char *madeby; - int bdnumb; + int bdnumb; // buildlog entry ID }; typedef enum @@ -876,6 +875,7 @@ void G_CommitRevertedBuildable( gentity_t *ent ); qboolean G_RevertCanFit( buildHistory_t *bh ); int G_LogBuild( buildHistory_t *new ); int G_CountBuildLog( void ); +char *G_FindBuildLogName( int id ); // // g_utils.c @@ -1374,6 +1374,16 @@ extern vmCvar_t g_mapvoteMaxTime; extern vmCvar_t g_specAspec; +extern vmCvar_t g_modBuildableHealth; // Buildable health +extern vmCvar_t g_modBuildableSpeed; // Buildable fire rate +extern vmCvar_t g_modHumanStamina; // Human stamina +extern vmCvar_t g_modHumanHealth; // Human health +extern vmCvar_t g_modAlienHealth; // Alien health +extern vmCvar_t g_modHumanRate; // Human fire rate +extern vmCvar_t g_modAlienRate; // Alien fire rate +extern vmCvar_t g_modWeaponAmmo; // Weapon ammo per clip +extern vmCvar_t g_modWeaponReload; // Weapon reload time + void trap_Printf( const char *fmt ); void trap_Error( const char *fmt ); int trap_Milliseconds( void ); diff --git a/src/game/g_main.c b/src/game/g_main.c index 97faa65..3ac8baa 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -204,6 +204,16 @@ vmCvar_t g_mapvoteMaxTime; vmCvar_t g_specAspec; +vmCvar_t g_modBuildableHealth; +vmCvar_t g_modBuildableSpeed; +vmCvar_t g_modHumanStamina; +vmCvar_t g_modHumanHealth; +vmCvar_t g_modAlienHealth; +vmCvar_t g_modHumanRate; +vmCvar_t g_modAlienRate; +vmCvar_t g_modWeaponAmmo; +vmCvar_t g_modWeaponReload; + static cvarTable_t gameCvarTable[ ] = { // don't override the cheat state set by the system @@ -243,6 +253,16 @@ static cvarTable_t gameCvarTable[ ] = { &g_devmapNoStructDmg, "g_devmapNoStructDmg", "0", CVAR_ARCHIVE, 0, qtrue }, { &g_specAspec, "g_specAspec", "0", CVAR_ARCHIVE, 0, qtrue }, + + { &g_modBuildableHealth, "g_modBuildableHealth", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modBuildableSpeed, "g_modBuildableSpeed", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modHumanStamina, "g_modHumanStamina", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modHumanHealth, "g_modHumanHealth", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modAlienHealth, "g_modAlienHealth", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modHumanRate, "g_modHumanRate", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modAlienRate, "g_modAlienRate", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modWeaponAmmo, "g_modWeaponAmmo", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_modWeaponReload, "g_modWeaponReload", "0", CVAR_ARCHIVE, 0, qfalse }, { &g_proximityMines, "g_proximityMines", "0", 0, 0, qtrue }, { &g_teamAutoJoin, "g_teamAutoJoin", "0", CVAR_ARCHIVE }, @@ -624,6 +644,21 @@ void G_UpdateCvars( void ) G_RemapTeamShaders( ); } +static void G_InitModCvars( void ) +{ + BG_MOD_set( MOD_BG_BUILDABLE_HEALTH, g_modBuildableHealth.integer ); + BG_MOD_set( MOD_BG_BUILDABLE_SPEED, g_modBuildableSpeed.integer ); + BG_MOD_set( MOD_BG_HUMAN_STAMINA, g_modHumanStamina.integer ); + BG_MOD_set( MOD_BG_HUMAN_HEALTH, g_modHumanHealth.integer ); + BG_MOD_set( MOD_BG_ALIEN_HEALTH, g_modAlienHealth.integer ); + BG_MOD_set( MOD_BG_HUMAN_RATE, g_modHumanRate.integer ); + BG_MOD_set( MOD_BG_ALIEN_RATE, g_modAlienRate.integer ); + BG_MOD_set( MOD_BG_WEAPON_AMMO, g_modWeaponAmmo.integer ); + BG_MOD_set( MOD_BG_WEAPON_RELOAD, g_modWeaponReload.integer ); + + BG_MOD_update( ); +} + /* ================= G_MapConfigs @@ -762,6 +797,9 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) // the map might disable some things BG_InitAllowedGameElements( ); + // syncronize mod cvars + G_InitModCvars( ); + // general initialization G_FindTeams( ); diff --git a/src/game/g_missile.c b/src/game/g_missile.c index b02065c..0580d1f 100644 --- a/src/game/g_missile.c +++ b/src/game/g_missile.c @@ -684,6 +684,12 @@ gentity_t *fire_hive( gentity_t *self, vec3_t start, vec3_t dir ) bolt->clipmask = MASK_SHOT; bolt->target_ent = self->target_ent; + if( g_modBuildableSpeed.integer > 0) + { + bolt->nextthink = level.time + HIVE_DIR_CHANGE_PERIOD * 100 / g_modBuildableSpeed.integer; + bolt->damage = bolt->damage * g_modBuildableSpeed.integer / 100; + } + bolt->s.pos.trType = TR_LINEAR; bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame VectorCopy( start, bolt->s.pos.trBase ); @@ -847,6 +853,9 @@ gentity_t *fire_bounceBall( gentity_t *self, vec3_t start, vec3_t dir ) VectorCopy( start, bolt->r.currentOrigin ); /*bolt->s.eFlags |= EF_BOUNCE;*/ + if( g_modAlienRate.integer > 0 ) + bolt->damage = bolt->damage * g_modAlienRate.integer / 100; + return bolt; } diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index 659f53f..f68b406 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -1131,6 +1131,8 @@ static void G_CreateNewZap( gentity_t *creator, gentity_t *target ) zap->used = qtrue; zap->timeToLive = LEVEL2_AREAZAP_TIME; + if( g_modAlienRate.integer > 0 ) + zap->timeToLive = zap->timeToLive * g_modAlienRate.integer / 100; zap->damageUsed = 0; zap->creator = creator; @@ -1224,6 +1226,8 @@ void G_UpdateZaps( int msec ) { G_Damage( target, source, zap->creator, forward, target->s.origin, damage, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP ); + if( g_modAlienRate.integer > 0 ) + damage = damage * 100 / g_modAlienRate.integer; zap->damageUsed += damage; } }