diff --git a/src/client/cstrike/game_event.c b/src/client/cstrike/game_event.c index b0634ab4..61f99fcb 100644 --- a/src/client/cstrike/game_event.c +++ b/src/client/cstrike/game_event.c @@ -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()); diff --git a/src/client/cstrike/player.c b/src/client/cstrike/player.c index caa9a421..32ee845b 100644 --- a/src/client/cstrike/player.c +++ b/src/client/cstrike/player.c @@ -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 diff --git a/src/client/predict.c b/src/client/predict.c index 14a907b8..694a72af 100644 --- a/src/client/predict.c +++ b/src/client/predict.c @@ -62,7 +62,7 @@ Predict_PreFrame(player pl) break; } input_sequence = i; - QPhysics_Run(pl); + PMove_Run(); } } diff --git a/src/client/valve/player.c b/src/client/valve/player.c index fec6ad19..66cef8fc 100644 --- a/src/client/valve/player.c +++ b/src/client/valve/player.c @@ -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 diff --git a/src/server/cstrike/buy.c b/src/server/cstrike/buy.c index 95c0844a..496a767f 100644 --- a/src/server/cstrike/buy.c +++ b/src/server/cstrike/buy.c @@ -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; } diff --git a/src/server/cstrike/client.c b/src/server/cstrike/client.c index 81284c2c..6db24d6d 100644 --- a/src/server/cstrike/client.c +++ b/src/server/cstrike/client.c @@ -21,7 +21,7 @@ Game_RunClientCommand(void) pl.buyzone = FALSE; Footsteps_Update(); - QPhysics_Run(self); + PMove_Run(); } void diff --git a/src/server/cstrike/defs.h b/src/server/cstrike/defs.h index 42680b48..f86deeaf 100644 --- a/src/server/cstrike/defs.h +++ b/src/server/cstrike/defs.h @@ -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 { diff --git a/src/server/cstrike/func_bomb_target.cpp b/src/server/cstrike/func_bomb_target.cpp index 1edc8630..cbe35f11 100644 --- a/src/server/cstrike/func_bomb_target.cpp +++ b/src/server/cstrike/func_bomb_target.cpp @@ -37,3 +37,9 @@ func_bomb_target::Respawn(void) { InitBrushTrigger(); } + +void +func_bomb_target::func_bomb_target(void) +{ + g_cs_bombzones++; +} diff --git a/src/server/cstrike/gamerules.cpp b/src/server/cstrike/gamerules.cpp index 3103fbbf..5f897e98 100644 --- a/src/server/cstrike/gamerules.cpp +++ b/src/server/cstrike/gamerules.cpp @@ -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; } diff --git a/src/server/cstrike/gamerules.h b/src/server/cstrike/gamerules.h new file mode 100644 index 00000000..d5277a34 --- /dev/null +++ b/src/server/cstrike/gamerules.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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; +}; diff --git a/src/server/cstrike/gamerules_multiplayer.cpp b/src/server/cstrike/gamerules_multiplayer.cpp index 77183747..c7ee41f9 100644 --- a/src/server/cstrike/gamerules_multiplayer.cpp +++ b/src/server/cstrike/gamerules_multiplayer.cpp @@ -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); } } diff --git a/src/server/cstrike/gamerules_singleplayer.cpp b/src/server/cstrike/gamerules_singleplayer.cpp index 701660db..a4ab66ec 100644 --- a/src/server/cstrike/gamerules_singleplayer.cpp +++ b/src/server/cstrike/gamerules_singleplayer.cpp @@ -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) { diff --git a/src/server/cstrike/progs.src b/src/server/cstrike/progs.src index d577e1c9..fe1e221d 100755 --- a/src/server/cstrike/progs.src +++ b/src/server/cstrike/progs.src @@ -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 diff --git a/src/server/gamerules.cpp b/src/server/gamerules.cpp index 5a1a5136..e2e0bd07 100644 --- a/src/server/gamerules.cpp +++ b/src/server/gamerules.cpp @@ -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) diff --git a/src/server/gamerules.h b/src/server/gamerules.h new file mode 100644 index 00000000..e3e61288 --- /dev/null +++ b/src/server/gamerules.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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; diff --git a/src/server/gearbox/gamerules.cpp b/src/server/gearbox/gamerules.cpp index 86163929..49e86a70 100644 --- a/src/server/gearbox/gamerules.cpp +++ b/src/server/gearbox/gamerules.cpp @@ -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 diff --git a/src/server/gearbox/progs.src b/src/server/gearbox/progs.src index eaa63b13..568a81bc 100755 --- a/src/server/gearbox/progs.src +++ b/src/server/gearbox/progs.src @@ -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 diff --git a/src/server/hunger/progs.src b/src/server/hunger/progs.src index 540a08a2..d4500d83 100755 --- a/src/server/hunger/progs.src +++ b/src/server/hunger/progs.src @@ -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 diff --git a/src/server/poke646/gamerules.cpp b/src/server/poke646/gamerules.cpp index 48581e63..794bb644 100644 --- a/src/server/poke646/gamerules.cpp +++ b/src/server/poke646/gamerules.cpp @@ -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 diff --git a/src/server/poke646/gamerules_multiplayer.cpp b/src/server/poke646/gamerules_multiplayer.cpp index 0db6d4a0..144db34f 100644 --- a/src/server/poke646/gamerules_multiplayer.cpp +++ b/src/server/poke646/gamerules_multiplayer.cpp @@ -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) { diff --git a/src/server/poke646/progs.src b/src/server/poke646/progs.src index 8cfe0496..cdaa7ca7 100755 --- a/src/server/poke646/progs.src +++ b/src/server/poke646/progs.src @@ -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 diff --git a/src/server/rewolf/gamerules.cpp b/src/server/rewolf/gamerules.cpp index e34f09c7..eec4477a 100644 --- a/src/server/rewolf/gamerules.cpp +++ b/src/server/rewolf/gamerules.cpp @@ -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) { diff --git a/src/server/rewolf/progs.src b/src/server/rewolf/progs.src index 893b7e8d..25a2ad78 100755 --- a/src/server/rewolf/progs.src +++ b/src/server/rewolf/progs.src @@ -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 diff --git a/src/server/scihunt/defs.h b/src/server/scihunt/defs.h new file mode 100644 index 00000000..c6c2f0ab --- /dev/null +++ b/src/server/scihunt/defs.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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" diff --git a/src/server/scihunt/gamerules_multiplayer.cpp b/src/server/scihunt/gamerules.cpp similarity index 93% rename from src/server/scihunt/gamerules_multiplayer.cpp rename to src/server/scihunt/gamerules.cpp index 9e125c15..26bf923d 100644 --- a/src/server/scihunt/gamerules_multiplayer.cpp +++ b/src/server/scihunt/gamerules.cpp @@ -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; diff --git a/src/server/scihunt/gamerules.h b/src/server/scihunt/gamerules.h new file mode 100644 index 00000000..08df62e3 --- /dev/null +++ b/src/server/scihunt/gamerules.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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; +}; diff --git a/src/server/scihunt/progs.src b/src/server/scihunt/progs.src index ef611e8d..11c8940d 100755 --- a/src/server/scihunt/progs.src +++ b/src/server/scihunt/progs.src @@ -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 diff --git a/src/server/tfc/defs.h b/src/server/tfc/defs.h new file mode 100644 index 00000000..c6c2f0ab --- /dev/null +++ b/src/server/tfc/defs.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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" diff --git a/src/server/tfc/gamerules.cpp b/src/server/tfc/gamerules.cpp index ea283f69..d7f222fb 100644 --- a/src/server/tfc/gamerules.cpp +++ b/src/server/tfc/gamerules.cpp @@ -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 diff --git a/src/server/tfc/gamerules.h b/src/server/tfc/gamerules.h new file mode 100644 index 00000000..02451c2e --- /dev/null +++ b/src/server/tfc/gamerules.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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; +}; diff --git a/src/server/tfc/progs.src b/src/server/tfc/progs.src index 97a1c1ae..204684dc 100755 --- a/src/server/tfc/progs.src +++ b/src/server/tfc/progs.src @@ -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 diff --git a/src/server/valve/client.c b/src/server/valve/client.c index 6aefc49e..2a81dca8 100644 --- a/src/server/valve/client.c +++ b/src/server/valve/client.c @@ -19,7 +19,7 @@ void Game_RunClientCommand(void) { Footsteps_Update(); - QPhysics_Run(self); + PMove_Run(); } /* custom chat packet */ diff --git a/src/server/valve/defs.h b/src/server/valve/defs.h index 2883edce..c6c2f0ab 100644 --- a/src/server/valve/defs.h +++ b/src/server/valve/defs.h @@ -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" diff --git a/src/server/valve/gamerules.cpp b/src/server/valve/gamerules.cpp index 99aeb053..cd5fe026 100644 --- a/src/server/valve/gamerules.cpp +++ b/src/server/valve/gamerules.cpp @@ -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) { diff --git a/src/server/valve/gamerules.h b/src/server/valve/gamerules.h new file mode 100644 index 00000000..1609cbfd --- /dev/null +++ b/src/server/valve/gamerules.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * 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; +}; diff --git a/src/server/valve/gamerules_singleplayer.cpp b/src/server/valve/gamerules_singleplayer.cpp index 38ca06fd..c40b10e3 100644 --- a/src/server/valve/gamerules_singleplayer.cpp +++ b/src/server/valve/gamerules_singleplayer.cpp @@ -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) { diff --git a/src/server/valve/progs.src b/src/server/valve/progs.src index 5a657a9f..bb77bd6f 100755 --- a/src/server/valve/progs.src +++ b/src/server/valve/progs.src @@ -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 diff --git a/src/shared/cstrike/w_c4bomb.c b/src/shared/cstrike/w_c4bomb.c index 6ff99818..a23b98cb 100644 --- a/src/shared/cstrike/w_c4bomb.c +++ b/src/shared/cstrike/w_c4bomb.c @@ -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 } diff --git a/src/shared/cstrike/w_m4a1.c b/src/shared/cstrike/w_m4a1.c index 1bfbdb46..48e79932 100644 --- a/src/shared/cstrike/w_m4a1.c +++ b/src/shared/cstrike/w_m4a1.c @@ -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 diff --git a/src/shared/math.h b/src/shared/math.h index 5bf2750c..e2a7b291 100644 --- a/src/shared/math.h +++ b/src/shared/math.h @@ -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 diff --git a/src/shared/pmove.c b/src/shared/pmove.c index e76c83e0..a4b9c0c8 100644 --- a/src/shared/pmove.c +++ b/src/shared/pmove.c @@ -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(); }