Moved gamerule definitions at a higher scope, this will make it easier

to call GameRule events from other parts of the codebase.
This commit is contained in:
Marco Cawthorne 2020-04-15 01:18:19 +02:00
parent 3e4a67367b
commit ad62ddc574
41 changed files with 480 additions and 273 deletions

View file

@ -40,6 +40,13 @@ Game_Parse_Event(float fHeader)
sendevent("PlayerSwitchWeapon", "i", w);
}
player pl = (player)pSeat->m_ePlayer;
if (getplayerkeyfloat(pl.entnum-1, "*team") == TEAM_CT) {
setcustomskin(pSeat->m_eViewModel, "", "geomset 0 2\n");
} else {
setcustomskin(pSeat->m_eViewModel, "", "geomset 0 1\n");
}
HUD_WeaponPickupNotify(w);
} else if (fHeader == EV_RADIOMSG) {
Radio_PlayMessage(readbyte());

View file

@ -38,7 +38,7 @@ Player_ReadEntity(float new)
break; //erk?... too old?
}
input_sequence = i;
QPhysics_Run(pl);
PMove_Run();
}
/* any differences in things that are read below are now

View file

@ -62,7 +62,7 @@ Predict_PreFrame(player pl)
break;
}
input_sequence = i;
QPhysics_Run(pl);
PMove_Run();
}
}

View file

@ -38,7 +38,7 @@ Player_ReadEntity(float new)
break; //erk?... too old?
}
input_sequence = i;
QPhysics_Run(pl);
PMove_Run();
}
/* any differences in things that are read below are now

View file

@ -55,7 +55,7 @@ CSEv_BuyWeapon_f(float fWeapon)
player pl = (player)self;
iWeapon = (int)fWeapon;
if (rules.RulesBuyingPossible(pl) == FALSE) {
if (rules.BuyingPossible(pl) == FALSE) {
return;
}

View file

@ -21,7 +21,7 @@ Game_RunClientCommand(void)
pl.buyzone = FALSE;
Footsteps_Update();
QPhysics_Run(self);
PMove_Run();
}
void

View file

@ -14,6 +14,8 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "gamerules.h"
var int g_cstrike_buying = 0;
var float g_cstrike_bombradius = 500;
@ -60,8 +62,8 @@ var int autocvar_fcs_penalty_pain = -150;
var int autocvar_fcs_penalty_kill = -1500;
var int autocvar_fcs_maxmoney = 16000;
var int autocvar_fcs_fillweapons = FALSE; /* This will automatically get ammo for the weapon you buy */
var int autocvar_fcs_fix_bombtimer = FALSE; /* If true, the bomb-timer will dictate the round-end */
var int autocvar_fcs_bombaltthrow = FALSE; /* Randomize the bomb-throw every time ever so slightly */
var int autocvar_fcs_fix_bombtimer = TRUE; /* If true, the bomb-timer will dictate the round-end */
var int autocvar_fcs_bombaltthrow = TRUE; /* Randomize the bomb-throw every time ever so slightly */
enum
{

View file

@ -37,3 +37,9 @@ func_bomb_target::Respawn(void)
{
InitBrushTrigger();
}
void
func_bomb_target::func_bomb_target(void)
{
g_cs_bombzones++;
}

View file

@ -16,24 +16,8 @@
var int autocvar_sv_playerkeepalive = TRUE;
class CSGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
/* level transitions */
virtual void(player) LevelChangeParms;
virtual void(player) LevelDecodeParms;
virtual void(void) LevelNewParms;
virtual int(player) RulesBuyingPossible;
};
int
CSGameRules::RulesBuyingPossible(player pl)
CSGameRules::BuyingPossible(player pl)
{
return FALSE;
}

View file

