mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2025-02-17 01:22:32 +00:00
Fixed my fix for doors-->spectators/players - NiceAss
This commit is contained in:
parent
05a49b6eae
commit
fc52427dc8
3 changed files with 98 additions and 75 deletions
|
@ -64,11 +64,11 @@ void P_DamageFeedback( gentity_t *player ) {
|
||||||
// Q3 Code
|
// Q3 Code
|
||||||
/* client->ps.damagePitch = angles[PITCH]/360.0 * 256;
|
/* client->ps.damagePitch = angles[PITCH]/360.0 * 256;
|
||||||
client->ps.damageYaw = angles[YAW]/360.0 * 256;*/
|
client->ps.damageYaw = angles[YAW]/360.0 * 256;*/
|
||||||
|
|
||||||
|
|
||||||
// new RQ3 view-kick code, needs more tweaking (the 50 needs to be replaces with that below calcuation
|
// new RQ3 view-kick code, needs more tweaking (the 50 needs to be replaces with that below calcuation
|
||||||
// from the AQ2 code.
|
// from the AQ2 code.
|
||||||
|
|
||||||
// set aiming directions
|
// set aiming directions
|
||||||
AngleVectors (client->ps.viewangles, forward, right, up);
|
AngleVectors (client->ps.viewangles, forward, right, up);
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ void P_DamageFeedback( gentity_t *player ) {
|
||||||
|
|
||||||
side = - DotProduct(v,right);
|
side = - DotProduct(v,right);
|
||||||
client->ps.damageYaw = 50*side*0.3;
|
client->ps.damageYaw = 50*side*0.3;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AQ2 code pasted here for reference
|
/* AQ2 code pasted here for reference
|
||||||
|
@ -97,10 +97,10 @@ void P_DamageFeedback( gentity_t *player ) {
|
||||||
|
|
||||||
VectorSubtract (client->damage_from, player->s.origin, v);
|
VectorSubtract (client->damage_from, player->s.origin, v);
|
||||||
VectorNormalize (v);
|
VectorNormalize (v);
|
||||||
|
|
||||||
side = DotProduct (v, right);
|
side = DotProduct (v, right);
|
||||||
client->v_dmg_roll = kick*side*0.3;
|
client->v_dmg_roll = kick*side*0.3;
|
||||||
|
|
||||||
side = -DotProduct (v, forward);
|
side = -DotProduct (v, forward);
|
||||||
client->v_dmg_pitch = kick*side*0.3;
|
client->v_dmg_pitch = kick*side*0.3;
|
||||||
|
|
||||||
|
@ -112,19 +112,19 @@ void P_DamageFeedback( gentity_t *player ) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
G_Printf("Lasthurt: %d, Head: %d, Face: %d, And-Op: %d\n",
|
G_Printf("Lasthurt: %d, Head: %d, Face: %d, And-Op: %d\n",
|
||||||
client->lasthurt_location,
|
client->lasthurt_location,
|
||||||
LOCATION_HEAD, LOCATION_FACE,
|
LOCATION_HEAD, LOCATION_FACE,
|
||||||
client->lasthurt_location & ~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) );
|
client->lasthurt_location & ~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// play an appropriate pain sound
|
// play an appropriate pain sound
|
||||||
if ( (level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) ) {
|
if ( (level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) ) {
|
||||||
//player->pain_debounce_time = level.time + 700;
|
//player->pain_debounce_time = level.time + 700;
|
||||||
//Elder: reduced pain debounce time so we can have a few more sounds :)
|
//Elder: reduced pain debounce time so we can have a few more sounds :)
|
||||||
player->pain_debounce_time = level.time + 250;
|
player->pain_debounce_time = level.time + 250;
|
||||||
|
|
||||||
switch ( client->lasthurt_location &
|
switch ( client->lasthurt_location &
|
||||||
~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) ) {
|
~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) ) {
|
||||||
//Elder: headshot sound
|
//Elder: headshot sound
|
||||||
case LOCATION_HEAD:
|
case LOCATION_HEAD:
|
||||||
|
@ -132,10 +132,10 @@ void P_DamageFeedback( gentity_t *player ) {
|
||||||
if (client->lasthurt_mod == MOD_KNIFE || client->lasthurt_mod == MOD_KNIFE_THROWN)
|
if (client->lasthurt_mod == MOD_KNIFE || client->lasthurt_mod == MOD_KNIFE_THROWN)
|
||||||
G_AddEvent( player, EV_RQ3_SOUND, RQ3_SOUND_KNIFEDEATH);
|
G_AddEvent( player, EV_RQ3_SOUND, RQ3_SOUND_KNIFEDEATH);
|
||||||
//Elder: do nothing -- sound is handled in g_combat.c again
|
//Elder: do nothing -- sound is handled in g_combat.c again
|
||||||
//tent = G_TempEntity2(client->ps.origin, EV_RQ3_SOUND, RQ3_SOUND_HEADSHOT);
|
//tent = G_TempEntity2(client->ps.origin, EV_RQ3_SOUND, RQ3_SOUND_HEADSHOT);
|
||||||
//Elder: takes more bandwidth but guarantees a headshot sound
|
//Elder: takes more bandwidth but guarantees a headshot sound
|
||||||
//G_Sound(player, CHAN_AUTO, G_SoundIndex("sound/misc/headshot.wav"));
|
//G_Sound(player, CHAN_AUTO, G_SoundIndex("sound/misc/headshot.wav"));
|
||||||
//G_AddEvent ( player, EV_RQ3_SOUND, RQ3_SOUND_HEADSHOT);
|
//G_AddEvent ( player, EV_RQ3_SOUND, RQ3_SOUND_HEADSHOT);
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
case LOCATION_CHEST:
|
case LOCATION_CHEST:
|
||||||
|
@ -147,7 +147,7 @@ void P_DamageFeedback( gentity_t *player ) {
|
||||||
G_AddEvent( player, EV_PAIN, player->health );
|
G_AddEvent( player, EV_PAIN, player->health );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
client->ps.damageEvent++;
|
client->ps.damageEvent++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ void P_WorldEffects( gentity_t *ent ) {
|
||||||
// don't play a normal pain sound
|
// don't play a normal pain sound
|
||||||
ent->pain_debounce_time = level.time + 200;
|
ent->pain_debounce_time = level.time + 200;
|
||||||
|
|
||||||
G_Damage (ent, NULL, NULL, NULL, NULL,
|
G_Damage (ent, NULL, NULL, NULL, NULL,
|
||||||
ent->damage, DAMAGE_NO_ARMOR, MOD_WATER);
|
ent->damage, DAMAGE_NO_ARMOR, MOD_WATER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ void P_WorldEffects( gentity_t *ent ) {
|
||||||
//
|
//
|
||||||
// check for sizzle damage (move to pmove?)
|
// check for sizzle damage (move to pmove?)
|
||||||
//
|
//
|
||||||
if (waterlevel &&
|
if (waterlevel &&
|
||||||
(ent->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) {
|
(ent->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) {
|
||||||
/*
|
/*
|
||||||
if (ent->health > 0
|
if (ent->health > 0
|
||||||
|
@ -254,16 +254,16 @@ void P_WorldEffects( gentity_t *ent ) {
|
||||||
G_AddEvent( ent, EV_POWERUP_BATTLESUIT, 0 );
|
G_AddEvent( ent, EV_POWERUP_BATTLESUIT, 0 );
|
||||||
} else {
|
} else {
|
||||||
if (ent->watertype & CONTENTS_LAVA) {
|
if (ent->watertype & CONTENTS_LAVA) {
|
||||||
//G_Damage (ent, NULL, NULL, NULL, NULL,
|
//G_Damage (ent, NULL, NULL, NULL, NULL,
|
||||||
//30*waterlevel, 0, MOD_LAVA);
|
//30*waterlevel, 0, MOD_LAVA);
|
||||||
G_Damage (ent, NULL, NULL, NULL, NULL,
|
G_Damage (ent, NULL, NULL, NULL, NULL,
|
||||||
3*waterlevel, 0, MOD_LAVA);
|
3*waterlevel, 0, MOD_LAVA);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ent->watertype & CONTENTS_SLIME) {
|
if (ent->watertype & CONTENTS_SLIME) {
|
||||||
//G_Damage (ent, NULL, NULL, NULL, NULL,
|
//G_Damage (ent, NULL, NULL, NULL, NULL,
|
||||||
//10*waterlevel, 0, MOD_SLIME);
|
//10*waterlevel, 0, MOD_SLIME);
|
||||||
G_Damage (ent, NULL, NULL, NULL, NULL,
|
G_Damage (ent, NULL, NULL, NULL, NULL,
|
||||||
waterlevel, 0, MOD_SLIME);
|
waterlevel, 0, MOD_SLIME);
|
||||||
}
|
}
|
||||||
// Elder: added
|
// Elder: added
|
||||||
|
@ -383,7 +383,8 @@ void G_TouchTriggers( gentity_t *ent ) {
|
||||||
if ( hit->s.eType != ET_TELEPORT_TRIGGER &&
|
if ( hit->s.eType != ET_TELEPORT_TRIGGER &&
|
||||||
// this is ugly but adding a new ET_? type will
|
// this is ugly but adding a new ET_? type will
|
||||||
// most likely cause network incompatibilities
|
// most likely cause network incompatibilities
|
||||||
hit->touch != Touch_DoorTrigger) {
|
// NiceAss: changed Touch_DoorTrigger to Touch_DoorTriggerSpectator
|
||||||
|
hit->touch != Touch_DoorTriggerSpectator) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -474,8 +475,8 @@ qboolean ClientInactivityTimer( gclient_t *client ) {
|
||||||
// gameplay, everyone isn't kicked
|
// gameplay, everyone isn't kicked
|
||||||
client->inactivityTime = level.time + 60 * 1000;
|
client->inactivityTime = level.time + 60 * 1000;
|
||||||
client->inactivityWarning = qfalse;
|
client->inactivityWarning = qfalse;
|
||||||
} else if ( client->pers.cmd.forwardmove ||
|
} else if ( client->pers.cmd.forwardmove ||
|
||||||
client->pers.cmd.rightmove ||
|
client->pers.cmd.rightmove ||
|
||||||
client->pers.cmd.upmove ||
|
client->pers.cmd.upmove ||
|
||||||
(client->pers.cmd.buttons & BUTTON_ATTACK) ) {
|
(client->pers.cmd.buttons & BUTTON_ATTACK) ) {
|
||||||
client->inactivityTime = level.time + g_inactivity.integer * 1000;
|
client->inactivityTime = level.time + g_inactivity.integer * 1000;
|
||||||
|
@ -706,7 +707,7 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) {
|
||||||
{
|
{
|
||||||
G_Damage (ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING);
|
G_Damage (ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_FALL_FAR_NOSOUND:
|
case EV_FALL_FAR_NOSOUND:
|
||||||
|
@ -732,7 +733,7 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) {
|
||||||
{
|
{
|
||||||
G_Damage (ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING);
|
G_Damage (ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EV_FIRE_WEAPON:
|
case EV_FIRE_WEAPON:
|
||||||
|
@ -925,7 +926,7 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow )
|
||||||
//}
|
//}
|
||||||
//Elder: remove zoom bits
|
//Elder: remove zoom bits
|
||||||
Cmd_Unzoom(ent);
|
Cmd_Unzoom(ent);
|
||||||
|
|
||||||
weap = 0;
|
weap = 0;
|
||||||
if (client->uniqueWeapons > 0)
|
if (client->uniqueWeapons > 0)
|
||||||
{
|
{
|
||||||
|
@ -955,21 +956,21 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow )
|
||||||
}
|
}
|
||||||
|
|
||||||
xr_item = BG_FindItemForWeapon( weap );
|
xr_item = BG_FindItemForWeapon( weap );
|
||||||
|
|
||||||
//Elder: Send a server command instead of force-setting
|
//Elder: Send a server command instead of force-setting
|
||||||
//client->ps.weapon = WP_PISTOL;
|
//client->ps.weapon = WP_PISTOL;
|
||||||
//Elder: Don't reset the weapon ammo
|
//Elder: Don't reset the weapon ammo
|
||||||
//client->ps.ammo[ weap ] = 0;
|
//client->ps.ammo[ weap ] = 0;
|
||||||
client->pers.hadUniqueWeapon[weap] = qtrue;
|
client->pers.hadUniqueWeapon[weap] = qtrue;
|
||||||
|
|
||||||
|
|
||||||
//Elder: for immediate weapon drops
|
//Elder: for immediate weapon drops
|
||||||
if (client->ps.weapon == weap)
|
if (client->ps.weapon == weap)
|
||||||
{
|
{
|
||||||
client->ps.stats[STAT_RQ3] |= RQ3_THROWWEAPON;
|
client->ps.stats[STAT_RQ3] |= RQ3_THROWWEAPON;
|
||||||
trap_SendServerCommand( ent-g_entities, va("selectpistol"));
|
trap_SendServerCommand( ent-g_entities, va("selectpistol"));
|
||||||
}
|
}
|
||||||
|
|
||||||
client->weaponCount[weap]--;
|
client->weaponCount[weap]--;
|
||||||
if (client->weaponCount[weap] == 0)
|
if (client->weaponCount[weap] == 0)
|
||||||
client->ps.stats[STAT_WEAPONS] &= ~( 1 << weap);
|
client->ps.stats[STAT_WEAPONS] &= ~( 1 << weap);
|
||||||
|
@ -1086,7 +1087,7 @@ void ClientThink_real( gentity_t *ent ) {
|
||||||
if ( ucmd->serverTime < level.time - 1000 ) {
|
if ( ucmd->serverTime < level.time - 1000 ) {
|
||||||
ucmd->serverTime = level.time - 1000;
|
ucmd->serverTime = level.time - 1000;
|
||||||
// G_Printf("serverTime >>>>>\n" );
|
// G_Printf("serverTime >>>>>\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
msec = ucmd->serverTime - client->ps.commandTime;
|
msec = ucmd->serverTime - client->ps.commandTime;
|
||||||
// following others may result in bad times, but we still want
|
// following others may result in bad times, but we still want
|
||||||
|
@ -1305,7 +1306,7 @@ void ClientThink_real( gentity_t *ent ) {
|
||||||
|
|
||||||
// touch other objects
|
// touch other objects
|
||||||
ClientImpacts( ent, &pm );
|
ClientImpacts( ent, &pm );
|
||||||
|
|
||||||
//Elder: someone added
|
//Elder: someone added
|
||||||
if ( bJumping ) JumpKick( ent );
|
if ( bJumping ) JumpKick( ent );
|
||||||
|
|
||||||
|
@ -1313,7 +1314,7 @@ void ClientThink_real( gentity_t *ent ) {
|
||||||
switch( ent->client->ps.weapon ) {
|
switch( ent->client->ps.weapon ) {
|
||||||
case WP_AKIMBO:
|
case WP_AKIMBO:
|
||||||
/*
|
/*
|
||||||
if ( ent->client->weaponfireNextTime != 0 &&
|
if ( ent->client->weaponfireNextTime != 0 &&
|
||||||
level.time >= ent->client->weaponfireNextTime) {
|
level.time >= ent->client->weaponfireNextTime) {
|
||||||
FireWeapon( ent );
|
FireWeapon( ent );
|
||||||
}
|
}
|
||||||
|
@ -1327,7 +1328,7 @@ void ClientThink_real( gentity_t *ent ) {
|
||||||
{
|
{
|
||||||
G_Printf("(%i) ClientThink: attempting M3 fast-reload...\n", ent->s.clientNum);
|
G_Printf("(%i) ClientThink: attempting M3 fast-reload...\n", ent->s.clientNum);
|
||||||
Cmd_Reload( ent );
|
Cmd_Reload( ent );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WP_SSG3000:
|
case WP_SSG3000:
|
||||||
//Elder: try to do a fast reload if it's queued
|
//Elder: try to do a fast reload if it's queued
|
||||||
|
@ -1337,12 +1338,12 @@ void ClientThink_real( gentity_t *ent ) {
|
||||||
{
|
{
|
||||||
G_Printf("(%i) ClientThink: attempting SSG fast-reload...\n", ent->s.clientNum);
|
G_Printf("(%i) ClientThink: attempting SSG fast-reload...\n", ent->s.clientNum);
|
||||||
Cmd_Reload( ent );
|
Cmd_Reload( ent );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// save results of triggers and client events
|
// save results of triggers and client events
|
||||||
if (ent->client->ps.eventSequence != oldEventSequence) {
|
if (ent->client->ps.eventSequence != oldEventSequence) {
|
||||||
ent->eventTime = level.time;
|
ent->eventTime = level.time;
|
||||||
|
@ -1358,12 +1359,12 @@ void ClientThink_real( gentity_t *ent ) {
|
||||||
// wait for the attack button to be pressed
|
// wait for the attack button to be pressed
|
||||||
if ( level.time > client->respawnTime ) {
|
if ( level.time > client->respawnTime ) {
|
||||||
// forcerespawn is to prevent users from waiting out powerups
|
// forcerespawn is to prevent users from waiting out powerups
|
||||||
if ( g_forcerespawn.integer > 0 &&
|
if ( g_forcerespawn.integer > 0 &&
|
||||||
( level.time - client->respawnTime ) > g_forcerespawn.integer * 1000 ) {
|
( level.time - client->respawnTime ) > g_forcerespawn.integer * 1000 ) {
|
||||||
respawn( ent );
|
respawn( ent );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pressing attack or use is the normal respawn method
|
// pressing attack or use is the normal respawn method
|
||||||
if ( ucmd->buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) ) {
|
if ( ucmd->buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) ) {
|
||||||
respawn( ent );
|
respawn( ent );
|
||||||
|
@ -1642,10 +1643,10 @@ void ClientEndFrame( gentity_t *ent ) {
|
||||||
ent->client->ps.stats[STAT_RQ3] &= ~RQ3_BANDAGE_WORK;
|
ent->client->ps.stats[STAT_RQ3] &= ~RQ3_BANDAGE_WORK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Moved to pmove.c
|
//Moved to pmove.c
|
||||||
//Elder: M4 ride-up/kick -- condition for non-burst and ammo only
|
//Elder: M4 ride-up/kick -- condition for non-burst and ammo only
|
||||||
|
|
||||||
if (ent->client->consecutiveShots &&
|
if (ent->client->consecutiveShots &&
|
||||||
(ent->client->ps.ammo[WP_M4] <= 0 || ent->client->ps.weaponstate != WEAPON_FIRING))
|
(ent->client->ps.ammo[WP_M4] <= 0 || ent->client->ps.weaponstate != WEAPON_FIRING))
|
||||||
{
|
{
|
||||||
|
@ -1667,7 +1668,7 @@ void ClientEndFrame( gentity_t *ent ) {
|
||||||
//Try to turn the laser on if it's off
|
//Try to turn the laser on if it's off
|
||||||
if (ent->client->lasersight == NULL)
|
if (ent->client->lasersight == NULL)
|
||||||
Laser_Gen(ent, qtrue);
|
Laser_Gen(ent, qtrue);
|
||||||
}
|
}
|
||||||
|
|
||||||
//RQ3_ClientReloadStages(ent);
|
//RQ3_ClientReloadStages(ent);
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
// that run non-standard server frame rates.
|
// that run non-standard server frame rates.
|
||||||
#define BLEED_TIME 20
|
#define BLEED_TIME 20
|
||||||
// Elder: Everyone knows you lose 6 health from the moment you start bandaging
|
// Elder: Everyone knows you lose 6 health from the moment you start bandaging
|
||||||
// Let's enforce that in-code because it's sometimes 7 or even 8
|
// Let's enforce that in-code because it's sometimes 7 or even 8
|
||||||
// Elder: LOL it's 3, dumb Elder!
|
// Elder: LOL it's 3, dumb Elder!
|
||||||
#define BLEED_BANDAGE 3
|
#define BLEED_BANDAGE 3
|
||||||
#define BLEED_BANDAGE_TIME 5400 // 27 x 2
|
#define BLEED_BANDAGE_TIME 5400 // 27 x 2
|
||||||
|
@ -107,13 +107,13 @@ struct gentity_s {
|
||||||
char *model;
|
char *model;
|
||||||
char *model2;
|
char *model2;
|
||||||
int freetime; // level.time when the object was freed
|
int freetime; // level.time when the object was freed
|
||||||
|
|
||||||
int eventTime; // events will be cleared EVENT_VALID_MSEC after set
|
int eventTime; // events will be cleared EVENT_VALID_MSEC after set
|
||||||
qboolean freeAfterEvent;
|
qboolean freeAfterEvent;
|
||||||
qboolean unlinkAfterEvent;
|
qboolean unlinkAfterEvent;
|
||||||
|
|
||||||
qboolean physicsObject; // if true, it can be pushed by movers and fall off edges
|
qboolean physicsObject; // if true, it can be pushed by movers and fall off edges
|
||||||
// all game items are physicsObjects,
|
// all game items are physicsObjects,
|
||||||
float physicsBounce; // 1.0 = continuous bounce, 0.0 = no bounce
|
float physicsBounce; // 1.0 = continuous bounce, 0.0 = no bounce
|
||||||
int clipmask; // brushes with this content value will be collided against
|
int clipmask; // brushes with this content value will be collided against
|
||||||
// when moving. items and corpses do not collide against
|
// when moving. items and corpses do not collide against
|
||||||
|
@ -191,7 +191,7 @@ struct gentity_s {
|
||||||
float wait;
|
float wait;
|
||||||
float random;
|
float random;
|
||||||
|
|
||||||
gitem_t *item; // for bonus items
|
gitem_t *item; // for bonus items
|
||||||
float distance; // VALKYRIE: for rotating door
|
float distance; // VALKYRIE: for rotating door
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -258,7 +258,7 @@ typedef struct {
|
||||||
// client data that stays across multiple respawns, but is cleared
|
// client data that stays across multiple respawns, but is cleared
|
||||||
// on each level change or team change at ClientBegin()
|
// on each level change or team change at ClientBegin()
|
||||||
typedef struct {
|
typedef struct {
|
||||||
clientConnected_t connected;
|
clientConnected_t connected;
|
||||||
usercmd_t cmd; // we would lose angles if not persistant
|
usercmd_t cmd; // we would lose angles if not persistant
|
||||||
qboolean localClient; // true if "ip" info key is "localhost"
|
qboolean localClient; // true if "ip" info key is "localhost"
|
||||||
qboolean initialSpawn; // the first spawn should be at a cool location
|
qboolean initialSpawn; // the first spawn should be at a cool location
|
||||||
|
@ -271,12 +271,12 @@ typedef struct {
|
||||||
int voteCount; // to prevent people from constantly calling votes
|
int voteCount; // to prevent people from constantly calling votes
|
||||||
int teamVoteCount; // to prevent people from constantly calling votes
|
int teamVoteCount; // to prevent people from constantly calling votes
|
||||||
qboolean teamInfo; // send team overlay updates?
|
qboolean teamInfo; // send team overlay updates?
|
||||||
|
|
||||||
qboolean hadUniqueWeapon[MAX_WEAPONS]; //Elder: for "ammo" in last gun
|
qboolean hadUniqueWeapon[MAX_WEAPONS]; //Elder: for "ammo" in last gun
|
||||||
|
|
||||||
int sayTime; // Elder: say validation stuff
|
int sayTime; // Elder: say validation stuff
|
||||||
int sayCount;
|
int sayCount;
|
||||||
int sayWarnings;
|
int sayWarnings;
|
||||||
int sayBans;
|
int sayBans;
|
||||||
int sayMuteTime;
|
int sayMuteTime;
|
||||||
qboolean sayModerated; // so warnings are not repeated for multi-line, same-frame messages
|
qboolean sayModerated; // so warnings are not repeated for multi-line, same-frame messages
|
||||||
|
@ -392,7 +392,7 @@ struct gclient_s {
|
||||||
int switchTeamTime; // time the player switched teams
|
int switchTeamTime; // time the player switched teams
|
||||||
// Begin Duffman
|
// Begin Duffman
|
||||||
int numClips[MAX_WEAPONS]; // Number of clips each weapon has
|
int numClips[MAX_WEAPONS]; // Number of clips each weapon has
|
||||||
// End Duffman
|
// End Duffman
|
||||||
int weaponCount[WP_NUM_WEAPONS]; // Elder: for duplicate unique weapon tracking
|
int weaponCount[WP_NUM_WEAPONS]; // Elder: for duplicate unique weapon tracking
|
||||||
|
|
||||||
qboolean openDoor; //Blaze: used to hold if someone has hit opendoor key
|
qboolean openDoor; //Blaze: used to hold if someone has hit opendoor key
|
||||||
|
@ -422,7 +422,7 @@ struct gclient_s {
|
||||||
// int zoomed; // Hawkins (SSG zoom)
|
// int zoomed; // Hawkins (SSG zoom)
|
||||||
//qboolean semi; // hawkins (semiauto mode for m4, mp5, pistol)
|
//qboolean semi; // hawkins (semiauto mode for m4, mp5, pistol)
|
||||||
int shots; // Blaze: Number of shots fired so far with this weapon
|
int shots; // Blaze: Number of shots fired so far with this weapon
|
||||||
|
|
||||||
int weaponfireNextTime; // for akimbos
|
int weaponfireNextTime; // for akimbos
|
||||||
int lastzoom; // Elder: save last zoom state when firing
|
int lastzoom; // Elder: save last zoom state when firing
|
||||||
|
|
||||||
|
@ -431,7 +431,7 @@ struct gclient_s {
|
||||||
int lastReloadTime; // Elder: for queuing M3/SSG reloads
|
int lastReloadTime; // Elder: for queuing M3/SSG reloads
|
||||||
int reloadAttempts; // Elder: for queuing M3/SSG reloads
|
int reloadAttempts; // Elder: for queuing M3/SSG reloads
|
||||||
int reloadStage; // Elder: 0, 1, 2 for sound queuing - move to stats?
|
int reloadStage; // Elder: 0, 1, 2 for sound queuing - move to stats?
|
||||||
|
|
||||||
int consecutiveShots; // Elder: for M4 ride-up/kick
|
int consecutiveShots; // Elder: for M4 ride-up/kick
|
||||||
int uniqueWeapons; // Elder: formerly a stat, now just a server var
|
int uniqueWeapons; // Elder: formerly a stat, now just a server var
|
||||||
int uniqueItems;
|
int uniqueItems;
|
||||||
|
@ -706,6 +706,7 @@ gentity_t *fire_prox( gentity_t *self, vec3_t start, vec3_t aimdir );
|
||||||
//
|
//
|
||||||
void G_RunMover( gentity_t *ent );
|
void G_RunMover( gentity_t *ent );
|
||||||
void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace );
|
void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace );
|
||||||
|
void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace ); // NiceAss: Added
|
||||||
|
|
||||||
//
|
//
|
||||||
// g_trigger.c
|
// g_trigger.c
|
||||||
|
|
|
@ -1099,29 +1099,32 @@ void Blocked_Door( gentity_t *ent, gentity_t *other ) {
|
||||||
Touch_DoorTriggerSpectator
|
Touch_DoorTriggerSpectator
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace ) {
|
void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace ) {
|
||||||
int i, axis;
|
int i, axis;
|
||||||
vec3_t origin, dir, angles;
|
vec3_t origin, dir, angles;
|
||||||
|
|
||||||
axis = ent->count;
|
// NiceAss: Only let spectators teleport through a door.
|
||||||
VectorClear(dir);
|
if (other->client->sess.sessionTeam == TEAM_SPECTATOR) {
|
||||||
if (fabs(other->s.origin[axis] - ent->r.absmax[axis]) <
|
axis = ent->count;
|
||||||
fabs(other->s.origin[axis] - ent->r.absmin[axis])) {
|
VectorClear(dir);
|
||||||
// NiceAss: "- 10" changed to "- 15" to prevent jumping back and forth occasionally when moving slowly
|
if (fabs(other->s.origin[axis] - ent->r.absmax[axis]) <
|
||||||
origin[axis] = ent->r.absmin[axis] - 15;
|
fabs(other->s.origin[axis] - ent->r.absmin[axis])) {
|
||||||
dir[axis] = -1;
|
// NiceAss: "- 10" changed to "- 15" to prevent jumping back and forth occasionally when moving slowly
|
||||||
|
origin[axis] = ent->r.absmin[axis] - 15;
|
||||||
|
dir[axis] = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// NiceAss: "- 10" changed to "- 15" to prevent jumping back and forth occasionally when moving slowly
|
||||||
|
origin[axis] = ent->r.absmax[axis] + 15;
|
||||||
|
dir[axis] = 1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
if (i == axis) continue;
|
||||||
|
origin[i] = (ent->r.absmin[i] + ent->r.absmax[i]) * 0.5;
|
||||||
|
}
|
||||||
|
vectoangles(dir, angles);
|
||||||
|
TeleportPlayer(other, origin, angles );
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// NiceAss: "- 10" changed to "- 15" to prevent jumping back and forth occasionally when moving slowly
|
|
||||||
origin[axis] = ent->r.absmax[axis] + 15;
|
|
||||||
dir[axis] = 1;
|
|
||||||
}
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
if (i == axis) continue;
|
|
||||||
origin[i] = (ent->r.absmin[i] + ent->r.absmax[i]) * 0.5;
|
|
||||||
}
|
|
||||||
vectoangles(dir, angles);
|
|
||||||
TeleportPlayer(other, origin, angles );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1130,6 +1133,8 @@ Touch_DoorTrigger
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) {
|
void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) {
|
||||||
|
// NiceAss: Not needed now that door's have their own spectator trigger
|
||||||
|
/*
|
||||||
if ( other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR ) {
|
if ( other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR ) {
|
||||||
// if the door is not open and not opening
|
// if the door is not open and not opening
|
||||||
if ( ent->parent->moverState != MOVER_1TO2 &&
|
if ( ent->parent->moverState != MOVER_1TO2 &&
|
||||||
|
@ -1139,10 +1144,11 @@ void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) {
|
||||||
Touch_DoorTriggerSpectator( ent, other, trace );
|
Touch_DoorTriggerSpectator( ent, other, trace );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
//else if ( ent->parent->moverState != MOVER_1TO2 &&
|
//else if ( ent->parent->moverState != MOVER_1TO2 &&
|
||||||
//ent->parent->moverState != ROTATOR_1TO2 ) {
|
//ent->parent->moverState != ROTATOR_1TO2 ) {
|
||||||
//Elder: we want to handle MOVER_1TO2 and ROTATOR_1TO2 now
|
//Elder: we want to handle MOVER_1TO2 and ROTATOR_1TO2 now
|
||||||
else {
|
//else {
|
||||||
//Blaze's broken open door code
|
//Blaze's broken open door code
|
||||||
//Elder: not as broken as you think :)
|
//Elder: not as broken as you think :)
|
||||||
if (other->client->openDoor == qtrue ||
|
if (other->client->openDoor == qtrue ||
|
||||||
|
@ -1152,7 +1158,7 @@ void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) {
|
||||||
other->client->openDoor = qfalse;
|
other->client->openDoor = qfalse;
|
||||||
other->client->openDoorTime = 0;
|
other->client->openDoorTime = 0;
|
||||||
}
|
}
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1190,11 +1196,10 @@ void Think_SpawnNewDoorTrigger( gentity_t *ent ) {
|
||||||
best = i;
|
best = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// NiceAss: This affected spectators near doors (jumping too soon)
|
maxs[best] += 120;
|
||||||
// This was expanding the bounds of the door trigger out from the door 120 units.
|
mins[best] -= 120;
|
||||||
//maxs[best] += 120;
|
|
||||||
//mins[best] -= 120;
|
|
||||||
|
|
||||||
|
// NiceAss: This trigger will be for players
|
||||||
// create a trigger with this size
|
// create a trigger with this size
|
||||||
other = G_Spawn ();
|
other = G_Spawn ();
|
||||||
other->classname = "door_trigger";
|
other->classname = "door_trigger";
|
||||||
|
@ -1207,6 +1212,22 @@ void Think_SpawnNewDoorTrigger( gentity_t *ent ) {
|
||||||
other->count = best;
|
other->count = best;
|
||||||
trap_LinkEntity (other);
|
trap_LinkEntity (other);
|
||||||
|
|
||||||
|
// NiceAss: This trigger will be for spectators
|
||||||
|
// NiceAss: Undo most of the stretched box size so it is only a little bigger than the door
|
||||||
|
maxs[best] -= 110;
|
||||||
|
mins[best] += 110;
|
||||||
|
other = G_Spawn ();
|
||||||
|
other->classname = "door_trigger_spectator";
|
||||||
|
VectorCopy (mins, other->r.mins);
|
||||||
|
VectorCopy (maxs, other->r.maxs);
|
||||||
|
other->parent = ent;
|
||||||
|
other->r.contents = CONTENTS_TRIGGER;
|
||||||
|
other->touch = Touch_DoorTriggerSpectator;
|
||||||
|
// remember the thinnest axis
|
||||||
|
other->count = best;
|
||||||
|
trap_LinkEntity (other);
|
||||||
|
|
||||||
|
|
||||||
MatchTeam( ent, ent->moverState, level.time );
|
MatchTeam( ent, ent->moverState, level.time );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue