From cf136dbd6c935e7bb908d3e65da7c1f5bd3d8ac7 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Tue, 7 Apr 2020 02:47:21 +0200 Subject: [PATCH] Cstrike: Finished most of the essential gun logic. --- .../data.pk3dir/sound/weapons_cstrike.sndshd | 25 +-- src/client/cstrike/crosshair.c | 80 +++++++++ src/client/cstrike/defs.h | 2 + src/client/cstrike/hud.c | 2 +- src/client/cstrike/player.c | 117 ++++++++++++ src/client/cstrike/predict.c | 45 +++++ src/client/cstrike/progs.src | 7 +- src/client/entry.c | 12 ++ src/client/gearbox/progs.src | 1 + src/client/hunger/progs.src | 1 + src/client/poke646/progs.src | 1 + src/client/predict.c | 21 ++- src/client/rewolf/progs.src | 1 + src/client/scihunt/progs.src | 1 + src/client/sentences.c | 24 +-- src/client/tfc/progs.src | 1 + src/client/valve/predict.c | 23 +++ src/client/valve/progs.src | 1 + src/gs-entbase/client/baseentity.cpp | 11 +- src/menu-fn/m_customgame.cpp | 4 + src/server/cstrike/client.c | 8 + src/server/cstrike/player.c | 6 + src/server/cstrike/progs.src | 1 + src/shared/cstrike/player.cpp | 14 ++ src/shared/cstrike/w_ak47.c | 57 +++--- src/shared/cstrike/w_aug.c | 56 +++--- src/shared/cstrike/w_awp.c | 74 ++++---- src/shared/cstrike/w_c4bomb.c | 14 +- src/shared/cstrike/w_deagle.c | 68 ++++--- src/shared/cstrike/w_elites.c | 136 ++++++++++---- src/shared/cstrike/w_fiveseven.c | 80 +++++---- src/shared/cstrike/w_flashbang.c | 13 +- src/shared/cstrike/w_g3sg1.c | 58 +++--- src/shared/cstrike/w_glock18.c | 150 ++++++++++++---- src/shared/cstrike/w_hegrenade.c | 13 +- src/shared/cstrike/w_m3.c | 127 ++++++++++---- src/shared/cstrike/w_m4a1.c | 48 +++-- src/shared/cstrike/w_mac10.c | 66 ++++--- src/shared/cstrike/w_mp5.c | 57 ++++-- src/shared/cstrike/w_p228.c | 87 +++++---- src/shared/cstrike/w_p90.c | 66 ++++--- src/shared/cstrike/w_para.c | 71 ++++---- src/shared/cstrike/w_scout.c | 57 +++--- src/shared/cstrike/w_sg550.c | 71 ++++---- src/shared/cstrike/w_sg552.c | 67 ++++--- src/shared/cstrike/w_smokegrenade.c | 12 +- src/shared/cstrike/w_tmp.c | 66 ++++--- src/shared/cstrike/w_ump45.c | 54 +++--- src/shared/cstrike/w_usp45.c | 166 ++++++++++++++---- src/shared/cstrike/w_xm1014.c | 129 ++++++++++---- src/shared/cstrike/weapons.h | 31 ++++ src/shared/cstrike/weapons_cstrike.c | 57 ++++++ src/shared/entities.h | 4 +- src/shared/hunger/w_medkit.c | 1 - src/shared/poke646/w_bradnailer.c | 10 +- src/shared/valve/w_gauss.c | 6 +- src/shared/valve/w_shotgun.c | 2 + src/shared/valve/weapon_common.c | 2 + 58 files changed, 1712 insertions(+), 673 deletions(-) create mode 100644 src/client/cstrike/crosshair.c create mode 100644 src/client/cstrike/player.c create mode 100644 src/client/cstrike/predict.c create mode 100644 src/client/valve/predict.c create mode 100644 src/shared/cstrike/weapons_cstrike.c diff --git a/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd b/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd index 8295170c..15d0a727 100644 --- a/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd +++ b/cstrike/data.pk3dir/sound/weapons_cstrike.sndshd @@ -7,13 +7,11 @@ weapon_ak47.fire weapon_aug.fire { sample weapons/aug-1.wav - sample weapons/aug-2.wav } weapon_awp.fire { - sample weapons/awp-1.wav - sample weapons/awp-2.wav + sample weapons/awp1.wav } weapon_c4bomb.disarm @@ -44,14 +42,13 @@ weapon_deagle.fire weapon_elites.fire { - sample weapons/elites-1.wav - sample weapons/elites-2.wav + sample weapons/elite_fire.wav + sample weapons/elite_fire.wav } weapon_fiveseven.fire { sample weapons/fiveseven-1.wav - sample weapons/fiveseven-2.wav } weapon_flashbang.explode @@ -62,13 +59,16 @@ weapon_flashbang.explode weapon_g3sg1.fire { sample weapons/g3sg1-1.wav - sample weapons/g3sg1-2.wav } -weapon_glock.fire +weapon_glock18.fire +{ + sample weapons/glock18-2.wav +} + +weapon_glock18.burstfire { sample weapons/glock18-1.wav - sample weapons/glock18-2.wav } weapon_grenade.bounce @@ -182,7 +182,7 @@ weapon_usp45.fire sample weapons/usp_unsil-1.wav } -weapon_usp45.silencer +weapon_usp45.silenced { sample weapons/usp1.wav sample weapons/usp2.wav @@ -192,3 +192,8 @@ weapon_xm1014.fire { sample weapons/xm1014-1.wav } + +weapon_xm1014.insertshell +{ + sample weapons/m3_insertshell.wav +} diff --git a/src/client/cstrike/crosshair.c b/src/client/cstrike/crosshair.c new file mode 100644 index 00000000..61d089b3 --- /dev/null +++ b/src/client/cstrike/crosshair.c @@ -0,0 +1,80 @@ +/* + * 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. + */ + +#define CS_CROSS_COLOR [0,1,0] +#define CS_CROSS_ALPHA 1.0f + +void +Cstrike_DrawCrosshair(void) +{ + player pl = (player)self; + int cross_dist; + int line_length; + + /* these are defined in the weapon-code files */ + float distance = pl.cs_cross_mindist; + float delta = pl.cs_cross_deltadist; + + if (!(pl.flags & FL_ONGROUND)) { + distance = distance * 2.0f; + } else if (pl.flags & FL_CROUCHING) { /* crouching... */ + distance = distance * 0.5f; + } else if (vlen(pl.velocity) > 120) { /* running, not walking */ + distance = distance * 1.5f; + } + + /* amount of shots that we've shot does affect our accuracy */ + if (pl.cs_shotmultiplier > pl.cs_old_shotmultiplier) { + pl.cs_crosshairdistance = min(15, pl.cs_crosshairdistance + delta); + } else if (pl.cs_crosshairdistance > distance) { + pl.cs_crosshairdistance -= (pl.cs_crosshairdistance * clframetime); + } + + pl.cs_old_shotmultiplier = pl.cs_shotmultiplier; + + if (pl.cs_crosshairdistance < distance) { + pl.cs_crosshairdistance = distance; + } + + cross_dist = ceil(pl.cs_crosshairdistance); + line_length = max(1, ((cross_dist - distance) / 2) + 5); + + /* line setup */ + vector vert1, vert2, hori1, hori2; + vert1 = vert2 = hori1 = hori2 = g_hudmins + (g_hudres / 2); + + /* vertical Lines */ + vert1[1] -= (cross_dist + line_length); + vert2[1] += cross_dist + 1; + + /* horizontal Lines */ + hori1[0] -= (cross_dist + line_length); + hori2[0] += cross_dist + 1; + + drawfill(vert1, [1, line_length], CS_CROSS_COLOR, CS_CROSS_ALPHA, DRAWFLAG_ADDITIVE); + drawfill(vert2, [1, line_length], CS_CROSS_COLOR, CS_CROSS_ALPHA, DRAWFLAG_ADDITIVE); + drawfill(hori1, [line_length, 1], CS_CROSS_COLOR, CS_CROSS_ALPHA, DRAWFLAG_ADDITIVE); + drawfill(hori2, [line_length, 1], CS_CROSS_COLOR, CS_CROSS_ALPHA, DRAWFLAG_ADDITIVE); +} + +/* AUG zoom uses this. so does the spectator cam */ +void +Cstrike_DrawSimpleCrosshair(void) +{ + static vector cross_pos; + cross_pos = g_hudmins + (g_hudres / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [0.1875,0], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +} diff --git a/src/client/cstrike/defs.h b/src/client/cstrike/defs.h index ede68e40..ac339819 100644 --- a/src/client/cstrike/defs.h +++ b/src/client/cstrike/defs.h @@ -13,3 +13,5 @@ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +void Cstrike_DrawCrosshair(void); diff --git a/src/client/cstrike/hud.c b/src/client/cstrike/hud.c index f1696531..5239519a 100644 --- a/src/client/cstrike/hud.c +++ b/src/client/cstrike/hud.c @@ -371,7 +371,7 @@ HUD_Draw(void) HUD_DrawFlashlight(); Damage_Draw(); - drawpic([128,128], HUD_NUMS, [256,256], [1,1,1], 1.0f); + //drawpic([128,128], HUD_NUMS, [256,256], [1,1,1], 1.0f); } /* specatator main entry */ diff --git a/src/client/cstrike/player.c b/src/client/cstrike/player.c new file mode 100644 index 00000000..a9b15fe2 --- /dev/null +++ b/src/client/cstrike/player.c @@ -0,0 +1,117 @@ +/* + * 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. + */ + +void +Player_ReadEntity(float new) +{ + float fl; + player pl = (player)self; + + if (new == TRUE) { + spawnfunc_player(); + pl.classname = "player"; + pl.solid = SOLID_SLIDEBOX; + pl.drawmask = MASK_ENGINE; + pl.customphysics = Empty; + setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); + } else { + int i; + //FIXME: splitscreen + if (pl.entnum == player_localentnum) { + //FIXME: splitscreen + pSeat = &seats[0]; + for (i = pl.sequence+1; i <= servercommandframe; i++) { + if (!getinputstate(i)) { + break; //erk?... too old? + } + input_sequence = i; + QPhysics_Run(pl); + } + + /* any differences in things that are read below are now + * officially from prediction misses. */ + } + } + + pl.sequence = servercommandframe; + + fl = readfloat(); + + /* HACK: we need to make this more reliable */ + if (fl == UPDATE_ALL) { + /* we respawned */ + pl.gravity = __NULL__; + } + + if (fl & PLAYER_MODELINDEX) + pl.modelindex = readshort(); + + if (fl & PLAYER_ORIGIN) { + pl.origin[0] = readcoord(); + pl.origin[1] = readcoord(); + } + + if (fl & PLAYER_ORIGIN_Z) + pl.origin[2] = readcoord(); + if (fl & PLAYER_ANGLES_X) + pl.pitch = readfloat(); + if (fl & PLAYER_ANGLES_Y) + pl.angles[1] = readfloat(); + if (fl & PLAYER_ANGLES_Z) + pl.angles[2] = readfloat(); + + if (fl & PLAYER_VELOCITY) { + pl.velocity[0] = readcoord(); + pl.velocity[1] = readcoord(); + } + + if (fl & PLAYER_VELOCITY_Z) + pl.velocity[2] = readcoord(); + if (fl & PLAYER_FLAGS) + pl.flags = readfloat(); + if (fl & PLAYER_WEAPON) + pl.activeweapon = readbyte(); + if (fl & PLAYER_ITEMS) + pl.g_items = (__variant)readfloat(); + if (fl & PLAYER_HEALTH) + pl.health = readbyte(); + if (fl & PLAYER_ARMOR) + pl.armor = readbyte(); + if (fl & PLAYER_MOVETYPE) + pl.movetype = readbyte(); + if (fl & PLAYER_VIEWOFS) + pl.view_ofs[2] = readfloat(); + if (fl & PLAYER_BASEFRAME) + pl.baseframe = readbyte(); + if (fl & PLAYER_FRAME) { + pl.frame = readbyte(); + pl.frame1time = 0.0f; + pl.frame2time = 0.0f; + } + if (fl & PLAYER_AMMO1) + pl.a_ammo1 = readbyte(); + if (fl & PLAYER_AMMO2) + pl.a_ammo2 = readbyte(); + if (fl & PLAYER_AMMO3) + pl.a_ammo3 = readbyte(); + + if (fl & PLAYER_CSSHOT) + pl.cs_shotmultiplier = readbyte(); + if (fl & PLAYER_CSSHOTTIME) + pl.cs_shottime = readfloat(); + + setorigin(pl, pl.origin); +} diff --git a/src/client/cstrike/predict.c b/src/client/cstrike/predict.c new file mode 100644 index 00000000..4d8e9851 --- /dev/null +++ b/src/client/cstrike/predict.c @@ -0,0 +1,45 @@ +/* + * 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. + */ + +/* +================= +Predict_PreFrame + +We're part way through parsing new player data. +Propagate our pmove state to whatever the current frame before its stomped on +(so any non-networked state updates locally). +================= +*/ +void GamePredict_PreFrame(player pl) +{ + pl.net_cs_shotmultiplier = pl.cs_shotmultiplier; + pl.net_cs_shottime = pl.cs_shottime; +} + +/* +================= +Predict_PostFrame + +We're part way through parsing new player data. +Rewind our pmove state back to before we started predicting. +(to give consistent state instead of accumulating errors) +================= +*/ +void GamePredict_PostFrame(player pl) +{ + pl.cs_shotmultiplier = pl.net_cs_shotmultiplier; + pl.cs_shottime = pl.net_cs_shottime; +} diff --git a/src/client/cstrike/progs.src b/src/client/cstrike/progs.src index 0f085df0..d52af925 100644 --- a/src/client/cstrike/progs.src +++ b/src/client/cstrike/progs.src @@ -36,15 +36,17 @@ ../voice.c ../../shared/valve/animations.h ../../shared/valve/animations.c -../../shared/valve/player.cpp +../../shared/cstrike/player.cpp ../player.c ../../shared/pmove.c +predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c ../../shared/spraylogo.cpp ../npc.c ../../shared/cstrike/items.h +../../shared/cstrike/weapons_cstrike.c ../../shared/valve/weapon_common.h ../../shared/cstrike/weapons.h ../../shared/cstrike/w_ak47.c @@ -76,7 +78,7 @@ ../../shared/cstrike/w_smokegrenade.c ../../shared/cstrike/weapons.c ../../shared/valve/weapon_common.c -../valve/player.c +../cstrike/player.c entities.c ../entities.c ../fx_lensflare.c @@ -94,6 +96,7 @@ entities.c ../cstrike/vgui_chooseteam.cpp hud.h +crosshair.c hud.c hud_weaponselect.c ../valve/scoreboard.c diff --git a/src/client/entry.c b/src/client/entry.c index 6fb9ebf4..5e5d9dcf 100644 --- a/src/client/entry.c +++ b/src/client/entry.c @@ -19,6 +19,7 @@ CSQC_Init(float apilevel, string enginename, float engineversion) { pSeat = &seats[0]; + registercommand("dev_sentence"); registercommand("fx_lenspos"); registercommand("titles_test"); registercommand("vox_test"); @@ -604,6 +605,17 @@ CSQC_ConsoleCommand(string sCMD) tokenize(sCMD); switch (argv(0)) { + case "dev_sentence": + static CBaseEntity foo; + if (!foo) { + foo = spawn(CBaseEntity); + foo.drawmask = MASK_ENGINE; + setmodel(foo, "models/headcrab.mdl"); + } + setorigin(foo, getproperty(VF_ORIGIN)); + foo.Sentence(argv(1)); + break; + case "vote": if (argv(1) == "yes") { sendevent("VoteY", ""); diff --git a/src/client/gearbox/progs.src b/src/client/gearbox/progs.src index 8ac9c34c..971b2186 100644 --- a/src/client/gearbox/progs.src +++ b/src/client/gearbox/progs.src @@ -34,6 +34,7 @@ ../../shared/gearbox/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/client/hunger/progs.src b/src/client/hunger/progs.src index 75fc212a..61b33e50 100644 --- a/src/client/hunger/progs.src +++ b/src/client/hunger/progs.src @@ -34,6 +34,7 @@ ../../shared/hunger/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/client/poke646/progs.src b/src/client/poke646/progs.src index 71945977..438e76e9 100644 --- a/src/client/poke646/progs.src +++ b/src/client/poke646/progs.src @@ -35,6 +35,7 @@ ../../shared/valve/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/client/predict.c b/src/client/predict.c index d15a3be6..c2147644 100644 --- a/src/client/predict.c +++ b/src/client/predict.c @@ -38,6 +38,8 @@ void Predict_PreFrame(player pl) pl.net_ammo2 = pl.a_ammo2; pl.net_ammo3 = pl.a_ammo3; pl.net_weapontime = pl.weapontime; + + GamePredict_PreFrame(pl); //self.netpmove_flags = self.pmove_flags; @@ -45,8 +47,18 @@ void Predict_PreFrame(player pl) /*for (; self.pmove_frame <= servercommandframe; self.pmove_frame++) { float flSuccess = getinputstate(self.pmove_frame);*/ for ( int i = pl.sequence + 1; i <= clientcommandframe; i++ ) { - if (!getinputstate(i)) { - break; //erk?... too old? + float flSuccess = getinputstate( i ); + if (flSuccess == FALSE) { + continue; + } + + if (i==clientcommandframe){ + CSQC_Input_Frame(); + } + + // Partial frames are the worst + if (input_timelength == 0) { + break; } input_sequence = i; QPhysics_Run(pl); @@ -71,16 +83,15 @@ void Predict_PostFrame(player pl) pl.teleport_time = pl.net_teleport_time; pl.viewzoom = pl.net_viewzoom; pl.punchangle = pl.net_punchangle; - //pl.hook.origin = pl.net_hookpos; - pl.w_attack_next = pl.net_w_attack_next; pl.w_idle_next = pl.net_w_idle_next; pl.a_ammo1 = pl.net_ammo1; pl.a_ammo2 = pl.net_ammo2; pl.a_ammo3 = pl.net_ammo3; - pl.weapontime = pl.net_weapontime; + GamePredict_PostFrame(pl); + //self.pmove_flags = self.netpmove_flags; setorigin(pl, pl.origin); //self.pmove_frame = servercommandframe + 1; diff --git a/src/client/rewolf/progs.src b/src/client/rewolf/progs.src index 42281bc8..1c14469f 100755 --- a/src/client/rewolf/progs.src +++ b/src/client/rewolf/progs.src @@ -42,6 +42,7 @@ decore.cpp ../../shared/rewolf/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/client/scihunt/progs.src b/src/client/scihunt/progs.src index 47be8914..17208801 100644 --- a/src/client/scihunt/progs.src +++ b/src/client/scihunt/progs.src @@ -38,6 +38,7 @@ ../../shared/scihunt/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/client/sentences.c b/src/client/sentences.c index b7f19ae1..657b41f0 100644 --- a/src/client/sentences.c +++ b/src/client/sentences.c @@ -44,20 +44,6 @@ typedef struct int g_sentences_count; #endif -string g_sentences_path; - -void -Sentences_Path(string word) -{ - int c = tokenizebyseparator(word, "/"); - - if (c > 1) { - g_sentences_path = sprintf("%s/", argv(0)); - } else { - g_sentences_path = ""; - } -} - void Sentences_Init(void) { @@ -90,9 +76,6 @@ Sentences_Init(void) /* starts of at 0, for every line increases */ int x = g_sentences_count; - /* default path is vox */ - g_sentences_path = "vox/"; - /* allocate memory and increase count */ #ifdef DYNAMIC_SENTENCES g_sentences = memrealloc(g_sentences, @@ -109,13 +92,10 @@ Sentences_Init(void) if (i==0) { g_sentences[x].m_strID = strcat("!", argv(0)); } else { - /* check whether or not our keyword contains a path */ - Sentences_Path(argv(i)); - if (i == 1) { - g_sentences[x].m_strSamples = sprintf("%s%s", g_sentences_path, argv(i)); + g_sentences[x].m_strSamples = sprintf("%s", argv(i)); } else { - g_sentences[x].m_strSamples = sprintf("%s %s%s", g_sentences[x].m_strSamples, g_sentences_path, argv(i)); + g_sentences[x].m_strSamples = sprintf("%s %s", g_sentences[x].m_strSamples, argv(i)); } } } diff --git a/src/client/tfc/progs.src b/src/client/tfc/progs.src index 7c8a60c4..b20755ec 100755 --- a/src/client/tfc/progs.src +++ b/src/client/tfc/progs.src @@ -41,6 +41,7 @@ init.c ../../shared/valve/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/client/valve/predict.c b/src/client/valve/predict.c new file mode 100644 index 00000000..e4a90409 --- /dev/null +++ b/src/client/valve/predict.c @@ -0,0 +1,23 @@ +/* + * 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. + */ + +void GamePredict_PreFrame(player pl) +{ +} + +void GamePredict_PostFrame(player pl) +{ +} diff --git a/src/client/valve/progs.src b/src/client/valve/progs.src index 9ead696d..23f6cac2 100755 --- a/src/client/valve/progs.src +++ b/src/client/valve/progs.src @@ -39,6 +39,7 @@ ../../shared/valve/player.cpp ../player.c ../../shared/pmove.c +../valve/predict.c ../predict.c ../../shared/decals.c ../../shared/effects.c diff --git a/src/gs-entbase/client/baseentity.cpp b/src/gs-entbase/client/baseentity.cpp index 9ba5938a..271cd83d 100644 --- a/src/gs-entbase/client/baseentity.cpp +++ b/src/gs-entbase/client/baseentity.cpp @@ -139,7 +139,16 @@ CBaseEntity::ProcessWordQue(void) return; } - sound(this, CHAN_VOICE, m_pSentenceQue[m_iSentencePos].m_strSnd, 1.0, ATTN_NORM, 100, SOUNDFLAG_FOLLOW); + /* hack to get vox working. */ + string sndpath; + int c = tokenizebyseparator(m_pSentenceQue[m_iSentencePos].m_strSnd, "/"); + if (c > 1) { + sndpath = argv(0); + } else { + sndpath = "vox"; + } + + sound(this, CHAN_VOICE, sprintf("%s/%s", sndpath, argv(1)), 1.0, ATTN_NORM, 100, SOUNDFLAG_FOLLOW); dprint(sprintf("^2CBaseEntity::^3ProcessWordQue^7: Speaking %s\n", m_pSentenceQue[m_iSentencePos].m_strSnd)); m_iSentencePos++; diff --git a/src/menu-fn/m_customgame.cpp b/src/menu-fn/m_customgame.cpp index fae9f4f5..05101bfc 100644 --- a/src/menu-fn/m_customgame.cpp +++ b/src/menu-fn/m_customgame.cpp @@ -182,12 +182,16 @@ void customgame_btnactivate_start(void) games_set(nextgame); +#if 0 + localcmd(sprintf("fs_changegame %s.fmf\n", games[nextgame].gamedir)); +#else /* some games/mods inherit other directories */ if (games[nextgame].fallback_dir) { localcmd(sprintf("gamedir \"%s;%s\"\n", games[nextgame].fallback_dir, games[nextgame].gamedir)); } else { localcmd(sprintf("gamedir \"%s\"\n", games[nextgame].gamedir)); } +#endif localcmd("stopmusic\nsnd_restart\nwait\nvid_reload\nmenu_restart\nmenu_customgame\n"); cvar_init(); diff --git a/src/server/cstrike/client.c b/src/server/cstrike/client.c index 02554669..3318e7c2 100644 --- a/src/server/cstrike/client.c +++ b/src/server/cstrike/client.c @@ -135,6 +135,12 @@ Game_PlayerPostThink(player pl) if (pl.old_a_ammo3 != pl.a_ammo3) { pl.SendFlags |= PLAYER_AMMO3; } + if (pl.old_cs_shotmultiplier != pl.cs_shotmultiplier) { + pl.SendFlags |= PLAYER_CSSHOT; + } + if (pl.old_cs_shottime != pl.cs_shottime) { + pl.SendFlags |= PLAYER_CSSHOTTIME; + } pl.old_modelindex = pl.modelindex; pl.old_origin = pl.origin; @@ -152,6 +158,8 @@ Game_PlayerPostThink(player pl) pl.old_a_ammo1 = pl.a_ammo1; pl.old_a_ammo2 = pl.a_ammo2; pl.old_a_ammo3 = pl.a_ammo3; + pl.old_cs_shotmultiplier = pl.cs_shotmultiplier; + pl.old_cs_shottime = pl.cs_shottime; } void diff --git a/src/server/cstrike/player.c b/src/server/cstrike/player.c index c5a0398e..51b759e5 100644 --- a/src/server/cstrike/player.c +++ b/src/server/cstrike/player.c @@ -192,6 +192,12 @@ float Player_SendEntity(entity ePEnt, float fChanged) if (fChanged & PLAYER_AMMO3) { WriteByte(MSG_ENTITY, pl.a_ammo3); } + if (fChanged & PLAYER_CSSHOT) { + WriteByte(MSG_ENTITY, pl.cs_shotmultiplier); + } + if (fChanged & PLAYER_CSSHOTTIME) { + WriteFloat(MSG_ENTITY, pl.cs_shottime); + } return TRUE; } diff --git a/src/server/cstrike/progs.src b/src/server/cstrike/progs.src index 5e8f8f98..20ce6646 100755 --- a/src/server/cstrike/progs.src +++ b/src/server/cstrike/progs.src @@ -32,6 +32,7 @@ ../valve/spectator.c ../../shared/cstrike/items.h +../../shared/cstrike/weapons_cstrike.c ../../shared/valve/weapon_common.h ../../shared/cstrike/weapons.h ../../shared/cstrike/w_ak47.c diff --git a/src/shared/cstrike/player.cpp b/src/shared/cstrike/player.cpp index 05a824ef..1a945b12 100644 --- a/src/shared/cstrike/player.cpp +++ b/src/shared/cstrike/player.cpp @@ -67,6 +67,9 @@ class player:CBaseEntity int g3sg1_mag; int sg550_mag; int para_mag; + + int cs_shotmultiplier; + float cs_shottime; #ifdef CSQC /* External model */ @@ -77,6 +80,11 @@ class player:CBaseEntity float pitch; float lastweapon; + int cs_cross_mindist; + int cs_cross_deltadist; + int cs_old_shotmultiplier; + float cs_crosshairdistance; + /* Prediction */ vector net_origin; vector net_velocity; @@ -87,9 +95,12 @@ class player:CBaseEntity float net_teleport_time; float net_weapontime; float net_viewzoom; + vector net_punchangle; int net_ammo1; int net_ammo2; int net_ammo3; + int net_cs_shotmultiplier; + float net_cs_shottime; int sequence; virtual void() gun_offset; @@ -125,5 +136,8 @@ class player:CBaseEntity int old_a_ammo1; int old_a_ammo2; int old_a_ammo3; + + int old_cs_shotmultiplier; + float old_cs_shottime; #endif }; diff --git a/src/shared/cstrike/w_ak47.c b/src/shared/cstrike/w_ak47.c index df218ee7..c8f6dd45 100644 --- a/src/shared/cstrike/w_ak47.c +++ b/src/shared/cstrike/w_ak47.c @@ -82,9 +82,13 @@ w_ak47_pickup(int new) void w_ak47_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_ak47.mdl"); Weapons_ViewAnimation(AK47_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 4; + pl.cs_cross_deltadist = 4; #endif } @@ -101,8 +105,30 @@ w_ak47_primary(void) if (!pl.a_ammo1) { return; } +#else + if (!pl.ak47_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 36, [accuracy,accuracy], WEAPON_AK47); + pl.ak47_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_ak47.fire"); +#endif + Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,25 +143,9 @@ w_ak47_primary(void) Weapons_ViewAnimation(AK47_SHOOT3); break; } -#else - if (!pl.ak47_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 36, [0.35,0,1.25], WEAPON_AK47); - - pl.ak47_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_ak47.fire"); - -#endif pl.w_attack_next = 0.0955f; + pl.w_idle_next = pl.w_attack_next; } void @@ -165,9 +175,10 @@ w_ak47_reload(void) Weapons_ReloadWeapon(pl, player::ak47_mag, player::ammo_762mm, 30); Weapons_UpdateAmmo(pl, pl.ak47_mag, pl.ammo_762mm, -1); #endif - Weapons_ViewAnimation(AK47_RELOAD); - pl.w_attack_next = 2.0f; + + pl.w_attack_next = 2.4f; + pl.w_idle_next = pl.w_attack_next; } float @@ -180,11 +191,11 @@ void w_ak47_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -231,7 +242,7 @@ weapon_t w_ak47 = .primary = w_ak47_primary, .secondary = __NULL__, .reload = w_ak47_reload, - .release = __NULL__, + .release = w_cstrike_weaponrelease, .crosshair = w_ak47_hud, .precache = w_ak47_precache, .pickup = w_ak47_pickup, diff --git a/src/shared/cstrike/w_aug.c b/src/shared/cstrike/w_aug.c index 92e8cf05..048eb914 100644 --- a/src/shared/cstrike/w_aug.c +++ b/src/shared/cstrike/w_aug.c @@ -82,9 +82,13 @@ w_aug_pickup(int new) void w_aug_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_aug.mdl"); Weapons_ViewAnimation(AUG_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 3; + pl.cs_cross_deltadist = 3; #endif } @@ -101,8 +105,30 @@ w_aug_primary(void) if (!pl.a_ammo1) { return; } +#else + if (!pl.aug_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 215); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + pl.aug_mag--; + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 32, [accuracy,accuracy], WEAPON_AUG); + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_aug.fire"); +#endif + Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +143,9 @@ w_aug_primary(void) Weapons_ViewAnimation(AUG_SHOOT3); break; } -#else - if (!pl.aug_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 32, [0.01,0,01], WEAPON_AUG); - - pl.aug_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_aug.fire"); -#endif pl.w_attack_next = 0.0825f; + pl.w_idle_next = pl.w_attack_next; } void @@ -164,9 +175,10 @@ w_aug_reload(void) Weapons_ReloadWeapon(pl, player::aug_mag, player::ammo_762mm, 30); Weapons_UpdateAmmo(pl, pl.aug_mag, pl.ammo_762mm, -1); #endif - Weapons_ViewAnimation(AUG_RELOAD); - pl.w_attack_next = 2.0f; + + pl.w_attack_next = 3.3f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +191,11 @@ void w_aug_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +242,7 @@ weapon_t w_aug = w_aug_primary, __NULL__, w_aug_reload, - __NULL__, + w_cstrike_weaponrelease, w_aug_hud, w_aug_precache, w_aug_pickup, diff --git a/src/shared/cstrike/w_awp.c b/src/shared/cstrike/w_awp.c index a133a0b0..87ec1eb3 100644 --- a/src/shared/cstrike/w_awp.c +++ b/src/shared/cstrike/w_awp.c @@ -16,11 +16,11 @@ enum { AWP_IDLE, - AWP_RELOAD, - AWP_DRAW, AWP_SHOOT1, AWP_SHOOT2, - AWP_SHOOT3 + AWP_SHOOT3, + AWP_RELOAD, + AWP_DRAW }; void @@ -38,7 +38,7 @@ void w_awp_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_338mag, -1); #endif } @@ -69,8 +69,8 @@ w_awp_pickup(int new) if (new) { pl.awp_mag = 10; } else { - if (pl.ammo_762mm < 20) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 10, 20); + if (pl.ammo_338mag < 20) { + pl.ammo_338mag = bound(0, pl.ammo_338mag + 10, 20); } else { return FALSE; } @@ -82,9 +82,13 @@ w_awp_pickup(int new) void w_awp_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_awp.mdl"); Weapons_ViewAnimation(AWP_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 3; #endif } @@ -101,8 +105,30 @@ w_awp_primary(void) if (!pl.a_ammo1) { return; } +#else + if (!pl.awp_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, -1); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + pl.awp_mag--; + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 115, [accuracy,accuracy], WEAPON_AWP); + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_awp.fire"); +#endif + Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +143,9 @@ w_awp_primary(void) Weapons_ViewAnimation(AWP_SHOOT3); break; } -#else - if (!pl.awp_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 115, [0.01,0,01], WEAPON_AWP); - - pl.awp_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_awp.fire"); -#endif pl.w_attack_next = 1.2f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +168,17 @@ w_awp_reload(void) if (pl.awp_mag >= 10) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_338mag) { return; } - Weapons_ReloadWeapon(pl, player::awp_mag, player::ammo_762mm, 10); - Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::awp_mag, player::ammo_338mag, 10); + Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_338mag, -1); #endif - Weapons_ViewAnimation(AWP_RELOAD); - pl.w_attack_next = 2.0f; + + pl.w_attack_next = 2.9f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +191,11 @@ void w_awp_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [24/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +242,7 @@ weapon_t w_awp = w_awp_primary, __NULL__, w_awp_reload, - __NULL__, + w_cstrike_weaponrelease, 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 1c2065fe..40429043 100644 --- a/src/shared/cstrike/w_c4bomb.c +++ b/src/shared/cstrike/w_c4bomb.c @@ -66,6 +66,7 @@ w_c4bomb_deathmsg(void) void w_c4bomb_draw(void) { + player pl = (player)self; #ifdef CSQC Weapons_SetModel("models/v_c4bomb.mdl"); Weapons_ViewAnimation(C4BOMB_DRAW); @@ -108,6 +109,17 @@ w_c4bomb_aimanim(void) return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; } +void +w_c4bomb_hud(void) +{ +#ifdef CSQC + Cstrike_DrawCrosshair(); + HUD_DrawAmmo2(); + vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [96/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); +#endif +} + void w_c4bomb_hudpic(int selected, vector pos, float a) { @@ -152,7 +164,7 @@ weapon_t w_c4bomb = __NULL__, __NULL__, __NULL__, - __NULL__, + w_c4bomb_hud, w_c4bomb_precache, __NULL__, w_c4bomb_updateammo, diff --git a/src/shared/cstrike/w_deagle.c b/src/shared/cstrike/w_deagle.c index 27caa2a1..23926cfa 100644 --- a/src/shared/cstrike/w_deagle.c +++ b/src/shared/cstrike/w_deagle.c @@ -16,11 +16,11 @@ enum { DEAGLE_IDLE, - DEAGLE_RELOAD, - DEAGLE_DRAW, DEAGLE_SHOOT1, DEAGLE_SHOOT2, - DEAGLE_SHOOT3 + DEAGLE_SHOOT_EMPTY, + DEAGLE_RELOAD, + DEAGLE_DRAW }; void @@ -82,8 +82,14 @@ w_deagle_pickup(int new) void w_deagle_draw(void) { + player pl = (player)self; Weapons_SetModel("models/v_deagle.mdl"); Weapons_ViewAnimation(DEAGLE_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 3; +#endif } void @@ -95,34 +101,30 @@ w_deagle_primary(void) return; } -#ifdef CSQC - if (!pl.a_ammo1) { + if (pl.flags & FL_SEMI_TOGGLED) { return; } - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(DEAGLE_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(DEAGLE_SHOOT2); - break; - default: - Weapons_ViewAnimation(DEAGLE_SHOOT3); - break; +#ifdef CSQC + if (!pl.a_ammo1) { + return; } #else if (!pl.deagle_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 54, [0.01,0,01], WEAPON_DEAGLE); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else pl.deagle_mag--; + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 54, [accuracy,accuracy], WEAPON_DEAGLE); + if (self.flags & FL_CROUCHING) Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); @@ -132,7 +134,25 @@ w_deagle_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_deagle.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(DEAGLE_SHOOT_EMPTY); + } else { + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(DEAGLE_SHOOT1); + break; + default: + Weapons_ViewAnimation(DEAGLE_SHOOT2); + break; + } + } + + pl.flags |= FL_SEMI_TOGGLED; pl.w_attack_next = 0.15f; + pl.w_idle_next = pl.w_attack_next; } void @@ -164,7 +184,8 @@ w_deagle_reload(void) #endif Weapons_ViewAnimation(DEAGLE_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 2.1f; + pl.w_idle_next = pl.w_attack_next; } float @@ -177,10 +198,11 @@ void w_deagle_hud(void) { #ifdef CSQC + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [24/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -227,7 +249,7 @@ weapon_t w_deagle = w_deagle_primary, __NULL__, w_deagle_reload, - __NULL__, + w_cstrike_weaponrelease, w_deagle_hud, w_deagle_precache, w_deagle_pickup, diff --git a/src/shared/cstrike/w_elites.c b/src/shared/cstrike/w_elites.c index 1cb907dc..f7e94bca 100644 --- a/src/shared/cstrike/w_elites.c +++ b/src/shared/cstrike/w_elites.c @@ -16,29 +16,38 @@ enum { ELITES_IDLE, + ELITES_IDLE_LEFTEMPTY, + ELITES_SHOOT_LEFT1, + ELITES_SHOOT_LEFT2, + ELITES_SHOOT_LEFT3, + ELITES_SHOOT_LEFT4, + ELITES_SHOOT_LEFT5, + ELITES_SHOOT_LEFTLAST, + ELITES_SHOOT_RIGHT1, + ELITES_SHOOT_RIGHT2, + ELITES_SHOOT_RIGHT3, + ELITES_SHOOT_RIGHT4, + ELITES_SHOOT_RIGHT5, + ELITES_SHOOT_RIGHTLAST, ELITES_RELOAD, - ELITES_DRAW, - ELITES_SHOOT1, - ELITES_SHOOT2, - ELITES_SHOOT3 + ELITES_DRAW }; - void w_elites_precache(void) { #ifdef SSQC Sound_Precache("weapon_elites.fire"); #endif - precache_model("models/v_elites.mdl"); - precache_model("models/w_elites.mdl"); - precache_model("models/p_elites.mdl"); + precache_model("models/v_elite.mdl"); + precache_model("models/w_elite.mdl"); + precache_model("models/p_elite.mdl"); } void w_elites_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_9mm, -1); #endif } @@ -69,8 +78,8 @@ w_elites_pickup(int new) if (new) { pl.elites_mag = 30; } else { - if (pl.ammo_762mm < 90) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + if (pl.ammo_9mm < 90) { + pl.ammo_9mm = bound(0, pl.ammo_9mm + 30, 90); } else { return FALSE; } @@ -82,9 +91,13 @@ w_elites_pickup(int new) void w_elites_draw(void) { -#ifdef CSQC - Weapons_SetModel("models/v_elites.mdl"); + player pl = (player)self; + Weapons_SetModel("models/v_elite.mdl"); Weapons_ViewAnimation(ELITES_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 4; + pl.cs_cross_deltadist = 3; #endif } @@ -97,33 +110,28 @@ w_elites_primary(void) return; } -#ifdef CSQC - if (!pl.a_ammo1) { + if (pl.flags & FL_SEMI_TOGGLED) { return; } - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(ELITES_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(ELITES_SHOOT2); - break; - default: - Weapons_ViewAnimation(ELITES_SHOOT3); - break; +#ifdef CSQC + if (!pl.a_ammo1) { + return; } #else if (!pl.elites_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 45, [0.01,0,01], WEAPON_ELITES); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 45, [accuracy,accuracy], WEAPON_ELITES); pl.elites_mag--; if (self.flags & FL_CROUCHING) @@ -134,7 +142,60 @@ w_elites_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_elites.fire"); #endif + pl.a_ammo3 = 1 - pl.a_ammo3; + + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 5; + if (pl.a_ammo3) { + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(ELITES_SHOOT_LEFTLAST); + } else { + switch (r) { + case 0: + Weapons_ViewAnimation(ELITES_SHOOT_LEFT1); + break; + case 1: + Weapons_ViewAnimation(ELITES_SHOOT_LEFT2); + break; + case 2: + Weapons_ViewAnimation(ELITES_SHOOT_LEFT3); + break; + case 3: + Weapons_ViewAnimation(ELITES_SHOOT_LEFT4); + break; + default: + Weapons_ViewAnimation(ELITES_SHOOT_LEFT1); + break; + } + } + } else { + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(ELITES_SHOOT_RIGHTLAST); + } else { + switch (r) { + case 0: + Weapons_ViewAnimation(ELITES_SHOOT_RIGHT1); + break; + case 1: + Weapons_ViewAnimation(ELITES_SHOOT_RIGHT2); + break; + case 2: + Weapons_ViewAnimation(ELITES_SHOOT_RIGHT3); + break; + case 3: + Weapons_ViewAnimation(ELITES_SHOOT_RIGHT4); + break; + default: + Weapons_ViewAnimation(ELITES_SHOOT_RIGHT1); + break; + } + } + } + + pl.flags |= FL_SEMI_TOGGLED; pl.w_attack_next = 0.15f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +218,17 @@ w_elites_reload(void) if (pl.elites_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_9mm) { return; } - Weapons_ReloadWeapon(pl, player::elites_mag, player::ammo_762mm, 30); - Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::elites_mag, player::ammo_9mm, 30); + Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_9mm, -1); #endif Weapons_ViewAnimation(ELITES_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 4.6f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +241,11 @@ void w_elites_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +292,7 @@ weapon_t w_elites = w_elites_primary, __NULL__, w_elites_reload, - __NULL__, + w_cstrike_weaponrelease, w_elites_hud, w_elites_precache, w_elites_pickup, diff --git a/src/shared/cstrike/w_fiveseven.c b/src/shared/cstrike/w_fiveseven.c index f35706f4..6b3adcea 100644 --- a/src/shared/cstrike/w_fiveseven.c +++ b/src/shared/cstrike/w_fiveseven.c @@ -16,11 +16,11 @@ enum { FIVESEVEN_IDLE, - FIVESEVEN_RELOAD, - FIVESEVEN_DRAW, FIVESEVEN_SHOOT1, FIVESEVEN_SHOOT2, - FIVESEVEN_SHOOT3 + FIVESEVEN_SHOOT_EMPTY, + FIVESEVEN_RELOAD, + FIVESEVEN_DRAW }; void @@ -38,7 +38,7 @@ void w_fiveseven_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_57mm, -1); #endif } @@ -69,8 +69,8 @@ w_fiveseven_pickup(int new) if (new) { pl.fiveseven_mag = 20; } else { - if (pl.ammo_762mm < 40) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 20, 40); + if (pl.ammo_57mm < 40) { + pl.ammo_57mm = bound(0, pl.ammo_57mm + 20, 40); } else { return FALSE; } @@ -82,9 +82,13 @@ w_fiveseven_pickup(int new) void w_fiveseven_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_fiveseven.mdl"); Weapons_ViewAnimation(FIVESEVEN_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 3; #endif } @@ -97,33 +101,28 @@ w_fiveseven_primary(void) return; } -#ifdef CSQC - if (!pl.a_ammo1) { + if (pl.flags & FL_SEMI_TOGGLED) { return; } - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(FIVESEVEN_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(FIVESEVEN_SHOOT2); - break; - default: - Weapons_ViewAnimation(FIVESEVEN_SHOOT3); - break; +#ifdef CSQC + if (!pl.a_ammo1) { + return; } #else if (!pl.fiveseven_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 25, [0.01,0,01], WEAPON_FIVESEVEN); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 25, [accuracy,accuracy], WEAPON_FIVESEVEN); pl.fiveseven_mag--; if (self.flags & FL_CROUCHING) @@ -134,7 +133,25 @@ w_fiveseven_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_fiveseven.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(FIVESEVEN_SHOOT_EMPTY); + } else { + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(FIVESEVEN_SHOOT1); + break; + default: + Weapons_ViewAnimation(FIVESEVEN_SHOOT2); + break; + } + } + + pl.flags |= FL_SEMI_TOGGLED; pl.w_attack_next = 0.15f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +174,17 @@ w_fiveseven_reload(void) if (pl.fiveseven_mag >= 20) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_57mm) { return; } - Weapons_ReloadWeapon(pl, player::fiveseven_mag, player::ammo_762mm, 20); - Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::fiveseven_mag, player::ammo_57mm, 20); + Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_57mm, -1); #endif Weapons_ViewAnimation(FIVESEVEN_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.1f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +197,11 @@ void w_fiveseven_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [120/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +248,7 @@ weapon_t w_fiveseven = w_fiveseven_primary, __NULL__, w_fiveseven_reload, - __NULL__, + w_cstrike_weaponrelease, w_fiveseven_hud, w_fiveseven_precache, w_fiveseven_pickup, diff --git a/src/shared/cstrike/w_flashbang.c b/src/shared/cstrike/w_flashbang.c index 5b521342..4e390832 100644 --- a/src/shared/cstrike/w_flashbang.c +++ b/src/shared/cstrike/w_flashbang.c @@ -105,6 +105,17 @@ w_flashbang_aimanim(void) return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; } +void +w_flashbang_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo2(); + vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); +#endif +} + void w_flashbang_hudpic(int selected, vector pos, float a) { @@ -149,7 +160,7 @@ weapon_t w_flashbang = __NULL__, __NULL__, __NULL__, - __NULL__, + w_flashbang_hud, w_flashbang_precache, __NULL__, w_flashbang_updateammo, diff --git a/src/shared/cstrike/w_g3sg1.c b/src/shared/cstrike/w_g3sg1.c index ecfcbfc6..08e97375 100644 --- a/src/shared/cstrike/w_g3sg1.c +++ b/src/shared/cstrike/w_g3sg1.c @@ -16,11 +16,10 @@ enum { G3SG1_IDLE, - G3SG1_RELOAD, - G3SG1_DRAW, G3SG1_SHOOT1, G3SG1_SHOOT2, - G3SG1_SHOOT3 + G3SG1_RELOAD, + G3SG1_DRAW }; void @@ -82,9 +81,13 @@ w_g3sg1_pickup(int new) void w_g3sg1_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_g3sg1.mdl"); Weapons_ViewAnimation(G3SG1_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 6; + pl.cs_cross_deltadist = 4; #endif } @@ -101,29 +104,20 @@ w_g3sg1_primary(void) if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(G3SG1_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(G3SG1_SHOOT2); - break; - default: - Weapons_ViewAnimation(G3SG1_SHOOT3); - break; - } #else if (!pl.g3sg1_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 80, [0.01,0,01], WEAPON_G3SG1); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 80, [accuracy,accuracy], WEAPON_G3SG1); pl.g3sg1_mag--; if (self.flags & FL_CROUCHING) @@ -134,7 +128,20 @@ w_g3sg1_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_g3sg1.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(SCOUT_SHOOT1); + break; + default: + Weapons_ViewAnimation(SCOUT_SHOOT2); + break; + } + pl.w_attack_next = 0.25f; + pl.w_idle_next = pl.w_attack_next; } void @@ -166,7 +173,8 @@ w_g3sg1_reload(void) #endif Weapons_ViewAnimation(G3SG1_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 4.6f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +187,11 @@ void w_g3sg1_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +238,7 @@ weapon_t w_g3sg1 = w_g3sg1_primary, __NULL__, w_g3sg1_reload, - __NULL__, + w_cstrike_weaponrelease, w_g3sg1_hud, w_g3sg1_precache, w_g3sg1_pickup, diff --git a/src/shared/cstrike/w_glock18.c b/src/shared/cstrike/w_glock18.c index da237446..ea311400 100644 --- a/src/shared/cstrike/w_glock18.c +++ b/src/shared/cstrike/w_glock18.c @@ -15,12 +15,19 @@ */ enum { - GLOCK18_IDLE, - GLOCK18_RELOAD, - GLOCK18_DRAW, - GLOCK18_SHOOT1, - GLOCK18_SHOOT2, - GLOCK18_SHOOT3 + GLOCK_IDLE1, + GLOCK_IDLE2, + GLOCK_IDLE3, + GLOCK_SHOOT_BURST1, + GLOCK_SHOOT_BURST2, + GLOCK_SHOOT, + GLOCK_SHOOT_EMPTY, + GLOCK_RELOAD1, + GLOCK_DRAW1, + GLOCK_UNUSED1, + GLOCK_UNUSED2, + GLOCK_DRAW2, + GLOCK_RELOAD2 }; void @@ -28,6 +35,7 @@ w_glock18_precache(void) { #ifdef SSQC Sound_Precache("weapon_glock18.fire"); + Sound_Precache("weapon_glock18.burstfire"); #endif precache_model("models/v_glock18.mdl"); precache_model("models/w_glock18.mdl"); @@ -38,7 +46,7 @@ void w_glock18_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_9mm, -1); #endif } @@ -69,8 +77,8 @@ w_glock18_pickup(int new) if (new) { pl.glock18_mag = 20; } else { - if (pl.ammo_762mm < 40) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 20, 40); + if (pl.ammo_9mm < 40) { + pl.ammo_9mm = bound(0, pl.ammo_9mm + 20, 40); } else { return FALSE; } @@ -82,9 +90,21 @@ w_glock18_pickup(int new) void w_glock18_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_glock18.mdl"); - Weapons_ViewAnimation(GLOCK18_DRAW); + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(GLOCK_DRAW1); + break; + default: + Weapons_ViewAnimation(GLOCK_DRAW2); + break; + } + +#ifdef CSQC + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 3; #endif } @@ -97,33 +117,28 @@ w_glock18_primary(void) return; } -#ifdef CSQC - if (!pl.a_ammo1) { + if (pl.flags & FL_SEMI_TOGGLED) { return; } - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(GLOCK18_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(GLOCK18_SHOOT2); - break; - default: - Weapons_ViewAnimation(GLOCK18_SHOOT3); - break; +#ifdef CSQC + if (!pl.a_ammo1) { + return; } #else if (!pl.glock18_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 25, [0.01,0,01], WEAPON_GLOCK18); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 25, [accuracy,accuracy], WEAPON_GLOCK18); pl.glock18_mag--; if (self.flags & FL_CROUCHING) @@ -131,10 +146,59 @@ w_glock18_primary(void) else Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - Sound_Play(pl, CHAN_WEAPON, "weapon_glock18.fire"); + if (pl.a_ammo3) { + Sound_Play(pl, CHAN_WEAPON, "weapon_glock18.burstfire"); + } else { + Sound_Play(pl, CHAN_WEAPON, "weapon_glock18.fire"); + } +#endif + Weapons_ViewPunchAngle([-2,0,0]); + + if (pl.a_ammo3) { + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(GLOCK_SHOOT_BURST1); + break; + default: + Weapons_ViewAnimation(GLOCK_SHOOT_BURST2); + break; + } + pl.w_attack_next = 0.5f; + } else { + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(GLOCK_SHOOT_EMPTY); + } else { + Weapons_ViewAnimation(GLOCK_SHOOT); + } + pl.w_attack_next = 0.15f; + } + pl.flags |= FL_SEMI_TOGGLED; + pl.w_idle_next = pl.w_attack_next; +} + +void +w_glock18_secondary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0) { + return; + } + + /* toggle burst-fire */ + pl.a_ammo3 = 1 - pl.a_ammo3; + +#ifdef CSQC + if (pl.a_ammo3) { + CSQC_Parse_CenterPrint("Switched to Burst-Fire mode"); + } else { + CSQC_Parse_CenterPrint("Switched to Semi-Automatic mode"); + } #endif - pl.w_attack_next = 0.15f; + pl.w_attack_next = 1.0f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +221,26 @@ w_glock18_reload(void) if (pl.glock18_mag >= 20) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_9mm) { return; } - Weapons_ReloadWeapon(pl, player::glock18_mag, player::ammo_762mm, 20); - Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::glock18_mag, player::ammo_9mm, 20); + Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_9mm, -1); #endif - Weapons_ViewAnimation(GLOCK18_RELOAD); + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(GLOCK_RELOAD1); + break; + default: + Weapons_ViewAnimation(GLOCK_RELOAD2); + break; + } + pl.w_attack_next = 2.1f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +253,11 @@ void w_glock18_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -228,9 +302,9 @@ weapon_t w_glock18 = w_glock18_draw, __NULL__, w_glock18_primary, - __NULL__, + w_glock18_secondary, w_glock18_reload, - __NULL__, + w_cstrike_weaponrelease, w_glock18_hud, w_glock18_precache, w_glock18_pickup, diff --git a/src/shared/cstrike/w_hegrenade.c b/src/shared/cstrike/w_hegrenade.c index cdeb042c..3b4ef8bb 100644 --- a/src/shared/cstrike/w_hegrenade.c +++ b/src/shared/cstrike/w_hegrenade.c @@ -102,6 +102,17 @@ w_hegrenade_aimanim(void) return w_flashbang_aimanim(); } +void +w_hegrenade_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo2(); + vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); +#endif +} + void w_hegrenade_hudpic(int selected, vector pos, float a) { @@ -146,7 +157,7 @@ weapon_t w_hegrenade = __NULL__, __NULL__, __NULL__, - __NULL__, + w_hegrenade_hud, w_hegrenade_precache, __NULL__, w_hegrenade_updateammo, diff --git a/src/shared/cstrike/w_m3.c b/src/shared/cstrike/w_m3.c index 43a8c0cb..7fe5f07b 100644 --- a/src/shared/cstrike/w_m3.c +++ b/src/shared/cstrike/w_m3.c @@ -16,11 +16,20 @@ enum { M3_IDLE, - M3_RELOAD, - M3_DRAW, M3_SHOOT1, M3_SHOOT2, - M3_SHOOT3 + M3_INSERT, + M3_RELOAD_END, + M3_RELOAD_START, + M3_DRAW +}; + +enum +{ + M3S_IDLE, + M3S_RELOAD_START, + M3S_RELOAD, + M3S_RELOAD_END }; void @@ -38,7 +47,7 @@ void w_m3_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.m3_mag, pl.ammo_buckshot, -1); + Weapons_UpdateAmmo(pl, pl.m3_mag, pl.ammo_buckshot, pl.a_ammo3); #endif } @@ -82,9 +91,13 @@ w_m3_pickup(int new) void w_m3_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_m3.mdl"); Weapons_ViewAnimation(M3_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 6; #endif } @@ -101,29 +114,20 @@ w_m3_primary(void) if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(M3_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(M3_SHOOT2); - break; - default: - Weapons_ViewAnimation(M3_SHOOT3); - break; - } #else if (!pl.m3_mag) { return; } +#endif - TraceAttack_FireBullets(8, pl.origin + pl.view_ofs, 26, [0.01,0,01], WEAPON_M3); + Cstrike_ShotMultiplierAdd(pl, 9); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(9, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_M3); pl.m3_mag--; if (self.flags & FL_CROUCHING) @@ -134,39 +138,88 @@ w_m3_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_m3.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(M3_SHOOT1); + break; + default: + Weapons_ViewAnimation(M3_SHOOT2); + break; + } + pl.w_attack_next = 1.0f; + pl.w_idle_next = pl.w_attack_next; } void w_m3_reload(void) { player pl = (player)self; - - if (pl.w_attack_next > 0.0) { - return; - } - #ifdef CSQC if (pl.a_ammo1 >= 8) { return; } - if (!pl.a_ammo2) { + if (pl.a_ammo2 <= 0) { return; } #else if (pl.m3_mag >= 8) { return; } - if (!pl.ammo_buckshot) { + if (pl.ammo_buckshot <= 0) { + return; + } +#endif + + if (pl.a_ammo3 > M3S_IDLE) { + return; + } + pl.a_ammo3 = M3S_RELOAD_START; + pl.w_idle_next = 0.0f; +} + +void +w_m3_release(void) +{ + player pl = (player)self; + + w_cstrike_weaponrelease(); + + if (pl.w_idle_next > 0.0) { return; } - Weapons_ReloadWeapon(pl, player::m3_mag, player::ammo_buckshot, 8); - Weapons_UpdateAmmo(pl, pl.m3_mag, pl.ammo_buckshot, -1); -#endif + if (pl.a_ammo3 == M3S_RELOAD_START) { + Weapons_ViewAnimation(M3_RELOAD_START); + pl.a_ammo3 = M3S_RELOAD; + pl.w_idle_next = 0.65f; + } else if (pl.a_ammo3 == M3S_RELOAD) { + Weapons_ViewAnimation(M3_INSERT); +#ifdef CSQC + pl.a_ammo1++; + pl.a_ammo2--; - Weapons_ViewAnimation(M3_RELOAD); - pl.w_attack_next = 2.0f; + if (pl.a_ammo2 <= 0 || pl.a_ammo1 >= 8) { + pl.a_ammo3 = M3S_RELOAD_END; + } +#else + pl.m3_mag++; + pl.ammo_buckshot--; + w_m3_updateammo(pl); + if (pl.ammo_buckshot <= 0 || pl.m3_mag >= 8) { + pl.a_ammo3 = M3S_RELOAD_END; + } +#endif + pl.w_idle_next = 0.5f; + } else if (pl.a_ammo3 == M3S_RELOAD_END) { + Weapons_ViewAnimation(M3_RELOAD_END); + pl.a_ammo3 = M3S_IDLE; + pl.w_idle_next = 10.0f; + pl.w_attack_next = 0.5f; + } } float @@ -179,11 +232,11 @@ void w_m3_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +283,7 @@ weapon_t w_m3 = w_m3_primary, __NULL__, w_m3_reload, - __NULL__, + w_m3_release, w_m3_hud, w_m3_precache, w_m3_pickup, diff --git a/src/shared/cstrike/w_m4a1.c b/src/shared/cstrike/w_m4a1.c index f3efb837..e54c4c46 100644 --- a/src/shared/cstrike/w_m4a1.c +++ b/src/shared/cstrike/w_m4a1.c @@ -47,7 +47,7 @@ void w_m4a1_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.m4a1_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.m4a1_mag, pl.ammo_556mm, -1); #endif } @@ -78,8 +78,8 @@ w_m4a1_pickup(int new) if (new) { pl.m4a1_mag = 30; } else { - if (pl.ammo_762mm < 90) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + if (pl.ammo_556mm < AMMO_MAX_762MM) { + pl.ammo_556mm = bound(0, pl.ammo_556mm + 30, AMMO_MAX_762MM); } else { return FALSE; } @@ -91,8 +91,20 @@ w_m4a1_pickup(int new) void w_m4a1_draw(void) { + player pl = (player)self; + Weapons_SetModel("models/v_m4a1.mdl"); - Weapons_ViewAnimation(M4A1_DRAW); + + if (pl.a_ammo3 == 1) { + Weapons_ViewAnimation(M4A1_DRAW); + } else { + Weapons_ViewAnimation(M4A1_DRAWUNSIL); + } + +#ifdef CSQC + pl.cs_cross_mindist = 4; + pl.cs_cross_deltadist = 3; +#endif } void @@ -115,6 +127,9 @@ w_m4a1_primary(void) } #endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 220); + /* actual firing */ #ifdef CSQC if (pl.a_ammo3 == 1) { @@ -125,7 +140,6 @@ w_m4a1_primary(void) pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); #else pl.m4a1_mag--; @@ -136,13 +150,14 @@ w_m4a1_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_m4a1.fire"); } - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [0.1,0.1], WEAPON_M4A1); + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [accuracy,accuracy], WEAPON_M4A1); if (self.flags & FL_CROUCHING) Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); else Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); #endif + Weapons_ViewPunchAngle([-2,0,0]); /* this stuff is predicted */ int r = (float)input_sequence % 3; @@ -174,7 +189,7 @@ w_m4a1_primary(void) Weapons_ViewPunchAngle([-2,0,0]); pl.w_attack_next = 0.0875f; - pl.w_idle_next = 5.0f; + pl.w_idle_next = pl.w_attack_next; } void @@ -220,15 +235,21 @@ w_m4a1_reload(void) if (pl.m4a1_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_556mm) { return; } - Weapons_ReloadWeapon(pl, player::m4a1_mag, player::ammo_762mm, 30); + Weapons_ReloadWeapon(pl, player::m4a1_mag, player::ammo_556mm, 30); #endif - Weapons_ViewAnimation(M4A1_RELOAD); - pl.w_attack_next = 2.0f; + if (pl.a_ammo3 == 1) { + Weapons_ViewAnimation(M4A1_RELOAD); + } else { + Weapons_ViewAnimation(M4A1_RELOADUNSIL); + } + + pl.w_attack_next = 3.1f; + pl.w_idle_next = pl.w_attack_next; } float @@ -241,10 +262,11 @@ void w_m4a1_hud(void) { #ifdef CSQC + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -253,6 +275,8 @@ w_m4a1_release(void) { player pl = (player)self; + w_cstrike_weaponrelease(); + if (pl.w_idle_next > 0.0) { return; } diff --git a/src/shared/cstrike/w_mac10.c b/src/shared/cstrike/w_mac10.c index 725e9988..0c74e40b 100644 --- a/src/shared/cstrike/w_mac10.c +++ b/src/shared/cstrike/w_mac10.c @@ -38,7 +38,7 @@ void w_mac10_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_45acp, -1); #endif } @@ -69,8 +69,8 @@ w_mac10_pickup(int new) if (new) { pl.mac10_mag = 30; } else { - if (pl.ammo_762mm < 90) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + if (pl.ammo_45acp < 90) { + pl.ammo_45acp = bound(0, pl.ammo_45acp + 30, 90); } else { return FALSE; } @@ -82,9 +82,13 @@ w_mac10_pickup(int new) void w_mac10_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_mac10.mdl"); Weapons_ViewAnimation(MAC10_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 9; + pl.cs_cross_deltadist = 3; #endif } @@ -101,8 +105,30 @@ w_mac10_primary(void) if (!pl.a_ammo1) { return; } +#else + if (!pl.mac10_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 29, [accuracy,accuracy], WEAPON_MAC10); + pl.mac10_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_mac10.fire"); +#endif + Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +143,9 @@ w_mac10_primary(void) Weapons_ViewAnimation(MAC10_SHOOT3); break; } -#else - if (!pl.mac10_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 29, [0.01,0,01], WEAPON_MAC10); - - pl.mac10_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_mac10.fire"); -#endif pl.w_attack_next = 0.07f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +168,17 @@ w_mac10_reload(void) if (pl.mac10_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_45acp) { return; } - Weapons_ReloadWeapon(pl, player::mac10_mag, player::ammo_762mm, 30); - Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::mac10_mag, player::ammo_45acp, 30); + Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_45acp, -1); #endif Weapons_ViewAnimation(MAC10_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.2f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +191,11 @@ void w_mac10_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [96/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +242,7 @@ weapon_t w_mac10 = w_mac10_primary, __NULL__, w_mac10_reload, - __NULL__, + w_cstrike_weaponrelease, w_mac10_hud, w_mac10_precache, w_mac10_pickup, diff --git a/src/shared/cstrike/w_mp5.c b/src/shared/cstrike/w_mp5.c index 80c1fdc7..8b219907 100644 --- a/src/shared/cstrike/w_mp5.c +++ b/src/shared/cstrike/w_mp5.c @@ -82,8 +82,14 @@ w_mp5_pickup(int new) void w_mp5_draw(void) { + player pl = (player)self; Weapons_SetModel("models/v_mp5.mdl"); Weapons_ViewAnimation(MP5_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 5; + pl.cs_cross_deltadist = 2; +#endif } void @@ -99,8 +105,34 @@ w_mp5_primary(void) if (!pl.a_ammo1) { return; } +#else + if (!pl.mp5_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 220); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + if (!pl.mp5_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_MP5); + + pl.mp5_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.fire"); +#endif Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -115,24 +147,9 @@ w_mp5_primary(void) Weapons_ViewAnimation(MP5_SHOOT3); break; } -#else - if (!pl.mp5_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [0.01,0,01], WEAPON_MP5); - - pl.mp5_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_mp5.fire"); -#endif pl.w_attack_next = 0.08f; + pl.w_idle_next = pl.w_attack_next; } void @@ -164,7 +181,8 @@ w_mp5_reload(void) #endif Weapons_ViewAnimation(MP5_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 2.6f; + pl.w_idle_next = pl.w_attack_next; } float @@ -177,10 +195,11 @@ void w_mp5_hud(void) { #ifdef CSQC + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -227,7 +246,7 @@ weapon_t w_mp5 = w_mp5_primary, __NULL__, w_mp5_reload, - __NULL__, + w_cstrike_weaponrelease, w_mp5_hud, w_mp5_precache, w_mp5_pickup, diff --git a/src/shared/cstrike/w_p228.c b/src/shared/cstrike/w_p228.c index c7d2405c..7bfac54d 100644 --- a/src/shared/cstrike/w_p228.c +++ b/src/shared/cstrike/w_p228.c @@ -16,11 +16,12 @@ enum { P228_IDLE, - P228_RELOAD, - P228_DRAW, P228_SHOOT1, P228_SHOOT2, - P228_SHOOT3 + P228_SHOOT3, + P228_SHOOT_EMPTY, + P228_RELOAD, + P228_DRAW }; void @@ -40,7 +41,7 @@ void w_p228_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_357sig, -1); #endif } @@ -71,8 +72,8 @@ w_p228_pickup(int new) if (new) { pl.p228_mag = 13; } else { - if (pl.ammo_762mm < 26) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 13, 26); + if (pl.ammo_357sig < 26) { + pl.ammo_357sig = bound(0, pl.ammo_357sig + 13, 26); } else { return FALSE; } @@ -84,9 +85,13 @@ w_p228_pickup(int new) void w_p228_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_p228.mdl"); Weapons_ViewAnimation(P228_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 3; #endif } @@ -99,33 +104,29 @@ w_p228_primary(void) return; } + if (pl.flags & FL_SEMI_TOGGLED) { + return; + } + + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(P228_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(P228_SHOOT2); - break; - default: - Weapons_ViewAnimation(P228_SHOOT3); - break; - } #else - if (!pl.p228_mag) { + if (!pl.p90_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 40, [0.01,0,01], WEAPON_P228); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 40, [accuracy,accuracy], WEAPON_P228); pl.p228_mag--; if (self.flags & FL_CROUCHING) @@ -136,7 +137,28 @@ w_p228_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_p228.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(P228_SHOOT_EMPTY); + } else { + int r = (float)input_sequence % 3; + switch (r) { + case 0: + Weapons_ViewAnimation(P228_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(P228_SHOOT2); + break; + default: + Weapons_ViewAnimation(P228_SHOOT3); + break; + } + } + + pl.flags |= FL_SEMI_TOGGLED; pl.w_attack_next = 0.15f; + pl.w_idle_next = pl.w_attack_next; } void @@ -159,16 +181,17 @@ w_p228_reload(void) if (pl.p228_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_357sig) { return; } - Weapons_ReloadWeapon(pl, player::p228_mag, player::ammo_762mm, 30); - Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::p228_mag, player::ammo_357sig, 13); + Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_357sig, -1); #endif Weapons_ViewAnimation(P228_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 2.7f; + pl.w_idle_next = pl.w_attack_next; } float @@ -181,11 +204,11 @@ void w_p228_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [120/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -232,7 +255,7 @@ weapon_t w_p228 = w_p228_primary, __NULL__, w_p228_reload, - __NULL__, + w_cstrike_weaponrelease, w_p228_hud, w_p228_precache, w_p228_pickup, diff --git a/src/shared/cstrike/w_p90.c b/src/shared/cstrike/w_p90.c index 406e06b4..a2cdd105 100644 --- a/src/shared/cstrike/w_p90.c +++ b/src/shared/cstrike/w_p90.c @@ -38,7 +38,7 @@ void w_p90_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_57mm, -1); #endif } @@ -69,8 +69,8 @@ w_p90_pickup(int new) if (new) { pl.p90_mag = 50; } else { - if (pl.ammo_762mm < 100) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 50, 100); + if (pl.ammo_57mm < 100) { + pl.ammo_57mm = bound(0, pl.ammo_57mm + 50, 100); } else { return FALSE; } @@ -82,9 +82,13 @@ w_p90_pickup(int new) void w_p90_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_p90.mdl"); Weapons_ViewAnimation(P90_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 7; + pl.cs_cross_deltadist = 3; #endif } @@ -97,12 +101,34 @@ w_p90_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } +#else + if (!pl.p90_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 175); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_P90); + pl.p90_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_p90.fire"); +#endif Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +143,9 @@ w_p90_primary(void) Weapons_ViewAnimation(P90_SHOOT3); break; } -#else - if (!pl.p90_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [0.01,0,01], WEAPON_P90); - - pl.p90_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_p90.fire"); -#endif pl.w_attack_next = 0.07f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +168,17 @@ w_p90_reload(void) if (pl.p90_mag >= 50) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_57mm) { return; } - Weapons_ReloadWeapon(pl, player::p90_mag, player::ammo_762mm, 50); - Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::p90_mag, player::ammo_57mm, 50); + Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_57mm, -1); #endif Weapons_ViewAnimation(P90_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.3f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +191,11 @@ void w_p90_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [120/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +242,7 @@ weapon_t w_p90 = w_p90_primary, __NULL__, w_p90_reload, - __NULL__, + w_cstrike_weaponrelease, w_p90_hud, w_p90_precache, w_p90_pickup, diff --git a/src/shared/cstrike/w_para.c b/src/shared/cstrike/w_para.c index fa5e694a..412c0b5f 100644 --- a/src/shared/cstrike/w_para.c +++ b/src/shared/cstrike/w_para.c @@ -16,11 +16,10 @@ enum { PARA_IDLE, - PARA_RELOAD, - PARA_DRAW, PARA_SHOOT1, PARA_SHOOT2, - PARA_SHOOT3 + PARA_RELOAD, + PARA_DRAW }; void @@ -38,7 +37,7 @@ void w_para_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_556mmbox, -1); #endif } @@ -69,8 +68,8 @@ w_para_pickup(int new) if (new) { pl.para_mag = 100; } else { - if (pl.ammo_762mm < 200) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 100, 200); + if (pl.ammo_556mmbox < 200) { + pl.ammo_556mmbox = bound(0, pl.ammo_556mmbox + 100, 200); } else { return FALSE; } @@ -82,9 +81,13 @@ w_para_pickup(int new) void w_para_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_m249.mdl"); Weapons_ViewAnimation(PARA_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 6; + pl.cs_cross_deltadist = 3; #endif } @@ -97,33 +100,25 @@ w_para_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(PARA_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(PARA_SHOOT2); - break; - default: - Weapons_ViewAnimation(PARA_SHOOT3); - break; - } #else if (!pl.para_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 35, [0.01,0,01], WEAPON_PARA); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 175); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 35, [accuracy,accuracy], WEAPON_PARA); pl.para_mag--; if (self.flags & FL_CROUCHING) @@ -134,7 +129,20 @@ w_para_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_para.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(SCOUT_SHOOT1); + break; + default: + Weapons_ViewAnimation(SCOUT_SHOOT2); + break; + } + pl.w_attack_next = 0.1f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +165,17 @@ w_para_reload(void) if (pl.para_mag >= 100) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_556mmbox) { return; } - Weapons_ReloadWeapon(pl, player::para_mag, player::ammo_762mm, 100); - Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::para_mag, player::ammo_556mmbox, 100); + Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_556mmbox, -1); #endif Weapons_ViewAnimation(PARA_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.0f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +188,11 @@ void w_para_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +239,7 @@ weapon_t w_para = w_para_primary, __NULL__, w_para_reload, - __NULL__, + w_cstrike_weaponrelease, w_para_hud, w_para_precache, w_para_pickup, diff --git a/src/shared/cstrike/w_scout.c b/src/shared/cstrike/w_scout.c index acfffd06..be570032 100644 --- a/src/shared/cstrike/w_scout.c +++ b/src/shared/cstrike/w_scout.c @@ -16,11 +16,10 @@ enum { SCOUT_IDLE, - SCOUT_RELOAD, - SCOUT_DRAW, SCOUT_SHOOT1, SCOUT_SHOOT2, - SCOUT_SHOOT3 + SCOUT_RELOAD, + SCOUT_DRAW }; void @@ -82,9 +81,13 @@ w_scout_pickup(int new) void w_scout_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_scout.mdl"); Weapons_ViewAnimation(SCOUT_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 5; + pl.cs_cross_deltadist = 3; #endif } @@ -97,33 +100,25 @@ w_scout_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(SCOUT_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(SCOUT_SHOOT2); - break; - default: - Weapons_ViewAnimation(SCOUT_SHOOT3); - break; - } #else if (!pl.scout_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 75, [0.01,0,01], WEAPON_SCOUT); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 75, [accuracy,accuracy], WEAPON_SCOUT); pl.scout_mag--; if (self.flags & FL_CROUCHING) @@ -134,7 +129,20 @@ w_scout_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_scout.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(SCOUT_SHOOT1); + break; + default: + Weapons_ViewAnimation(SCOUT_SHOOT2); + break; + } + pl.w_attack_next = 1.25f; + pl.w_idle_next = pl.w_attack_next; } void @@ -167,6 +175,7 @@ w_scout_reload(void) Weapons_ViewAnimation(SCOUT_RELOAD); pl.w_attack_next = 2.0f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +188,11 @@ void w_scout_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +239,7 @@ weapon_t w_scout = w_scout_primary, __NULL__, w_scout_reload, - __NULL__, + w_cstrike_weaponrelease, w_scout_hud, w_scout_precache, w_scout_pickup, diff --git a/src/shared/cstrike/w_sg550.c b/src/shared/cstrike/w_sg550.c index f4fb42ac..92ae914f 100644 --- a/src/shared/cstrike/w_sg550.c +++ b/src/shared/cstrike/w_sg550.c @@ -16,11 +16,10 @@ enum { SG550_IDLE, - SG550_RELOAD, - SG550_DRAW, SG550_SHOOT1, SG550_SHOOT2, - SG550_SHOOT3 + SG550_RELOAD, + SG550_DRAW, }; void @@ -38,7 +37,7 @@ void w_sg550_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_556mm, -1); #endif } @@ -69,8 +68,8 @@ w_sg550_pickup(int new) if (new) { pl.sg550_mag = 30; } else { - if (pl.ammo_762mm < 90) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + if (pl.ammo_556mm < 90) { + pl.ammo_556mm = bound(0, pl.ammo_556mm + 30, 90); } else { return FALSE; } @@ -82,9 +81,13 @@ w_sg550_pickup(int new) void w_sg550_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_sg550.mdl"); Weapons_ViewAnimation(SG550_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 5; + pl.cs_cross_deltadist = 3; #endif } @@ -97,33 +100,25 @@ w_sg550_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(SG550_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(SG550_SHOOT2); - break; - default: - Weapons_ViewAnimation(SG550_SHOOT3); - break; - } #else if (!pl.sg550_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 70, [0.01,0,01], WEAPON_SG550); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 70, [accuracy,accuracy], WEAPON_SG550); pl.sg550_mag--; if (self.flags & FL_CROUCHING) @@ -134,7 +129,20 @@ w_sg550_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_sg550.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 2; + switch (r) { + case 0: + Weapons_ViewAnimation(SCOUT_SHOOT1); + break; + default: + Weapons_ViewAnimation(SCOUT_SHOOT2); + break; + } + pl.w_attack_next = 0.25f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +165,17 @@ w_sg550_reload(void) if (pl.sg550_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_556mm) { return; } - Weapons_ReloadWeapon(pl, player::sg550_mag, player::ammo_762mm, 30); - Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::sg550_mag, player::ammo_556mm, 30); + Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_556mm, -1); #endif Weapons_ViewAnimation(SG550_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.8f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +188,11 @@ void w_sg550_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +239,7 @@ weapon_t w_sg550 = w_sg550_primary, __NULL__, w_sg550_reload, - __NULL__, + w_cstrike_weaponrelease, w_sg550_hud, w_sg550_precache, w_sg550_pickup, diff --git a/src/shared/cstrike/w_sg552.c b/src/shared/cstrike/w_sg552.c index fcc0fb89..e62f6a0d 100644 --- a/src/shared/cstrike/w_sg552.c +++ b/src/shared/cstrike/w_sg552.c @@ -38,7 +38,7 @@ void w_sg552_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_556mm, -1); #endif } @@ -69,8 +69,8 @@ w_sg552_pickup(int new) if (new) { pl.sg552_mag = 30; } else { - if (pl.ammo_762mm < 90) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + if (pl.ammo_556mm < 90) { + pl.ammo_556mm = bound(0, pl.ammo_556mm + 30, 90); } else { return FALSE; } @@ -82,9 +82,13 @@ w_sg552_pickup(int new) void w_sg552_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_sg552.mdl"); Weapons_ViewAnimation(SG552_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 5; + pl.cs_cross_deltadist = 3; #endif } @@ -97,12 +101,35 @@ w_sg552_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } +#else + if (!pl.sg552_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 220); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [accuracy,accuracy], WEAPON_SG552); + pl.sg552_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_sg552.fire"); +#endif + Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +144,9 @@ w_sg552_primary(void) Weapons_ViewAnimation(SG552_SHOOT3); break; } -#else - if (!pl.sg552_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [0.01,0,01], WEAPON_SG552); - - pl.sg552_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_sg552.fire"); -#endif pl.w_attack_next = 0.0825f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +169,17 @@ w_sg552_reload(void) if (pl.sg552_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_556mm) { return; } - Weapons_ReloadWeapon(pl, player::sg552_mag, player::ammo_762mm, 30); - Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::sg552_mag, player::ammo_556mm, 30); + Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_556mm, -1); #endif Weapons_ViewAnimation(SG552_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.2f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +192,11 @@ void w_sg552_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +243,7 @@ weapon_t w_sg552 = w_sg552_primary, __NULL__, w_sg552_reload, - __NULL__, + w_cstrike_weaponrelease, w_sg552_hud, w_sg552_precache, w_sg552_pickup, diff --git a/src/shared/cstrike/w_smokegrenade.c b/src/shared/cstrike/w_smokegrenade.c index 0a00092e..fbd78047 100644 --- a/src/shared/cstrike/w_smokegrenade.c +++ b/src/shared/cstrike/w_smokegrenade.c @@ -105,6 +105,16 @@ w_smokegrenade_aimanim(void) return w_flashbang_aimanim(); } +void +w_smokegrenade_hud(void) +{ +#ifdef CSQC + HUD_DrawAmmo2(); + vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [144/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); +#endif +} + void w_smokegrenade_hudpic(int selected, vector pos, float a) { @@ -149,7 +159,7 @@ weapon_t w_smokegrenade = __NULL__, __NULL__, __NULL__, - __NULL__, + w_smokegrenade_hud, w_smokegrenade_precache, __NULL__, w_smokegrenade_updateammo, diff --git a/src/shared/cstrike/w_tmp.c b/src/shared/cstrike/w_tmp.c index 26c973b7..4d8fb618 100644 --- a/src/shared/cstrike/w_tmp.c +++ b/src/shared/cstrike/w_tmp.c @@ -38,7 +38,7 @@ void w_tmp_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_762mm, -1); + Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_9mm, -1); #endif } @@ -69,8 +69,8 @@ w_tmp_pickup(int new) if (new) { pl.tmp_mag = 30; } else { - if (pl.ammo_762mm < 90) { - pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + if (pl.ammo_9mm < 90) { + pl.ammo_9mm = bound(0, pl.ammo_9mm + 30, 90); } else { return FALSE; } @@ -82,9 +82,13 @@ w_tmp_pickup(int new) void w_tmp_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_tmp.mdl"); Weapons_ViewAnimation(TMP_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 7; + pl.cs_cross_deltadist = 3; #endif } @@ -97,12 +101,34 @@ w_tmp_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } +#else + if (!pl.tmp_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [accuracy,accuracy], WEAPON_TMP); + pl.tmp_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_tmp.fire"); +#endif Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +143,9 @@ w_tmp_primary(void) Weapons_ViewAnimation(TMP_SHOOT3); break; } -#else - if (!pl.tmp_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 26, [0.01,0,01], WEAPON_TMP); - - pl.tmp_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_tmp.fire"); -#endif pl.w_attack_next = 0.07f; + pl.w_idle_next = pl.w_attack_next; } void @@ -157,16 +168,17 @@ w_tmp_reload(void) if (pl.tmp_mag >= 30) { return; } - if (!pl.ammo_762mm) { + if (!pl.ammo_9mm) { return; } - Weapons_ReloadWeapon(pl, player::tmp_mag, player::ammo_762mm, 30); - Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_762mm, -1); + Weapons_ReloadWeapon(pl, player::tmp_mag, player::ammo_9mm, 30); + Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_9mm, -1); #endif Weapons_ViewAnimation(TMP_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 2.1f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,11 +191,11 @@ void w_tmp_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -230,7 +242,7 @@ weapon_t w_tmp = w_tmp_primary, __NULL__, w_tmp_reload, - __NULL__, + w_cstrike_weaponrelease, w_tmp_hud, w_tmp_precache, w_tmp_pickup, diff --git a/src/shared/cstrike/w_ump45.c b/src/shared/cstrike/w_ump45.c index 1e9fc4a5..0da8149c 100644 --- a/src/shared/cstrike/w_ump45.c +++ b/src/shared/cstrike/w_ump45.c @@ -82,9 +82,13 @@ w_ump45_pickup(int new) void w_ump45_draw(void) { -#ifdef CSQC + player pl = (player)self; Weapons_SetModel("models/v_ump45.mdl"); Weapons_ViewAnimation(UMP45_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 6; + pl.cs_cross_deltadist = 3; #endif } @@ -97,12 +101,35 @@ w_ump45_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } +#else + if (!pl.ump45_mag) { + return; + } +#endif + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 210); + +#ifdef CSQC + pl.a_ammo1--; View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 30, [accuracy,accuracy], WEAPON_UMP45); + pl.ump45_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + Sound_Play(pl, CHAN_WEAPON, "weapon_ump45.fire"); +#endif + Weapons_ViewPunchAngle([-2,0,0]); int r = (float)input_sequence % 3; @@ -117,24 +144,9 @@ w_ump45_primary(void) Weapons_ViewAnimation(UMP45_SHOOT3); break; } -#else - if (!pl.ump45_mag) { - return; - } - - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 30, [0.01,0,01], WEAPON_UMP45); - - pl.ump45_mag--; - - if (self.flags & FL_CROUCHING) - Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); - else - Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_ump45.fire"); -#endif pl.w_attack_next = 0.105f; + pl.w_idle_next = pl.w_attack_next; } void @@ -166,7 +178,8 @@ w_ump45_reload(void) #endif Weapons_ViewAnimation(UMP45_RELOAD); - pl.w_attack_next = 2.0f; + pl.w_attack_next = 3.5f; + pl.w_idle_next = pl.w_attack_next; } float @@ -179,10 +192,11 @@ void w_ump45_hud(void) { #ifdef CSQC + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [96/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -229,7 +243,7 @@ weapon_t w_ump45 = w_ump45_primary, __NULL__, w_ump45_reload, - __NULL__, + w_cstrike_weaponrelease, w_ump45_hud, w_ump45_precache, w_ump45_pickup, diff --git a/src/shared/cstrike/w_usp45.c b/src/shared/cstrike/w_usp45.c index b80b8aa3..c523bd64 100644 --- a/src/shared/cstrike/w_usp45.c +++ b/src/shared/cstrike/w_usp45.c @@ -16,11 +16,21 @@ enum { USP45_IDLE, - USP45_RELOAD, - USP45_DRAW, USP45_SHOOT1, USP45_SHOOT2, - USP45_SHOOT3 + USP45_SHOOT3, + USP45_SHOOTLAST, + USP45_RELOAD, + USP45_DRAW, + USP45_ADDSIL, + USP45_IDLEUNSIL, + USP45_SHOOT1UNSIL, + USP45_SHOOT2UNSIL, + USP45_SHOOT3UNSIL, + USP45_SHOOTLASTUNSIL, + USP45_RELOADUNSIL, + USP45_DRAWUNSIL, + USP45_DETACHSIL }; void @@ -28,13 +38,11 @@ w_usp45_precache(void) { #ifdef SSQC Sound_Precache("weapon_usp45.fire"); - Sound_Precache("weapon_usp45.silencer"); + Sound_Precache("weapon_usp45.silenced"); #endif - precache_model("models/v_usp45.mdl"); - precache_model("models/w_usp45.mdl"); - precache_model("models/p_usp45.mdl"); - precache_sound("weapons/usp45-1.wav"); - precache_sound("weapons/usp45-2.wav"); + precache_model("models/v_usp.mdl"); + precache_model("models/w_usp.mdl"); + precache_model("models/p_usp.mdl"); } void @@ -85,9 +93,18 @@ w_usp45_pickup(int new) void w_usp45_draw(void) { + player pl = (player)self; + + Weapons_SetModel("models/v_usp.mdl"); + if (pl.a_ammo3 == 1) { + Weapons_ViewAnimation(USP45_DRAW); + } else { + Weapons_ViewAnimation(USP45_DRAWUNSIL); + } + #ifdef CSQC - Weapons_SetModel("models/v_usp45.mdl"); - Weapons_ViewAnimation(USP45_DRAW); + pl.cs_cross_mindist = 8; + pl.cs_cross_deltadist = 3; #endif } @@ -100,44 +117,114 @@ w_usp45_primary(void) return; } -#ifdef CSQC - if (!pl.a_ammo1) { + if (pl.flags & FL_SEMI_TOGGLED) { return; } - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(USP45_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(USP45_SHOOT2); - break; - default: - Weapons_ViewAnimation(USP45_SHOOT3); - break; + /* ammo check */ +#ifdef CSQC + if (!pl.a_ammo1) { + return; } #else if (!pl.usp45_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 34, [0.01,0,01], WEAPON_USP45); + Cstrike_ShotMultiplierAdd(pl, 1); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); + /* actual firing */ +#ifdef CSQC + if (pl.a_ammo3 == 1) { + View_SetMuzzleflash(0); + } else { + View_SetMuzzleflash(MUZZLE_SMALL); + } + + pl.a_ammo1--; +#else pl.usp45_mag--; + /* Different sounds without silencer */ + if (pl.a_ammo3 == 1) { + Sound_Play(pl, CHAN_WEAPON, "weapon_usp45.silenced"); + } else { + Sound_Play(pl, CHAN_WEAPON, "weapon_usp45.fire"); + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 33, [accuracy,accuracy], WEAPON_USP45); + if (self.flags & FL_CROUCHING) Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); else Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - - Sound_Play(pl, CHAN_WEAPON, "weapon_usp45.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); - pl.w_attack_next = 0.15f; + /* this stuff is predicted */ + int r = (float)input_sequence % 3; + if (pl.a_ammo3 == 1) { + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(USP45_SHOOTLAST); + } else { + switch (r) { + case 0: + Weapons_ViewAnimation(USP45_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(USP45_SHOOT2); + break; + default: + Weapons_ViewAnimation(USP45_SHOOT3); + break; + } + } + } else { + if (pl.a_ammo1 <= 0) { + Weapons_ViewAnimation(USP45_SHOOTLASTUNSIL); + } else { + switch (r) { + case 0: + Weapons_ViewAnimation(USP45_SHOOT1UNSIL); + break; + case 1: + Weapons_ViewAnimation(USP45_SHOOT2UNSIL); + break; + default: + Weapons_ViewAnimation(USP45_SHOOT3UNSIL); + break; + } + } + } + + pl.flags |= FL_SEMI_TOGGLED; + pl.w_attack_next = 0.0875f; + pl.w_idle_next = pl.w_attack_next; +} + +void +w_usp45_secondary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0) { + return; + } + + /* toggle silencer */ + pl.a_ammo3 = 1 - pl.a_ammo3; + + /* play the animation */ + if (pl.a_ammo3) { + Weapons_ViewAnimation(USP45_ADDSIL); + } else { + Weapons_ViewAnimation(USP45_DETACHSIL); + } + + pl.w_attack_next = 2.0f; + pl.w_idle_next = pl.w_attack_next; } void @@ -168,8 +255,13 @@ w_usp45_reload(void) Weapons_UpdateAmmo(pl, pl.usp45_mag, pl.ammo_45acp, -1); #endif - Weapons_ViewAnimation(USP45_RELOAD); - pl.w_attack_next = 2.0f; + if (pl.a_ammo3 == 1) { + Weapons_ViewAnimation(USP45_RELOAD); + } else { + Weapons_ViewAnimation(USP45_RELOADUNSIL); + } + + pl.w_attack_next = 2.5f; } float @@ -182,11 +274,11 @@ void w_usp45_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [96/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -231,9 +323,9 @@ weapon_t w_usp45 = w_usp45_draw, __NULL__, w_usp45_primary, - __NULL__, + w_usp45_secondary, w_usp45_reload, - __NULL__, + w_cstrike_weaponrelease, w_usp45_hud, w_usp45_precache, w_usp45_pickup, diff --git a/src/shared/cstrike/w_xm1014.c b/src/shared/cstrike/w_xm1014.c index 71a932b6..25c062fa 100644 --- a/src/shared/cstrike/w_xm1014.c +++ b/src/shared/cstrike/w_xm1014.c @@ -16,11 +16,20 @@ enum { XM1014_IDLE, - XM1014_RELOAD, - XM1014_DRAW, XM1014_SHOOT1, XM1014_SHOOT2, - XM1014_SHOOT3 + XM1014_INSERT, + XM1014_RELOAD_END, + XM1014_RELOAD_START, + XM1014_DRAW +}; + +enum +{ + XM1014S_IDLE, + XM1014S_RELOAD_START, + XM1014S_RELOAD, + XM1014S_RELOAD_END }; void @@ -28,6 +37,7 @@ w_xm1014_precache(void) { #ifdef SSQC Sound_Precache("weapon_xm1014.fire"); + Sound_Precache("weapon_xm1014.insertshell"); #endif precache_model("models/v_xm1014.mdl"); precache_model("models/w_xm1014.mdl"); @@ -38,7 +48,7 @@ void w_xm1014_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, pl.xm1014_mag, pl.ammo_buckshot, -1); + Weapons_UpdateAmmo(pl, pl.xm1014_mag, pl.ammo_buckshot, pl.a_ammo3); #endif } @@ -82,8 +92,14 @@ w_xm1014_pickup(int new) void w_xm1014_draw(void) { + player pl = (player)self; Weapons_SetModel("models/v_xm1014.mdl"); Weapons_ViewAnimation(XM1014_DRAW); + +#ifdef CSQC + pl.cs_cross_mindist = 9; + pl.cs_cross_deltadist = 4; +#endif } void @@ -95,33 +111,25 @@ w_xm1014_primary(void) return; } + /* ammo check */ #ifdef CSQC if (!pl.a_ammo1) { return; } - - View_SetMuzzleflash(MUZZLE_RIFLE); - Weapons_ViewPunchAngle([-2,0,0]); - - int r = (float)input_sequence % 3; - switch (r) { - case 0: - Weapons_ViewAnimation(XM1014_SHOOT1); - break; - case 1: - Weapons_ViewAnimation(XM1014_SHOOT2); - break; - default: - Weapons_ViewAnimation(XM1014_SHOOT3); - break; - } #else if (!pl.xm1014_mag) { return; } +#endif - TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 22, [0.01,0,01], WEAPON_XM1014); + Cstrike_ShotMultiplierAdd(pl, 6); + float accuracy = Cstrike_CalculateAccuracy(pl, 200); +#ifdef CSQC + pl.a_ammo1--; + View_SetMuzzleflash(MUZZLE_RIFLE); +#else + TraceAttack_FireBullets(6, pl.origin + pl.view_ofs, 22, [accuracy,accuracy], WEAPON_XM1014); pl.xm1014_mag--; if (self.flags & FL_CROUCHING) @@ -132,38 +140,89 @@ w_xm1014_primary(void) Sound_Play(pl, CHAN_WEAPON, "weapon_xm1014.fire"); #endif + Weapons_ViewPunchAngle([-2,0,0]); + + int r = (float)input_sequence % 3; + switch (r) { + case 0: + Weapons_ViewAnimation(XM1014_SHOOT1); + break; + default: + Weapons_ViewAnimation(XM1014_SHOOT2); + break; + } + pl.w_attack_next = 0.25f; + pl.w_idle_next = pl.w_attack_next; } void w_xm1014_reload(void) { player pl = (player)self; - - if (pl.w_attack_next > 0.0) { - return; - } - #ifdef CSQC if (pl.a_ammo1 >= 7) { return; } - if (!pl.a_ammo2) { + if (pl.a_ammo2 <= 0) { return; } #else if (pl.xm1014_mag >= 7) { return; } - if (!pl.ammo_buckshot) { + if (pl.ammo_buckshot <= 0) { + return; + } +#endif + + if (pl.a_ammo3 > XM1014S_IDLE) { + return; + } + pl.a_ammo3 = XM1014S_RELOAD_START; + pl.w_idle_next = 0.0f; +} + +void +w_xm1014_release(void) +{ + player pl = (player)self; + + w_cstrike_weaponrelease(); + + if (pl.w_idle_next > 0.0) { return; } - Weapons_ReloadWeapon(pl, player::xm1014_mag, player::ammo_buckshot, 7); -#endif + if (pl.a_ammo3 == XM1014S_RELOAD_START) { + Weapons_ViewAnimation(XM1014_RELOAD_START); + pl.a_ammo3 = XM1014S_RELOAD; + pl.w_idle_next = 0.65f; + } else if (pl.a_ammo3 == XM1014S_RELOAD) { + Weapons_ViewAnimation(XM1014_INSERT); +#ifdef CSQC + pl.a_ammo1++; + pl.a_ammo2--; - Weapons_ViewAnimation(XM1014_RELOAD); - pl.w_attack_next = 2.0f; + if (pl.a_ammo2 <= 0 || pl.a_ammo1 >= 7) { + pl.a_ammo3 = XM1014S_RELOAD_END; + } +#else + pl.xm1014_mag++; + pl.ammo_buckshot--; + w_xm1014_updateammo(pl); + Sound_Play(pl, CHAN_WEAPON, "weapon_xm1014.insertshell"); + if (pl.ammo_buckshot <= 0 || pl.xm1014_mag >= 7) { + pl.a_ammo3 = XM1014S_RELOAD_END; + } +#endif + pl.w_idle_next = 0.5f; + } else if (pl.a_ammo3 == XM1014S_RELOAD_END) { + Weapons_ViewAnimation(XM1014_RELOAD_END); + pl.a_ammo3 = XM1014S_IDLE; + pl.w_idle_next = 10.0f; + pl.w_attack_next = 0.5f; + } } float @@ -176,11 +235,11 @@ void w_xm1014_hud(void) { #ifdef CSQC - + Cstrike_DrawCrosshair(); HUD_DrawAmmo1(); HUD_DrawAmmo2(); vector aicon_pos = g_hudmins + [g_hudres[0] - 48, g_hudres[1] - 42]; - drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/128], [24/256, 24/128], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); #endif } @@ -227,7 +286,7 @@ weapon_t w_xm1014 = w_xm1014_primary, __NULL__, w_xm1014_reload, - __NULL__, + w_xm1014_release, w_xm1014_hud, w_xm1014_precache, w_xm1014_pickup, diff --git a/src/shared/cstrike/weapons.h b/src/shared/cstrike/weapons.h index ab08b588..544284b9 100644 --- a/src/shared/cstrike/weapons.h +++ b/src/shared/cstrike/weapons.h @@ -48,12 +48,43 @@ enum }; #define AMMO_MAX_50AE 35 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [24/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_762MM 90 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_556MM 90 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_556MMBOX 200 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_338MAG 30 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [24/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_9MM 150 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_BUCKSHOT 32 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [0,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_45ACP 100 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [96/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_357SIG 52 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [120/256,72/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + #define AMMO_MAX_57MM 100 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [120/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + +// flashbang +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [48/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + +// he +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [72/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + +// smoke +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [144/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); + +// c4 +// drawsubpic(aicon_pos, [24,24], "sprites/640hud7.spr_0.tga", [96/256,96/256], [24/256, 24/256], g_hud_color, pSeat->ammo2_alpha, DRAWFLAG_ADDITIVE); diff --git a/src/shared/cstrike/weapons_cstrike.c b/src/shared/cstrike/weapons_cstrike.c new file mode 100644 index 00000000..b7a91ae0 --- /dev/null +++ b/src/shared/cstrike/weapons_cstrike.c @@ -0,0 +1,57 @@ +/* + * 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. + */ + +/* called whenever a cstrike gun fires a successful shot */ +void +Cstrike_ShotMultiplierAdd(player pl, int shots) +{ + /* more than 12 is enough, you can barely hit the barn */ + pl.cs_shotmultiplier = bound(0, pl.cs_shotmultiplier + shots, 12); + + pl.cs_shottime = 0.2f; + pl.punchangle[0] = -2 * (pl.cs_shotmultiplier / 6); + pl.punchangle[1] = random(-1, 1); +} + +/* generate an accuracy value that we'll pass onto TraceAttack */ +float +Cstrike_CalculateAccuracy(player pl, float divisor) +{ + if (divisor == -1) { + /* snipers shoot way less accurate overall. */ + return (pl.viewzoom < 1.0f) ? 0.0f : 0.05; + } else { + return (pl.cs_shotmultiplier / divisor); + } +} + +/* called whenever cstrike guns aren't firing */ +void +Cstrike_ShotMultiplierUpdate(player pl) +{ + if ((pl.cs_shotmultiplier > 0) && (pl.cs_shottime <= 0.0f)) { + pl.cs_shottime = pl.w_attack_next + 0.01; + pl.cs_shotmultiplier--; + } + + pl.cs_shottime = max(0, pl.cs_shottime - input_timelength); +} +void +w_cstrike_weaponrelease(void) +{ + player pl = (player)self; + Cstrike_ShotMultiplierUpdate(pl); +} diff --git a/src/shared/entities.h b/src/shared/entities.h index 36242c51..01870597 100644 --- a/src/shared/entities.h +++ b/src/shared/entities.h @@ -65,5 +65,7 @@ enumflags { PLAYER_FRAME, PLAYER_AMMO1, PLAYER_AMMO2, - PLAYER_AMMO3 + PLAYER_AMMO3, + PLAYER_CSSHOT, + PLAYER_CSSHOTTIME }; diff --git a/src/shared/hunger/w_medkit.c b/src/shared/hunger/w_medkit.c index ca44229f..33626f74 100644 --- a/src/shared/hunger/w_medkit.c +++ b/src/shared/hunger/w_medkit.c @@ -134,7 +134,6 @@ void w_medkit_release(void) { player pl = (player)self; - int r; if (pl.w_idle_next > 0.0) { return; diff --git a/src/shared/poke646/w_bradnailer.c b/src/shared/poke646/w_bradnailer.c index 7fa0c9dc..280e9e87 100644 --- a/src/shared/poke646/w_bradnailer.c +++ b/src/shared/poke646/w_bradnailer.c @@ -96,11 +96,7 @@ w_bradnailer_shootnail(void) Effect_CreateSpark(self.origin, trace_plane_normal); if (other.takedamage == DAMAGE_YES) { Damage_Apply(other, self.owner, 15, WEAPON_BRADNAILER, DMG_GENERIC); - if (random() < 0.5) { - Weapons_PlaySound(self, CHAN_WEAPON, "weapons/brad_hit1.wav", 1, ATTN_NORM); - } else { - Weapons_PlaySound(self, CHAN_WEAPON, "weapons/brad_hit2.wav", 1, ATTN_NORM); - } + Sound_Play(self, CHAN_WEAPON, "weapon_bradnailer.hitbody"); } else { Weapons_PlaySound(self, CHAN_WEAPON, "weapons/xbow_hit1.wav", 1, ATTN_NORM); } @@ -125,7 +121,7 @@ w_bradnailer_shootnail(void) else Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); - sound(pl, CHAN_WEAPON, "weapons/bradnailer.wav", 1, ATTN_NORM); + Sound_Play(pl, CHAN_WEAPON, "weapon_bradnailer.fire"); } #endif @@ -196,7 +192,7 @@ w_bradnailer_release(void) return; } - int r = floor(random(0,3)); + int r = (float)input_sequence % 3; switch (r) { case 0: Weapons_ViewAnimation(BNAIL_IDLE1); diff --git a/src/shared/valve/w_gauss.c b/src/shared/valve/w_gauss.c index e60e914a..31203081 100644 --- a/src/shared/valve/w_gauss.c +++ b/src/shared/valve/w_gauss.c @@ -49,7 +49,7 @@ FXGauss::Draw(void) src = m_vecStart; makevectors(m_vecAngle); - vector endpos = src + v_forward * 1024; + endpos = src + v_forward * 1024; traceline(src, endpos, FALSE, pl); /* drawing the first bit */ @@ -269,7 +269,7 @@ void w_gauss_primary(void) FXGauss p = (FXGauss)pSeat->pWeaponFX; p.m_iBeams = 0; p.m_vecAngle = input_angles; - p.m_vecStart = pl.net_origin + pl.view_ofs; + p.m_vecStart = pl.origin + pl.view_ofs; p.alpha = 1.0f; pl.a_ammo2 -= 2; Weapons_ViewPunchAngle([-2,0,0]); @@ -361,7 +361,7 @@ void w_gauss_release(void) FXGauss p = (FXGauss)pSeat->pWeaponFX; p.m_iBeams = 1; p.m_vecAngle = input_angles; - p.m_vecStart = pl.net_origin + pl.view_ofs; + p.m_vecStart = pl.origin + pl.view_ofs; p.alpha = 1.0f; soundupdate(pl, CHAN_WEAPON, "", -1, ATTN_NORM, 0, 0, 0); Weapons_ViewPunchAngle([-5,0,0]); diff --git a/src/shared/valve/w_shotgun.c b/src/shared/valve/w_shotgun.c index c283275d..48e7bc71 100644 --- a/src/shared/valve/w_shotgun.c +++ b/src/shared/valve/w_shotgun.c @@ -186,6 +186,7 @@ void w_shotgun_secondary(void) pl.w_attack_next = 1.5f; pl.w_idle_next = 2.5f; } + void w_shotgun_reload(void) { player pl = (player)self; @@ -211,6 +212,7 @@ void w_shotgun_reload(void) pl.a_ammo3 = SHOTTY_RELOAD_START; pl.w_idle_next = 0.0f; } + void w_shotgun_release(void) { player pl = (player)self; diff --git a/src/shared/valve/weapon_common.c b/src/shared/valve/weapon_common.c index b1069c54..61d987cb 100644 --- a/src/shared/valve/weapon_common.c +++ b/src/shared/valve/weapon_common.c @@ -123,6 +123,8 @@ void Weapons_Release(void) if (g_weapons[i].release != __NULL__) { g_weapons[i].release(); } + + pl.flags &= ~FL_SEMI_TOGGLED; } void Weapons_DrawCrosshair(void)