@ -0,0 +1,73 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../gamerules.h"
class CSGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
/* level transitions */
virtual void(player) LevelChangeParms;
virtual void(player) LevelDecodeParms;
virtual void(void) LevelNewParms;
virtual int(player) BuyingPossible;
};
class CSSingleplayerRules:CSGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};
class CSMultiplayerRules:CSGameRules
{
entity m_eLastTSpawn;
entity m_eLastCTSpawn;
void() CSMultiplayerRules;
virtual void(void) InitPostEnts;
virtual void(void) FrameStart;
virtual void(player) PlayerSpawn;
virtual void(player) PlayerPreFrame;
/* CS specific */
virtual void(void) CreateRescueZones;
virtual void(void) CreateCTBuyzones;
virtual void(void) CreateTBuyzones;
virtual void(float, int) TimerBegin;
virtual void(void) TimerUpdate;
virtual int(player) BuyingPossible;
virtual void(int, int, int) RoundOver;
virtual void(int) RestartRound;
virtual void(player) DeathCheck;
virtual void(player) MakeBomber;
virtual void(player) MakeVIP;
virtual void(void) CountPlayers;
virtual void(void) SwitchTeams;
virtual void(void) TimeOut;
virtual void(player, int) PlayerMakePlayable;
virtual void(player) PlayerMakeSpectator;
virtual void(player, int) PlayerRespawn;
virtual entity(float) PlayerFindSpawn;
};

View file

