From 2cee375ce50f169f5c3d5784bacc2f6cc2674ef7 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Mon, 20 Apr 2020 06:44:47 +0200 Subject: [PATCH] Lots of commits bundled into one: - Added GamePMove_Fall and GamePMove_Jump for controlling either. - Tweaked maxspeed for Counter-Strike heavily. - Worked on the Counter-Strike WEAPON_KNIFE (fully functional!). - Worked on the Counter-Strike WEAPON_AWP (mainly zoom). - The WEAPON_C4 in Counter-Strike will no longer unfreeze you during warmup - Added cl_showtriggers for displaying brush-based triggers. - Removed muzzleflash dynamic light, as it seems GoldSrc doesn't have any. - Fixed bug in which the server-list would run into an infinite loop error. - Fixed weapon pricing in Counter-Strike. - To rescue hostages means to earn $$$ --- .../data.pk3dir/sound/weapons_cstrike.sndshd | 5 + src/client/cstrike/progs.src | 7 +- src/client/gearbox/progs.src | 4 - src/client/hunger/progs.src | 4 - src/client/poke646/progs.src | 4 - src/client/rewolf/progs.src | 4 - src/client/scihunt/progs.src | 4 - src/client/tfc/progs.src | 4 - src/client/valve/progs.src | 4 - src/client/view.c | 6 +- src/gs-entbase/baseentity.h | 3 +- src/gs-entbase/client/baseentity.cpp | 11 ++ src/gs-entbase/materials.h | 29 ----- src/gs-entbase/server/basetrigger.cpp | 3 +- src/gs-entbase/server/trigger_transition.cpp | 3 +- src/menu-fn/m_controls.cpp | 6 +- src/menu-fn/m_internetgames.cpp | 12 +- src/menu-fn/m_langames.cpp | 12 +- src/menu-fn/m_loadgame.cpp | 10 +- src/menu-fn/m_videomodes.cpp | 2 +- src/menu-fn/w_listbox.cpp | 8 +- src/server/cstrike/buy.c | 57 ++++----- src/server/cstrike/defs.h | 1 + src/server/cstrike/func_buyzone.cpp | 23 ++-- src/server/cstrike/func_hostage_rescue.cpp | 27 ++-- src/server/cstrike/game_money.c | 3 - src/server/cstrike/gamerules_multiplayer.cpp | 6 +- src/server/cstrike/info_buyzone.cpp | 50 ++++++++ src/server/cstrike/info_hostage_rescue.cpp | 30 ++++- src/server/cstrike/money.h | 27 ++++ src/server/cstrike/progs.src | 9 +- src/server/gearbox/progs.src | 4 - src/server/hunger/progs.src | 4 - src/server/poke646/progs.src | 4 - src/server/rewolf/progs.src | 4 - src/server/scihunt/progs.src | 4 - src/server/tfc/progs.src | 4 - src/server/valve/progs.src | 4 - src/shared/cstrike/defs.h | 1 + src/shared/cstrike/pmove.c | 117 +++++++++++++----- src/shared/cstrike/w_awp.c | 72 ++++++++--- src/shared/cstrike/w_c4bomb.c | 2 +- src/shared/cstrike/w_deagle.c | 1 - src/shared/cstrike/w_knife.c | 90 +++++++++++--- src/shared/cstrike/w_mp5.c | 2 +- src/shared/defs.h | 21 +++- src/shared/flags.h | 31 ++++- src/shared/materials.h | 49 ++++---- src/shared/pmove.c | 60 ++------- src/shared/valve/pmove.c | 66 ++++++++++ src/shared/valve/weapon_common.c | 1 + 51 files changed, 578 insertions(+), 341 deletions(-) create mode 100644 src/server/cstrike/info_buyzone.cpp create mode 100644 src/server/cstrike/money.h diff --git a/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd b/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd index 371dbdd3..901a514d 100644 --- a/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd +++ b/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd @@ -14,6 +14,11 @@ weapon_awp.fire sample weapons/awp1.wav } +weapon_awp.zoom +{ + sample weapons/zoom.wav +} + weapon_c4bomb.disarm { sample weapons/c4_disarm.wav diff --git a/src/client/cstrike/progs.src b/src/client/cstrike/progs.src index b316986e..aa26877c 100644 --- a/src/client/cstrike/progs.src +++ b/src/client/cstrike/progs.src @@ -5,15 +5,12 @@ #define CLIENT #define VALVE #define CSTRIKE +#define CLASSIC_VGUI #includelist ../../shared/fteextensions.qc ../../shared/defs.h ../../shared/cstrike/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../cstrike/defs.h ../valve/particles.h @@ -48,10 +45,8 @@ predict.c ../npc.c ../../shared/cstrike/radio.c -../../shared/cstrike/items.h ../../shared/cstrike/weapons_cstrike.c ../../shared/valve/weapon_common.h -../../shared/cstrike/weapons.h ../../shared/cstrike/w_ak47.c ../../shared/cstrike/w_deagle.c ../../shared/cstrike/w_knife.c diff --git a/src/client/gearbox/progs.src b/src/client/gearbox/progs.src index d883bad8..c34dc2d4 100644 --- a/src/client/gearbox/progs.src +++ b/src/client/gearbox/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/hunger/progs.src b/src/client/hunger/progs.src index 921dc722..9c1078d0 100644 --- a/src/client/hunger/progs.src +++ b/src/client/hunger/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/poke646/progs.src b/src/client/poke646/progs.src index 2f69ff89..c7a39da5 100644 --- a/src/client/poke646/progs.src +++ b/src/client/poke646/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/rewolf/progs.src b/src/client/rewolf/progs.src index b354626e..58474964 100755 --- a/src/client/rewolf/progs.src +++ b/src/client/rewolf/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/scihunt/progs.src b/src/client/scihunt/progs.src index fe4d2773..8305f875 100644 --- a/src/client/scihunt/progs.src +++ b/src/client/scihunt/progs.src @@ -8,10 +8,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/tfc/progs.src b/src/client/tfc/progs.src index 7e5d6cb6..f4906c68 100755 --- a/src/client/tfc/progs.src +++ b/src/client/tfc/progs.src @@ -8,10 +8,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/valve/progs.src b/src/client/valve/progs.src index c98a751f..9046b6a0 100755 --- a/src/client/valve/progs.src +++ b/src/client/valve/progs.src @@ -8,10 +8,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../valve/defs.h ../valve/particles.h diff --git a/src/client/view.c b/src/client/view.c index e8295b56..47a54599 100644 --- a/src/client/view.c +++ b/src/client/view.c @@ -141,7 +141,7 @@ void View_DrawViewModel(void) if (pl.health <= 0) { return; } - + if (cvar("r_drawviewmodel") == 0 || autocvar_cl_thirdperson == TRUE) { return; } @@ -165,7 +165,7 @@ void View_DrawViewModel(void) /* now apply the scale hack */ m_eViewModel.scale = autocvar_r_viewmodelscale; pSeat->m_flBob *= autocvar_r_viewmodelscale; - + m_eViewModel.origin = pSeat->m_vecPredictedOrigin + pl.view_ofs; m_eViewModel.origin += [0,0,-1] + (v_forward * (pSeat->m_flBob * 0.4)) + (v_forward * autocvar_v_gunofs[0]) @@ -190,7 +190,7 @@ void View_DrawViewModel(void) if (m_eMuzzleflash.alpha > 0.0f) { makevectors(getproperty(VF_ANGLES)); m_eMuzzleflash.origin = gettaginfo(m_eViewModel, m_eMuzzleflash.skin); - dynamiclight_add(pSeat->m_vecPredictedOrigin + (v_forward * 32), 400 * m_eMuzzleflash.alpha, [1,0.45,0]); + /*dynamiclight_add(pSeat->m_vecPredictedOrigin + (v_forward * 32), 400 * m_eMuzzleflash.alpha, [1,0.45,0]);*/ setorigin(m_eMuzzleflash, m_eMuzzleflash.origin); addentity(m_eMuzzleflash); diff --git a/src/gs-entbase/baseentity.h b/src/gs-entbase/baseentity.h index 3fc58d37..6235ff8c 100644 --- a/src/gs-entbase/baseentity.h +++ b/src/gs-entbase/baseentity.h @@ -24,7 +24,8 @@ enum RM_TEXTURE, RM_GLOW, RM_SOLID, - RM_ADDITIVE + RM_ADDITIVE, + RM_TRIGGER }; enum diff --git a/src/gs-entbase/client/baseentity.cpp b/src/gs-entbase/client/baseentity.cpp index 564cdcb9..1a6f068e 100644 --- a/src/gs-entbase/client/baseentity.cpp +++ b/src/gs-entbase/client/baseentity.cpp @@ -14,6 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +var int autocvar_cl_showtriggers = FALSE; + string __fullspawndata; string Sentences_GetSamples(string); @@ -74,6 +76,15 @@ CBaseEntity::RenderFXPass(void) case RM_ADDITIVE: effects = EF_ADDITIVE; break; + case RM_TRIGGER: + if (autocvar_cl_showtriggers) { + effects = EF_FULLBRIGHT; + alpha = 0.75f; + colormod = [1,0,0]; + } else { + alpha = 0.0f; + } + break; } /* messy hologram imitation */ diff --git a/src/gs-entbase/materials.h b/src/gs-entbase/materials.h index c888383f..3219d938 100644 --- a/src/gs-entbase/materials.h +++ b/src/gs-entbase/materials.h @@ -49,32 +49,3 @@ enum #define SURF_ALPHASHADOW 0x10000i /* do per-pixel light shadow casting in q3map */ #define SURF_NODLIGHT 0x20000i /* don't dlight even if solid (solid lava, skies) */ #define SURF_DUST 0x40000i /* leave a dust trail when walking on this surface */ - -/* behaviour surfaceflags */ -#define SURF_LEAKSTEAM 0x00080000i /* when shot, the material emits steam */ -#define SURF_LEAKWATER 0x00100000i /* when shot, the material emits water */ -#define SURF_RESERVED1 0x00200000i -#define SURF_RESERVED2 0x00400000i -#define SURF_RESERVED3 0x00800000i -#define SURF_RESERVED4 0x01000000i -#define SURF_RESERVED5 0x02000000i -#define SURF_RESERVED6 0x04000000i -#define SURF_RESERVED7 0x08000000i - -/* material surfaceflags (need to be masked) */ -#define SURF_MASK 0x0FFFFFFFi -#define SURF_ALIEN 0x10000000i -#define SURF_FLESH 0x20000000i -#define SURF_FOLIAGE 0x30000000i -#define SURF_COMPUTER 0x40000000i -#define SURF_DIRT 0x50000000i -#define SURF_VENT 0x60000000i -#define SURF_GRATE 0x70000000i -#define SURF_METAL 0x80000000i -#define SURF_GLASS 0x90000000i -#define SURF_SAND 0xA0000000i -#define SURF_SLOSH 0xB0000000i -#define SURF_SNOW 0xC0000000i -#define SURF_TILE 0xD0000000i -#define SURF_WOOD 0xE0000000i -#define SURF_CONCRETE 0xF0000000i diff --git a/src/gs-entbase/server/basetrigger.cpp b/src/gs-entbase/server/basetrigger.cpp index 17006e6c..cc1689ec 100644 --- a/src/gs-entbase/server/basetrigger.cpp +++ b/src/gs-entbase/server/basetrigger.cpp @@ -133,8 +133,7 @@ CBaseTrigger::InitBrushTrigger(void) setmodel(this, m_oldModel); movetype = MOVETYPE_NONE; solid = SOLID_BSPTRIGGER; - m_iRenderMode = RM_COLOR; - m_flRenderAmt = 0.25f; + m_iRenderMode = RM_TRIGGER; } void diff --git a/src/gs-entbase/server/trigger_transition.cpp b/src/gs-entbase/server/trigger_transition.cpp index a9a8b064..5eb20ab8 100644 --- a/src/gs-entbase/server/trigger_transition.cpp +++ b/src/gs-entbase/server/trigger_transition.cpp @@ -21,7 +21,7 @@ Currently unused. This is meant for defining level transition regions. All entities touching this volume would carry across to the next level. */ -class trigger_transition +class trigger_transition:CBaseEntity { void(void) trigger_transition; }; @@ -34,4 +34,5 @@ trigger_transition::trigger_transition(void) setmodel(this, model); model = __NULL__; modelindex = 0; + m_iRenderMode = RM_TRIGGER; } diff --git a/src/menu-fn/m_controls.cpp b/src/menu-fn/m_controls.cpp index c0113bf9..e0f0de65 100644 --- a/src/menu-fn/m_controls.cpp +++ b/src/menu-fn/m_controls.cpp @@ -69,9 +69,9 @@ void ctrl_lb_clicked(int val) { static float clicked_last; static int val_last; - ctrl_lbActDesc.SetSelected(val); - ctrl_lbActBind1.SetSelected(val); - ctrl_lbActBind2.SetSelected(val); + ctrl_lbActDesc.SetSelected(val, FALSE); + ctrl_lbActBind1.SetSelected(val, FALSE); + ctrl_lbActBind2.SetSelected(val, FALSE); if (ctrl_lbActBind3.GetItem(val) == "blank") { return; diff --git a/src/menu-fn/m_internetgames.cpp b/src/menu-fn/m_internetgames.cpp index b1b3d3cc..65044315 100644 --- a/src/menu-fn/m_internetgames.cpp +++ b/src/menu-fn/m_internetgames.cpp @@ -119,12 +119,12 @@ void inet_btnrefresh(void) void inet_lb_clicked(int val) { - inet_lbServers_Name.SetSelected(val); - inet_lbServers_Ping.SetSelected(val); - inet_lbServers_Map.SetSelected(val); - inet_lbServers_Game.SetSelected(val); - inet_lbServers_Players.SetSelected(val); - inet_lbServers_Addresses.SetSelected(val); + inet_lbServers_Name.SetSelected(val, FALSE); + inet_lbServers_Ping.SetSelected(val, FALSE); + inet_lbServers_Map.SetSelected(val, FALSE); + inet_lbServers_Game.SetSelected(val, FALSE); + inet_lbServers_Players.SetSelected(val, FALSE); + inet_lbServers_Addresses.SetSelected(val, FALSE); } void inet_lb_changed(int val) { diff --git a/src/menu-fn/m_langames.cpp b/src/menu-fn/m_langames.cpp index 3c533772..f9817322 100644 --- a/src/menu-fn/m_langames.cpp +++ b/src/menu-fn/m_langames.cpp @@ -113,12 +113,12 @@ void lan_btnrefresh(void) void lan_lb_clicked(int val) { - lan_lbServers_Name.SetSelected(val); - lan_lbServers_Ping.SetSelected(val); - lan_lbServers_Map.SetSelected(val); - lan_lbServers_Game.SetSelected(val); - lan_lbServers_Players.SetSelected(val); - lan_lbServers_Addresses.SetSelected(val); + lan_lbServers_Name.SetSelected(val, FALSE); + lan_lbServers_Ping.SetSelected(val, FALSE); + lan_lbServers_Map.SetSelected(val, FALSE); + lan_lbServers_Game.SetSelected(val, FALSE); + lan_lbServers_Players.SetSelected(val, FALSE); + lan_lbServers_Addresses.SetSelected(val, FALSE); } void lan_lb_changed(int val) diff --git a/src/menu-fn/m_loadgame.cpp b/src/menu-fn/m_loadgame.cpp index fbbdbcb9..a4ba9402 100644 --- a/src/menu-fn/m_loadgame.cpp +++ b/src/menu-fn/m_loadgame.cpp @@ -32,6 +32,12 @@ void lg_btnload(void) localcmd(sprintf("load %s\n", g_savegames[i])); } +void lg_btnunsave(void) +{ + int i = lg_lbSaves.GetSelected(); + localcmd(sprintf("unsavegame %s\n", g_savegames[i])); +} + void lg_btncancel_start(void) { static void lg_btncancel_end(void) { @@ -69,7 +75,7 @@ void menu_loadgame_refreshsaves(void) lg_lbSaves.AddEntry(g_savegames[i]); } search_end(searchy); - lg_lbSaves.SetSelected(0); + lg_lbSaves.SetSelected(0, TRUE); } void menu_loadgame_init(void) @@ -84,7 +90,7 @@ void menu_loadgame_init(void) lg_btnDelete = spawn(CMainButton); lg_btnDelete.SetImage(BTN_DELETE); - lg_btnDelete.SetExecute(__NULL__); + lg_btnDelete.SetExecute(lg_btnunsave); lg_btnDelete.SetPos(50,172); Widget_Add(fn_loadgame, lg_btnDelete); diff --git a/src/menu-fn/m_videomodes.cpp b/src/menu-fn/m_videomodes.cpp index 0fcfc23c..8e434f40 100644 --- a/src/menu-fn/m_videomodes.cpp +++ b/src/menu-fn/m_videomodes.cpp @@ -160,7 +160,7 @@ void menu_videomodes_init(void) for (int i = 0; i < g_resolutions.length; i++) { tokenizebyseparator(g_resolutions[i], "x"); if (stof(argv(0)) == physres[0] && stof(argv(1)) == physres[1]) { - vm_lbRes.SetSelected(i); + vm_lbRes.SetSelected(i, FALSE); } vm_lbRes.AddEntry(g_resolutions[i]); } diff --git a/src/menu-fn/w_listbox.cpp b/src/menu-fn/w_listbox.cpp index 74b1cf49..87c563d2 100644 --- a/src/menu-fn/w_listbox.cpp +++ b/src/menu-fn/w_listbox.cpp @@ -35,7 +35,7 @@ class CListBox:CWidget virtual void(void(int val) func) SetChanged; virtual string(int) GetItem; virtual void(int, string) SetItem; - virtual void(int i) SetSelected; + virtual void(int, int) SetSelected; virtual string() GetSelectedItem; virtual int(void) GetSelected; virtual int(void) GetCount; @@ -81,7 +81,7 @@ void CListBox::Input(float type, float x, float y, float devid) if (Util_CheckMouse(pos[0], pos[1], m_size[0], 15)) { if (type == IE_KEYDOWN) { if (x == K_MOUSE1) { - SetSelected(i); + SetSelected(i, TRUE); break; } } @@ -126,7 +126,7 @@ void CListBox::SetChanged(void(int val) func) m_execute = func; } -void CListBox::SetSelected(int i) +void CListBox::SetSelected(int i, int exec) { if (m_entries[i] == __NULL__) { return; @@ -134,7 +134,7 @@ void CListBox::SetSelected(int i) m_selected = i; - if (m_execute) { + if (m_execute && exec) { m_execute(i); } } diff --git a/src/server/cstrike/buy.c b/src/server/cstrike/buy.c index 496a767f..58889393 100644 --- a/src/server/cstrike/buy.c +++ b/src/server/cstrike/buy.c @@ -14,36 +14,37 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +/* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ int g_cstrikeWeaponPrice[] = { - WEAPON_NONE, - WEAPON_M3, - WEAPON_XM1014, - WEAPON_MP5, - WEAPON_P90, - WEAPON_UMP45, - WEAPON_MAC10, - WEAPON_TMP, - WEAPON_AK47, - WEAPON_SG552, - WEAPON_M4A1, - WEAPON_AUG, - WEAPON_SCOUT, - WEAPON_AWP, - WEAPON_G3SG1, - WEAPON_SG550, - WEAPON_PARA, - WEAPON_USP45, - WEAPON_GLOCK18, - WEAPON_DEAGLE, - WEAPON_P228, - WEAPON_ELITES, - WEAPON_FIVESEVEN, - WEAPON_KNIFE, - WEAPON_HEGRENADE, - WEAPON_FLASHBANG, - WEAPON_SMOKEGRENADE, - WEAPON_C4BOMB + 0, /* WEAPON_NONE */ + 1700, /* WEAPON_M3 */ + 3000, /* WEAPON_XM1014 */ + 1500, /* WEAPON_MP5 */ + 2350, /* WEAPON_P90 */ + 1700, /* WEAPON_UMP45 */ + 1400, /* WEAPON_MAC10 */ + 1250, /* WEAPON_TMP */ + 2500, /* WEAPON_AK47 */ + 3500, /* WEAPON_SG552 */ + 3100, /* WEAPON_M4A1 */ + 3500, /* WEAPON_AUG */ + 2750, /* WEAPON_SCOUT */ + 4750, /* WEAPON_AWP */ + 5000, /* WEAPON_G3SG1 */ + 4200, /* WEAPON_SG550 */ + 5750, /* WEAPON_PARA */ + 500, /* WEAPON_USP45 */ + 400, /* WEAPON_GLOCK18 */ + 650, /* WEAPON_DEAGLE */ + 600, /* WEAPON_P228 */ + 800, /* WEAPON_ELITES */ + 750, /* WEAPON_FIVESEVEN */ + 0, /* WEAPON_KNIFE */ + 300, /* WEAPON_HEGRENADE */ + 200, /* WEAPON_FLASHBANG */ + 300, /* WEAPON_SMOKEGRENADE */ + 0 /* WEAPON_C4BOMB */ }; void diff --git a/src/server/cstrike/defs.h b/src/server/cstrike/defs.h index f86deeaf..70c36f02 100644 --- a/src/server/cstrike/defs.h +++ b/src/server/cstrike/defs.h @@ -15,6 +15,7 @@ */ #include "gamerules.h" +#include "money.h" var int g_cstrike_buying = 0; var float g_cstrike_bombradius = 500; diff --git a/src/server/cstrike/func_buyzone.cpp b/src/server/cstrike/func_buyzone.cpp index c4c8fe0d..aee574bf 100644 --- a/src/server/cstrike/func_buyzone.cpp +++ b/src/server/cstrike/func_buyzone.cpp @@ -40,10 +40,12 @@ Choices for 'team' include: 2 = Counter-Terrorist */ -class func_buyzone +class func_buyzone:CBaseTrigger { void(void) func_buyzone; + virtual void(void) touch; + virtual void(void) Respawn; }; void @@ -57,18 +59,15 @@ func_buyzone::touch(void) pl.buyzone = TRUE; } +void +func_buyzone::Respawn(void) +{ + InitBrushTrigger(); +} + void func_buyzone::func_buyzone(void) { - angles = [0,0,0]; - movetype = MOVETYPE_NONE; - solid = SOLID_TRIGGER; - - if (model) { - setmodel(this, model); - } else { - mins = [-128,-128,-36]; - maxs = [128,128,36]; - setsize(this, mins, maxs); - } + CBaseTrigger::CBaseTrigger(); + InitBrushTrigger(); } diff --git a/src/server/cstrike/func_hostage_rescue.cpp b/src/server/cstrike/func_hostage_rescue.cpp index b9c32168..d6c8b735 100644 --- a/src/server/cstrike/func_hostage_rescue.cpp +++ b/src/server/cstrike/func_hostage_rescue.cpp @@ -28,10 +28,12 @@ If neither a func_hostage_rescue or a info_hostage_rescue is placed, zones will be placed in Counter-Terrorist player spawn nodes automatically. */ -class func_hostage_rescue +class func_hostage_rescue:CBaseTrigger { void(void) func_hostage_rescue; + virtual void(void) touch; + virtual void(void) Respawn; }; void @@ -50,28 +52,25 @@ func_hostage_rescue::touch(void) Radio_BroadcastMessage(RADIO_RESCUED); g_cs_hostagesrescued++; - //Money_AddMoney(hosty.m_eFollowing, 1000); + Money_AddMoney(hosty.m_eFollowing, 1000); /* In Hostage Rescue, all Counter-Terrorists receive an $850 * bonus for every hostage they rescue, even if they lose the round. */ - //Money_QueTeamReward(TEAM_CT, 850); + Money_QueTeamReward(TEAM_CT, 850); CBaseEntity targa = (CBaseEntity)other; targa.Hide(); } +void +func_hostage_rescue::Respawn(void) +{ + InitBrushTrigger(); +} + void func_hostage_rescue::func_hostage_rescue(void) { - angles = [0,0,0]; - movetype = MOVETYPE_NONE; - solid = SOLID_TRIGGER; - - if (model) { - setmodel(this, model); - } else { - mins = [-128,-128,-36]; - maxs = [128,128,36]; - setsize(this, mins, maxs); - } + CBaseTrigger::CBaseTrigger(); + InitBrushTrigger(); } diff --git a/src/server/cstrike/game_money.c b/src/server/cstrike/game_money.c index 2d8985a4..5c748a94 100644 --- a/src/server/cstrike/game_money.c +++ b/src/server/cstrike/game_money.c @@ -14,9 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -int g_cs_moneyreward_ct; -int g_cs_moneyreward_t; - void Money_AddMoney(player pl, int iMoneyValue) { diff --git a/src/server/cstrike/gamerules_multiplayer.cpp b/src/server/cstrike/gamerules_multiplayer.cpp index c7ee41f9..0ada49a0 100644 --- a/src/server/cstrike/gamerules_multiplayer.cpp +++ b/src/server/cstrike/gamerules_multiplayer.cpp @@ -75,7 +75,7 @@ CSMultiplayerRules::CreateRescueZones(void) /* since no buyzones are available, let's create one around every CT spawn */ for (entity e = world; (e = find(e, ::classname, "info_player_start"));) { - func_hostage_rescue newzone = spawn(func_hostage_rescue); + info_hostage_rescue newzone = spawn(info_hostage_rescue); setorigin(newzone, e.origin); } } @@ -98,7 +98,7 @@ CSMultiplayerRules::CreateCTBuyzones(void) /* since no buyzones are available, let's create one around every CT spawn */ for (entity e = world; (e = find(e, ::classname, "info_player_start"));) { - func_buyzone newzone = spawn(func_buyzone); + info_buyzone newzone = spawn(info_buyzone); setorigin(newzone, e.origin); newzone.team = TEAM_CT; } @@ -122,7 +122,7 @@ CSMultiplayerRules::CreateTBuyzones(void) /* since no buyzones are available, let's create one around every T spawn */ for (entity e = world; (e = find(e, ::classname, "info_player_deathmatch"));) { - func_buyzone newzone = spawn(func_buyzone); + info_buyzone newzone = spawn(info_buyzone); setorigin(newzone, e.origin); newzone.team = TEAM_T; } diff --git a/src/server/cstrike/info_buyzone.cpp b/src/server/cstrike/info_buyzone.cpp new file mode 100644 index 00000000..24bbce10 --- /dev/null +++ b/src/server/cstrike/info_buyzone.cpp @@ -0,0 +1,50 @@ +/* + * 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. + */ + +/*QUAKED info_buyzone (0 0 0.8) (-16 -16 0) (16 16 16) +"targetname" Name +"target" Target when triggered. +"killtarget" Target to kill when triggered. + +COUNTER-STRIKE (1999) ENTITY + +Buy zone. +See func_buyzone for more information. +*/ + +class info_buyzone +{ + void(void) info_buyzone; + virtual void(void) touch; +}; + +void +info_buyzone::touch(void) +{ + player pl = (player)other; + if (!(other.flags & FL_CLIENT)) { + return; + } + + pl.buyzone = TRUE; +} + +void +info_buyzone::info_buyzone(void) +{ + solid = SOLID_TRIGGER; + setsize(this, [-128,-128,-128], [128,128,128]); +} diff --git a/src/server/cstrike/info_hostage_rescue.cpp b/src/server/cstrike/info_hostage_rescue.cpp index d9004c59..c36e39c5 100644 --- a/src/server/cstrike/info_hostage_rescue.cpp +++ b/src/server/cstrike/info_hostage_rescue.cpp @@ -32,10 +32,38 @@ zones will be placed in Counter-Terrorist player spawn nodes automatically. class info_hostage_rescue { void(void) info_hostage_rescue; + virtual void(void) touch; }; +void +info_hostage_rescue::touch(void) +{ + if (other.classname != "hostage_entity") { + return; + } + + CBaseNPC hosty = (CBaseNPC)other; + + if (hosty.solid == SOLID_NOT) { + return; + } + + Radio_BroadcastMessage(RADIO_RESCUED); + g_cs_hostagesrescued++; + + Money_AddMoney(hosty.m_eFollowing, 1000); + + /* In Hostage Rescue, all Counter-Terrorists receive an $850 + * bonus for every hostage they rescue, even if they lose the round. */ + Money_QueTeamReward(TEAM_CT, 850); + + CBaseEntity targa = (CBaseEntity)other; + targa.Hide(); +} + void info_hostage_rescue::info_hostage_rescue(void) { - + solid = SOLID_TRIGGER; + setsize(this, [-128,-128,-128], [128,128,128]); } diff --git a/src/server/cstrike/money.h b/src/server/cstrike/money.h new file mode 100644 index 00000000..6e7df108 --- /dev/null +++ b/src/server/cstrike/money.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016-2019 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. + */ + +int g_cs_moneyreward_ct; +int g_cs_moneyreward_t; + +void Money_AddMoney(player pl, int iMoneyValue); +void Money_QueTeamReward(int t, int iMoneyValue); +void Money_GiveTeamReward(void); +void Money_ResetTeamReward(void); +int Money_GetLosses(int team); +int Money_HasBonus(int team); +void Money_HandleRoundReward(int winner) +void Money_ResetRoundReward(void); diff --git a/src/server/cstrike/progs.src b/src/server/cstrike/progs.src index a6c3493a..ee4297a5 100755 --- a/src/server/cstrike/progs.src +++ b/src/server/cstrike/progs.src @@ -10,10 +10,6 @@ ../../shared/fteextensions.qc ../../shared/defs.h ../../shared/cstrike/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h @@ -36,10 +32,8 @@ ../valve/spectator.c ../../shared/cstrike/radio.c -../../shared/cstrike/items.h ../../shared/cstrike/weapons_cstrike.c ../../shared/valve/weapon_common.h -../../shared/cstrike/weapons.h ../../shared/cstrike/w_ak47.c ../../shared/cstrike/w_deagle.c ../../shared/cstrike/w_knife.c @@ -75,10 +69,11 @@ ../cstrike/armoury_entity.cpp ../cstrike/func_bomb_target.cpp ../cstrike/func_buyzone.cpp +../cstrike/info_buyzone.cpp ../cstrike/func_escapezone.cpp ../cstrike/func_hostage_rescue.cpp -../cstrike/func_vip_safetyzone.cpp ../cstrike/info_hostage_rescue.cpp +../cstrike/func_vip_safetyzone.cpp ../cstrike/info_map_parameters.cpp ../cstrike/item_suit.cpp diff --git a/src/server/gearbox/progs.src b/src/server/gearbox/progs.src index 651d4fa4..01e243ac 100755 --- a/src/server/gearbox/progs.src +++ b/src/server/gearbox/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/server/hunger/progs.src b/src/server/hunger/progs.src index 0b25d3d4..9a66a822 100755 --- a/src/server/hunger/progs.src +++ b/src/server/hunger/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/server/poke646/progs.src b/src/server/poke646/progs.src index dabe36ce..5cc165e5 100755 --- a/src/server/poke646/progs.src +++ b/src/server/poke646/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/server/rewolf/progs.src b/src/server/rewolf/progs.src index d6959ea3..12193d17 100755 --- a/src/server/rewolf/progs.src +++ b/src/server/rewolf/progs.src @@ -8,10 +8,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/server/scihunt/progs.src b/src/server/scihunt/progs.src index 0025b893..bded990a 100755 --- a/src/server/scihunt/progs.src +++ b/src/server/scihunt/progs.src @@ -9,10 +9,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/server/tfc/progs.src b/src/server/tfc/progs.src index a08e1648..d4cea2b3 100755 --- a/src/server/tfc/progs.src +++ b/src/server/tfc/progs.src @@ -8,10 +8,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/server/valve/progs.src b/src/server/valve/progs.src index 0ce7202f..30125ab9 100755 --- a/src/server/valve/progs.src +++ b/src/server/valve/progs.src @@ -8,10 +8,6 @@ #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/math.h -../../shared/materials.h -../../shared/events.h -../../shared/entities.h ../../shared/sound.c ../../shared/valve/animations.h ../defs.h diff --git a/src/shared/cstrike/defs.h b/src/shared/cstrike/defs.h index f262d485..e41ab45d 100644 --- a/src/shared/cstrike/defs.h +++ b/src/shared/cstrike/defs.h @@ -16,6 +16,7 @@ #include "radio.h" #include "weapons.h" +#include "items.h" enum { diff --git a/src/shared/cstrike/pmove.c b/src/shared/cstrike/pmove.c index d390784e..d4c743fb 100644 --- a/src/shared/cstrike/pmove.c +++ b/src/shared/cstrike/pmove.c @@ -1,98 +1,151 @@ +/* + * 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. + */ -float GamePMove_Maxspeed(player target) +.float waterlevel; +.float watertype; + +/* values courtesy of https://wiki.alliedmods.net/Cs_weapons_information */ +float +GamePMove_Maxspeed(player target) { float spd = serverkeyfloat("phy_maxspeed"); switch (target.activeweapon) { - case WEAPON_NONE: - spd *= 1.0f; - break; case WEAPON_M3: - spd *= 0.92f; + spd *= 230/250; break; case WEAPON_XM1014: - spd *= 0.96f; + spd *= 240/250; break; case WEAPON_MP5: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_P90: - spd *= 0.98f; + spd *= 245/250; break; case WEAPON_UMP45: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_MAC10: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_TMP: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_AK47: - spd *= 0.88f; + spd *= 221/250; break; case WEAPON_SG552: - spd *= 0.94f; + spd *= 235/250; break; case WEAPON_M4A1: - spd *= 0.92f; + spd *= 230/250; break; case WEAPON_AUG: - spd *= 0.96f; + spd *= 240/250; break; case WEAPON_SCOUT: - spd *= 1.04f; + spd *= 260/250; break; case WEAPON_AWP: - spd *= 0.84f; + spd *= 210/250; break; case WEAPON_G3SG1: - spd *= 0.84f; + spd *= 210/250; break; case WEAPON_SG550: - spd *= 0.84f; + spd *= 210/250; break; case WEAPON_PARA: - spd *= 0.88f; + spd *= 220/250; break; case WEAPON_USP45: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_GLOCK18: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_DEAGLE: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_P228: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_ELITES: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_FIVESEVEN: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_KNIFE: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_HEGRENADE: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_FLASHBANG: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_SMOKEGRENADE: - spd *= 1.0f; + spd *= 250/250; break; case WEAPON_C4BOMB: - spd *= 1.0f; + spd *= 250/250; break; + default: } - if (target.flags & FL_CROUCHING) + if (target.flags & FL_CROUCHING) { spd *= 0.5f; + } return spd; } + +void +GamePMove_Fall(player target, float impactspeed) +{ + if (impactspeed > 580) { +#ifdef SERVER + float fFallDamage = (impactspeed - 580) * (100 / (1024 - 580)) * 1.75f; + Damage_Apply(target, world, fFallDamage, 0, DMG_FALL); + + if (random() < 0.5) + sound(target, CHAN_AUTO, "player/pl_pain2.wav", 1.0, ATTN_NORM); + else + sound(target, CHAN_AUTO, "player/pl_pain4.wav", 1.0, ATTN_NORM); +#endif + } +} + +void +GamePMove_Jump(player target) +{ + if (target.waterlevel >= 2) { + if (target.watertype == CONTENT_WATER) { + target.velocity[2] = 100; + } else if (target.watertype == CONTENT_SLIME) { + target.velocity[2] = 80; + } else { + target.velocity[2] = 50; + } + } else { + /* slow the player down a bit to prevent bhopping like crazy */ + target.velocity *= 0.80f; + target.velocity[2] += 220; + } +} diff --git a/src/shared/cstrike/w_awp.c b/src/shared/cstrike/w_awp.c index bdfd65cf..ca947547 100644 --- a/src/shared/cstrike/w_awp.c +++ b/src/shared/cstrike/w_awp.c @@ -41,6 +41,7 @@ w_awp_precache(void) { #ifdef SERVER Sound_Precache("weapon_awp.fire"); + Sound_Precache("weapon_awp.zoom"); #endif precache_model("models/v_awp.mdl"); precache_model("models/w_awp.mdl"); @@ -51,7 +52,7 @@ void w_awp_updateammo(player pl) { #ifdef SERVER - Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_338mag, -1); + Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_338mag, pl.a_ammo3); #endif } @@ -105,12 +106,61 @@ w_awp_draw(void) #endif } + +void +w_awp_release(void) +{ + player pl = (player)self; + + w_cstrike_weaponrelease(); + + if (pl.w_idle_next > 0.0f) { + pl.viewzoom = 1.0f; + return; + } + + if (pl.a_ammo3 == 1) { + pl.viewzoom = 0.45f; + } else if (pl.a_ammo3 == 2) { + pl.viewzoom = 0.1f; + } else { + pl.viewzoom = 1.0f; + } +} + +void +w_awp_secondary(void) +{ + player pl = (player)self; + if (pl.w_attack_next) { + return; + } + +#ifdef SSQC + Sound_Play(pl, CHAN_WEAPON, "weapon_awp.zoom"); +#endif + + /* Simple toggle of fovs */ + if (pl.a_ammo3 == 1) { + pl.a_ammo3 = 2; + } else if (pl.a_ammo3 == 2) { + pl.a_ammo3 = 0; + } else { + pl.a_ammo3 = 1; + } + + pl.w_attack_next = 0.5f; + pl.w_idle_next = 0.0f; + w_awp_release(); +} + void w_awp_primary(void) { player pl = (player)self; if (pl.w_attack_next > 0.0) { + w_awp_release(); return; } @@ -159,24 +209,6 @@ w_awp_primary(void) pl.w_idle_next = pl.w_attack_next; } -void -w_awp_secondary(void) -{ - player pl = (player)self; - if (pl.w_attack_next) { - return; - } - /* Simple toggle of fovs */ - if (pl.viewzoom == 1.0f) { - pl.viewzoom = 0.45f; - } else if (pl.viewzoom == 0.45f) { - pl.viewzoom = 0.1f; - } else { - pl.viewzoom = 1.0f; - } - pl.w_attack_next = 0.5f; -} - void w_awp_reload(void) { @@ -274,7 +306,7 @@ weapon_t w_awp = w_awp_primary, w_awp_secondary, w_awp_reload, - w_cstrike_weaponrelease, + w_awp_release, w_awp_hud, w_awp_precache, w_awp_pickup, diff --git a/src/shared/cstrike/w_c4bomb.c b/src/shared/cstrike/w_c4bomb.c index a23b98cb..b6122818 100644 --- a/src/shared/cstrike/w_c4bomb.c +++ b/src/shared/cstrike/w_c4bomb.c @@ -219,7 +219,6 @@ w_c4bomb_release(void) } pl.a_ammo1 = C4S_NONE; pl.w_idle_next = 0.0f; - pl.flags &= ~FL_FROZEN; } void @@ -244,6 +243,7 @@ w_c4bomb_primary(void) break; case C4S_DROPPING: w_c4bomb_release(); + return; break; default: break; diff --git a/src/shared/cstrike/w_deagle.c b/src/shared/cstrike/w_deagle.c index 19963dcb..e9788884 100644 --- a/src/shared/cstrike/w_deagle.c +++ b/src/shared/cstrike/w_deagle.c @@ -146,7 +146,6 @@ w_deagle_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_deagle.fire"); #endif - if (pl.a_ammo1 <= 0) { Weapons_ViewAnimation(DEAGLE_SHOOT_EMPTY); } else { diff --git a/src/shared/cstrike/w_knife.c b/src/shared/cstrike/w_knife.c index e679792d..64f8d37a 100644 --- a/src/shared/cstrike/w_knife.c +++ b/src/shared/cstrike/w_knife.c @@ -27,12 +27,14 @@ Default arsenal on both teams enum { - KNIFE_IDLE, - KNIFE_RELOAD, + KNIFE_IDLE1, + KNIFE_SLASH1, + KNIFE_SLASH2, KNIFE_DRAW, - KNIFE_SHOOT1, - KNIFE_SHOOT2, - KNIFE_SHOOT3 + KNIFE_STAB, + KNIFE_STAB_MISS, + KNIFE_MIDSLASH1, + KNIFE_MIDSLASH2 }; void @@ -93,24 +95,78 @@ w_knife_primary(void) return; } -#ifdef CLIENT - View_SetMuzzleflash(MUZZLE_RIFLE); - - int r = (float)input_sequence % 3; + int r = (float)input_sequence % 2; switch (r) { case 0: - Weapons_ViewAnimation(KNIFE_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(KNIFE_SHOOT2); + Weapons_ViewAnimation(KNIFE_SLASH1); break; default: - Weapons_ViewAnimation(KNIFE_SHOOT3); + Weapons_ViewAnimation(KNIFE_SLASH2); break; } -#endif - pl.w_attack_next = 0.7f; + +#ifdef SERVER + vector src; + Weapons_MakeVectors(); + src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + Sound_Play(pl, CHAN_WEAPON, "weapon_knife.miss"); + + if (trace_fraction >= 1.0) { + return; + } + + if (trace_ent.iBleeds) { + Effect_CreateBlood(trace_endpos, [1,0,0]); + Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hitbody"); + } else { + Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hit"); + } + + if (trace_ent.takedamage) { + Damage_Apply(trace_ent, pl, 15, WEAPON_KNIFE, DMG_SLASH); + } +#endif +} + +void +w_knife_secondary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + + Weapons_ViewAnimation(KNIFE_STAB); + pl.w_attack_next = 1.2f; + +#ifdef SERVER + vector src; + Weapons_MakeVectors(); + src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + Sound_Play(pl, CHAN_WEAPON, "weapon_knife.miss"); + + if (trace_fraction >= 1.0) { + return; + } + + /* don't bother with decals, we got squibs */ + if (trace_ent.iBleeds) { + Effect_CreateBlood(trace_endpos, [1,0,0]); + Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hitbody"); + } else { + Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hit"); + } + + if (trace_ent.takedamage) { + Damage_Apply(trace_ent, pl, 65, WEAPON_KNIFE, DMG_SLASH); + } +#endif } float @@ -160,7 +216,7 @@ weapon_t w_knife = w_knife_draw, __NULL__, w_knife_primary, - __NULL__, + w_knife_secondary, __NULL__, __NULL__, __NULL__, diff --git a/src/shared/cstrike/w_mp5.c b/src/shared/cstrike/w_mp5.c index 286cda70..ed912f0e 100644 --- a/src/shared/cstrike/w_mp5.c +++ b/src/shared/cstrike/w_mp5.c @@ -272,7 +272,7 @@ weapon_t w_mp5 = #ifdef SERVER void -weapon_mp5(void) +weapon_mp5navy(void) { Weapons_InitItem(WEAPON_MP5); } diff --git a/src/shared/defs.h b/src/shared/defs.h index 3f3f7d8e..2ccc1ce1 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -17,6 +17,12 @@ #include "damage.h" #include "flags.h" #include "hitmesh.h" +#include "entities.h" +#include "events.h" +#include "flags.h" +#include "hitmesh.h" +#include "materials.h" +#include "math.h" /* Those are constant for HL BSP and CANNOT be changed. * Blame Valve for purchasing a Quake II license but not @@ -54,7 +60,8 @@ const vector VEC_PLAYER_CVIEWPOS = [0,0,12]; .float teleport_time; .vector basevelocity; -void* memrealloc(__variant *oldptr, int elementsize, int oldelements, int newelements) +void* +memrealloc(__variant *oldptr, int elementsize, int oldelements, int newelements) { void *n = memalloc(elementsize * newelements); memcpy(n, oldptr, elementsize * min(oldelements, newelements)); @@ -62,22 +69,26 @@ void* memrealloc(__variant *oldptr, int elementsize, int oldelements, int newele return n; } -__wrap __variant* memalloc(int size) +__wrap __variant* +memalloc(int size) { return prior(size); } -void Empty(void) +void +Empty(void) { } -void Util_Destroy(void) +void +Util_Destroy(void) { remove(self); } -__wrap void dprint(string m) +__wrap void +dprint(string m) { if (cvar("developer") == 1) return prior(m); diff --git a/src/shared/flags.h b/src/shared/flags.h index 508f9267..6439d8fa 100644 --- a/src/shared/flags.h +++ b/src/shared/flags.h @@ -35,8 +35,33 @@ #define FL_ONLADDER (1<<13) #define FL_FLASHLIGHT (1<<17) #define FL_REMOVEME (1<<18) -#define FL_CROUCHING (1<<19) +#define FL_CROUCHING (1<<19) #define FL_SEMI_TOGGLED (1<<20) -#define FL_FROZEN (1<<21) -#define FL_VOTED (1<<22) +#define FL_FROZEN (1<<21) +#define FL_VOTED (1<<22) #define FL_RESERVED (1<<23) + +/* game flags */ +#define GF_UNUSED1 (1<<0) +#define GF_UNUSED2 (1<<1) +#define GF_UNUSED3 (1<<2) +#define GF_UNUSED4 (1<<3) +#define GF_UNUSED5 (1<<4) +#define GF_UNUSED6 (1<<5) +#define GF_UNUSED7 (1<<6) +#define GF_UNUSED8 (1<<7) +#define GF_UNUSED9 (1<<8) +#define GF_UNUSED10 (1<<9) +#define GF_UNUSED11 (1<<10) +#define GF_UNUSED12 (1<<11) +#define GF_UNUSED13 (1<<12) +#define GF_UNUSED14 (1<<14) +#define GF_UNUSED15 (1<<16) +#define GF_UNUSED16 (1<<13) +#define GF_UNUSED17 (1<<17) +#define GF_UNUSED18 (1<<18) +#define GF_UNUSED19 (1<<19) +#define GF_UNUSED20 (1<<20) +#define GF_UNUSED21 (1<<21) +#define GF_UNUSED22 (1<<22) +#define GF_UNUSED23 (1<<23) diff --git a/src/shared/materials.h b/src/shared/materials.h index 8b331788..3fad09d7 100644 --- a/src/shared/materials.h +++ b/src/shared/materials.h @@ -37,7 +37,7 @@ enum #define SURF_LADDER 0x8i // climb this surface #define SURF_NOIMPACT 0x10i // don't make missile explosions #define SURF_NOMARKS 0x20i // don't leave missile marks -#define SURF_FLESH 0x40i // make flesh sounds and effects +#define SURF_Q3FLESH 0x40i // make flesh sounds and effects #define SURF_NODRAW 0x80i // don't generate a drawsurface at all #define SURF_HINT 0x100i // make a primary bsp splitter #define SURF_SKIP 0x200i // completely ignore, allowing non-closed brushes @@ -51,24 +51,31 @@ enum #define SURF_NODLIGHT 0x20000i // don't dlight even if solid (solid lava, skies) #define SURF_DUST 0x40000i // leave a dust trail when walking on this surface -// behaviour surfaceflags -#define SURF_LEAKSTEAM 0x80000i /* surface shoots steam when hit */ -#define SURF_LEAKWATER 0x100000i /* surface sprays water when hit */ +/* behaviour surfaceflags */ +#define SURF_LEAKSTEAM 0x00080000i /* when shot, the material emits steam */ +#define SURF_LEAKWATER 0x00100000i /* when shot, the material emits water */ +#define SURF_RESERVED1 0x00200000i +#define SURF_RESERVED2 0x00400000i +#define SURF_RESERVED3 0x00800000i +#define SURF_RESERVED4 0x01000000i +#define SURF_RESERVED5 0x02000000i +#define SURF_RESERVED6 0x04000000i +#define SURF_RESERVED7 0x08000000i -// material surfaceflags -#define SURF_MASK 0x0FFFFFFFi -#define SURF_ALIEN 0x10000000i -#define SURF_FLESH 0x20000000i -#define SURF_FOLIAGE 0x30000000i -#define SURF_COMPUTER 0x40000000i -#define SURF_DIRT 0x50000000i -#define SURF_VENT 0x60000000i -#define SURF_GRATE 0x70000000i -#define SURF_METAL 0x80000000i -#define SURF_GLASS 0x90000000i -#define SURF_SAND 0xA0000000i -#define SURF_SLOSH 0xB0000000i -#define SURF_SNOW 0xC0000000i -#define SURF_TILE 0xD0000000i -#define SURF_WOOD 0xE0000000i -#define SURF_CONCRETE 0xF0000000i +/* material surfaceflags (need to be masked) */ +#define SURF_MASK 0x0FFFFFFFi +#define SURF_ALIEN 0x10000000i +#define SURF_FLESH 0x20000000i +#define SURF_FOLIAGE 0x30000000i +#define SURF_COMPUTER 0x40000000i +#define SURF_DIRT 0x50000000i +#define SURF_VENT 0x60000000i +#define SURF_GRATE 0x70000000i +#define SURF_METAL 0x80000000i +#define SURF_GLASS 0x90000000i +#define SURF_SAND 0xA0000000i +#define SURF_SLOSH 0xB0000000i +#define SURF_SNOW 0xC0000000i +#define SURF_TILE 0xD0000000i +#define SURF_WOOD 0xE0000000i +#define SURF_CONCRETE 0xF0000000i diff --git a/src/shared/pmove.c b/src/shared/pmove.c index 13fa2a6a..aeea7a1e 100644 --- a/src/shared/pmove.c +++ b/src/shared/pmove.c @@ -14,10 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define PHY_JUMP_CHAINWINDOW 0.5 -#define PHY_JUMP_CHAIN 100 -#define PHY_JUMP_CHAINDECAY 50 - /* FIXME: jumptime should use the time global, as time intervals are not * predictable - decrement it based upon input_timelength */ .float waterlevel; @@ -27,13 +23,6 @@ int trace_endcontentsi; .vector basevelocity; -#ifdef VALVE -int Items_CheckItem(entity pl, int i) { - player pm = (player)pl; - return pm.g_items & i ? TRUE:FALSE; -} -#endif - /* serverinfo keys are the only way both client and server are kept in sync * about physics variables. so none of the traditional cvars will work. * otherwise we could not have reliable prediction code for player movement. @@ -56,7 +45,7 @@ PMove_Init(void) { #ifdef CSTRIKE localcmd("serverinfo phy_accelerate 4\n"); - localcmd("serverinfo phy_maxspeed 240\n"); + localcmd("serverinfo phy_maxspeed 250\n"); #endif #endif } @@ -455,9 +444,6 @@ PMove_AccelGravity(float move_time, float premove, vector wish_dir, float wish_s void PMove_AccelJump(float move_time, float premove) { - float flJumptimeDelta; - float flChainBonus; - /* unset jump-key whenever it's not set */ if (!(input_buttons & INPUT_BUTTON2)) { self.flags |= FL_JUMPRELEASED; @@ -476,31 +462,7 @@ PMove_AccelJump(float move_time, float premove) self.velocity[2] = 0; } - if (self.waterlevel >= 2) { - if (self.watertype == CONTENT_WATER) { - self.velocity[2] = 100; - } else if (self.watertype == CONTENT_SLIME) { - self.velocity[2] = 80; - } else { - self.velocity[2] = 50; - } - } else { - /* Half-Life: Longjump module */ - #ifdef VALVE - if (self.flags & FL_CROUCHING && Items_CheckItem(self, 0x00008000)) { - self.velocity = v_forward * 512; - self.velocity[2] += 100; - } - #endif - self.velocity[2] += 240; - } - - if (self.jumptime > 0) { - flJumptimeDelta = 0 - (self.jumptime - PHY_JUMP_CHAINWINDOW); - flChainBonus = PHY_JUMP_CHAIN - (((PHY_JUMP_CHAINWINDOW - (PHY_JUMP_CHAINWINDOW - flJumptimeDelta)) * 2) * PHY_JUMP_CHAINDECAY); - self.velocity[2] += flChainBonus; - } - self.jumptime = PHY_JUMP_CHAINWINDOW; + GamePMove_Jump((player)self); self.flags &= ~FL_ONGROUND; self.flags &= ~FL_JUMPRELEASED; } @@ -563,8 +525,6 @@ PMove_Acceleration(float move_time, float premove) self.flags &= ~FL_ONGROUND; self.velocity = wish_dir * wish_speed; } else { - PMove_AccelJump(move_time, premove); - if (self.flags & FL_ONLADDER) { PMove_AccelLadder(move_time, premove, wish_dir, wish_speed); } else if (self.flags & FL_ONGROUND) { @@ -572,6 +532,7 @@ PMove_Acceleration(float move_time, float premove) } else { PMove_AccelGravity(move_time, premove, wish_dir, wish_speed); } + PMove_AccelJump(move_time, premove); } } @@ -745,13 +706,12 @@ 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 = GamePMove_Maxspeed(self); + self.maxspeed = GamePMove_Maxspeed((player)self); /* when pressing the 'use' button, we also walk slower for precision */ if (input_buttons & INPUT_BUTTON5) { @@ -813,17 +773,13 @@ 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); + if ((self.flags & FL_ONGROUND) && self.movetype == MOVETYPE_WALK) { + GamePMove_Fall((player)self, flFallVel); } -#endif /* weapon/item logic of what the player controls */ Game_Input(); diff --git a/src/shared/valve/pmove.c b/src/shared/valve/pmove.c index f2130048..2a1993a2 100644 --- a/src/shared/valve/pmove.c +++ b/src/shared/valve/pmove.c @@ -1,4 +1,70 @@ +/* + * 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. + */ + +#define PHY_JUMP_CHAINWINDOW 0.5 +#define PHY_JUMP_CHAIN 100 +#define PHY_JUMP_CHAINDECAY 50 + +.float waterlevel; +.float watertype; + float GamePMove_Maxspeed(player target) { return (target.flags & FL_CROUCHING) ? 135 : 270; } + +void GamePMove_Fall(player target, float impactspeed) +{ + if (impactspeed > 580) { +#ifdef SERVER + float fFallDamage = (impactspeed - 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 + } +} + +void GamePMove_Jump(player target) +{ + float flJumptimeDelta; + float flChainBonus; + + if (target.waterlevel >= 2) { + if (target.watertype == CONTENT_WATER) { + target.velocity[2] = 100; + } else if (target.watertype == CONTENT_SLIME) { + target.velocity[2] = 80; + } else { + target.velocity[2] = 50; + } + } else { + /* Half-Life: Longjump module */ +#ifdef VALVE + if (target.flags & FL_CROUCHING && target.g_items & 0x00008000i) { + target.velocity = v_forward * 512; + target.velocity[2] += 100; + } +#endif + target.velocity[2] += 240; + } + + if (target.jumptime > 0) { + flJumptimeDelta = 0 - (target.jumptime - PHY_JUMP_CHAINWINDOW); + flChainBonus = PHY_JUMP_CHAIN - (((PHY_JUMP_CHAINWINDOW - (PHY_JUMP_CHAINWINDOW - flJumptimeDelta)) * 2) * PHY_JUMP_CHAINDECAY); + target.velocity[2] += flChainBonus; + } + target.jumptime = PHY_JUMP_CHAINWINDOW; +} diff --git a/src/shared/valve/weapon_common.c b/src/shared/valve/weapon_common.c index 3ba62230..9ba5e25f 100644 --- a/src/shared/valve/weapon_common.c +++ b/src/shared/valve/weapon_common.c @@ -274,6 +274,7 @@ void Weapons_SwitchBest(player pl) } Weapons_Draw(); self = oldself; + pl.flags |= FL_SEMI_TOGGLED; } /* returns TRUE if weapon pickup gets removed from this world */