mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2024-11-22 20:31:11 +00:00
Elder:
VM 0-17-00 Server-side
This commit is contained in:
parent
4371354291
commit
c24d952d34
6 changed files with 56 additions and 96 deletions
|
@ -1915,6 +1915,9 @@ static void PM_BeginWeaponChange( int weapon ) {
|
|||
pm->ps->stats[STAT_RQ3] &= ~RQ3_LOCKRELOADS;
|
||||
pm->ps->stats[STAT_RQ3] &= ~RQ3_QUEUERELOAD;
|
||||
|
||||
// Elder: cancel burst shots
|
||||
pm->ps->stats[STAT_BURST] = 0;
|
||||
|
||||
pm->ps->weaponstate = WEAPON_DROPPING;
|
||||
|
||||
//Elder: temp hack
|
||||
|
@ -2284,6 +2287,15 @@ static void PM_Reload( void )
|
|||
}
|
||||
|
||||
// insert stage 1 sound events here; check against the reload time
|
||||
|
||||
// Special handcannon shell ejection hack
|
||||
if ( pm->ps->weapon == WP_HANDCANNON &&
|
||||
!(pm->ps->stats[STAT_RQ3] & RQ3_RELOADWEAPON1) &&
|
||||
pm->ps->stats[STAT_RELOADTIME] < 1400 )
|
||||
{
|
||||
pm->ps->stats[STAT_RQ3] |= RQ3_RELOADWEAPON1;
|
||||
PM_AddEvent(EV_RELOAD_WEAPON1);
|
||||
}
|
||||
|
||||
// finished reload
|
||||
if (pm->ps->stats[STAT_RELOADTIME] <= 0)
|
||||
|
@ -2343,12 +2355,12 @@ static void PM_Reload( void )
|
|||
PM_StartWeaponAnim(WP_ANIM_EXTRA1);
|
||||
//PM_StartWeaponAnim(WP_ANIM_RELOAD);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (pm->ps->stats[STAT_CLIPS] > 0)
|
||||
{
|
||||
//Com_Printf("Sending event from continuous fast-reloads\n");
|
||||
PM_AddEvent(EV_RELOAD_WEAPON2);
|
||||
PM_AddEvent(EV_RELOAD_WEAPON1);
|
||||
//PM_AddEvent(EV_RELOAD_WEAPON0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2400,6 +2412,7 @@ static void PM_Reload( void )
|
|||
//Com_Printf("Finished reload\n");
|
||||
pm->ps->stats[STAT_RELOADTIME] = 0;
|
||||
pm->ps->stats[STAT_RELOADATTEMPTS] = 0;
|
||||
pm->ps->stats[STAT_RQ3] &= ~RQ3_RELOADWEAPON1;
|
||||
pm->ps->weaponstate = WEAPON_READY;
|
||||
//}
|
||||
|
||||
|
@ -2481,7 +2494,7 @@ static void PM_Weapon( void ) {
|
|||
{
|
||||
pm->ps->stats[STAT_BURST] = 0;
|
||||
}
|
||||
else if ((pm->cmd.buttons & BUTTON_ATTACK) && pm->ps->stats[STAT_BURST])
|
||||
else if ( (pm->cmd.buttons & BUTTON_ATTACK) && pm->ps->stats[STAT_BURST] )
|
||||
{
|
||||
pm->cmd.buttons &= ~BUTTON_ATTACK;
|
||||
}
|
||||
|
@ -2543,11 +2556,13 @@ static void PM_Weapon( void ) {
|
|||
// can't change if weapon is firing, but can change
|
||||
// again if lowering or raising
|
||||
|
||||
// Elder: modified so that a dropweapon command is high precedence
|
||||
|
||||
//if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) {
|
||||
if ( pm->ps->weaponTime <= 0 &&
|
||||
!(pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_STALL)) {
|
||||
if ( (pm->ps->stats[STAT_RQ3] & RQ3_THROWWEAPON) || (pm->ps->weaponTime <= 0 &&
|
||||
!(pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_STALL))) {
|
||||
if ( pm->ps->weapon != pm->cmd.weapon ) {
|
||||
//Elder TODO: if switching weapons, fire off the grenade "instantly"
|
||||
//Elder: if switching weapons, fire off the grenade "instantly"
|
||||
if ( pm->ps->weapon == WP_GRENADE && pm->ps->weaponstate == WEAPON_COCKED) {
|
||||
pm->ps->weaponstate = WEAPON_FIRING;
|
||||
pm->cmd.buttons &= ~BUTTON_ATTACK;
|
||||
|
@ -2654,9 +2669,9 @@ static void PM_Weapon( void ) {
|
|||
if ( pm->ps->weapon == WP_GRENADE )
|
||||
{
|
||||
pm->ps->weaponTime = 0;
|
||||
// put it in the "cocked" position
|
||||
// put it in the "cocked" position and play the pin-pull animation
|
||||
pm->ps->weaponstate = WEAPON_COCKED;
|
||||
PM_StartWeaponAnim(WP_ANIM_EXTRA1);
|
||||
PM_ContinueWeaponAnim(WP_ANIM_EXTRA1);
|
||||
return;
|
||||
}
|
||||
// Elder: stall the thrown knife action
|
||||
|
|
|
@ -498,6 +498,7 @@ typedef enum {
|
|||
#define RQ3_FASTRELOADS 64 // Fast-reloads flag
|
||||
#define RQ3_LOCKRELOADS 128 // Lock-reloads at end of fast-reload cycle
|
||||
#define RQ3_QUEUERELOAD 256 // auto-reload if set
|
||||
#define RQ3_RELOADWEAPON1 512 // flag off EV_RELOAD_WEAPON1 event so no dupes occur
|
||||
|
||||
|
||||
// player_state->persistant[] indexes
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
//Elder: moved kick to g_weapon.c where it belongs
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
G_DamageFeedback
|
||||
|
@ -741,10 +742,10 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) {
|
|||
case EV_RELOAD_WEAPON0:
|
||||
ReloadWeapon ( ent, 0 );
|
||||
break;
|
||||
*/
|
||||
case EV_RELOAD_WEAPON1:
|
||||
ReloadWeapon ( ent, 1 );
|
||||
break;
|
||||
*/
|
||||
case EV_RELOAD_WEAPON2:
|
||||
ReloadWeapon ( ent, 2 );
|
||||
break;
|
||||
|
@ -754,14 +755,6 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) {
|
|||
//ent->client->zoomed=0;
|
||||
break;
|
||||
|
||||
/* case EV_ZOOM:
|
||||
if(ent->client->zoomed==3)
|
||||
ent->client->zoomed=0;
|
||||
else
|
||||
ent->client->zoomed++;
|
||||
G_Printf("zoomlevel = %d\n",ent->client->zoomed);
|
||||
break;
|
||||
*/
|
||||
case EV_USE_ITEM1: // teleporter
|
||||
// drop flags in CTF
|
||||
item = NULL;
|
||||
|
@ -921,7 +914,7 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow )
|
|||
//weaponTime > 0 or weaponState == weapon_dropping? Or both?
|
||||
//Still firing
|
||||
if (!forceThrow)
|
||||
if ( (ucmd->buttons & BUTTON_ATTACK) == BUTTON_ATTACK || client->ps.weaponTime > 0)
|
||||
if ( (ucmd->buttons & BUTTON_ATTACK) || client->ps.weaponTime > 0)
|
||||
return 0;
|
||||
|
||||
//Elder: Bandaging case -- handled in cgame
|
||||
|
@ -930,7 +923,8 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow )
|
|||
//trap_SendServerCommand( ent-g_entities, va("print \"You are too busy bandaging...\n\""));
|
||||
//return;
|
||||
//}
|
||||
|
||||
//Elder: remove zoom bits
|
||||
Cmd_Unzoom(ent);
|
||||
|
||||
weap = 0;
|
||||
if (client->uniqueWeapons > 0)
|
||||
|
@ -1183,69 +1177,19 @@ void ClientThink_real( gentity_t *ent ) {
|
|||
|
||||
// check for the hit-scan gauntlet, don't let the action
|
||||
// go through as an attack unless it actually hits something
|
||||
//Blaze: no need for the gauntlet check
|
||||
// if ( client->ps.weapon == WP_GAUNTLET && !( ucmd->buttons & BUTTON_TALK ) &&
|
||||
// ( ucmd->buttons & BUTTON_ATTACK ) && client->ps.weaponTime <= 0 ) {
|
||||
// pm.gauntletHit = CheckGauntletAttack( ent );
|
||||
// }
|
||||
|
||||
// Blaze: no need for the gauntlet check
|
||||
/*
|
||||
if ( client->ps.weapon == WP_GAUNTLET && !( ucmd->buttons & BUTTON_TALK ) &&
|
||||
( ucmd->buttons & BUTTON_ATTACK ) && client->ps.weaponTime <= 0 ) {
|
||||
pm.gauntletHit = CheckGauntletAttack( ent );
|
||||
}
|
||||
*/
|
||||
if ( ent->flags & FL_FORCE_GESTURE ) {
|
||||
ent->flags &= ~FL_FORCE_GESTURE;
|
||||
ent->client->pers.cmd.buttons |= BUTTON_GESTURE;
|
||||
}
|
||||
|
||||
//**************Elder: moved to bg_pmove.c (PM_Weapon)************//
|
||||
//Elder: New 3rb Code
|
||||
//force fire button down if STAT_BURST is < proper amount
|
||||
//Otherwise release the button
|
||||
/*
|
||||
if ( (client->ps.weapon == WP_M4 &&
|
||||
(client->ps.persistant[PERS_WEAPONMODES] & RQ3_M4MODE) == RQ3_M4MODE) ||
|
||||
(client->ps.weapon == WP_MP5 &&
|
||||
(client->ps.persistant[PERS_WEAPONMODES] & RQ3_MP5MODE) == RQ3_MP5MODE))
|
||||
{
|
||||
int weaponNum = client->ps.weapon;
|
||||
|
||||
if (client->ps.ammo[weaponNum] == 0)
|
||||
{
|
||||
client->ps.stats[STAT_BURST] = 0;
|
||||
}
|
||||
else if (ucmd->buttons & BUTTON_ATTACK)// && client->ps.stats[STAT_BURST] > 0)
|
||||
{
|
||||
if ( client->ps.stats[STAT_BURST] >= 0 && client->ps.stats[STAT_BURST] < 3)
|
||||
ucmd->buttons |= BUTTON_ATTACK;
|
||||
else
|
||||
ucmd->buttons &= ~BUTTON_ATTACK;
|
||||
}
|
||||
else if (client->ps.stats[STAT_BURST] > 2)
|
||||
{
|
||||
client->ps.stats[STAT_BURST] = 0;
|
||||
client->ps.weaponTime += 300;
|
||||
}
|
||||
//Don't need?
|
||||
else if (client->ps.stats[STAT_BURST] > 0)
|
||||
ucmd->buttons |= BUTTON_ATTACK;
|
||||
}
|
||||
|
||||
//Elder: New semi-auto code
|
||||
if ( client->ps.weapon == WP_PISTOL &&
|
||||
(client->ps.persistant[PERS_WEAPONMODES] & RQ3_MK23MODE) == RQ3_MK23MODE)
|
||||
{
|
||||
if (client->ps.ammo[WP_PISTOL] == 0)
|
||||
{
|
||||
client->ps.stats[STAT_BURST] = 0;
|
||||
}
|
||||
else if ((ucmd->buttons & BUTTON_ATTACK) && client->ps.stats[STAT_BURST])
|
||||
{
|
||||
ucmd->buttons &= ~BUTTON_ATTACK;
|
||||
}
|
||||
else if (client->ps.stats[STAT_BURST])
|
||||
{
|
||||
client->ps.weaponTime += 200;
|
||||
client->ps.stats[STAT_BURST] = 0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
//Elder: 3rb Code moved to bg_pmove.c (resides in PM_Weapon)
|
||||
|
||||
#ifdef MISSIONPACK
|
||||
// check for invulnerability expansion before doing the Pmove
|
||||
|
@ -1327,7 +1271,7 @@ void ClientThink_real( gentity_t *ent ) {
|
|||
BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue );
|
||||
}
|
||||
else {
|
||||
BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue );
|
||||
BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue );
|
||||
}
|
||||
SendPendingPredictableEvents( &ent->client->ps );
|
||||
|
||||
|
|
|
@ -2355,19 +2355,10 @@ void Cmd_DropWeapon_f( gentity_t *ent ) {
|
|||
|
||||
if (ent->client->ps.pm_type == PM_SPECTATOR)
|
||||
return;
|
||||
//Elder: added -- checked in cgame
|
||||
//if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK)
|
||||
//{
|
||||
//trap_SendServerCommand( ent-g_entities, va("print \"You are too busy bandaging!\n\""));
|
||||
//return;
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//Elder: remove zoom bits
|
||||
Cmd_Unzoom(ent);
|
||||
//Throwing away return here
|
||||
ThrowWeapon( ent, qfalse );
|
||||
//}
|
||||
//Elder: remove zoom bits
|
||||
//Cmd_Unzoom(ent);
|
||||
//Throwing away return value here; high precedence weapon drop
|
||||
ThrowWeapon( ent, qtrue );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -132,6 +132,7 @@ static cvarTable_t gameCvarTable[] = {
|
|||
|
||||
{ &g_dedicated, "dedicated", "0", 0, 0, qfalse },
|
||||
|
||||
// Elder: slow down to 300?
|
||||
{ &g_speed, "g_speed", "320", 0, 0, qtrue },
|
||||
{ &g_gravity, "g_gravity", "800", 0, 0, qtrue },
|
||||
{ &g_knockback, "g_knockback", "1000", 0, 0, qtrue },
|
||||
|
@ -490,7 +491,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) {
|
|||
|
||||
// make sure we have flags for CTF, etc
|
||||
if( g_gametype.integer >= GT_TEAM ) {
|
||||
G_CheckTeamItems();
|
||||
G_CheckTeamItems();
|
||||
}
|
||||
|
||||
//Elder: spawn unique items.
|
||||
|
@ -502,7 +503,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) {
|
|||
if ( trap_Cvar_VariableIntegerValue( "sv_floodprotect" ) != 0 )
|
||||
{
|
||||
trap_Cvar_Set( "sv_floodprotect", "0" );
|
||||
G_Printf("sv_floodprotect shut off for RQ3 Beta 1.\n");
|
||||
G_Printf("sv_floodprotect shut off for RQ3 Release 1.\n");
|
||||
}
|
||||
|
||||
SaveRegisteredItems();
|
||||
|
|
|
@ -2405,9 +2405,17 @@ Handles server-side management of numclips
|
|||
void ReloadWeapon ( gentity_t *ent, int stage )
|
||||
{
|
||||
|
||||
if (stage == 2)
|
||||
if (stage == 1 && (ent->client->ps.weapon == WP_SSG3000 ||
|
||||
ent->client->ps.weapon == WP_M3) )
|
||||
{
|
||||
G_Printf("Hit server-side reload\n");
|
||||
G_Printf("Hit server-side reload stage 1\n");
|
||||
if ( ent->client->ps.weapon == WP_M3 )
|
||||
ent->client->numClips[WP_HANDCANNON] = ent->client->numClips[WP_M3];
|
||||
ent->client->numClips[ent->client->ps.weapon]--;
|
||||
}
|
||||
else if (stage == 2)
|
||||
{
|
||||
G_Printf("Hit server-side reload stage 2\n");
|
||||
ent->client->numClips[ent->client->ps.weapon]--;
|
||||
// remove an extra clip if using HC or Akimbos
|
||||
if (ent->client->ps.weapon == WP_HANDCANNON ||
|
||||
|
|
Loading…
Reference in a new issue