@ -14,37 +14,18 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class CSMultiplayerRules:CSGameRules
void
CSMultiplayerRules::PlayerPreFrame(player pl)
{
entity m_eLastTSpawn;
entity m_eLastCTSpawn;
if (pl.health <= 0)
return;
virtual void(void) InitPostEnts;
virtual void(void) FrameStart;
virtual void(player) PlayerSpawn;
/* CS specific */
virtual void(void) CreateRescueZones;
virtual void(void) CreateCTBuyzones;
virtual void(void) CreateTBuyzones;
virtual void(float, int) TimerBegin;
virtual void(void) TimerUpdate;
virtual void(player) RulesDeathCheck;
virtual void(void) RulesCountPlayers;
virtual void(void) RulesSwitchTeams;
virtual void(void) RulesTimeOver;
virtual void(int, int, int) RulesRoundOver;
virtual void(int) RulesRestart;
virtual void(player) RulesMakeVIP;
virtual void(player) RulesMakeBomber;
virtual int(player) RulesBuyingPossible;
virtual void(player, int) PlayerMakePlayable;
virtual void(player) PlayerMakeSpectator;
virtual void(player, int) PlayerRespawn;
virtual entity(float) PlayerFindSpawn;
};
if (g_cs_gamestate == GAME_FREEZE) {
pl.flags |= FL_FROZEN;
} else {
pl.flags &= ~FL_FROZEN;
}
}
void
CSMultiplayerRules::FrameStart(void)
@ -196,7 +177,7 @@ CSMultiplayerRules::TimerUpdate(void)
if (g_cs_hostagestotal > 0) {
if (g_cs_hostagesrescued >= g_cs_hostagestotal) {
RulesRoundOver(TEAM_CT, 0, FALSE);
RoundOver(TEAM_CT, 0, FALSE);
return;
}
}
@ -239,14 +220,14 @@ CSMultiplayerRules::TimerUpdate(void)
if (g_cs_roundswon_t == 0 && g_cs_roundswon_ct == 0) {
Money_ResetTeamReward();
Money_ResetRoundReward();
RulesRestart(TRUE);
RestartRound(TRUE);
} else {
if (autocvar_mp_halftime == TRUE && (autocvar_mp_winlimit / 2 == g_cs_roundsplayed)) {
Money_ResetTeamReward();
RulesSwitchTeams();
RulesRestart(TRUE);
SwitchTeams();
RestartRound(TRUE);
} else {
RulesRestart(FALSE);
RestartRound(FALSE);
}
}
}
@ -262,7 +243,7 @@ CSMultiplayerRules::TimerUpdate(void)
return;
}
}
RulesTimeOver();
TimeOut();
TimerBegin(5, GAME_END); // Round is over, 5 seconds til a new round starts
} else {
TimerBegin(autocvar_mp_roundtime * 60, GAME_ACTIVE); // Unfreeze
@ -274,13 +255,13 @@ CSMultiplayerRules::TimerUpdate(void)
/*
=================
RulesBuyingPossible
BuyingPossible
Checks if it is possible for players to buy anything
=================
*/
int
CSMultiplayerRules::RulesBuyingPossible(player pl)
CSMultiplayerRules::BuyingPossible(player pl)
{
if (pl.health <= 0) {
return FALSE;
@ -322,14 +303,14 @@ CSMultiplayerRules::RulesBuyingPossible(player pl)
}
void
CSMultiplayerRules::RulesMakeBomber(player pl)
CSMultiplayerRules::MakeBomber(player pl)
{
Weapons_AddItem(pl, WEAPON_C4BOMB);
centerprint(pl, "You have the bomb!\nFind the target zone or DROP\nthe bomb for another Terrorist.");
}
void
CSMultiplayerRules::RulesMakeVIP(player pl)
CSMultiplayerRules::MakeVIP(player pl)
{
pl.team = TEAM_VIP;
PlayerRespawn(pl, pl.team);
@ -339,13 +320,13 @@ CSMultiplayerRules::RulesMakeVIP(player pl)
/*
=================
RulesRestart
RestartRound
Loop through all ents and handle them
=================
*/
void
CSMultiplayerRules::RulesRestart(int iWipe)
CSMultiplayerRules::RestartRound(int iWipe)
{
g_cs_hostagesrescued = 0;
@ -388,7 +369,7 @@ CSMultiplayerRules::RulesRestart(int iWipe)
iPickT++;
if (iPickT == iRandomT) {
RulesMakeBomber((player)eFind);
MakeBomber((player)eFind);
}
}
}
@ -403,7 +384,7 @@ CSMultiplayerRules::RulesRestart(int iWipe)
if (eFind.team == TEAM_CT) {
iPickCT++;
if (iPickCT == iRandomCT) {
RulesMakeVIP((player)eFind);
MakeVIP((player)eFind);
}
}
}
@ -421,13 +402,13 @@ CSMultiplayerRules::RulesRestart(int iWipe)
/*
=================
RulesRoundOver
RoundOver
This happens whenever an objective is complete or time is up
=================
*/
void
CSMultiplayerRules::RulesRoundOver(int iTeamWon, int iMoneyReward, int fSilent)
CSMultiplayerRules::RoundOver(int iTeamWon, int iMoneyReward, int fSilent)
{
if (g_cs_gamestate != GAME_ACTIVE) {
@ -467,37 +448,37 @@ CSMultiplayerRules::RulesRoundOver(int iTeamWon, int iMoneyReward, int fSilent)
/*
=================
RulesTimeOver
TimeOut
Whenever mp_roundtime was being counted down to 0
=================
*/
void
CSMultiplayerRules::RulesTimeOver(void)
CSMultiplayerRules::TimeOut(void)
{
if (g_cs_vipzones > 0) {
RulesRoundOver(TEAM_T, 3250, FALSE);
RoundOver(TEAM_T, 3250, FALSE);
} else if (g_cs_bombzones > 0) {
/* In Bomb Defusal, all Counter-Terrorists receive $3250
* if they won running down the time. */
RulesRoundOver(TEAM_CT, 3250, FALSE);
RoundOver(TEAM_CT, 3250, FALSE);
} else if (g_cs_hostagestotal > 0) {
// TODO: Broadcast_Print: Hostages have not been rescued!
RulesRoundOver(TEAM_T, 3250, FALSE);
RoundOver(TEAM_T, 3250, FALSE);
} else {
RulesRoundOver(0, 0, FALSE);
RoundOver(0, 0, FALSE);
}
}
/*
=================
RulesSwitchTeams
SwitchTeams
Happens rarely
=================
*/
void
CSMultiplayerRules::RulesSwitchTeams(void)
CSMultiplayerRules::SwitchTeams(void)
{
int iCTW, iTW;
@ -527,7 +508,7 @@ CSMultiplayerRules::RulesSwitchTeams(void)
}
void
CSMultiplayerRules::RulesCountPlayers(void)
CSMultiplayerRules::CountPlayers(void)
{
g_cs_alive_t = 0;
g_cs_alive_ct = 0;
@ -546,13 +527,13 @@ CSMultiplayerRules::RulesCountPlayers(void)
}
void
CSMultiplayerRules::RulesDeathCheck(player pl)
CSMultiplayerRules::DeathCheck(player pl)
{
if ((g_cs_alive_t == 0) && (g_cs_alive_ct == 0)) {
if (g_cs_bombplanted == TRUE) {
RulesRoundOver(TEAM_T, 3600, FALSE);
RoundOver(TEAM_T, 3600, FALSE);
} else {
RulesRoundOver(FALSE, 0, FALSE);
RoundOver(FALSE, 0, FALSE);
}
} else {
int winner;
@ -567,12 +548,12 @@ CSMultiplayerRules::RulesDeathCheck(player pl)
/* In Bomb Defusal, the winning team receives $3250
* if they won by eliminating the enemy team. */
if (!g_cs_bombplanted || g_cs_alive_ct == 0) {
RulesRoundOver(winner, 3250, FALSE);
RoundOver(winner, 3250, FALSE);
}
} else {
/* In Hostage Rescue, the winning team receives $3600
* if they won by eliminating the enemy team. */
RulesRoundOver(winner, 3600, FALSE);
RoundOver(winner, 3600, FALSE);
}
}
}
@ -647,7 +628,7 @@ CSMultiplayerRules::PlayerRespawn(player pl, int fTeam)
pl.classname = "player";
pl.health = pl.max_health = 100;
forceinfokey(pl, "*dead", "0");
RulesCountPlayers();
CountPlayers();
pl.takedamage = DAMAGE_YES;
pl.solid = SOLID_SLIDEBOX;
@ -769,6 +750,12 @@ CSMultiplayerRules::PlayerSpawn(player pl)
forceinfokey(pl, "*team", "0");
}
void
CSMultiplayerRules::CSMultiplayerRules(void)
{
forceinfokey(world, "*gamemode", "classic");
}
/*
=================
CSEv_JoinTeam_f
@ -776,7 +763,7 @@ CSEv_JoinTeam_f
Event Handling, called by the Client codebase via 'sendevent'
=================
*/
void CSEv_JoinTeam_f(int fChar)
void CSEv_JoinTeam_f(float flChar)
{
CSMultiplayerRules rules = (CSMultiplayerRules)g_grMode;
player pl = (player)self;
@ -794,28 +781,28 @@ void CSEv_JoinTeam_f(int fChar)
switch (g_cs_gamestate) {
/* spawn the players immediately when its in the freeze state */
case GAME_FREEZE:
pl.charmodel = fChar;
rules.PlayerMakePlayable(pl, fChar);
pl.charmodel = (int)flChar;
rules.PlayerMakePlayable(pl, (int)flChar);
if ((pl.team == TEAM_T) && (g_cs_alive_t == 1)) {
if (g_cs_bombzones > 0) {
rules.RulesMakeBomber(pl);
rules.MakeBomber(pl);
}
} else if ((pl.team == TEAM_CT) && (g_cs_alive_ct == 1)) {
if (g_cs_vipzones > 0) {
rules.RulesMakeVIP(pl);
rules.MakeVIP(pl);
}
}
break;
/* otherwise, just prepare their fields for the next round */
default:
if (fChar == 0) {
if (flChar == 0) {
rules.PlayerSpawn(pl);
return;
}
if (fChar < 5) {
if (flChar < 5) {
pl.team = TEAM_T;
} else {
pl.team = TEAM_CT;
@ -823,7 +810,7 @@ void CSEv_JoinTeam_f(int fChar)
rules.PlayerMakeSpectator(pl);
pl.classname = "player";
pl.charmodel = fChar;
pl.charmodel = (int)flChar;
pl.health = 0;
forceinfokey(pl, "*dead", "1");
forceinfokey(pl, "*team", ftos(pl.team));
@ -836,9 +823,9 @@ void CSEv_JoinTeam_f(int fChar)
/* if no players are present in the chosen team, force restart round */
if ((pl.team == TEAM_T) && (g_cs_alive_t == 0)) {
rules.RulesRoundOver(FALSE, 0, FALSE);
rules.RoundOver(FALSE, 0, FALSE);
} else if ((pl.team == TEAM_CT) && (g_cs_alive_ct == 0)) {
rules.RulesRoundOver(FALSE, 0, FALSE);
rules.RoundOver(FALSE, 0, FALSE);
}
}

View file

@ -14,12 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class CSSingleplayerRules:CSGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};
void
CSSingleplayerRules::PlayerSpawn(player pl)
{

View file

@ -10,7 +10,6 @@
../../shared/fteextensions.qc
../../shared/defs.h
../../shared/cstrike/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -18,7 +17,6 @@
../../shared/sound.c
../../shared/valve/animations.h
../defs.h
../cstrike/defs.h
../plugins.c
../logging.c
../nodes.c
@ -28,8 +26,10 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/effects.c
../../shared/cstrike/player.cpp
../cstrike/defs.h
../../shared/effects.c
../cstrike/player.c
../../shared/pmove.c
../valve/spectator.c
@ -87,7 +87,6 @@
../gamerules.cpp
../cstrike/game_money.c
../cstrike/gamerules.cpp
../cstrike/gamerules_singleplayer.cpp
../cstrike/gamerules_multiplayer.cpp

View file

@ -14,34 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class CGameRules
{
void() CGameRules;
virtual void(void) InitPostEnts;
/* logic */
virtual void(void) FrameStart;
virtual float(player,string) ConsoleCommand;
/* client */
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerSpawn;
virtual void(player) PlayerPreFrame;
virtual void(player) PlayerPostFrame;
/* level transitions */
virtual void(void) LevelNewParms;
virtual void(player) LevelChangeParms;
/* spectator */
/*virtual void(player) SpectatorConnect;
virtual void(player) SpectatorDisconnect;
virtual void(player) SpectatorThink;*/
};
/* init */
void
CGameRules::InitPostEnts(void)

46
src/server/gamerules.h Normal file
View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class CGameRules
{
void() CGameRules;
virtual void(void) InitPostEnts;
/* logic */
virtual void(void) FrameStart;
virtual float(player,string) ConsoleCommand;
/* client */
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerSpawn;
virtual void(player) PlayerPreFrame;
virtual void(player) PlayerPostFrame;
/* level transitions */
virtual void(void) LevelNewParms;
virtual void(player) LevelChangeParms;
/* spectator */
/*virtual void(player) SpectatorConnect;
virtual void(player) SpectatorDisconnect;
virtual void(player) SpectatorThink;*/
};
/* our currently running mode */
CGameRules g_grMode;

View file

@ -16,19 +16,6 @@
var int autocvar_sv_playerkeepalive = TRUE;
class HLGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
/* level transitions */
virtual void(player) LevelChangeParms;
virtual void(player) LevelDecodeParms;
virtual void(void) LevelNewParms;
};
/* we check what fields have changed over the course of the frame and network
* only the ones that have actually changed */
void

View file

@ -9,7 +9,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -26,6 +25,9 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/gearbox/player.cpp
../valve/defs.h
../valve/monster_apache.cpp
../valve/monster_alien_controller.cpp
../valve/monster_alien_grunt.cpp
@ -65,7 +67,6 @@
../gearbox/monster_recruit.cpp
../../shared/effects.c
../../shared/gearbox/player.cpp
../valve/player.c
../../shared/pmove.c
../valve/spectator.c

View file

@ -9,7 +9,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -26,6 +25,9 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/hunger/player.cpp
../valve/defs.h
../valve/monster_apache.cpp
../valve/monster_alien_controller.cpp
../valve/monster_alien_grunt.cpp
@ -62,7 +64,6 @@
../valve/monster_zombie.cpp
../../shared/effects.c
../../shared/hunger/player.cpp
../valve/player.c
../../shared/pmove.c
../valve/spectator.c

View file

@ -16,19 +16,6 @@
var int autocvar_sv_playerkeepalive = TRUE;
class HLGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
/* level transitions */
virtual void(player) LevelChangeParms;
virtual void(player) LevelDecodeParms;
virtual void(void) LevelNewParms;
};
/* we check what fields have changed over the course of the frame and network
* only the ones that have actually changed */
void

View file

@ -14,15 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class HLMultiplayerRules:HLGameRules
{
/* client */
virtual void(player) PlayerSpawn;
/* level transitions */
virtual void(player) LevelDecodeParms;
};
void
HLMultiplayerRules::LevelDecodeParms(player pl)
{

View file

@ -9,7 +9,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -26,6 +25,9 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/poke646/player.cpp
../valve/defs.h
../valve/monster_apache.cpp
../valve/monster_alien_controller.cpp
../valve/monster_alien_grunt.cpp
@ -62,7 +64,6 @@
../valve/monster_zombie.cpp
../../shared/effects.c
../../shared/poke646/player.cpp
../valve/player.c
../../shared/pmove.c
../valve/spectator.c

View file

@ -16,18 +16,6 @@
var int autocvar_sv_playerkeepalive = TRUE;
class HLGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
virtual void(player) LevelDecodeParms;
virtual void(player) LevelChangeParms;
virtual void(void) LevelNewParms;
};
void
HLGameRules::LevelDecodeParms(player pl)
{

View file

@ -8,7 +8,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -25,6 +24,9 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/rewolf/player.cpp
../valve/defs.h
../valve/monster_rat.cpp
../valve/monster_scientist_dead.cpp
gunman_cycler.cpp
@ -34,7 +36,6 @@ monster_human_demoman.cpp
monster_human_gunman.cpp
monster_human_unarmed.cpp
../../shared/effects.c
../../shared/rewolf/player.cpp
../valve/player.c
../../shared/pmove.c
../valve/spectator.c

17
src/server/scihunt/defs.h Normal file
View file

@ -0,0 +1,17 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "gamerules.h"

View file

@ -14,12 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class SHMultiplayerRules:HLGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};
void
SHMultiplayerRules::PlayerSpawn(player pl)
{
@ -56,8 +50,6 @@ SHMultiplayerRules::PlayerSpawn(player pl)
forceinfokey(pl, "*spec", "0");
forceinfokey(pl, "*deaths", ftos(pl.deaths));
LevelNewParms();
LevelDecodeParms(pl);
spot = Spawn_SelectRandom("info_player_deathmatch");
setorigin(pl, spot.origin);
pl.angles = spot.angles;

View file

@ -0,0 +1,23 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../gamerules.h"
class SHMultiplayerRules:CGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};

View file

@ -9,7 +9,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -27,6 +26,9 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/scihunt/player.cpp
../scihunt/defs.h
../valve/monster_apache.cpp
../valve/monster_alien_controller.cpp
../valve/monster_alien_grunt.cpp
@ -64,7 +66,6 @@ monster_scientist.cpp
../../shared/effects.c
../../shared/scihunt/player.cpp
../valve/player.c
../../shared/pmove.c
../valve/spectator.c
@ -111,8 +112,7 @@ shdata_parse.c
../../shared/valve/animations.c
../gamerules.cpp
../valve/gamerules.cpp
../scihunt/gamerules_multiplayer.cpp
../scihunt/gamerules.cpp
../valve/client.c
../client.c

17
src/server/tfc/defs.h Normal file
View file

@ -0,0 +1,17 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "gamerules.h"

View file

@ -16,17 +16,6 @@
var int autocvar_sv_playerkeepalive = TRUE;
class TFCGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerPostFrame;
virtual void(player) PlayerSpawn;
virtual void(player) PlayerKill;
virtual void(void) LevelNewParms;
};
/* we check what fields have changed over the course of the frame and network
* only the ones that have actually changed */
void

View file

@ -0,0 +1,28 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../gamerules.h"
class TFCGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerPostFrame;
virtual void(player) PlayerSpawn;
virtual void(player) PlayerKill;
virtual void(void) LevelNewParms;
};

View file

@ -8,7 +8,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -25,8 +24,10 @@
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/effects.c
../../shared/valve/player.cpp
../tfc/defs.h
../../shared/effects.c
../valve/player.c
../../shared/pmove.c
../valve/spectator.c

View file

@ -19,7 +19,7 @@ void
Game_RunClientCommand(void)
{
Footsteps_Update();
QPhysics_Run(self);
PMove_Run();
}
/* custom chat packet */

View file

@ -14,4 +14,4 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
void Damage_Apply(entity, entity, float, int, int);
#include "gamerules.h"

View file

@ -16,18 +16,6 @@
var int autocvar_sv_playerkeepalive = TRUE;
class HLGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
virtual void(player) LevelDecodeParms;
virtual void(player) LevelChangeParms;
virtual void(void) LevelNewParms;
};
void
HLGameRules::LevelDecodeParms(player pl)
{

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../gamerules.h"
class HLGameRules:CGameRules
{
virtual void(entity) PlayerConnect;
virtual void(entity) PlayerDisconnect;
virtual void(player) PlayerKill;
virtual void(player) PlayerPostFrame;
virtual void(player) LevelDecodeParms;
virtual void(player) LevelChangeParms;
virtual void(void) LevelNewParms;
};
class HLSingleplayerRules:HLGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};
class HLMultiplayerRules:HLGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};

