DEFINE_ACTION_FUNCTION(AActor, A_CPosRefire) { // keep firing unless target got out of sight A_FaceTarget (self); // [BC] Client chaingunners continue to fire until told by the server to stop. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (pr_cposrefire() < 40) return; if (!self->target || P_HitFriend (self) || self->target->health <= 0 || !P_CheckSight (self, self->target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES)) { // [BC] If we're the server, tell clients to update this thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingState( self, STATE_SEE ); self->SetState (self->SeeState); } }
// // A_PosAttack // DEFINE_ACTION_FUNCTION(AActor, A_PosAttack) { int angle; int damage; int slope; // [BC] Server takes care of the rest of this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { S_Sound( self, CHAN_WEAPON, "grunt/attack", 1, ATTN_NORM ); return; } if (!self->target) return; A_FaceTarget (self); angle = self->angle; slope = P_AimLineAttack (self, angle, MISSILERANGE); S_Sound (self, CHAN_WEAPON, "grunt/attack", 1, ATTN_NORM); angle += pr_posattack.Random2() << 20; damage = ((pr_posattack()%5)+1)*3; P_LineAttack (self, angle, MISSILERANGE, slope, damage, NAME_None, NAME_BulletPuff); }
DEFINE_ACTION_FUNCTION(AActor, A_BishopAttack) { // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (!self->target) { return; } S_Sound (self, CHAN_BODY, self->AttackSound, 1, ATTN_NORM); // [BB] If we're the server, tell the clients to play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_BODY, S_GetName(self->AttackSound), 1, ATTN_NORM ); if (self->CheckMeleeRange()) { int damage = pr_atk.HitDice (4); P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (damage, self->target, self); return; } self->special1 = (pr_atk() & 3) + 5; }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireShotgun2) { int pitch; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; S_Sound (self, CHAN_WEAPON, "weapons/sshotf", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/sshotf", 1, ATTN_NORM ); A_FaceTarget (self); pitch = P_AimLineAttack (self, self->angle, MISSILERANGE); for (int i = 0; i < 20; ++i) { int damage = 5*(pr_m_fireshotgun2()%3+1); angle_t angle = self->angle + (pr_m_fireshotgun2.Random2() << 19); P_LineAttack (self, angle, MISSILERANGE, pitch + (pr_m_fireshotgun2.Random2() * 332063), damage, NAME_None, PClass::FindClass(NAME_BulletPuff)); } self->special1 = level.maptime; }
DEFINE_ACTION_FUNCTION(AActor, A_BishopDoBlur) { // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } self->special1 = (pr_doblur() & 3) + 3; // Random number of blurs if (pr_doblur() < 120) { P_ThrustMobj (self, self->angle + ANG90, 11*FRACUNIT); } else if (pr_doblur() > 125) { P_ThrustMobj (self, self->angle - ANG90, 11*FRACUNIT); } else { // Thrust forward P_ThrustMobj (self, self->angle, 11*FRACUNIT); } S_Sound (self, CHAN_BODY, "BishopBlur", 1, ATTN_NORM); // [BB] If we're the server, update the thing's momentum and play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_MoveThingExact( self, CM_MOMX|CM_MOMY ); SERVERCOMMANDS_SoundActor( self, CHAN_BODY, "BishopBlur", 1, ATTN_NORM ); } }
bool ATeleporterBeacon::Use (bool pickup) { AInventory *drop; // [BC] This is handled server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return ( true ); } // Increase the amount by one so that when DropInventory decrements it, // the actor will have the same number of beacons that he started with. // When we return to UseInventory, it will take care of decrementing // Amount again and disposing of this item if there are no more. Amount++; drop = Owner->DropInventory (this); if (drop == NULL) { Amount--; return false; } else { drop->SetState(drop->FindState(NAME_Drop)); drop->target = Owner; return true; } }
DEFINE_ACTION_FUNCTION(AActor, A_GetHurt) { // [BB] The server handles this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { if (( self->ulNetworkFlags & NETFL_CLIENTSIDEONLY ) == false ) return; } self->flags4 |= MF4_INCOMBAT; if ((pr_gethurt() % 5) == 0) { S_Sound (self, CHAN_VOICE, self->PainSound, 1, ATTN_NORM); // [BB] If we're the server, tell clients to play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_VOICE, S_GetName( self->PainSound ), 1, ATTN_NORM ); self->health--; } if (self->health <= 0) { self->Die (self->target, self->target); } }
DEFINE_ACTION_FUNCTION(AActor, A_SpectreChunkLarge) { // [BB] Clients may not do this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) return; AActor *foo = Spawn("AlienChunkLarge", self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE); if (foo != NULL) { int t; t = pr_spectrechunk() & 7; foo->momx = (t - (pr_spectrechunk() & 15)) << FRACBITS; t = pr_spectrechunk() & 7; foo->momy = (t - (pr_spectrechunk() & 15)) << FRACBITS; foo->momz = (pr_spectrechunk() & 7) << FRACBITS; // [BB] Tell clients to spawn the actor. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnThing( foo ); } }
DEFINE_ACTION_FUNCTION(AActor, A_M_BFGsound) { // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; if (self->special1 != 0) { self->SetState (self->SeeState); } else { A_FaceTarget (self); S_Sound (self, CHAN_WEAPON, "weapons/bfgf", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/bfgf", 1, ATTN_NORM ); // Don't interrupt the firing sequence self->PainChance = 0; } }
DEFINE_ACTION_FUNCTION(AActor, A_M_SawRefire) { // [BC] Let the server do this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL || self->target->health <= 0) { // [BC] Update the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingFrame( self, self->state + 1 ); self->SetState (self->state + 1); return; } if (!self->CheckMeleeRange ()) { // [BC] Update the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingFrame( self, self->state + 1 ); self->SetState (self->state + 1); } }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireMissile) { // [BC] AActor *pMissile; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; if (self->CheckMeleeRange ()) { // If too close, punch it MarinePunch(self, 1); } else { A_FaceTarget (self); pMissile = P_SpawnMissile (self, self->target, PClass::FindClass("Rocket")); // [BC] If we're the server, tell clients to spawn this missile. if (( pMissile ) && ( NETWORK_GetState( ) == NETSTATE_SERVER )) SERVERCOMMANDS_SpawnMissile( pMissile ); } }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireShotgun) { int pitch; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; S_Sound (self, CHAN_WEAPON, "weapons/shotgf", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/shotgf", 1, ATTN_NORM ); A_FaceTarget (self); pitch = P_AimLineAttack (self, self->angle, MISSILERANGE); for (int i = 0; i < 7; ++i) { P_GunShot2 (self, false, pitch, PClass::FindClass(NAME_BulletPuff)); } self->special1 = level.maptime + 27; }
DEFINE_ACTION_FUNCTION(AActor, A_SerpentMeleeAttack) { // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (!self->target) { return; } if (self->CheckMeleeRange ()) { int damage = pr_serpentmeattack.HitDice (5); P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (damage, self->target, self); S_Sound (self, CHAN_BODY, "SerpentMeleeHit", 1, ATTN_NORM); // [BB] If we're the server, tell the clients to play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_BODY, "SerpentMeleeHit", 1, ATTN_NORM ); } if (pr_serpentmeattack() < 96) { CALL_ACTION(A_SerpentCheckForAttack, self); } }
static void DragonSeek (AActor *actor, angle_t thresh, angle_t turnMax) { int dir; int dist; angle_t delta; angle_t angle; AActor *target; int i; angle_t bestAngle; angle_t angleToSpot, angleToTarget; AActor *mo; // [BB] Let the server do this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } target = actor->tracer; if(target == NULL) { return; } dir = P_FaceMobj (actor, target, &delta); if (delta > thresh) { delta >>= 1; if (delta > turnMax) { delta = turnMax; } }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_M_FireCGun) { // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; ACTION_PARAM_START(1); ACTION_PARAM_BOOL(accurate, 0); S_Sound (self, CHAN_WEAPON, "weapons/chngun", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/chngun", 1, ATTN_NORM ); A_FaceTarget (self); P_GunShot2 (self, accurate, P_AimLineAttack (self, self->angle, MISSILERANGE), PClass::FindClass(NAME_BulletPuff)); }
DEFINE_ACTION_FUNCTION(AActor, A_CFlameMissile) { int i; int an, an90; fixed_t dist; AActor *mo; self->renderflags &= ~RF_INVISIBLE; S_Sound (self, CHAN_BODY, "ClericFlameExplode", 1, ATTN_NORM); // [BC] Let the server handle this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } AActor *BlockingMobj = self->BlockingMobj; if (BlockingMobj && BlockingMobj->flags&MF_SHOOTABLE) { // Hit something, so spawn the flame circle around the thing dist = BlockingMobj->radius+18*FRACUNIT; for (i = 0; i < 4; i++) { an = (i*ANG45)>>ANGLETOFINESHIFT; an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT; mo = Spawn ("CircleFlame", BlockingMobj->x+FixedMul(dist, finecosine[an]), BlockingMobj->y+FixedMul(dist, finesine[an]), BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE); if (mo) { mo->angle = an<<ANGLETOFINESHIFT; mo->target = self->target; mo->momx = mo->special1 = FixedMul(FLAMESPEED, finecosine[an]); mo->momy = mo->special2 = FixedMul(FLAMESPEED, finesine[an]); mo->tics -= pr_missile()&3; // [BC] If we're the server, spawn this to clients. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnThingExact( mo ); } mo = Spawn ("CircleFlame", BlockingMobj->x-FixedMul(dist, finecosine[an]), BlockingMobj->y-FixedMul(dist, finesine[an]), BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE); if(mo) { mo->angle = ANG180+(an<<ANGLETOFINESHIFT); mo->target = self->target; mo->momx = mo->special1 = FixedMul(-FLAMESPEED, finecosine[an]); mo->momy = mo->special2 = FixedMul(-FLAMESPEED, finesine[an]); mo->tics -= pr_missile()&3; // [BC] If we're the server, spawn this to clients. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnThingExact( mo ); } } self->SetState (self->SpawnState); }
//***************************************************************************** // void CALLVOTE_EndVote( bool bPassed ) { // This is a client-only function. if (( NETWORK_GetState( ) != NETSTATE_CLIENT ) && ( CLIENTDEMO_IsPlaying( ) == false )) { return; } g_bVotePassed = bPassed; callvote_EndVote( ); }
DEFINE_ACTION_FUNCTION(AActor, A_SerpentHumpDecide) { // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->MissileState != NULL) { if (pr_serpenthump() > 30) { return; } else if (pr_serpenthump() < 40) { // Missile attack // [BB] If we're the server, set the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingState( self, STATE_MELEE ); self->SetState (self->MeleeState); return; } } else if (pr_serpenthump() > 3) { return; } if (!self->CheckMeleeRange ()) { // The hump shouldn't occur when within melee range if (self->MissileState != NULL && pr_serpenthump() < 128) { // [BB] If we're the server, set the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingState( self, STATE_MELEE ); self->SetState (self->MeleeState); } else { // [BB] If we're the server, set the thing's state and play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_SetThingFrame( self, self->FindState ("Hump") ); SERVERCOMMANDS_SoundActor( self, CHAN_BODY, "SerpentActive", 1, ATTN_NORM ); } self->SetState (self->FindState ("Hump")); S_Sound (self, CHAN_BODY, "SerpentActive", 1, ATTN_NORM); } } }
DEFINE_ACTION_FUNCTION(AActor, A_SerpentCheckForAttack) { // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (!self->target) { return; } if (self->MissileState != NULL) { if (!self->CheckMeleeRange ()) { // [BB] If we're the server, set the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingFrame( self, self->FindState ("Attack") ); self->SetState (self->FindState ("Attack")); return; } } if (P_CheckMeleeRange2 (self)) { // [BB] If we're the server, set the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingFrame( self, self->FindState ("Walk") ); self->SetState (self->FindState ("Walk")); } else if (self->CheckMeleeRange ()) { if (pr_serpentattack() < 32) { // [BB] If we're the server, set the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingFrame( self, self->FindState ("Walk") ); self->SetState (self->FindState ("Walk")); } else { // [BB] If we're the server, set the thing's state. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingFrame( self, self->FindState ("Attack") ); self->SetState (self->FindState ("Attack")); } } }
DEFINE_ACTION_FUNCTION(AActor, A_FHammerThrow) { AActor *mo; player_t *player; if (NULL == (player = self->player)) { return; } if (!player->mo->special1) { return; } AWeapon *weapon = player->ReadyWeapon; if (weapon != NULL) { if (!weapon->DepleteAmmo (weapon->bAltFire, false)) return; } // [BC] Weapons are handled by the server. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } mo = P_SpawnPlayerMissile (player->mo, PClass::FindClass ("HammerMissile")); if (mo) { mo->special1 = 0; } // [BC] Apply spread. if ( player->cheats & CF_SPREAD ) { mo = P_SpawnPlayerMissile( player->mo, PClass::FindClass ("HammerMissile"), self->angle + ( ANGLE_45 / 3 )); if ( mo ) { mo->special1 = 0; } mo = P_SpawnPlayerMissile( player->mo, PClass::FindClass ("HammerMissile"), self->angle - ( ANGLE_45 / 3 )); if ( mo ) { mo->special1 = 0; } } }
DEFINE_ACTION_FUNCTION(AActor, A_BishopSpawnBlur) { // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } AActor *mo; if (!--self->special1) { self->momx = 0; self->momy = 0; // [BB] If we're the server, update the thing's momentum. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_MoveThingExact( self, CM_MOMX|CM_MOMY ); if (pr_sblur() > 96) { // [BB] If we're the server, tell the clients of the state change. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingState( self, STATE_SEE ); self->SetState (self->SeeState); } else { // [BB] If we're the server, tell the clients of the state change. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingState( self, STATE_MISSILE ); self->SetState (self->MissileState); } } mo = Spawn ("BishopBlur", self->x, self->y, self->z, ALLOW_REPLACE); if (mo) { mo->angle = self->angle; // [BB] If we're the server, tell the clients to spawn the thing and set its angle. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_SpawnThing( mo ); SERVERCOMMANDS_SetThingAngle( mo ); } } }
DEFINE_ACTION_FUNCTION(AActor, A_WizAtk3) { AActor *mo; CALL_ACTION(A_GhostOff, self); // [BB] This is server-side, the client only needs to run A_GhostOff. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (!self->target) { return; } S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM); // [BB] If we're the server, tell the clients to play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, S_GetName( self->AttackSound ), 1, ATTN_NORM ); if (self->CheckMeleeRange()) { int damage = pr_wizatk3.HitDice (4); P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (damage, self->target, self); return; } const PClass *fx = PClass::FindClass("WizardFX1"); mo = P_SpawnMissile (self, self->target, fx); if (mo != NULL) { AActor *missile1 = P_SpawnMissileAngle(self, fx, mo->angle-(ANG45/8), mo->velz); AActor *missile2 = P_SpawnMissileAngle(self, fx, mo->angle+(ANG45/8), mo->velz); // [BB] If we're the server, tell the clients to spawn the missiles. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_SpawnMissile( mo ); if ( missile1 ) SERVERCOMMANDS_SpawnMissile( missile1 ); if ( missile2 ) SERVERCOMMANDS_SpawnMissile( missile2 ); } } }
//***************************************************************************** // void LASTMANSTANDING_DoFight( void ) { DHUDMessageFadeOut *pMsg; // The match is now in progress. if (( NETWORK_GetState( ) != NETSTATE_CLIENT ) && ( CLIENTDEMO_IsPlaying( ) == false )) { LASTMANSTANDING_SetState( LMSS_INPROGRESS ); } // Make sure this is 0. Can be non-zero in network games if they're slightly out of sync. g_ulLMSCountdownTicks = 0; // Since the level time is being reset, also reset the last frag/excellent time for // each player. PLAYER_ResetAllPlayersSpecialCounters(); // Tell clients to "fight!". if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_DoGameModeFight( 0 ); if ( NETWORK_GetState( ) != NETSTATE_SERVER ) { // Play fight sound. ANNOUNCER_PlayEntry( cl_announcer, "Fight" ); // Display "FIGHT!" HUD message. pMsg = new DHUDMessageFadeOut( BigFont, "FIGHT!", 160.4f, 75.0f, 320, 200, CR_RED, 2.0f, 1.0f ); StatusBar->AttachMessage( pMsg, MAKE_ID('C','N','T','R') ); } // Display a little thing in the server window so servers can know when matches begin. else Printf( "FIGHT!\n" ); // Reset the map. GAME_ResetMap( ); GAMEMODE_RespawnAllPlayers( BOTEVENT_LMS_FIGHT ); SCOREBOARD_RefreshHUD( ); }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireRailgun) { // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; CALL_ACTION(A_MonsterRail, self); self->special1 = level.maptime + 50; }
// This version of the function, which uses a hard-coded sound, is // meant for Dehacked only. DEFINE_ACTION_FUNCTION(AActor, A_SPosAttack) { // [BC] Server takes care of the rest of this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { S_Sound ( self, CHAN_WEAPON, "shotguy/attack", 1, ATTN_NORM ); return; } if (!self->target) return; S_Sound (self, CHAN_WEAPON, "shotguy/attack", 1, ATTN_NORM); A_SPosAttack2 (self); }
//***************************************************************************** // LONG JOINQUEUE_GetPositionInLine( ULONG ulPlayer ) { ULONG ulIdx; if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return ( g_lClientQueuePosition ); } for ( ulIdx = 0; ulIdx < MAXPLAYERS; ulIdx++ ) { if ( g_lJoinQueue[ulIdx].ulPlayer == ulPlayer ) return ( ulIdx ); } return ( -1 ); }
DEFINE_ACTION_FUNCTION(AActor, A_MarineNoise) { // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (static_cast<AScriptedMarine *>(self)->CurrentWeapon == AScriptedMarine::WEAPON_Chainsaw) { S_Sound (self, CHAN_WEAPON, "weapons/sawidle", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/sawidle", 1, ATTN_NORM ); } }
DEFINE_ACTION_FUNCTION(AActor, A_BishopChase) { // [BB] This is server-side. The z coordinate seems to go out of sync // on client and server, if you make this client side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } self->z -= FloatBobOffsets[self->special2] >> 1; self->special2 = (self->special2 + 4) & 63; self->z += FloatBobOffsets[self->special2] >> 1; // [BB] If we're the server, update the thing's z coordinate. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_MoveThingExact( self, CM_Z ); }
DEFINE_ACTION_FUNCTION(AActor, A_M_CheckAttack) { // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->special1 != 0 || self->target == NULL) { self->SetState (self->FindState("SkipAttack")); } else { A_FaceTarget (self); } }
void FBaseCVar::SetGenericRep (UCVarValue value, ECVarType type) { if ((Flags & CVAR_NOSET) && m_DoNoSet) { return; } // [BB] ConsoleCommand may not mess with the cvar. else if ( ( Flags & CVAR_NOSETBYACS ) && ( ACS_IsCalledFromConsoleCommand() ) ) return; else if (( Flags & CVAR_CAMPAIGNLOCK ) && ( CAMPAIGN_InCampaign( )) && ( sv_cheats == false )) { Printf( "%s cannot be changed during a campaign.\n", GetName( )); return; } else if ((Flags & CVAR_LATCH) && gamestate != GS_FULLCONSOLE && gamestate != GS_STARTUP) { FLatchedValue latch; latch.Variable = this; latch.Type = type; if (type != CVAR_String) latch.Value = value; else latch.Value.String = copystring(value.String); LatchedValues.Push (latch); } // [BC] Support for client-side demos. else if ((Flags & CVAR_SERVERINFO) && gamestate != GS_STARTUP && !demoplayback && ( CLIENTDEMO_IsPlaying( ) == false )) { if ( NETWORK_GetState( ) != NETSTATE_CLIENT ) { ForceSet (value, type); // D_SendServerInfoChange (this, value, type); // [BB] Inform the clients about changes of server mod cvars. if ( ( NETWORK_GetState( ) == NETSTATE_SERVER ) && ( Flags & CVAR_MOD ) ) SERVERCOMMANDS_SetCVar ( *this ); } } else { ForceSet (value, type); } }