* 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
This commit is contained in:
Paradox460 committed 2008-03-15 20:00:49 +00:00
1 parent 56a06e3ff0
commit 9a5647df1d
9 files changed
+253 -21

No files matched your search

+119
View File
@@ -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 ];
}
}
}
+18
View File
@@ -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 );
+11 -2
View File
@@ -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;
+25 -4
View File
@@ -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 : "<world>";
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 "<world>";
}
+17 -13
View File
@@ -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 ] );
+12 -2
View File
@@ -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 );
+38
View File
@@ -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( );
+9
View File
@@ -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;
}
+4
View File
@@ -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;
}
}