View file

@ -14,12 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class HLSingleplayerRules:HLGameRules
{
/* client */
virtual void(player) PlayerSpawn;
};
void
HLSingleplayerRules::PlayerSpawn(player pl)
{

View file

@ -8,7 +8,6 @@
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
@ -25,6 +24,9 @@ defs.h
../../gs-entbase/server.src
../../gs-entbase/shared.src
../../shared/valve/player.cpp
../valve/defs.h
../valve/monster_apache.cpp
../valve/monster_alien_controller.cpp
../valve/monster_alien_grunt.cpp
@ -61,7 +63,6 @@ defs.h
../valve/monster_zombie.cpp
../../shared/effects.c
../../shared/valve/player.cpp
player.c
../../shared/pmove.c
spectator.c

View file

@ -28,6 +28,97 @@ func_bombtarget brush entities.
*/
/* C4 entity logic */
#ifdef SERVER
class c4bomb:CBaseEntity
{
entity m_eUser;
float m_flBeepTime;
float m_flExplodeTime;
float m_flDefusalState;
void(void) c4bomb;
virtual void(void) PlayerUse;
virtual void(void) Logic;
};
void
c4bomb::PlayerUse(void)
{
m_eUser = eActivator;
m_flDefusalState += frametime;
}
void
c4bomb::Logic(void)
{
// If the guy who started using us stopped using us, reset the defuser counter
if (m_eUser != world) {
m_eUser= world;
m_flDefusalState = 0.0f;
}
// If our time has passed, explode
if (m_flExplodeTime < time) {
CSMultiplayerRules rules = (CSMultiplayerRules)g_grMode;
/* In Bomb Defusal, all Terrorists receive $3500
* if they won by detonating the bomb. */
rules.RoundOver(TEAM_T, 3500, FALSE);
Damage_Radius(origin, this.owner, 500, g_cstrike_bombradius, TRUE, WEAPON_C4BOMB);
sound(this, CHAN_VOICE, "weapons/c4_explode1.wav", 1.0, ATTN_NONE);
for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) {
CBaseTrigger trigger = (CBaseTrigger)e;
if (trigger.Trigger != __NULL__) {
trigger.Trigger();
}
}
m_flBeepTime = 0.0f;
m_flDefusalState = 0;
remove(this);
return;
}
if (m_flBeepTime > time) {
return;
}
m_flBeepTime = time + 1.5;
if (m_flExplodeTime - time < 2) {
sound(this, CHAN_VOICE, "weapons/c4_beep5.wav", 1.0, ATTN_NONE);
} else if (m_flExplodeTime - time < 5) {
sound(this, CHAN_VOICE, "weapons/c4_beep5.wav", 1.0, ATTN_NORM);
} else if (m_flExplodeTime - time < 10) {
sound(this, CHAN_VOICE, "weapons/c4_beep4.wav", 1.0, ATTN_NORM);
} else if (m_flExplodeTime - time < 20) {
sound(this, CHAN_VOICE, "weapons/c4_beep3.wav", 1.0, ATTN_NORM);
} else if (m_flExplodeTime - time < 30) {
sound(this, CHAN_VOICE, "weapons/c4_beep2.wav", 1.0, ATTN_NORM);
} else {
sound(this, CHAN_VOICE, "weapons/c4_beep1.wav", 1.0, ATTN_NORM);
}
}
void
c4bomb::c4bomb(void)
{
movetype = MOVETYPE_NONE;
solid = SOLID_BBOX;
setmodel(this, "models/w_c4.mdl");
setsize(this, [-6,-6,0], [6,6,6]);
customphysics = Logic;
m_flExplodeTime = time + 45.0f;
sound(this, CHAN_WEAPON, "weapons/c4_plant.wav", 1.0f, ATTN_IDLE);
}
#endif
/* C4 weapon logic */
enum
{
C4_IDLE,
@ -52,6 +143,13 @@ w_c4bomb_precache(void)
Sound_Precache("weapon_c4bomb.disarmed");
Sound_Precache("weapon_c4bomb.explode");
Sound_Precache("weapon_c4bomb.plant");
precache_sound("weapons/c4_plant.wav");
precache_sound("weapons/c4_beep1.wav");
precache_sound("weapons/c4_beep2.wav");
precache_sound("weapons/c4_beep3.wav");
precache_sound("weapons/c4_beep4.wav");
precache_sound("weapons/c4_beep5.wav");
precache_sound("weapons/c4_explode1.wav");
#endif
precache_model("models/v_c4.mdl");
precache_model("models/w_c4.mdl");
@ -100,6 +198,15 @@ w_c4bomb_release(void)
if (pl.w_idle_next <= 0.0f) {
pl.a_ammo1 = C4S_DONE;
#ifdef SERVER
c4bomb bomb = spawn(c4bomb);
bomb.owner = pl;
/* place directly below */
traceline(pl.origin, pl.origin + [0,0,-64], FALSE, pl);
setorigin(bomb, trace_endpos);
Radio_BroadcastMessage(RADIO_BOMBPL);
g_cs_bombplanted = TRUE;
Weapons_RemoveItem(pl, WEAPON_C4BOMB);
#endif
}

View file

@ -201,7 +201,7 @@ w_m4a1_primary(void)
}
pl.w_attack_next = 0.0875f;
pl.w_idle_next = pl.w_attack_next;
pl.w_idle_next = 2.0f;
}
void

