* 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:
1 parent
56a06e3ff0
commit
9a5647df1d
9 files changed
+253
-21
No files matched your search
@@ -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 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 );
|
||||
|
||||
@@ -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( );
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user