View file

@ -45,41 +45,3 @@ Math_Reflect(vector v1, vector v2)
{
return v1 - 2 * dotproduct(v1, v2) * v2;
}
#if defined(SSQC) || defined(CSQC)
void PMove_Run(void);
int
QPhysics_IsStuck(entity eTarget, vector vOffset, vector vecMins, vector vecMaxs)
{
if (eTarget.solid != SOLID_SLIDEBOX) {
return FALSE;
}
tracebox(eTarget.origin + vOffset, vecMins, vecMaxs, eTarget.origin + vOffset, FALSE, eTarget);
return trace_startsolid;
}
void
QPhysics_Run(entity eTarget)
{
entity eOld = self;
self = eTarget;
float flFallVel = (self.flags & FL_ONGROUND) ? 0 : -self.velocity[2];
PMove_Run();
#ifdef SERVER
if (self.waterlevel != 0) {
flFallVel = 0;
}
if ((self.flags & FL_ONGROUND) && self.movetype == MOVETYPE_WALK && (flFallVel > 580)) {
float fFallDamage = (flFallVel - 580) * (100 / (1024 - 580));
Damage_Apply(self, world, fFallDamage, 0, DMG_FALL);
sound(self, CHAN_AUTO, "player/pl_fallpain3.wav", 1.0, ATTN_NORM);
}
#endif
self = eOld;
}
#endif

View file

@ -745,6 +745,10 @@ PMove_Run(void)
{
float punch;
player pl = (player)self;
#ifdef SERVER
float flFallVel = (self.flags & FL_ONGROUND) ? 0 : -self.velocity[2];
#endif
/* maxspeed changes when crouching, TODO: make this game-specific */
self.maxspeed = (self.flags & FL_CROUCHING) ? 135 : 270;
@ -754,6 +758,10 @@ PMove_Run(void)
input_movevalues *= 0.25;
}
if (pl.flags & FL_FROZEN) {
input_movevalues = [0,0,0];
}
/* establish which water elements we're dealing in */
PMove_WaterMove();
@ -805,6 +813,18 @@ PMove_Run(void)
pl.punchangle[1] *= punch;
pl.punchangle[2] *= punch;
#ifdef SERVER
if (self.waterlevel != 0) {
flFallVel = 0;
}
if ((self.flags & FL_ONGROUND) && self.movetype == MOVETYPE_WALK && (flFallVel > 580)) {
float fFallDamage = (flFallVel - 580) * (100 / (1024 - 580));
Damage_Apply(self, world, fFallDamage, 0, DMG_FALL);
sound(self, CHAN_AUTO, "player/pl_fallpain3.wav", 1.0, ATTN_NORM);
}
#endif
/* weapon/item logic of what the player controls */
Game_Input();
}