From f66792ef493609e04c5c0aeff8f6ee3aa61484bf Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sat, 28 Mar 2020 10:56:52 +0100 Subject: [PATCH] Comitting the new cstrike-branch stuff so far, it's very little but a step in the right direction. The old (regressed) codebase is now in cstrike.old. --- .gitignore | 3 + src/Makefile | 4 +- src/client/cstrike.old/defs.h | 206 +++++ src/client/{cstrike => cstrike.old}/draw.c | 0 src/client/cstrike.old/entities.c | 62 ++ src/client/{cstrike => cstrike.old}/event.c | 0 src/client/cstrike.old/hud.c | 541 +++++++++++++ .../{cstrike => cstrike.old}/hudcrosshair.c | 0 .../{cstrike => cstrike.old}/hudorbituaries.c | 0 .../{cstrike => cstrike.old}/hudscope.c | 0 .../hudweaponselect.c | 0 src/client/cstrike.old/init.c | 61 ++ src/client/{cstrike => cstrike.old}/input.c | 0 .../{cstrike => cstrike.old}/nightvision.c | 0 .../{cstrike => cstrike.old}/overview.c | 0 src/client/{cstrike => cstrike.old}/player.c | 0 src/client/cstrike.old/progs.src | 107 +++ .../{cstrike => cstrike.old}/scoreboard.c | 0 .../{cstrike => cstrike.old}/vgui_buymenu.cpp | 0 src/client/cstrike.old/vgui_chooseteam.cpp | 205 +++++ .../{cstrike => cstrike.old}/vgui_motd.cpp | 0 .../{cstrike => cstrike.old}/vgui_radio.cpp | 0 src/client/{cstrike => cstrike.old}/view.c | 0 src/client/cstrike/defs.h | 191 ----- src/client/cstrike/entities.c | 36 - src/client/cstrike/hud.c | 765 +++++++----------- src/client/cstrike/hud.h | 51 ++ src/client/cstrike/hud_weaponselect.c | 200 +++++ src/client/cstrike/init.c | 59 +- src/client/cstrike/progs.src | 137 ++-- src/client/entry.c | 18 +- src/client/events.c | 2 +- src/client/music.c | 3 +- src/client/player.c | 42 +- src/client/predict.c | 6 +- src/client/view.c | 8 - src/gs-entbase/client/point_message.cpp | 2 + src/server/{cstrike => cstrike.old}/ammo.c | 0 src/server/cstrike.old/armoury_entity.cpp | 189 +++++ src/server/cstrike.old/client.c | 231 ++++++ src/server/{cstrike => cstrike.old}/damage.c | 0 src/server/{cstrike => cstrike.old}/defs.h | 2 +- .../{cstrike => cstrike.old}/defsfields.h | 0 .../func_bomb_target.cpp | 0 .../{cstrike => cstrike.old}/func_buyzone.cpp | 0 .../func_escapezone.cpp | 0 .../func_hostage_rescue.cpp | 0 .../func_vip_safetyzone.cpp | 0 .../hostage_entity.cpp | 0 .../info_hostage_rescue.cpp | 0 .../info_map_parameters.cpp | 0 src/server/cstrike.old/input.c | 72 ++ src/server/cstrike.old/item_suit.cpp | 66 ++ src/server/{cstrike => cstrike.old}/main.c | 0 src/server/{cstrike => cstrike.old}/money.c | 0 src/server/cstrike.old/player.c | 267 ++++++ src/server/cstrike.old/progs.src | 96 +++ src/server/{cstrike => cstrike.old}/rules.c | 0 src/server/{cstrike => cstrike.old}/spawn.c | 4 +- src/server/{cstrike => cstrike.old}/timer.c | 0 src/server/cstrike/armoury_entity.cpp | 125 +-- src/server/cstrike/client.c | 468 ++++++----- src/server/cstrike/gamerules.c | 89 ++ src/server/cstrike/input.c | 98 ++- src/server/cstrike/item_suit.cpp | 15 +- src/server/cstrike/player.c | 296 +++---- src/server/cstrike/progs.src | 119 ++- .../{cstrike => cstrike.old}/animations.c | 0 src/shared/{cstrike => cstrike.old}/basegun.c | 0 .../{cstrike => cstrike.old}/basemelee.c | 2 +- src/shared/{cstrike => cstrike.old}/defs.h | 0 src/shared/cstrike.old/equipment.c | 124 +++ src/shared/cstrike.old/player.cpp | 129 +++ src/shared/cstrike.old/radio.c | 317 ++++++++ .../{cstrike => cstrike.old}/weaponak47.c | 0 .../{cstrike => cstrike.old}/weaponaug.c | 0 .../{cstrike => cstrike.old}/weaponawp.c | 0 .../{cstrike => cstrike.old}/weaponc4bomb.c | 0 .../{cstrike => cstrike.old}/weapondeagle.c | 0 .../{cstrike => cstrike.old}/weaponelites.c | 0 .../weaponfiveseven.c | 0 .../weaponflashbang.c | 2 +- .../{cstrike => cstrike.old}/weapong3sg1.c | 0 .../{cstrike => cstrike.old}/weaponglock18.c | 0 .../weaponhegrenade.c | 0 .../{cstrike => cstrike.old}/weaponknife.c | 0 .../{cstrike => cstrike.old}/weaponm3.c | 0 .../{cstrike => cstrike.old}/weaponm4a1.c | 0 .../{cstrike => cstrike.old}/weaponmac10.c | 0 .../{cstrike => cstrike.old}/weaponmp5.c | 0 .../{cstrike => cstrike.old}/weaponp228.c | 0 .../{cstrike => cstrike.old}/weaponp90.c | 0 .../{cstrike => cstrike.old}/weaponpara.c | 0 src/shared/cstrike.old/weapons.c | 601 ++++++++++++++ .../{cstrike => cstrike.old}/weaponscout.c | 0 .../{cstrike => cstrike.old}/weaponsg550.c | 0 .../{cstrike => cstrike.old}/weaponsg552.c | 0 .../weaponsmokegrenade.c | 2 +- .../{cstrike => cstrike.old}/weapontmp.c | 0 .../{cstrike => cstrike.old}/weaponump45.c | 0 .../{cstrike => cstrike.old}/weaponusp45.c | 0 .../{cstrike => cstrike.old}/weaponxm1014.c | 0 src/shared/cstrike/equipment.c | 14 +- src/shared/cstrike/items.h | 51 ++ src/shared/cstrike/player.cpp | 2 +- src/shared/cstrike/w_ak47.c | 252 ++++++ src/shared/cstrike/w_aug.c | 252 ++++++ src/shared/cstrike/w_awp.c | 252 ++++++ src/shared/cstrike/w_c4bomb.c | 166 ++++ src/shared/cstrike/w_deagle.c | 254 ++++++ src/shared/cstrike/w_elites.c | 254 ++++++ src/shared/cstrike/w_fiveseven.c | 254 ++++++ src/shared/cstrike/w_flashbang.c | 166 ++++ src/shared/cstrike/w_g3sg1.c | 252 ++++++ src/shared/cstrike/w_glock18.c | 254 ++++++ src/shared/cstrike/w_hegrenade.c | 166 ++++ src/shared/cstrike/w_knife.c | 166 ++++ src/shared/cstrike/w_m3.c | 252 ++++++ src/shared/cstrike/w_m4a1.c | 252 ++++++ src/shared/cstrike/w_mac10.c | 252 ++++++ src/shared/cstrike/w_mp5.c | 252 ++++++ src/shared/cstrike/w_p228.c | 254 ++++++ src/shared/cstrike/w_p90.c | 252 ++++++ src/shared/cstrike/w_para.c | 252 ++++++ src/shared/cstrike/w_scout.c | 252 ++++++ src/shared/cstrike/w_sg550.c | 252 ++++++ src/shared/cstrike/w_sg552.c | 252 ++++++ src/shared/cstrike/w_smokegrenade.c | 166 ++++ src/shared/cstrike/w_tmp.c | 252 ++++++ src/shared/cstrike/w_ump45.c | 252 ++++++ src/shared/cstrike/w_usp45.c | 254 ++++++ src/shared/cstrike/w_xm1014.c | 252 ++++++ src/shared/cstrike/weapons.c | 614 +------------- src/shared/cstrike/weapons.h | 48 ++ 134 files changed, 11114 insertions(+), 2024 deletions(-) create mode 100644 src/client/cstrike.old/defs.h rename src/client/{cstrike => cstrike.old}/draw.c (100%) create mode 100644 src/client/cstrike.old/entities.c rename src/client/{cstrike => cstrike.old}/event.c (100%) create mode 100644 src/client/cstrike.old/hud.c rename src/client/{cstrike => cstrike.old}/hudcrosshair.c (100%) rename src/client/{cstrike => cstrike.old}/hudorbituaries.c (100%) rename src/client/{cstrike => cstrike.old}/hudscope.c (100%) rename src/client/{cstrike => cstrike.old}/hudweaponselect.c (100%) create mode 100644 src/client/cstrike.old/init.c rename src/client/{cstrike => cstrike.old}/input.c (100%) rename src/client/{cstrike => cstrike.old}/nightvision.c (100%) rename src/client/{cstrike => cstrike.old}/overview.c (100%) rename src/client/{cstrike => cstrike.old}/player.c (100%) create mode 100755 src/client/cstrike.old/progs.src rename src/client/{cstrike => cstrike.old}/scoreboard.c (100%) rename src/client/{cstrike => cstrike.old}/vgui_buymenu.cpp (100%) create mode 100644 src/client/cstrike.old/vgui_chooseteam.cpp rename src/client/{cstrike => cstrike.old}/vgui_motd.cpp (100%) rename src/client/{cstrike => cstrike.old}/vgui_radio.cpp (100%) rename src/client/{cstrike => cstrike.old}/view.c (100%) create mode 100644 src/client/cstrike/hud.h create mode 100644 src/client/cstrike/hud_weaponselect.c mode change 100755 => 100644 src/client/cstrike/progs.src rename src/server/{cstrike => cstrike.old}/ammo.c (100%) create mode 100755 src/server/cstrike.old/armoury_entity.cpp create mode 100644 src/server/cstrike.old/client.c rename src/server/{cstrike => cstrike.old}/damage.c (100%) rename src/server/{cstrike => cstrike.old}/defs.h (98%) rename src/server/{cstrike => cstrike.old}/defsfields.h (100%) rename src/server/{cstrike => cstrike.old}/func_bomb_target.cpp (100%) rename src/server/{cstrike => cstrike.old}/func_buyzone.cpp (100%) rename src/server/{cstrike => cstrike.old}/func_escapezone.cpp (100%) rename src/server/{cstrike => cstrike.old}/func_hostage_rescue.cpp (100%) rename src/server/{cstrike => cstrike.old}/func_vip_safetyzone.cpp (100%) rename src/server/{cstrike => cstrike.old}/hostage_entity.cpp (100%) rename src/server/{cstrike => cstrike.old}/info_hostage_rescue.cpp (100%) rename src/server/{cstrike => cstrike.old}/info_map_parameters.cpp (100%) create mode 100644 src/server/cstrike.old/input.c create mode 100644 src/server/cstrike.old/item_suit.cpp rename src/server/{cstrike => cstrike.old}/main.c (100%) rename src/server/{cstrike => cstrike.old}/money.c (100%) create mode 100644 src/server/cstrike.old/player.c create mode 100755 src/server/cstrike.old/progs.src rename src/server/{cstrike => cstrike.old}/rules.c (100%) rename src/server/{cstrike => cstrike.old}/spawn.c (99%) rename src/server/{cstrike => cstrike.old}/timer.c (100%) mode change 100755 => 100644 src/server/cstrike/armoury_entity.cpp create mode 100644 src/server/cstrike/gamerules.c rename src/shared/{cstrike => cstrike.old}/animations.c (100%) rename src/shared/{cstrike => cstrike.old}/basegun.c (100%) rename src/shared/{cstrike => cstrike.old}/basemelee.c (98%) rename src/shared/{cstrike => cstrike.old}/defs.h (100%) create mode 100755 src/shared/cstrike.old/equipment.c create mode 100644 src/shared/cstrike.old/player.cpp create mode 100755 src/shared/cstrike.old/radio.c rename src/shared/{cstrike => cstrike.old}/weaponak47.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponaug.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponawp.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponc4bomb.c (100%) rename src/shared/{cstrike => cstrike.old}/weapondeagle.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponelites.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponfiveseven.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponflashbang.c (98%) rename src/shared/{cstrike => cstrike.old}/weapong3sg1.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponglock18.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponhegrenade.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponknife.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponm3.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponm4a1.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponmac10.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponmp5.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponp228.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponp90.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponpara.c (100%) create mode 100755 src/shared/cstrike.old/weapons.c rename src/shared/{cstrike => cstrike.old}/weaponscout.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponsg550.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponsg552.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponsmokegrenade.c (98%) rename src/shared/{cstrike => cstrike.old}/weapontmp.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponump45.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponusp45.c (100%) rename src/shared/{cstrike => cstrike.old}/weaponxm1014.c (100%) create mode 100644 src/shared/cstrike/items.h create mode 100644 src/shared/cstrike/w_ak47.c create mode 100644 src/shared/cstrike/w_aug.c create mode 100644 src/shared/cstrike/w_awp.c create mode 100644 src/shared/cstrike/w_c4bomb.c create mode 100644 src/shared/cstrike/w_deagle.c create mode 100644 src/shared/cstrike/w_elites.c create mode 100644 src/shared/cstrike/w_fiveseven.c create mode 100644 src/shared/cstrike/w_flashbang.c create mode 100644 src/shared/cstrike/w_g3sg1.c create mode 100644 src/shared/cstrike/w_glock18.c create mode 100644 src/shared/cstrike/w_hegrenade.c create mode 100644 src/shared/cstrike/w_knife.c create mode 100644 src/shared/cstrike/w_m3.c create mode 100644 src/shared/cstrike/w_m4a1.c create mode 100644 src/shared/cstrike/w_mac10.c create mode 100644 src/shared/cstrike/w_mp5.c create mode 100644 src/shared/cstrike/w_p228.c create mode 100644 src/shared/cstrike/w_p90.c create mode 100644 src/shared/cstrike/w_para.c create mode 100644 src/shared/cstrike/w_scout.c create mode 100644 src/shared/cstrike/w_sg550.c create mode 100644 src/shared/cstrike/w_sg552.c create mode 100644 src/shared/cstrike/w_smokegrenade.c create mode 100644 src/shared/cstrike/w_tmp.c create mode 100644 src/shared/cstrike/w_ump45.c create mode 100644 src/shared/cstrike/w_usp45.c create mode 100644 src/shared/cstrike/w_xm1014.c mode change 100755 => 100644 src/shared/cstrike/weapons.c create mode 100644 src/shared/cstrike/weapons.h diff --git a/.gitignore b/.gitignore index edd6948f..af4cdbd0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ ship/ src/client/cstrike.new src/server/cstrike.new src/shared/cstrike.new +src/client/hl2 +src/server/hl2 +src/shared/hl2 *.lno *.pk3 *.dat diff --git a/src/Makefile b/src/Makefile index 3dcee722..983e70c0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -25,8 +25,8 @@ games: mods: mkdir -p ../cstrike/data.pk3dir - ##$(CC) client/cstrike.new/progs.src - ##$(CC) server/cstrike.new/progs.src + $(CC) client/cstrike/progs.src + $(CC) server/cstrike/progs.src mkdir -p ../scihunt/data.pk3dir $(CC) client/scihunt/progs.src $(CC) server/scihunt/progs.src diff --git a/src/client/cstrike.old/defs.h b/src/client/cstrike.old/defs.h new file mode 100644 index 00000000..53a30a6f --- /dev/null +++ b/src/client/cstrike.old/defs.h @@ -0,0 +1,206 @@ +/* + * 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. + */ + +// Clientside cvars +var vector autocvar_cross_color = '0 255 0'; // autocvar of "cross_color" + +var int autocvar_cl_radar = 1; + +// Particle stuff +var float PARTICLE_SMOKEGRENADE; + +.float flUpAngle; + +vector vHUDColor; // Defined in HUD_Draw (HUD.c) +vector vCrossColor; // Defined in HUD_Draw (HUDCrosshair.c) + +string sShellModel [ 4 ] = { + "models/pshell.mdl", + "models/rshell.mdl", + "models/rshell_big.mdl", + "models/shotgunshell.mdl" +}; + + +var string autocvar_skins_dir = ""; +string sViewModels[ CS_WEAPON_COUNT - 1 ] = { + "v_knife.mdl", + "v_usp.mdl", + "v_glock18.mdl", + "v_deagle.mdl", + "v_p228.mdl", + "v_elite.mdl", + "v_fiveseven.mdl", + "v_m3.mdl", + "v_xm1014.mdl", + "v_mp5.mdl", + "v_p90.mdl", + "v_ump45.mdl", + "v_mac10.mdl", + "v_tmp.mdl", + "v_ak47.mdl", + "v_sg552.mdl", + "v_m4a1.mdl", + "v_aug.mdl", + "v_scout.mdl", + "v_awp.mdl", + "v_g3sg1.mdl", + "v_sg550.mdl", + "v_m249.mdl", + "v_c4.mdl", + "v_flashbang.mdl", + "v_hegrenade.mdl", + "v_smokegrenade.mdl" +}; + + +struct +{ +//Viewmodel stuff + entity eViewModel; + entity eMuzzleflash; + float fNumBones; + float fEjectBone; + vector punchangle; + float fLastWeapon; + float fBobTime; + float fBob; + float damage_alpha; + vector damage_pos; + + /* Camera Bob */ + float flCamMove; + float flCamTime; + int iCamCycle; + float flCamFracSin; + float flCamDelta; + + int iZoomed; + float flZoomTime; + +//Player fields + entity ePlayer; + vector vPlayerOrigin; + vector vPlayerOriginOld; + vector vPlayerVelocity; + float fPlayerFlags; + +// Camera Fields + //entity ePlayerEnt; + vector vCameraPos; + vector vCameraAngle; + float fCameraTime; + +// Flashbang'd + float fFlashTime; + float fFlashAlpha; + +//UI fields + float fVGUI_Display; // The VGUI menu currently being drawn + int iShowScores; // This is seperated from the other VGUI stuff so we can check scores while buying and whatnot + + // Testing + int iOverview; + int iMapExpand; + float fMapLerp; + +//crosshair + int iOldShotMultiplier; + float fCrosshairDistance; + float fDecreaseShotTime; + int iShotMultiplier; + +//buy menu + // We can only carry one item per slot, so this is hacking around the last one + int iHUDGrenades; + int iHUDGrenadesSelected; + float fHUDWeaponSelectTime; + float fHUDWeaponSelected; + + int iInputAttack2; + int iInputReload; + int iInputUse; + int iInputDuck; + + float fInputSendNext; +} seats[4], *pSeat; + +// Sound Stuff +//.string sSoundSample; +//.float fVolume; +string HUD_GetChatColorHEX( float fTeam ); + +// For the player entity +.entity eGunModel; +float fWeaponEventPlayer; +.float fWeaponLast; +.float fWeaponBoneID; +.float health; +.float oldhealth; + +void Animation_ShootWeapon( entity ePlayer ); +void Animation_ReloadWeapon( entity ePlayer ); + +/* +==================== +HUD_GetChatColor + +Returns an RGB color vector for the specified team +==================== +*/ +vector HUD_GetChatColor( float fTeam ) { + if ( fTeam == TEAM_CT ) { + return '0.45 0.60 0.75'; + } else if ( fTeam == TEAM_T ) { + return '0.75 0.1875 0.1875'; + } else { + return '0.75 0.75 0.75'; + } +} + +/* +==================== +HUD_GetChatColor + +Returns a HEX color string prefix for the specified team +==================== +*/ +string HUD_GetChatColorHEX( float fTeam ) { + if ( fTeam == TEAM_CT ) { + return "^x7AC"; + } else if ( fTeam == TEAM_T ) { + return "^xC33"; + } else { + return "^xCCC"; + } +} + +/* +==================== +HUD_GetChatColor + +Returns a HEX color string prefix with teamname +==================== +*/ +string HUD_GetChatColorHEXTeam( float fTeam ) { + if ( fTeam == TEAM_CT ) { + return "^x7AC(Counter-Terrorist) "; + } else if ( fTeam == TEAM_T ) { + return "^xC33(Terrorist) "; + } else { + return "^xCCC(Spectator) "; + } +} diff --git a/src/client/cstrike/draw.c b/src/client/cstrike.old/draw.c similarity index 100% rename from src/client/cstrike/draw.c rename to src/client/cstrike.old/draw.c diff --git a/src/client/cstrike.old/entities.c b/src/client/cstrike.old/entities.c new file mode 100644 index 00000000..97f08b22 --- /dev/null +++ b/src/client/cstrike.old/entities.c @@ -0,0 +1,62 @@ +/* + * 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 +CSQC_ambient_generic( string sSample, float fVolume, float fAttenuation, float fLoop, float lFORate ) { + //print( sprintf( "SOUND: %s, %f, %d\n%d %d %d", sSample, fVolume, fAttenuation, self.origin[0], self.origin[1], self.origin[2] ) ); + static void LFOHack (void) { + sound( self, CHAN_VOICE, self.classname, self.movetype, self.style, 0, 0 ); + self.nextthink = self.solid + time; + } + // Hack + if ( lFORate ) { + self.classname = sSample; + self.movetype = fVolume; + self.style = fAttenuation; + self.think = LFOHack; + self.solid = lFORate / 10; + self.nextthink = self.solid + time; + fLoop = FALSE; + } + + /*if ( fLoop ) { + sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, SOUNDFLAG_FORCELOOP ); + } else {*/ + sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, 0 ); + //} +} + +int +Game_Entity_Update(float id, float new) +{ + switch (id) { + default: + return FALSE; + } + + return TRUE; +} + +void +CSQC_Ent_Remove( void ) { + if ( self.eGunModel ) { + remove( self.eGunModel ); + } + + soundupdate( self, CHAN_VOICE, "", -1, ATTN_IDLE, 0, 0, 0 ); + remove( self ); +} + diff --git a/src/client/cstrike/event.c b/src/client/cstrike.old/event.c similarity index 100% rename from src/client/cstrike/event.c rename to src/client/cstrike.old/event.c diff --git a/src/client/cstrike.old/hud.c b/src/client/cstrike.old/hud.c new file mode 100644 index 00000000..b2ca4cad --- /dev/null +++ b/src/client/cstrike.old/hud.c @@ -0,0 +1,541 @@ +/* + * 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 HUD_NUMFILE "sprites/640hud7.spr" // We'll precache this +#define HUD_NUMFILE_LAYER "sprites/640hud7.spr_0.tga" // And only use the first frame for drawing (needs precache) + +// Sigh +#define NUMSIZE_X 0.09375 +#define NUMSIZE_Y 0.09765625 + +#define HUD_ALPHA 0.5 + +// Instead of calculating them on demand, just read the offsets here +float vHUDNumPos[10] = { + 0, + 0.09375, + 0.1875, + 0.28125, + 0.375, + 0.46875, + 0.5625, + 0.65625, + 0.75, + 0.84375 +}; + +// Ditto +vector vHUDCalPos[15] = { + [0, 0], + [0.09375, 0.28125], // 50AE + [0.28125, 0.28125], // 762MM + [0, 0.375], // 556MM + [0, 0.375], // 556MM + [0.09375, 0.375], // 338MAG + [0.1875, 0.28125], // 9MM + [0, 0.28125], // BUCKSHOT + [0.375, 0.28125], // 45ACP + [0.46875, 0.28125], // 357SIG + [0.46875, 0.375], // 57MM + [0.375, 0.375], // C4 + [0.5625, 0.375], // SMOKE + [0.28125, 0.375], // HE + [0.1875, 0.375] // FLASH +}; + +void HUD_Init(void) +{ + precache_model(HUD_NUMFILE); + precache_model("sprites/top_left.spr"); + precache_model("sprites/top.spr"); + precache_model("sprites/top_right.spr"); + precache_model("sprites/left.spr"); + precache_model("sprites/right.spr"); + precache_model("sprites/bottom_left.spr"); + precache_model("sprites/bottom.spr"); + precache_model("sprites/bottom_right.spr"); + precache_model("sprites/sniper_scope.spr"); + precache_model("sprites/radar640.spr"); + precache_model("sprites/640hud1.spr"); + precache_model("sprites/640hud16.spr"); + precache_model("sprites/640hud2.spr"); + precache_model("sprites/640hud10.spr"); + precache_model("sprites/640hud12.spr"); + precache_model("sprites/640hud14.spr"); + precache_model("sprites/640hud3.spr"); + precache_model("sprites/640hud5.spr"); +} + +/* +================= +HUD_DrawRedNumber + +Draws a normal number +================= +*/ +void HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) { + drawsubpic(vPos, [24,25], HUD_NUMFILE_LAYER, [vHUDNumPos[iNumber], 0], [NUMSIZE_X, NUMSIZE_Y], vColor, fAlpha, DRAWFLAG_ADDITIVE); +} + +/* +================= +HUD_DrawNums + +Draws numerals quickly for health, armor etc. +================= +*/ +void HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor) { + int iNumber = fNumber; + if (iNumber > 0) { + while (iNumber > 0) { + HUD_DrawNumber((float)iNumber % 10, vPos, fAlpha, vColor); + iNumber = iNumber / 10; + vPos[0] -= 20; + } + } else { + HUD_DrawNumber(0, vPos, fAlpha, vColor); + } +} + +/* +================= +HUD_DrawHealth + +Draw the current amount of health +================= +*/ +void HUD_DrawHealth(void) { + static float fOldHealth; + static float fHealthAlpha; + if (getstatf(STAT_HEALTH) != fOldHealth) { + fHealthAlpha = 1.0; + } + + if (fHealthAlpha >= HUD_ALPHA) { + fHealthAlpha -= frametime * 0.5; + } else { + fHealthAlpha = HUD_ALPHA; + } + + vector vHealthPos = video_mins + [16, video_res[1] - 42]; + if (getstatf(STAT_HEALTH) > 25) { + drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE); + HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, vHUDColor); + } else { + drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], [1,0,0], HUD_ALPHA, DRAWFLAG_ADDITIVE); + HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, [1,0,0]); + } + fOldHealth = getstatf(STAT_HEALTH); +} + +/* +================= +HUD_DrawArmor + +Draw the current amount of Kevlar +================= +*/ +void HUD_DrawArmor(void) { + static float fOldArmor; + static float fArmorAlpha; + if (getstatf(STAT_ARMOR) != fOldArmor) { + fArmorAlpha = 1.0; + } + + if (fArmorAlpha >= HUD_ALPHA) { + fArmorAlpha -= frametime * 0.5; + } else { + fArmorAlpha = HUD_ALPHA; + } + + vector vArmorPos = video_mins + [128, video_res[1] - 42]; + + if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_HELMET) { + drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, 0.4862745098], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE); + } + + HUD_DrawNums(getstatf(STAT_ARMOR), vArmorPos + [72,0], fArmorAlpha, vHUDColor); + fOldArmor = getstatf(STAT_ARMOR); +} + +/* +================= +HUD_DrawIcons + +Draw icons such as hostage, bomb and buyzones +================= +*/ +void HUD_DrawIcons(void) { + vector iconpos; + + iconpos = video_mins + [16, (video_res[1] / 2) - 24]; + + // Defusal Kit Icon (64, 148) + if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_DEFUSALKIT) { + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); + iconpos[1] += 32; + } + + // BuyZone Icon + if (getstatf(STAT_BUYZONE) == TRUE) { + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 3, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); + iconpos[1] += 32; + } + + // Hostage-Rescue Area Icon + if (getstatf(STAT_HOSTAGEZONE) == TRUE) { + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 2, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); + iconpos[1] += 32; + } + + // Escape Zone Icon (128, 148) + if (getstatf(STAT_ESCAPEZONE) == TRUE) { + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.5, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); + iconpos[1] += 32; + } + + // VIP Zone Icon (160, 148) + if (getstatf(STAT_VIPZONE) == TRUE) { + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.625, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); + iconpos[1] += 32; + } + + // Bomb-Area + if (getstatf(STAT_SLOT_C4BOMB) == WEAPON_C4BOMB) { + if (getstatf(STAT_BOMBZONE) == TRUE) { + float fAlpha = fabs(sin(time * 20)); + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1 - fAlpha, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); + } + iconpos[1] += 32; + } +} + +/* +================= +HUD_DrawTimer + +Draws the roundtime at the bottom of the screen (always visible) +================= +*/ +void HUD_DrawTimer(void) { + static int iOldUnits; + static float fTimerAlpha; + int iMinutes, iSeconds, iTens, iUnits; + vector vTimePos = video_mins+[(video_res[0] / 2) - 62, video_res[1] - 42]; + + if (getstatf(STAT_GAMETIME) == -1) { + return; + } + + iMinutes = getstatf(STAT_GAMETIME) / 60; + iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes; + iTens = iSeconds / 10; + iUnits = iSeconds - 10 * iTens; + + // Flashing red numbers + if ((iMinutes == 0) && (iTens <= 1)) { + float fAlpha; + + // 0:00 is fully red + if ((iTens == 0) && (iUnits == 0)) { + fAlpha = 1; + } else { + fAlpha = fabs(sin(time * 20)); + } + + HUD_DrawNumber(iMinutes, vTimePos + [48,0], fAlpha, [1,0,0]); + HUD_DrawNumber(iTens, vTimePos + [75,0], fAlpha, [1,0,0]); + HUD_DrawNumber(iUnits, vTimePos + [99,0],fAlpha, [1,0,0]); + HUD_DrawNumber(iMinutes, vTimePos + [48,0], 1 - fAlpha, vHUDColor); + HUD_DrawNumber(iTens, vTimePos + [75,0], 1 - fAlpha, vHUDColor); + HUD_DrawNumber(iUnits, vTimePos + [99,0],1 - fAlpha, vHUDColor); + + // : symbol + drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); + drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); + drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE); + drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE); + + drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); + drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE); + } else { + if (iUnits != iOldUnits) { + fTimerAlpha = 1.0; + } + + if (fTimerAlpha >= HUD_ALPHA) { + fTimerAlpha -= frametime * 0.5; + } else { + fTimerAlpha = HUD_ALPHA; + } + HUD_DrawNumber(iMinutes, vTimePos + [48,0], fTimerAlpha, vHUDColor); + HUD_DrawNumber(iTens, vTimePos + [75,0], fTimerAlpha, vHUDColor); + HUD_DrawNumber(iUnits, vTimePos + [95,0], fTimerAlpha, vHUDColor); + + drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE); + drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE); + + drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE); + iOldUnits = iUnits; + } +} + +/* +================= +HUD_DrawMoney + +Draws the amount of money (0-16000) with an icon to the screen +================= +*/ +void HUD_DrawMoney(void) { + static float fOldMoneyValue; + static float fMoneyAlphaEffect; + static vector vMoneyColorEffect; + static float fMoneyDifference; + + // If the money differs from last frame, paint it appropriately + if (getstatf(STAT_MONEY) > fOldMoneyValue) { + // Effect already in progress from something else, go add on top of it! + if (fMoneyAlphaEffect > 0) { + fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY)); + } else { + fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY); + } + // Make it green for a short time + vMoneyColorEffect = [0,1,0]; + fMoneyAlphaEffect = 1.0; + } else if (getstatf(STAT_MONEY) < fOldMoneyValue) { + // Same one as above + if (fMoneyAlphaEffect > 0) { + fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY)); + } else { + fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY); + } + // Make it red + vMoneyColorEffect = [1,0,0]; + fMoneyAlphaEffect = 1.0; + fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY); + } + + vector vMoneyPos = video_mins+[video_res[0] - 160, video_res[1] - 72]; + + // If the alpha/color effect is active, draw the money twice in their varying alphas/colors + if (fMoneyAlphaEffect > 0) { + fMoneyAlphaEffect -= frametime * 0.5; + drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE); + drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), DRAWFLAG_ADDITIVE); + + // Draw the +/- symbols depending on whether or not we made or lost money + if (fMoneyDifference < 0) { + drawsubpic(vMoneyPos + [0,-32], [18,23], HUD_NUMFILE_LAYER, [0.8671875, 0.09765625], [0.0703125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(vMoneyPos + [0,-32], [13,23], HUD_NUMFILE_LAYER, [0.8203125, 0.09765625], [0.05078125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE); + } + + // Shift the numbers for reverse drawing + vMoneyPos[0] += (24 * 5); + + // Draw the regular numbers at their normal positions + HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, fMoneyAlphaEffect, vMoneyColorEffect); + HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), vHUDColor); + + // Draw above how much money we've gotten from all this + HUD_DrawNums(fabs(fMoneyDifference), vMoneyPos + [0,-32], fMoneyAlphaEffect, vMoneyColorEffect); + } else { + drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE); + vMoneyPos[0] += (24 * 5); + HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA, vHUDColor); + } + + fOldMoneyValue = getstatf(STAT_MONEY); +} + +/* +================= +HUD_DrawAmmo + +Draws the current clip, the amount of ammo for the caliber and a matching caliber icon +================= +*/ +void HUD_DrawAmmo(void) { + static float fOldMag, fOldCal; + static float fAmmoAlpha; + static vector vAmmoMagPos; + static vector vAmmoCalPos; + + if (getstatf(STAT_ACTIVEWEAPON) == 0) { + return; + } + if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_KNIFE || getstatf(STAT_ACTIVEWEAPON) == WEAPON_C4BOMB) { + return; + } + + if (getstatf(STAT_CURRENT_MAG) != fOldMag || getstatf(STAT_CURRENT_CALIBER) != fOldCal) { + fAmmoAlpha = 1.0; + } + + if (fAmmoAlpha >= HUD_ALPHA) { + fAmmoAlpha -= frametime * 0.5; + } else { + fAmmoAlpha = HUD_ALPHA; + } + + if (wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber < 11) { + vAmmoMagPos = video_mins+[video_res[0] - 142, video_res[1] - 42]; + HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor); + + drawsubpic(video_mins+[video_res[0] - 118, video_res[1] - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.09765625], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE); + + vAmmoCalPos = video_mins+[video_res[0] - 64, video_res[1] - 42]; + HUD_DrawNums(getstatf(STAT_CURRENT_CALIBER), vAmmoCalPos, fAmmoAlpha, vHUDColor); + } else { + vAmmoMagPos = video_mins+[video_res[0] - 64, video_res[1] - 42]; + HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor); + } + + // Caliber icon + drawsubpic(video_mins+video_res - [42,42], [24,24], HUD_NUMFILE_LAYER, vHUDCalPos[wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE); + fOldMag = getstatf(STAT_CURRENT_MAG); + fOldCal = getstatf(STAT_CURRENT_CALIBER); +} + +void HUD_DrawProgressBar(void) { + vector vSize = [540,16]; + vector vMainPos; + + if (getstatf(STAT_PROGRESS) > 0) { + vMainPos = video_mins; + vMainPos[0] += (video_res[0] / 2) - (vSize[0] / 2); + vMainPos[1] += (video_res[1] / 2) - (vSize[1] / 2); + + // Draw the background + vector vBar = vSize; + vBar[0] = 538 * getstatf(STAT_PROGRESS); + vBar[1] = 14; + drawfill(vMainPos + [1,1], vBar, vHUDColor, 1, DRAWFLAG_ADDITIVE); + + drawfill(vMainPos, [vSize[0], 1], vHUDColor, 1.0f); // Top + drawfill([vMainPos[0], vMainPos[1] + vSize[1]], [vSize[0], 1], vHUDColor, 1.0f); // Bottom + + drawfill(vMainPos, [1, vSize[1]], vHUDColor, 1.0f); // Left + drawfill([vMainPos[0] + vSize[0], vMainPos[1]], [1, vSize[1] + 1], vHUDColor, 1.0f); // Right + } +} + +void HUD_DrawRadar(void) { + if (autocvar_cl_radar == 1) { + drawpic(video_mins, "sprites/radar640.spr_0.tga", [128,128], [1,1,1], 0.25, DRAWFLAG_ADDITIVE); + } else if (autocvar_cl_radar == 2) { + static int iLastMode = 0; + static vector vMapSize; + static float fZoom; + + if (iLastMode != pSeat.iMapExpand) { + iLastMode = pSeat.iMapExpand; + } + + if (pSeat.iMapExpand == 1) { + if (pSeat.fMapLerp < 1.0f) { + vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp)); + vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp)); + fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp); + pSeat.fMapLerp += frametime * 2; + } else { + pSeat.fMapLerp = 1.0f; + fZoom = ovMap.fCameraHeight; + vMapSize = video_res + [-32,-32]; + } + } else { + if (pSeat.fMapLerp > 0.0f) { + vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp)); + vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp)); + fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp); + pSeat.fMapLerp -= frametime * 2; + } else { + pSeat.fMapLerp = 0.0f; + fZoom = (ovMap.fCameraHeight * (128 / (video_res[1] - 32))); + vMapSize = [128,128]; + } + } + + clearscene(); + drawfill(video_mins + [15,15], vMapSize + [2,2], vHUDColor, 1.0f, DRAWFLAG_ADDITIVE); + drawfill(video_mins + [16,16], vMapSize, [0,0,0], 1.0f, 0); + setproperty(VF_MIN, video_mins + [16,16]); + setproperty(VF_SIZE, vMapSize); + + Overview_DrawLayer(); + + makevectors(view_angles); + setproperty(VF_ORIGIN, [pSeat->vPlayerOrigin[0], pSeat->vPlayerOrigin[1], fZoom] ); + setproperty(VF_ANGLES, [Math_Lerp(90, 60, pSeat.fMapLerp), view_angles[1], 0]); + setproperty(VF_DRAWWORLD, 0); + renderscene(); + } +} + +void HUD_DrawFlash(void) { + if (pSeat->fFlashTime > 0.0f) { + pSeat->fFlashTime -= frametime; + } else { + if (pSeat->fFlashAlpha > 0.0f) { + pSeat->fFlashAlpha -= (frametime * 0.5); + } else { + return; + } + } + + drawfill(video_mins, video_res, [1,1,1], pSeat->fFlashAlpha, 0/*pSeat->fFlashTime*/); +} + +/* +================= +HUD_Draw + +Called every frame in Draw.c +================= +*/ +void HUD_Draw(void) { + vHUDColor = autocvar_con_color * (1 / 255); + + // I guess viewzoom turns from 0.0-1.0 float into a 0-255 byte + if (getstatf(STAT_VIEWZOOM) < 1.0f) { + if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_SG552 || getstatf(STAT_ACTIVEWEAPON) == WEAPON_AUG) { + HUD_DrawSimpleCrosshair(); + } else { + HUD_DrawScope(); + } + } else { + HUD_DrawCrosshair(); + } + + HUD_DrawFlash(); + Damage_Draw(); + HUD_DrawTimer(); + HUD_DrawHealth(); + HUD_DrawArmor(); + HUD_DrawIcons(); + HUD_DrawMoney(); + HUD_DrawAmmo(); + HUD_DrawRadar(); + HUD_DrawProgressBar(); + HUD_DrawWeaponSelect(); +} diff --git a/src/client/cstrike/hudcrosshair.c b/src/client/cstrike.old/hudcrosshair.c similarity index 100% rename from src/client/cstrike/hudcrosshair.c rename to src/client/cstrike.old/hudcrosshair.c diff --git a/src/client/cstrike/hudorbituaries.c b/src/client/cstrike.old/hudorbituaries.c similarity index 100% rename from src/client/cstrike/hudorbituaries.c rename to src/client/cstrike.old/hudorbituaries.c diff --git a/src/client/cstrike/hudscope.c b/src/client/cstrike.old/hudscope.c similarity index 100% rename from src/client/cstrike/hudscope.c rename to src/client/cstrike.old/hudscope.c diff --git a/src/client/cstrike/hudweaponselect.c b/src/client/cstrike.old/hudweaponselect.c similarity index 100% rename from src/client/cstrike/hudweaponselect.c rename to src/client/cstrike.old/hudweaponselect.c diff --git a/src/client/cstrike.old/init.c b/src/client/cstrike.old/init.c new file mode 100644 index 00000000..ddee5ce5 --- /dev/null +++ b/src/client/cstrike.old/init.c @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* +================= +Client_Init + +Comparable to worldspawn in SSQC in that it's mostly used for precaches +================= +*/ +void Client_Init(float apilevel, string enginename, float engineversion) +{ + precache_model("sprites/fexplo.spr"); + precache_model("sprites/muzzleflash1.spr"); + precache_sound("player/pl_pain2.wav"); + + precache_model("sprites/iplayerred.spr"); + precache_model("sprites/iplayerblue.spr"); + precache_model("sprites/iplayervip.spr"); + precache_model("sprites/ihostage.spr"); + + precache_model("models/pshell.mdl"); + precache_model("models/rshell.mdl"); + precache_model("models/rshell_big.mdl"); + precache_model("models/shotgunshell.mdl"); + precache_pic( sprintf( "overviews/%s.bmp", mapname ) ); + + PARTICLE_SMOKEGRENADE = particleeffectnum("smokegren"); + + Radio_InitSounds(); + CSQC_ConsoleCommand_Init(); + Overview_Init(); + + pSeat.iOverview = FALSE; +} + +void Client_InitDone(void) +{ + /* don't open this in singleplayer */ + if (serverkeyfloat("slots") > 1) { + VGUI_ChooseTeam(); + } +} + +void Game_RendererRestarted(string rstr) +{ + Overview_Init(); +} diff --git a/src/client/cstrike/input.c b/src/client/cstrike.old/input.c similarity index 100% rename from src/client/cstrike/input.c rename to src/client/cstrike.old/input.c diff --git a/src/client/cstrike/nightvision.c b/src/client/cstrike.old/nightvision.c similarity index 100% rename from src/client/cstrike/nightvision.c rename to src/client/cstrike.old/nightvision.c diff --git a/src/client/cstrike/overview.c b/src/client/cstrike.old/overview.c similarity index 100% rename from src/client/cstrike/overview.c rename to src/client/cstrike.old/overview.c diff --git a/src/client/cstrike/player.c b/src/client/cstrike.old/player.c similarity index 100% rename from src/client/cstrike/player.c rename to src/client/cstrike.old/player.c diff --git a/src/client/cstrike.old/progs.src b/src/client/cstrike.old/progs.src new file mode 100755 index 00000000..6b42db87 --- /dev/null +++ b/src/client/cstrike.old/progs.src @@ -0,0 +1,107 @@ +#pragma target fte +#pragma progs_dat "../../../cstrike/data.pk3dir/csprogs.dat" + +#define CSQC +#define CSTRIKE + +#includelist +../../shared/fteextensions.qc +../../shared/defs.h +../../shared/cstrike/defs.h +../../shared/math.h +../../shared/materials.h +../../shared/events.h +../../shared/entities.h +defs.h +../defs.h + +../../vgui/include.src + +../voice.c +../sound.c +../music.c +../prints.c +../util.c +../../gs-entbase/client.src + +../../shared/cstrike/weaponak47.c +../../shared/cstrike/weaponaug.c +../../shared/cstrike/weaponawp.c +../../shared/cstrike/weaponc4bomb.c +../../shared/cstrike/weapondeagle.c +../../shared/cstrike/weaponelites.c +../../shared/cstrike/weaponfiveseven.c +../../shared/cstrike/weaponflashbang.c +../../shared/cstrike/weapong3sg1.c +../../shared/cstrike/weaponglock18.c +../../shared/cstrike/weaponhegrenade.c +../../shared/cstrike/weaponknife.c +../../shared/cstrike/weaponm3.c +../../shared/cstrike/weaponm4a1.c +../../shared/cstrike/weaponmac10.c +../../shared/cstrike/weaponmp5.c +../../shared/cstrike/weaponp228.c +../../shared/cstrike/weaponp90.c +../../shared/cstrike/weaponpara.c +../../shared/cstrike/weaponscout.c +../../shared/cstrike/weaponsg550.c +../../shared/cstrike/weaponsg552.c +../../shared/cstrike/weaponsmokegrenade.c +../../shared/cstrike/weapontmp.c +../../shared/cstrike/weaponump45.c +../../shared/cstrike/weaponusp45.c +../../shared/cstrike/weaponxm1014.c +../../shared/cstrike/basegun.c +../../shared/cstrike/weapons.c +../../shared/cstrike/radio.c +../../shared/cstrike/equipment.c +../../shared/cstrike/animations.c + +../../shared/valve/player.cpp +../../shared/pmove.c + +../fade.c +../sprite.cpp +../titles.c +../text.c +../sentences.c + +../../shared/decals.c +../../shared/effects.c +../../shared/spraylogo.cpp +../npc.c + +../sky.c +overview.c +../player.c +../predict.c +../events.c +view.c +../view.c +../damage.c +../chat.c +nightvision.c +hudcrosshair.c +hudscope.c +hudweaponselect.c +../obituary.c +hudorbituaries.c +hud.c +../vgui.cpp +vgui_buymenu.cpp +vgui_chooseteam.cpp +vgui_motd.cpp +vgui_radio.cpp +scoreboard.c + +draw.c +entities.c +event.c +init.c + +player.c +../entities.c + +input.c +../entry.c +#endlist diff --git a/src/client/cstrike/scoreboard.c b/src/client/cstrike.old/scoreboard.c similarity index 100% rename from src/client/cstrike/scoreboard.c rename to src/client/cstrike.old/scoreboard.c diff --git a/src/client/cstrike/vgui_buymenu.cpp b/src/client/cstrike.old/vgui_buymenu.cpp similarity index 100% rename from src/client/cstrike/vgui_buymenu.cpp rename to src/client/cstrike.old/vgui_buymenu.cpp diff --git a/src/client/cstrike.old/vgui_chooseteam.cpp b/src/client/cstrike.old/vgui_chooseteam.cpp new file mode 100644 index 00000000..5334c334 --- /dev/null +++ b/src/client/cstrike.old/vgui_chooseteam.cpp @@ -0,0 +1,205 @@ +/* + * 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. + */ + +static CUIWindow winChooseTeam; +static CUIWindow winCTTeam; +static CUIWindow winTTeam; + +void +T_Skin1(void) +{ + sendevent( "GamePlayerSpawn", "f", 1 ); + winTTeam.Hide(); +} +void +T_Skin2(void) +{ + sendevent( "GamePlayerSpawn", "f", 2 ); + winTTeam.Hide(); +} +void +T_Skin3(void) +{ + sendevent( "GamePlayerSpawn", "f", 3 ); + winTTeam.Hide(); +} +void +T_Skin4(void) +{ + sendevent( "GamePlayerSpawn", "f", 4 ); + winTTeam.Hide(); +} + +void +CT_Skin1(void) +{ + sendevent( "GamePlayerSpawn", "f", 5 ); + winCTTeam.Hide(); +} +void +CT_Skin2(void) +{ + sendevent( "GamePlayerSpawn", "f", 6 ); + winCTTeam.Hide(); +} +void +CT_Skin3(void) +{ + sendevent( "GamePlayerSpawn", "f", 7 ); + winCTTeam.Hide(); +} +void +CT_Skin4(void) +{ + sendevent( "GamePlayerSpawn", "f", 8 ); + winCTTeam.Hide(); +} +void +VGUI_GoSpectator(void) +{ + sendevent( "GamePlayerSpawn", "f", 0 ); + winChooseTeam.Hide(); +} + +void VGUI_ChooseTeam_CT(void) +{ + static int initialized; + static CUIButton btnSkin1; + static CUIButton btnSkin2; + static CUIButton btnSkin3; + static CUIButton btnSkin4; + + if ( !initialized ) { + initialized = TRUE; + winCTTeam = spawn( CUIWindow ); + winCTTeam.SetTitle( "Choose Skin" ); + winCTTeam.SetSize( [420,320] ); + + btnSkin1 = spawn( CUIButton ); + btnSkin1.SetTitle( "Skin 1" ); + btnSkin1.SetPos( [8,132] ); + btnSkin1.SetFunc( CT_Skin1 ); + + btnSkin2 = spawn( CUIButton ); + btnSkin2.SetTitle( "Skin 2" ); + btnSkin2.SetPos( [8,132+30] ); + btnSkin2.SetFunc( CT_Skin2 ); + + btnSkin3 = spawn( CUIButton ); + btnSkin3.SetTitle( "Skin 3" ); + btnSkin3.SetPos( [8,132+30+30] ); + btnSkin3.SetFunc( CT_Skin3 ); + + btnSkin4 = spawn( CUIButton ); + btnSkin4.SetTitle( "Skin 4" ); + btnSkin4.SetPos( [8,132+30+30+30] ); + btnSkin4.SetFunc( CT_Skin4 ); + + g_uiDesktop.Add( winCTTeam ); + winCTTeam.Add( btnSkin1 ); + winCTTeam.Add( btnSkin2 ); + winCTTeam.Add( btnSkin3 ); + winCTTeam.Add( btnSkin4 ); + } + + winChooseTeam.Hide(); + winCTTeam.Show(); + winCTTeam.SetPos( ( video_res / 2 ) - ( winCTTeam.GetSize() / 2 ) ); +} + +void VGUI_ChooseTeam_T(void) +{ + static int initialized; + static CUIButton btnSkin1; + static CUIButton btnSkin2; + static CUIButton btnSkin3; + static CUIButton btnSkin4; + + if ( !initialized ) { + initialized = TRUE; + winTTeam = spawn( CUIWindow ); + winTTeam.SetTitle( "Choose Skin" ); + winTTeam.SetSize( [420,320] ); + + btnSkin1 = spawn( CUIButton ); + btnSkin1.SetTitle( "Skin 1" ); + btnSkin1.SetPos( [8,132] ); + btnSkin1.SetFunc( T_Skin1 ); + + btnSkin2 = spawn( CUIButton ); + btnSkin2.SetTitle( "Skin 2" ); + btnSkin2.SetPos( [8,132+30] ); + btnSkin2.SetFunc( T_Skin2 ); + + btnSkin3 = spawn( CUIButton ); + btnSkin3.SetTitle( "Skin 3" ); + btnSkin3.SetPos( [8,132+30+30] ); + btnSkin3.SetFunc( T_Skin3 ); + + btnSkin4 = spawn( CUIButton ); + btnSkin4.SetTitle( "Skin 4" ); + btnSkin4.SetPos( [8,132+30+30+30] ); + btnSkin4.SetFunc( T_Skin4 ); + + g_uiDesktop.Add( winTTeam ); + winTTeam.Add( btnSkin1 ); + winTTeam.Add( btnSkin2 ); + winTTeam.Add( btnSkin3 ); + winTTeam.Add( btnSkin4 ); + } + + winChooseTeam.Hide(); + winTTeam.Show(); + winTTeam.SetPos( ( video_res / 2 ) - ( winTTeam.GetSize() / 2 ) ); +} + +void VGUI_ChooseTeam(void) +{ + static int initialized; + static CUIButton btnGoCT; + static CUIButton btnGoT; + static CUIButton btnGoSpectator; + + if ( !initialized ) { + initialized = TRUE; + winChooseTeam = spawn( CUIWindow ); + winChooseTeam.SetTitle( "Choose Team" ); + winChooseTeam.SetSize( '420 320' ); + + btnGoCT = spawn( CUIButton ); + btnGoCT.SetTitle( "Counter-Terrorists" ); + btnGoCT.SetPos( '8 132' ); + btnGoCT.SetFunc( VGUI_ChooseTeam_CT ); + + btnGoT = spawn( CUIButton ); + btnGoT.SetTitle( "Terrorists" ); + btnGoT.SetPos( '8 162' ); + btnGoT.SetFunc( VGUI_ChooseTeam_T ); + + btnGoSpectator = spawn( CUIButton ); + btnGoSpectator.SetTitle( "Spectator" ); + btnGoSpectator.SetPos( '8 192' ); + btnGoSpectator.SetFunc( VGUI_GoSpectator ); + + g_uiDesktop.Add( winChooseTeam ); + winChooseTeam.Add( btnGoCT ); + winChooseTeam.Add( btnGoT ); + winChooseTeam.Add( btnGoSpectator ); + } + + winChooseTeam.Show(); + winChooseTeam.SetPos( ( video_res / 2 ) - ( winChooseTeam.GetSize() / 2 ) ); +} diff --git a/src/client/cstrike/vgui_motd.cpp b/src/client/cstrike.old/vgui_motd.cpp similarity index 100% rename from src/client/cstrike/vgui_motd.cpp rename to src/client/cstrike.old/vgui_motd.cpp diff --git a/src/client/cstrike/vgui_radio.cpp b/src/client/cstrike.old/vgui_radio.cpp similarity index 100% rename from src/client/cstrike/vgui_radio.cpp rename to src/client/cstrike.old/vgui_radio.cpp diff --git a/src/client/cstrike/view.c b/src/client/cstrike.old/view.c similarity index 100% rename from src/client/cstrike/view.c rename to src/client/cstrike.old/view.c diff --git a/src/client/cstrike/defs.h b/src/client/cstrike/defs.h index 53a30a6f..ede68e40 100644 --- a/src/client/cstrike/defs.h +++ b/src/client/cstrike/defs.h @@ -13,194 +13,3 @@ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -// Clientside cvars -var vector autocvar_cross_color = '0 255 0'; // autocvar of "cross_color" - -var int autocvar_cl_radar = 1; - -// Particle stuff -var float PARTICLE_SMOKEGRENADE; - -.float flUpAngle; - -vector vHUDColor; // Defined in HUD_Draw (HUD.c) -vector vCrossColor; // Defined in HUD_Draw (HUDCrosshair.c) - -string sShellModel [ 4 ] = { - "models/pshell.mdl", - "models/rshell.mdl", - "models/rshell_big.mdl", - "models/shotgunshell.mdl" -}; - - -var string autocvar_skins_dir = ""; -string sViewModels[ CS_WEAPON_COUNT - 1 ] = { - "v_knife.mdl", - "v_usp.mdl", - "v_glock18.mdl", - "v_deagle.mdl", - "v_p228.mdl", - "v_elite.mdl", - "v_fiveseven.mdl", - "v_m3.mdl", - "v_xm1014.mdl", - "v_mp5.mdl", - "v_p90.mdl", - "v_ump45.mdl", - "v_mac10.mdl", - "v_tmp.mdl", - "v_ak47.mdl", - "v_sg552.mdl", - "v_m4a1.mdl", - "v_aug.mdl", - "v_scout.mdl", - "v_awp.mdl", - "v_g3sg1.mdl", - "v_sg550.mdl", - "v_m249.mdl", - "v_c4.mdl", - "v_flashbang.mdl", - "v_hegrenade.mdl", - "v_smokegrenade.mdl" -}; - - -struct -{ -//Viewmodel stuff - entity eViewModel; - entity eMuzzleflash; - float fNumBones; - float fEjectBone; - vector punchangle; - float fLastWeapon; - float fBobTime; - float fBob; - float damage_alpha; - vector damage_pos; - - /* Camera Bob */ - float flCamMove; - float flCamTime; - int iCamCycle; - float flCamFracSin; - float flCamDelta; - - int iZoomed; - float flZoomTime; - -//Player fields - entity ePlayer; - vector vPlayerOrigin; - vector vPlayerOriginOld; - vector vPlayerVelocity; - float fPlayerFlags; - -// Camera Fields - //entity ePlayerEnt; - vector vCameraPos; - vector vCameraAngle; - float fCameraTime; - -// Flashbang'd - float fFlashTime; - float fFlashAlpha; - -//UI fields - float fVGUI_Display; // The VGUI menu currently being drawn - int iShowScores; // This is seperated from the other VGUI stuff so we can check scores while buying and whatnot - - // Testing - int iOverview; - int iMapExpand; - float fMapLerp; - -//crosshair - int iOldShotMultiplier; - float fCrosshairDistance; - float fDecreaseShotTime; - int iShotMultiplier; - -//buy menu - // We can only carry one item per slot, so this is hacking around the last one - int iHUDGrenades; - int iHUDGrenadesSelected; - float fHUDWeaponSelectTime; - float fHUDWeaponSelected; - - int iInputAttack2; - int iInputReload; - int iInputUse; - int iInputDuck; - - float fInputSendNext; -} seats[4], *pSeat; - -// Sound Stuff -//.string sSoundSample; -//.float fVolume; -string HUD_GetChatColorHEX( float fTeam ); - -// For the player entity -.entity eGunModel; -float fWeaponEventPlayer; -.float fWeaponLast; -.float fWeaponBoneID; -.float health; -.float oldhealth; - -void Animation_ShootWeapon( entity ePlayer ); -void Animation_ReloadWeapon( entity ePlayer ); - -/* -==================== -HUD_GetChatColor - -Returns an RGB color vector for the specified team -==================== -*/ -vector HUD_GetChatColor( float fTeam ) { - if ( fTeam == TEAM_CT ) { - return '0.45 0.60 0.75'; - } else if ( fTeam == TEAM_T ) { - return '0.75 0.1875 0.1875'; - } else { - return '0.75 0.75 0.75'; - } -} - -/* -==================== -HUD_GetChatColor - -Returns a HEX color string prefix for the specified team -==================== -*/ -string HUD_GetChatColorHEX( float fTeam ) { - if ( fTeam == TEAM_CT ) { - return "^x7AC"; - } else if ( fTeam == TEAM_T ) { - return "^xC33"; - } else { - return "^xCCC"; - } -} - -/* -==================== -HUD_GetChatColor - -Returns a HEX color string prefix with teamname -==================== -*/ -string HUD_GetChatColorHEXTeam( float fTeam ) { - if ( fTeam == TEAM_CT ) { - return "^x7AC(Counter-Terrorist) "; - } else if ( fTeam == TEAM_T ) { - return "^xC33(Terrorist) "; - } else { - return "^xCCC(Spectator) "; - } -} diff --git a/src/client/cstrike/entities.c b/src/client/cstrike/entities.c index 97f08b22..8cb88cd7 100644 --- a/src/client/cstrike/entities.c +++ b/src/client/cstrike/entities.c @@ -14,31 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void -CSQC_ambient_generic( string sSample, float fVolume, float fAttenuation, float fLoop, float lFORate ) { - //print( sprintf( "SOUND: %s, %f, %d\n%d %d %d", sSample, fVolume, fAttenuation, self.origin[0], self.origin[1], self.origin[2] ) ); - static void LFOHack (void) { - sound( self, CHAN_VOICE, self.classname, self.movetype, self.style, 0, 0 ); - self.nextthink = self.solid + time; - } - // Hack - if ( lFORate ) { - self.classname = sSample; - self.movetype = fVolume; - self.style = fAttenuation; - self.think = LFOHack; - self.solid = lFORate / 10; - self.nextthink = self.solid + time; - fLoop = FALSE; - } - - /*if ( fLoop ) { - sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, SOUNDFLAG_FORCELOOP ); - } else {*/ - sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, 0 ); - //} -} - int Game_Entity_Update(float id, float new) { @@ -49,14 +24,3 @@ Game_Entity_Update(float id, float new) return TRUE; } - -void -CSQC_Ent_Remove( void ) { - if ( self.eGunModel ) { - remove( self.eGunModel ); - } - - soundupdate( self, CHAN_VOICE, "", -1, ATTN_IDLE, 0, 0, 0 ); - remove( self ); -} - diff --git a/src/client/cstrike/hud.c b/src/client/cstrike/hud.c index b2ca4cad..52a0cd60 100644 --- a/src/client/cstrike/hud.c +++ b/src/client/cstrike/hud.c @@ -14,528 +14,369 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define HUD_NUMFILE "sprites/640hud7.spr" // We'll precache this -#define HUD_NUMFILE_LAYER "sprites/640hud7.spr_0.tga" // And only use the first frame for drawing (needs precache) - -// Sigh -#define NUMSIZE_X 0.09375 -#define NUMSIZE_Y 0.09765625 +void HUD_DrawWeaponSelect(void); +/* Use first frame for drawing (needs precache) */ +#define HUD_NUMS "sprites/640hud7.spr_0.tga" +#define NUMSIZE_X 24/256 +#define NUMSIZE_Y 24/256 #define HUD_ALPHA 0.5 -// Instead of calculating them on demand, just read the offsets here -float vHUDNumPos[10] = { - 0, - 0.09375, - 0.1875, - 0.28125, - 0.375, - 0.46875, - 0.5625, - 0.65625, - 0.75, - 0.84375 +float spr_hudnum[10] = { + 0 / 256, + 23 / 256, + 47 / 256, + 70 / 256, + 95 / 256, + 119 / 256, + 144 / 256, + 169 / 256, + 192 / 256, + 216 / 256 }; -// Ditto -vector vHUDCalPos[15] = { - [0, 0], - [0.09375, 0.28125], // 50AE - [0.28125, 0.28125], // 762MM - [0, 0.375], // 556MM - [0, 0.375], // 556MM - [0.09375, 0.375], // 338MAG - [0.1875, 0.28125], // 9MM - [0, 0.28125], // BUCKSHOT - [0.375, 0.28125], // 45ACP - [0.46875, 0.28125], // 357SIG - [0.46875, 0.375], // 57MM - [0.375, 0.375], // C4 - [0.5625, 0.375], // SMOKE - [0.28125, 0.375], // HE - [0.1875, 0.375] // FLASH -}; - -void HUD_Init(void) +/* precaches */ +void +HUD_Init(void) { - precache_model(HUD_NUMFILE); - precache_model("sprites/top_left.spr"); - precache_model("sprites/top.spr"); - precache_model("sprites/top_right.spr"); - precache_model("sprites/left.spr"); - precache_model("sprites/right.spr"); - precache_model("sprites/bottom_left.spr"); - precache_model("sprites/bottom.spr"); - precache_model("sprites/bottom_right.spr"); - precache_model("sprites/sniper_scope.spr"); - precache_model("sprites/radar640.spr"); - precache_model("sprites/640hud1.spr"); - precache_model("sprites/640hud16.spr"); - precache_model("sprites/640hud2.spr"); - precache_model("sprites/640hud10.spr"); - precache_model("sprites/640hud12.spr"); - precache_model("sprites/640hud14.spr"); - precache_model("sprites/640hud3.spr"); - precache_model("sprites/640hud5.spr"); + precache_model("sprites/640hud7.spr"); + precache_model("sprites/640_logo.spr"); } -/* -================= -HUD_DrawRedNumber - -Draws a normal number -================= -*/ -void HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) { - drawsubpic(vPos, [24,25], HUD_NUMFILE_LAYER, [vHUDNumPos[iNumber], 0], [NUMSIZE_X, NUMSIZE_Y], vColor, fAlpha, DRAWFLAG_ADDITIVE); +/* seperator for mainly ammo */ +void +HUD_DrawSeperator(vector pos) +{ + drawsubpic(pos, + [2,24], + HUD_NUMS, + [240/256, 0], + [2/256, 24/256], + g_hud_color, + HUD_ALPHA, + DRAWFLAG_ADDITIVE + ); } -/* -================= -HUD_DrawNums +/* handle single/multiple digits */ +void +HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) +{ + drawsubpic(vPos, + [20,25], + HUD_NUMS, + [spr_hudnum[iNumber], 0], + [20/256, 25/256], + vColor, + fAlpha, + DRAWFLAG_ADDITIVE + ); +} -Draws numerals quickly for health, armor etc. -================= -*/ -void HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor) { - int iNumber = fNumber; - if (iNumber > 0) { - while (iNumber > 0) { - HUD_DrawNumber((float)iNumber % 10, vPos, fAlpha, vColor); - iNumber = iNumber / 10; +void +HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor) +{ + int i = fNumber; + if (i > 0) { + while (i > 0) { + HUD_DrawNumber((float)i % 10, vPos, fAlpha, vColor); + i = i / 10; vPos[0] -= 20; - } + } } else { HUD_DrawNumber(0, vPos, fAlpha, vColor); } } -/* -================= -HUD_DrawHealth +/* health */ +void +HUD_DrawHealth(void) +{ + vector pos; + player pl = (player)pSeat->ePlayer; -Draw the current amount of health -================= -*/ -void HUD_DrawHealth(void) { - static float fOldHealth; - static float fHealthAlpha; - if (getstatf(STAT_HEALTH) != fOldHealth) { - fHealthAlpha = 1.0; + if (pl.health != pSeat->health_old) { + pSeat->health_alpha = 1.0; } - - if (fHealthAlpha >= HUD_ALPHA) { - fHealthAlpha -= frametime * 0.5; + + if (pSeat->health_alpha >= HUD_ALPHA) { + pSeat->health_alpha -= clframetime * 0.5; } else { - fHealthAlpha = HUD_ALPHA; + pSeat->health_alpha = HUD_ALPHA; } - - vector vHealthPos = video_mins + [16, video_res[1] - 42]; - if (getstatf(STAT_HEALTH) > 25) { - drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE); - HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, vHUDColor); + + pos = video_mins + [88, video_res[1] - 42]; + if (pl.health > 25) { + drawsubpic( + pos + [-72,1], + [24,24], + HUD_NUMS, + [spr_health[0], spr_health[1]], + [spr_health[2], spr_health[3]], + g_hud_color, + pSeat->health_alpha, + DRAWFLAG_ADDITIVE + ); + HUD_DrawNums(pl.health, pos, pSeat->health_alpha, g_hud_color); } else { - drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], [1,0,0], HUD_ALPHA, DRAWFLAG_ADDITIVE); - HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, [1,0,0]); + drawsubpic( + pos + [-72,1], + [24,24], + HUD_NUMS, + [spr_health[0], spr_health[1]], + [spr_health[2], spr_health[3]], + [1,0,0], + pSeat->health_alpha, + DRAWFLAG_ADDITIVE + ); + HUD_DrawNums(pl.health, pos, pSeat->health_alpha, [1,0,0]); } - fOldHealth = getstatf(STAT_HEALTH); + + pSeat->health_old = pl.health; } -/* -================= -HUD_DrawArmor +/* armor/suit charge */ +void +HUD_DrawArmor(void) +{ + vector pos; + player pl = (player)pSeat->ePlayer; -Draw the current amount of Kevlar -================= -*/ -void HUD_DrawArmor(void) { - static float fOldArmor; - static float fArmorAlpha; - if (getstatf(STAT_ARMOR) != fOldArmor) { - fArmorAlpha = 1.0; - } + pos = video_mins + [198, video_res[1] - 42]; - if (fArmorAlpha >= HUD_ALPHA) { - fArmorAlpha -= frametime * 0.5; - } else { - fArmorAlpha = HUD_ALPHA; - } - - vector vArmorPos = video_mins + [128, video_res[1] - 42]; - - if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_HELMET) { - drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, 0.4862745098], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE); - } else { - drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE); + if (pl.armor != pSeat->armor_old) { + pSeat->armor_alpha = 1.0; } - HUD_DrawNums(getstatf(STAT_ARMOR), vArmorPos + [72,0], fArmorAlpha, vHUDColor); - fOldArmor = getstatf(STAT_ARMOR); + if (pSeat->armor_alpha >= HUD_ALPHA) { + pSeat->armor_alpha -= clframetime * 0.5; + } else { + pSeat->armor_alpha = HUD_ALPHA; + } + + drawsubpic( + pos + [-80,1], + [24,24], + HUD_NUMS, + [spr_suit2[0], spr_suit2[1]], + [spr_suit2[2], spr_suit2[3]], + g_hud_color, + pSeat->armor_alpha, + DRAWFLAG_ADDITIVE + ); + + if (pl.armor > 0) { + drawsubpic( + pos + [-80,1], + [24, 24 * (pl.armor / 100)], + HUD_NUMS, + [spr_suit1[0], + spr_suit1[1]], + [spr_suit1[2], spr_suit1[3] * (pl.armor / 100)], + g_hud_color, + pSeat->armor_alpha, + DRAWFLAG_ADDITIVE + ); + } + + HUD_DrawNums(pl.armor, pos, pSeat->armor_alpha, g_hud_color); + pSeat->armor_old = pl.armor; } -/* -================= -HUD_DrawIcons +/* magazine/clip ammo */ +void +HUD_DrawAmmo1(void) +{ + player pl = (player)pSeat->ePlayer; + vector pos; -Draw icons such as hostage, bomb and buyzones -================= -*/ -void HUD_DrawIcons(void) { - vector iconpos; - - iconpos = video_mins + [16, (video_res[1] / 2) - 24]; - - // Defusal Kit Icon (64, 148) - if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_DEFUSALKIT) { - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); - iconpos[1] += 32; + if (pl.a_ammo1 != pSeat->ammo1_old) { + pSeat->ammo1_alpha = 1.0; + pSeat->ammo1_old = pl.a_ammo1; } - // BuyZone Icon - if (getstatf(STAT_BUYZONE) == TRUE) { - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 3, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); - iconpos[1] += 32; + if (pSeat->ammo1_alpha >= HUD_ALPHA) { + pSeat->ammo1_alpha -= clframetime * 0.5; + } else { + pSeat->ammo1_alpha = HUD_ALPHA; } - // Hostage-Rescue Area Icon - if (getstatf(STAT_HOSTAGEZONE) == TRUE) { - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 2, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); - iconpos[1] += 32; + pos = video_mins + [video_res[0] - 152, video_res[1] - 42]; + HUD_DrawNums(pl.a_ammo1, pos, pSeat->ammo1_alpha, g_hud_color); + HUD_DrawSeperator(pos + [30,0]); +} + +/* leftover type ammo */ +void +HUD_DrawAmmo2(void) +{ + player pl = (player)pSeat->ePlayer; + vector pos; + + if (pl.a_ammo2 != pSeat->ammo2_old) { + pSeat->ammo2_alpha = 1.0; + pSeat->ammo2_old = pl.a_ammo2; } - // Escape Zone Icon (128, 148) - if (getstatf(STAT_ESCAPEZONE) == TRUE) { - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.5, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); - iconpos[1] += 32; + if (pSeat->ammo2_alpha >= HUD_ALPHA) { + pSeat->ammo2_alpha -= clframetime * 0.5; + } else { + pSeat->ammo2_alpha = HUD_ALPHA; } - // VIP Zone Icon (160, 148) - if (getstatf(STAT_VIPZONE) == TRUE) { - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.625, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); - iconpos[1] += 32; + pos = video_mins + [video_res[0] - 72, video_res[1] - 42]; + HUD_DrawNums(pl.a_ammo2, pos, pSeat->ammo2_alpha, g_hud_color); +} + +/* special ammo */ +void +HUD_DrawAmmo3(void) +{ + player pl = (player)pSeat->ePlayer; + vector pos; + + if (pl.a_ammo3 != pSeat->ammo3_old) { + pSeat->ammo3_alpha = 1.0; + pSeat->ammo3_old = pl.a_ammo3; } - // Bomb-Area - if (getstatf(STAT_SLOT_C4BOMB) == WEAPON_C4BOMB) { - if (getstatf(STAT_BOMBZONE) == TRUE) { - float fAlpha = fabs(sin(time * 20)); - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1 - fAlpha, DRAWFLAG_ADDITIVE); - } else { - drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE); - } - iconpos[1] += 32; + if (pSeat->ammo3_alpha >= HUD_ALPHA) { + pSeat->ammo3_alpha -= clframetime * 0.5; + } else { + pSeat->ammo3_alpha = HUD_ALPHA; + } + + pos = video_mins + [video_res[0] - 72, video_res[1] - 74]; + HUD_DrawNums(pl.a_ammo3, pos, pSeat->ammo3_alpha, g_hud_color); +} + +/* flashlight/torch indicator */ +void +HUD_DrawFlashlight(void) +{ + vector pos; + player pl = (player)pSeat->ePlayer; + pos = video_mins + [video_res[0] - 48, 16]; + + /* both on, draw both sprites at full intensity */ + if (pl.flags & FL_FLASHLIGHT) { + drawsubpic( + pos, + [32,32], + HUD_NUMS, + [spr_flash1[0], spr_flash1[1]], + [spr_flash1[2], spr_flash1[3]], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + + drawsubpic( + pos, + [48,32], + HUD_NUMS, + [spr_flash2[0], spr_flash2[1]], + [spr_flash2[2], spr_flash2[3]], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [32,32], + HUD_NUMS, + [spr_flash1[0], spr_flash1[1]], + [spr_flash1[2], spr_flash1[3]], + g_hud_color, + HUD_ALPHA, + DRAWFLAG_ADDITIVE + ); } } -/* -================= -HUD_DrawTimer +/* logo animation used during e3 1998 */ +void +HUD_DrawLogo(void) +{ + vector pos; + static int f; + static float frame_timer; -Draws the roundtime at the bottom of the screen (always visible) -================= -*/ -void HUD_DrawTimer(void) { - static int iOldUnits; - static float fTimerAlpha; - int iMinutes, iSeconds, iTens, iUnits; - vector vTimePos = video_mins+[(video_res[0] / 2) - 62, video_res[1] - 42]; + frame_timer -= clframetime; + pos = [video_res[0] - 262, 48]; - if (getstatf(STAT_GAMETIME) == -1) { + drawpic( + pos, + sprintf("sprites/640_logo.spr_%i.tga", f), + [256, 48], + [1,1,1], + 1.0f, + DRAWFLAG_ADDITIVE + ); + + if (frame_timer > 0) { return; } - iMinutes = getstatf(STAT_GAMETIME) / 60; - iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes; - iTens = iSeconds / 10; - iUnits = iSeconds - 10 * iTens; + frame_timer = 0.1f; - // Flashing red numbers - if ((iMinutes == 0) && (iTens <= 1)) { - float fAlpha; - - // 0:00 is fully red - if ((iTens == 0) && (iUnits == 0)) { - fAlpha = 1; - } else { - fAlpha = fabs(sin(time * 20)); - } - - HUD_DrawNumber(iMinutes, vTimePos + [48,0], fAlpha, [1,0,0]); - HUD_DrawNumber(iTens, vTimePos + [75,0], fAlpha, [1,0,0]); - HUD_DrawNumber(iUnits, vTimePos + [99,0],fAlpha, [1,0,0]); - HUD_DrawNumber(iMinutes, vTimePos + [48,0], 1 - fAlpha, vHUDColor); - HUD_DrawNumber(iTens, vTimePos + [75,0], 1 - fAlpha, vHUDColor); - HUD_DrawNumber(iUnits, vTimePos + [99,0],1 - fAlpha, vHUDColor); - - // : symbol - drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); - drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); - drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE); - drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE); - - drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE); - drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE); - } else { - if (iUnits != iOldUnits) { - fTimerAlpha = 1.0; - } - - if (fTimerAlpha >= HUD_ALPHA) { - fTimerAlpha -= frametime * 0.5; - } else { - fTimerAlpha = HUD_ALPHA; - } - HUD_DrawNumber(iMinutes, vTimePos + [48,0], fTimerAlpha, vHUDColor); - HUD_DrawNumber(iTens, vTimePos + [75,0], fTimerAlpha, vHUDColor); - HUD_DrawNumber(iUnits, vTimePos + [95,0], fTimerAlpha, vHUDColor); - - drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE); - drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE); - - drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE); - iOldUnits = iUnits; + f++; + if (f == 31) { + f = 0; } } -/* -================= -HUD_DrawMoney - -Draws the amount of money (0-16000) with an icon to the screen -================= -*/ -void HUD_DrawMoney(void) { - static float fOldMoneyValue; - static float fMoneyAlphaEffect; - static vector vMoneyColorEffect; - static float fMoneyDifference; - - // If the money differs from last frame, paint it appropriately - if (getstatf(STAT_MONEY) > fOldMoneyValue) { - // Effect already in progress from something else, go add on top of it! - if (fMoneyAlphaEffect > 0) { - fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY)); - } else { - fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY); - } - // Make it green for a short time - vMoneyColorEffect = [0,1,0]; - fMoneyAlphaEffect = 1.0; - } else if (getstatf(STAT_MONEY) < fOldMoneyValue) { - // Same one as above - if (fMoneyAlphaEffect > 0) { - fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY)); - } else { - fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY); - } - // Make it red - vMoneyColorEffect = [1,0,0]; - fMoneyAlphaEffect = 1.0; - fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY); - } +/* weapon/ammo pickup notifications */ +void +HUD_DrawNotify(void) +{ + vector pos; - vector vMoneyPos = video_mins+[video_res[0] - 160, video_res[1] - 72]; - - // If the alpha/color effect is active, draw the money twice in their varying alphas/colors - if (fMoneyAlphaEffect > 0) { - fMoneyAlphaEffect -= frametime * 0.5; - drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE); - drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), DRAWFLAG_ADDITIVE); - - // Draw the +/- symbols depending on whether or not we made or lost money - if (fMoneyDifference < 0) { - drawsubpic(vMoneyPos + [0,-32], [18,23], HUD_NUMFILE_LAYER, [0.8671875, 0.09765625], [0.0703125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE); - } else { - drawsubpic(vMoneyPos + [0,-32], [13,23], HUD_NUMFILE_LAYER, [0.8203125, 0.09765625], [0.05078125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE); - } - - // Shift the numbers for reverse drawing - vMoneyPos[0] += (24 * 5); - - // Draw the regular numbers at their normal positions - HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, fMoneyAlphaEffect, vMoneyColorEffect); - HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), vHUDColor); - - // Draw above how much money we've gotten from all this - HUD_DrawNums(fabs(fMoneyDifference), vMoneyPos + [0,-32], fMoneyAlphaEffect, vMoneyColorEffect); - } else { - drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE); - vMoneyPos[0] += (24 * 5); - HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA, vHUDColor); - } - - fOldMoneyValue = getstatf(STAT_MONEY); -} - -/* -================= -HUD_DrawAmmo - -Draws the current clip, the amount of ammo for the caliber and a matching caliber icon -================= -*/ -void HUD_DrawAmmo(void) { - static float fOldMag, fOldCal; - static float fAmmoAlpha; - static vector vAmmoMagPos; - static vector vAmmoCalPos; - - if (getstatf(STAT_ACTIVEWEAPON) == 0) { + if (pSeat->pickup_alpha <= 0.0f) { return; } - if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_KNIFE || getstatf(STAT_ACTIVEWEAPON) == WEAPON_C4BOMB) { + + pos = video_mins + [video_res[0] - 192, video_res[1] - 128]; + Weapons_HUDPic(pSeat->pickup_weapon, 1, pos, pSeat->pickup_alpha); + pSeat->pickup_alpha -= frametime; +} + +void +HUD_WeaponPickupNotify(int w) +{ + pSeat->pickup_weapon = w; + pSeat->pickup_alpha = 1.0f; +} + +/* main entry */ +void +HUD_Draw(void) +{ + player pl = (player)pSeat->ePlayer; + + g_hud_color = autocvar_con_color * (1 / 255); + + /* little point in not drawing these, even if you don't have a suit */ + Weapons_DrawCrosshair(); + HUD_DrawWeaponSelect(); + + if (!(pl.g_items & ITEM_SUIT)) { return; } - - if (getstatf(STAT_CURRENT_MAG) != fOldMag || getstatf(STAT_CURRENT_CALIBER) != fOldCal) { - fAmmoAlpha = 1.0; - } - - if (fAmmoAlpha >= HUD_ALPHA) { - fAmmoAlpha -= frametime * 0.5; - } else { - fAmmoAlpha = HUD_ALPHA; - } - - if (wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber < 11) { - vAmmoMagPos = video_mins+[video_res[0] - 142, video_res[1] - 42]; - HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor); - - drawsubpic(video_mins+[video_res[0] - 118, video_res[1] - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.09765625], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE); - - vAmmoCalPos = video_mins+[video_res[0] - 64, video_res[1] - 42]; - HUD_DrawNums(getstatf(STAT_CURRENT_CALIBER), vAmmoCalPos, fAmmoAlpha, vHUDColor); - } else { - vAmmoMagPos = video_mins+[video_res[0] - 64, video_res[1] - 42]; - HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor); - } - - // Caliber icon - drawsubpic(video_mins+video_res - [42,42], [24,24], HUD_NUMFILE_LAYER, vHUDCalPos[wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE); - fOldMag = getstatf(STAT_CURRENT_MAG); - fOldCal = getstatf(STAT_CURRENT_CALIBER); -} -void HUD_DrawProgressBar(void) { - vector vSize = [540,16]; - vector vMainPos; - - if (getstatf(STAT_PROGRESS) > 0) { - vMainPos = video_mins; - vMainPos[0] += (video_res[0] / 2) - (vSize[0] / 2); - vMainPos[1] += (video_res[1] / 2) - (vSize[1] / 2); - - // Draw the background - vector vBar = vSize; - vBar[0] = 538 * getstatf(STAT_PROGRESS); - vBar[1] = 14; - drawfill(vMainPos + [1,1], vBar, vHUDColor, 1, DRAWFLAG_ADDITIVE); - - drawfill(vMainPos, [vSize[0], 1], vHUDColor, 1.0f); // Top - drawfill([vMainPos[0], vMainPos[1] + vSize[1]], [vSize[0], 1], vHUDColor, 1.0f); // Bottom - - drawfill(vMainPos, [1, vSize[1]], vHUDColor, 1.0f); // Left - drawfill([vMainPos[0] + vSize[0], vMainPos[1]], [1, vSize[1] + 1], vHUDColor, 1.0f); // Right - } -} - -void HUD_DrawRadar(void) { - if (autocvar_cl_radar == 1) { - drawpic(video_mins, "sprites/radar640.spr_0.tga", [128,128], [1,1,1], 0.25, DRAWFLAG_ADDITIVE); - } else if (autocvar_cl_radar == 2) { - static int iLastMode = 0; - static vector vMapSize; - static float fZoom; - - if (iLastMode != pSeat.iMapExpand) { - iLastMode = pSeat.iMapExpand; - } - - if (pSeat.iMapExpand == 1) { - if (pSeat.fMapLerp < 1.0f) { - vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp)); - vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp)); - fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp); - pSeat.fMapLerp += frametime * 2; - } else { - pSeat.fMapLerp = 1.0f; - fZoom = ovMap.fCameraHeight; - vMapSize = video_res + [-32,-32]; - } - } else { - if (pSeat.fMapLerp > 0.0f) { - vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp)); - vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp)); - fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp); - pSeat.fMapLerp -= frametime * 2; - } else { - pSeat.fMapLerp = 0.0f; - fZoom = (ovMap.fCameraHeight * (128 / (video_res[1] - 32))); - vMapSize = [128,128]; - } - } - - clearscene(); - drawfill(video_mins + [15,15], vMapSize + [2,2], vHUDColor, 1.0f, DRAWFLAG_ADDITIVE); - drawfill(video_mins + [16,16], vMapSize, [0,0,0], 1.0f, 0); - setproperty(VF_MIN, video_mins + [16,16]); - setproperty(VF_SIZE, vMapSize); - - Overview_DrawLayer(); - - makevectors(view_angles); - setproperty(VF_ORIGIN, [pSeat->vPlayerOrigin[0], pSeat->vPlayerOrigin[1], fZoom] ); - setproperty(VF_ANGLES, [Math_Lerp(90, 60, pSeat.fMapLerp), view_angles[1], 0]); - setproperty(VF_DRAWWORLD, 0); - renderscene(); - } -} - -void HUD_DrawFlash(void) { - if (pSeat->fFlashTime > 0.0f) { - pSeat->fFlashTime -= frametime; - } else { - if (pSeat->fFlashAlpha > 0.0f) { - pSeat->fFlashAlpha -= (frametime * 0.5); - } else { - return; - } - } - - drawfill(video_mins, video_res, [1,1,1], pSeat->fFlashAlpha, 0/*pSeat->fFlashTime*/); -} - -/* -================= -HUD_Draw - -Called every frame in Draw.c -================= -*/ -void HUD_Draw(void) { - vHUDColor = autocvar_con_color * (1 / 255); - - // I guess viewzoom turns from 0.0-1.0 float into a 0-255 byte - if (getstatf(STAT_VIEWZOOM) < 1.0f) { - if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_SG552 || getstatf(STAT_ACTIVEWEAPON) == WEAPON_AUG) { - HUD_DrawSimpleCrosshair(); - } else { - HUD_DrawScope(); - } - } else { - HUD_DrawCrosshair(); - } - - HUD_DrawFlash(); - Damage_Draw(); - HUD_DrawTimer(); + HUD_DrawNotify(); HUD_DrawHealth(); HUD_DrawArmor(); - HUD_DrawIcons(); - HUD_DrawMoney(); - HUD_DrawAmmo(); - HUD_DrawRadar(); - HUD_DrawProgressBar(); - HUD_DrawWeaponSelect(); + HUD_DrawFlashlight(); + Damage_Draw(); + + drawpic([128,128], HUD_NUMS, [256,256], [1,1,1], 1.0f); +} + +/* specatator main entry */ +void +VGUI_DrawSpectatorHUD(void) +{ + // FIXME } diff --git a/src/client/cstrike/hud.h b/src/client/cstrike/hud.h new file mode 100644 index 00000000..e7b66434 --- /dev/null +++ b/src/client/cstrike/hud.h @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/* pre-calculated sprite definitions */ +float spr_health[4] = { + 48 / 256, // pos x + 25 / 256, // pos u + 24 / 256, // size x + 24 / 256 // size y +}; + +float spr_suit1[4] = { + 0 / 256, // pos x + 25 / 256, // pos u + 24 / 256, // size x + 24 / 256 // size y +}; + +float spr_suit2[4] = { + 24 / 256, // pos x + 25 / 256, // pos u + 24 / 256, // size x + 24 / 256 // size y +}; + +float spr_flash1[4] = { + 160 / 256, // pos x + 24 / 256, // pos u + 32 / 256, // size x + 32 / 256 // size y +}; + +float spr_flash2[4] = { + 112 / 256, // pos x + 24 / 256, // pos u + 48 / 256, // size x + 32 / 256 // size y +}; diff --git a/src/client/cstrike/hud_weaponselect.c b/src/client/cstrike/hud_weaponselect.c new file mode 100644 index 00000000..bc45724d --- /dev/null +++ b/src/client/cstrike/hud_weaponselect.c @@ -0,0 +1,200 @@ +/* + * 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. + */ + +vector vHUDSlotNumPos[6] = +{ + [168 / 256, 72 / 256], + [188 / 256, 72 / 256], + [208 / 256, 72 / 256], + [168 / 256, 92 / 256], + [188 / 256, 92 / 256], + [208 / 256, 92 / 256] +}; + +void HUD_DrawWeaponSelect_Forward(void) +{ + player pl = (player)pSeat->ePlayer; + + if (!pl.activeweapon) { + return; + } + + if (pSeat->fHUDWeaponSelectTime < time) { + pSeat->fHUDWeaponSelected = pl.activeweapon; + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE); + } else { + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE); + pSeat->fHUDWeaponSelected--; + if (pSeat->fHUDWeaponSelected <= 0) { + pSeat->fHUDWeaponSelected = g_weapons.length - 1; + } + } + + pSeat->fHUDWeaponSelectTime = time + 3; + + if not (pl.g_items & g_weapons[pSeat->fHUDWeaponSelected].id) { + HUD_DrawWeaponSelect_Forward(); + } +} + +void HUD_DrawWeaponSelect_Back(void) +{ + player pl = (player)pSeat->ePlayer; + + if (!pl.activeweapon) { + return; + } + + if (pSeat->fHUDWeaponSelectTime < time) { + pSeat->fHUDWeaponSelected = pl.activeweapon; + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE); + } else { + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE); + pSeat->fHUDWeaponSelected++; + if (pSeat->fHUDWeaponSelected >= g_weapons.length) { + pSeat->fHUDWeaponSelected = 1; + } + } + + pSeat->fHUDWeaponSelectTime = time + 3; + + if not (pl.g_items & g_weapons[pSeat->fHUDWeaponSelected].id) { + HUD_DrawWeaponSelect_Back(); + } +} + +void HUD_DrawWeaponSelect_Trigger(void) +{ + player pl = (player)pSeat->ePlayer; + pl.activeweapon = pSeat->fHUDWeaponSelected; + sendevent("PlayerSwitchWeapon", "f", pSeat->fHUDWeaponSelected); + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_select.wav", 0.5f, ATTN_NONE); + pSeat->fHUDWeaponSelected = pSeat->fHUDWeaponSelectTime = 0; +} + +void HUD_DrawWeaponSelect_Last(void) +{ + +} + +void HUD_DrawWeaponSelect_Num(vector vPos, float fValue) +{ + drawsubpic(vPos, [20,20], "sprites/640hud7.spr_0.tga", vHUDSlotNumPos[fValue], [20/256, 20/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); +} + +int HUD_InSlotPos(int slot, int pos) +{ + player pl = (player)pSeat->ePlayer; + for (int i = 1; i < g_weapons.length; i++) { + if (g_weapons[i].slot == slot && g_weapons[i].slot_pos == pos) { + if (pl.g_items & g_weapons[i].id) { + return i; + } else { + return -1; + } + } + } + return -1; +} + +void HUD_SlotSelect(int slot) +{ + player pl = (player)pSeat->ePlayer; + int curslot = g_weapons[pSeat->fHUDWeaponSelected].slot; + int i; + + if (pSeat->fHUDWeaponSelectTime < time) { + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE); + } else { + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE); + } + + /* weren't in that slot? select the first one then */ + if (curslot != slot) { + for (i = 1; i < g_weapons.length; i++) { + if (g_weapons[i].slot == slot) { + pSeat->fHUDWeaponSelected = i; + pSeat->fHUDWeaponSelectTime = time + 3; + break; + } + } + } else { + /* increment our current selected weapon by 1 */ + pSeat->fHUDWeaponSelected++; + pSeat->fHUDWeaponSelectTime = time + 3; + + /* reset when out of bounds or outside slot area */ + if (pSeat->fHUDWeaponSelected >= g_weapons.length) { + pSeat->fHUDWeaponSelected = 0; + HUD_SlotSelect(slot); + } else if (g_weapons[pSeat->fHUDWeaponSelected].slot != slot) { + pSeat->fHUDWeaponSelected = 0; + HUD_SlotSelect(slot); + } + } +} + +void HUD_DrawWeaponSelect(void) +{ + player pl = (player)pSeat->ePlayer; + if (!pl.activeweapon) { + return; + } + if (pSeat->fHUDWeaponSelectTime < time) { + if (pSeat->fHUDWeaponSelected) { + sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudoff.wav", 0.5, ATTN_NONE); + pSeat->fHUDWeaponSelected = 0; + } + return; + } + + vector vecPos = video_mins + [16,16]; + + int b; + int wantslot = g_weapons[pSeat->fHUDWeaponSelected].slot; + int wantpos = g_weapons[pSeat->fHUDWeaponSelected].slot_pos; + for (int i = 0; i < 5; i++) { + int slot_selected = 0; + vecPos[1] = video_mins[1] + 16; + HUD_DrawWeaponSelect_Num(vecPos, i); + vecPos[1] += 20; + for (int x = 0; x < 32; x++) { + if (i == wantslot) { + slot_selected = TRUE; + if (x == wantpos) { + // Selected Sprite + Weapons_HUDPic(pSeat->fHUDWeaponSelected, 1, vecPos, 1.0f); + drawsubpic(vecPos, [170,45], "sprites/640hud3.spr_0.tga", + [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + vecPos[1] += 50; + } else if ((b=HUD_InSlotPos(i, x)) != -1) { + // Unselected Sprite + Weapons_HUDPic(b, 0, vecPos, 1.0f); + vecPos[1] += 50; + } + } else if (HUD_InSlotPos(i, x) != -1) { + HUD_DrawWeaponSelect_Num(vecPos, 5); + vecPos[1] += 25; + } + } + + if (slot_selected == TRUE) { + vecPos[0] += 175; + } else { + vecPos[0] += 25; + } + } +} diff --git a/src/client/cstrike/init.c b/src/client/cstrike/init.c index ddee5ce5..9e554fe2 100644 --- a/src/client/cstrike/init.c +++ b/src/client/cstrike/init.c @@ -14,6 +14,9 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +float(entity foo, float chanid) getchannellevel = #0; + + /* ================= Client_Init @@ -23,39 +26,43 @@ Comparable to worldspawn in SSQC in that it's mostly used for precaches */ void Client_Init(float apilevel, string enginename, float engineversion) { - precache_model("sprites/fexplo.spr"); - precache_model("sprites/muzzleflash1.spr"); - precache_sound("player/pl_pain2.wav"); + precache_model("sprites/640hud1.spr"); + precache_model("sprites/640hud2.spr"); + precache_model("sprites/640hud3.spr"); + precache_model("sprites/640hud4.spr"); + precache_model("sprites/640hud5.spr"); + precache_model("sprites/640hud6.spr"); + precache_model("sprites/640hud7.spr"); + precache_model("sprites/640hud10.spr"); + precache_model("sprites/640hud11.spr"); + precache_model("sprites/640hud12.spr"); + precache_model("sprites/640hud13.spr"); + precache_model("sprites/640hud14.spr"); + precache_model("sprites/640hud15.spr"); + precache_model("sprites/640hud16.spr"); + precache_model("sprites/hud640_01.spr"); + precache_model("sprites/hud640_02.spr"); + precache_model("sprites/hud640_04.spr"); + precache_model("sprites/bottom.spr"); + precache_model("sprites/bottom_left.spr"); + precache_model("sprites/bottom_right.spr"); + precache_model("sprites/left.spr"); + precache_model("sprites/radar640.spr"); + precache_model("sprites/right.spr"); + precache_model("sprites/sniper_scope.spr"); + precache_model("sprites/top.spr"); + precache_model("sprites/top_left.spr"); + precache_model("sprites/top_right.spr"); - precache_model("sprites/iplayerred.spr"); - precache_model("sprites/iplayerblue.spr"); - precache_model("sprites/iplayervip.spr"); - precache_model("sprites/ihostage.spr"); - - precache_model("models/pshell.mdl"); - precache_model("models/rshell.mdl"); - precache_model("models/rshell_big.mdl"); - precache_model("models/shotgunshell.mdl"); - precache_pic( sprintf( "overviews/%s.bmp", mapname ) ); - - PARTICLE_SMOKEGRENADE = particleeffectnum("smokegren"); - - Radio_InitSounds(); - CSQC_ConsoleCommand_Init(); - Overview_Init(); - - pSeat.iOverview = FALSE; + BEAM_TRIPMINE = particleeffectnum("beam_tripmine"); } void Client_InitDone(void) { - /* don't open this in singleplayer */ - if (serverkeyfloat("slots") > 1) { - VGUI_ChooseTeam(); - } + /* change this to the motd */ + //VGUI_ChooseTeam(); } void Game_RendererRestarted(string rstr) { - Overview_Init(); } diff --git a/src/client/cstrike/progs.src b/src/client/cstrike/progs.src old mode 100755 new mode 100644 index 6b42db87..5f8ad30f --- a/src/client/cstrike/progs.src +++ b/src/client/cstrike/progs.src @@ -2,106 +2,99 @@ #pragma progs_dat "../../../cstrike/data.pk3dir/csprogs.dat" #define CSQC -#define CSTRIKE +#define VALVE #includelist ../../shared/fteextensions.qc ../../shared/defs.h -../../shared/cstrike/defs.h ../../shared/math.h ../../shared/materials.h ../../shared/events.h ../../shared/entities.h -defs.h +../valve/defs.h +../cstrike/defs.h +../valve/particles.h ../defs.h ../../vgui/include.src -../voice.c -../sound.c -../music.c -../prints.c ../util.c -../../gs-entbase/client.src - -../../shared/cstrike/weaponak47.c -../../shared/cstrike/weaponaug.c -../../shared/cstrike/weaponawp.c -../../shared/cstrike/weaponc4bomb.c -../../shared/cstrike/weapondeagle.c -../../shared/cstrike/weaponelites.c -../../shared/cstrike/weaponfiveseven.c -../../shared/cstrike/weaponflashbang.c -../../shared/cstrike/weapong3sg1.c -../../shared/cstrike/weaponglock18.c -../../shared/cstrike/weaponhegrenade.c -../../shared/cstrike/weaponknife.c -../../shared/cstrike/weaponm3.c -../../shared/cstrike/weaponm4a1.c -../../shared/cstrike/weaponmac10.c -../../shared/cstrike/weaponmp5.c -../../shared/cstrike/weaponp228.c -../../shared/cstrike/weaponp90.c -../../shared/cstrike/weaponpara.c -../../shared/cstrike/weaponscout.c -../../shared/cstrike/weaponsg550.c -../../shared/cstrike/weaponsg552.c -../../shared/cstrike/weaponsmokegrenade.c -../../shared/cstrike/weapontmp.c -../../shared/cstrike/weaponump45.c -../../shared/cstrike/weaponusp45.c -../../shared/cstrike/weaponxm1014.c -../../shared/cstrike/basegun.c -../../shared/cstrike/weapons.c -../../shared/cstrike/radio.c -../../shared/cstrike/equipment.c -../../shared/cstrike/animations.c - -../../shared/valve/player.cpp -../../shared/pmove.c +../cstrike/init.c ../fade.c ../sprite.cpp ../titles.c ../text.c -../sentences.c +../../gs-entbase/client.src + +../sky.c +../sound.c +../music.c +../sentences.c +../prints.c +../voice.c +../../shared/valve/animations.h +../../shared/valve/animations.c +../../shared/valve/player.cpp +../player.c +../../shared/pmove.c +../predict.c ../../shared/decals.c ../../shared/effects.c ../../shared/spraylogo.cpp ../npc.c - -../sky.c -overview.c -../player.c -../predict.c +../../shared/cstrike/items.h +../../shared/valve/weapon_common.h +../../shared/cstrike/weapons.h +../../shared/cstrike/w_knife.c +../../shared/cstrike/w_usp45.c +../../shared/cstrike/w_glock18.c +../../shared/cstrike/w_deagle.c +../../shared/cstrike/w_p228.c +../../shared/cstrike/w_elites.c +../../shared/cstrike/w_fiveseven.c +../../shared/cstrike/w_m3.c +../../shared/cstrike/w_xm1014.c +../../shared/cstrike/w_mp5.c +../../shared/cstrike/w_p90.c +../../shared/cstrike/w_ump45.c +../../shared/cstrike/w_mac10.c +../../shared/cstrike/w_tmp.c +../../shared/cstrike/w_ak47.c +../../shared/cstrike/w_sg552.c +../../shared/cstrike/w_m4a1.c +../../shared/cstrike/w_aug.c +../../shared/cstrike/w_scout.c +../../shared/cstrike/w_awp.c +../../shared/cstrike/w_g3sg1.c +../../shared/cstrike/w_sg550.c +../../shared/cstrike/w_para.c +../../shared/cstrike/w_c4bomb.c +../../shared/cstrike/w_flashbang.c +../../shared/cstrike/w_hegrenade.c +../../shared/cstrike/w_smokegrenade.c +../../shared/cstrike/weapons.c +../../shared/valve/weapon_common.c +../valve/player.c +entities.c +../entities.c +../valve/cmds.c +../valve/game_event.c ../events.c -view.c +../valve/view.c ../view.c ../damage.c -../chat.c -nightvision.c -hudcrosshair.c -hudscope.c -hudweaponselect.c ../obituary.c -hudorbituaries.c -hud.c +../chat.c + ../vgui.cpp -vgui_buymenu.cpp -vgui_chooseteam.cpp -vgui_motd.cpp -vgui_radio.cpp -scoreboard.c +../cstrike/vgui_chooseteam.cpp -draw.c -entities.c -event.c -init.c - -player.c -../entities.c - -input.c +hud.h +hud.c +hud_weaponselect.c +../valve/scoreboard.c +../valve/input.c ../entry.c #endlist diff --git a/src/client/entry.c b/src/client/entry.c index e03cca1b..faa6df49 100644 --- a/src/client/entry.c +++ b/src/client/entry.c @@ -188,11 +188,6 @@ CSQC_UpdateView(float w, float h, float focus) pSeat->vPlayerVelocity = pl.velocity; pSeat->fPlayerFlags = pl.flags; - // Render 3D Game Loop -#ifdef CSTRIKE - Cstrike_PreDraw(); -#endif - // Don't hide the player entity if (autocvar_cl_thirdperson == TRUE && pl.health) { setproperty(VF_VIEWENTITY, (float)0); @@ -247,7 +242,6 @@ CSQC_UpdateView(float w, float h, float focus) } else { setproperty(VF_ORIGIN, pSeat->vPlayerOrigin); } - View_DrawViewModel(); } addentities(MASK_ENGINE); @@ -273,6 +267,18 @@ CSQC_UpdateView(float w, float h, float focus) setproperty(VF_SKYROOM_CAMERA, g_skypos + realpos); } + /* draw the world/entities */ + renderscene(); + + /* Now we draw the viewmodel in a second pass */ + clearscene(); + setproperty(VF_MIN, video_mins); + setproperty(VF_SIZE, video_res); + setproperty(VF_ANGLES, view_angles + pl.punchangle); + setproperty(VF_DRAWWORLD, 0); + setproperty(VF_AFOV, cvar("cl_viewmodelfov")); + setproperty(VF_ORIGIN, pSeat->vPlayerOrigin + pl.view_ofs); + View_DrawViewModel(); renderscene(); /* Run this on all players */ diff --git a/src/client/events.c b/src/client/events.c index 31bc1dc0..2f56d231 100644 --- a/src/client/events.c +++ b/src/client/events.c @@ -36,7 +36,7 @@ void Event_EjectShell(void) entity eShell = spawn(); setorigin(eShell, vOrigin); -#ifdef CSTRIKE +#if 0 setmodel(eShell, sShellModel[wptTable[getstati(STAT_ACTIVEWEAPON)].iShellType]); #endif eShell.movetype = MOVETYPE_BOUNCE; diff --git a/src/client/music.c b/src/client/music.c index cbc0e2c7..3be3f161 100644 --- a/src/client/music.c +++ b/src/client/music.c @@ -63,7 +63,6 @@ Music_GetPath(int id) } else if (autocvar_cl_musicstyle == MUSIC_FLAC) { return sprintf("music/track%02i.flac", id); } else if (autocvar_cl_musicstyle == MUSIC_STEAMHL) { - /* this doesn't happen often enough for it to be in RAM all the time */ if (id >= 2 && id <= 28) { return g_steamhltracks[id - 2]; } @@ -94,6 +93,6 @@ Music_ParseLoop(void) track = readbyte(); path = Music_GetPath(track); - dprint(sprintf("^2Music_ParseTrack:^7 Looping track %i from %s\n", track, path)); + dprint(sprintf("^2Music_ParseLoop:^7 Looping track %i from %s\n", track, path)); localcmd(sprintf("music %s\n", path)); } diff --git a/src/client/player.c b/src/client/player.c index 8351bb18..796c23c2 100644 --- a/src/client/player.c +++ b/src/client/player.c @@ -23,39 +23,6 @@ //.float basesubblendfrac; // legs part. .float subblend2frac; // Up/Down -// TODO: This needs to be redone. -#ifdef CSTRIKE -string sPModels[CS_WEAPON_COUNT - 1] = { - "models/p_knife.mdl", - "models/p_usp.mdl", - "models/p_glock18.mdl", - "models/p_deagle.mdl", - "models/p_p228.mdl", - "models/p_elite.mdl", - "models/p_fiveseven.mdl", - "models/p_m3.mdl", - "models/p_xm1014.mdl", - "models/p_mp5.mdl", - "models/p_p90.mdl", - "models/p_ump45.mdl", - "models/p_mac10.mdl", - "models/p_tmp.mdl", - "models/p_ak47.mdl", - "models/p_sg552.mdl", - "models/p_m4a1.mdl", - "models/p_aug.mdl", - "models/p_scout.mdl", - "models/p_awp.mdl", - "models/p_g3sg1.mdl", - "models/p_sg550.mdl", - "models/p_m249.mdl", - "models/p_c4.mdl", - "models/p_flashbang.mdl", - "models/p_hegrenade.mdl", - "models/p_smokegrenade.mdl" -}; -#endif - void player::gun_offset(void) { vector v1, v2; @@ -81,9 +48,7 @@ void player::gun_offset(void) setorigin(this.p_model, this.origin - ofs); } -#ifdef VALVE string Weapons_GetPlayermodel(int); -#endif void player::draw(void) { @@ -174,11 +139,12 @@ float player::predraw(void) makevectors(ang); traceline(src, src + (v_forward * 8096), FALSE, self); - if (serverkeyfloat("*bspversion") == 30) { + /*if (serverkeyfloat("*bspversion") == 30) { dynamiclight_add(trace_endpos + (v_forward * -2), 128, [1,1,1]); - } else { - float p = dynamiclight_add(src, 0, [1,1,1], 0, "textures/flashlight"); + } else */{ + float p = dynamiclight_add(src, 512, [1,1,1], 0, "textures/flashlight"); dynamiclight_set(p, LFIELD_ANGLES, ang); + dynamiclight_set(p, LFIELD_FLAGS, 3); } } diff --git a/src/client/predict.c b/src/client/predict.c index b19042f8..2e72866e 100644 --- a/src/client/predict.c +++ b/src/client/predict.c @@ -32,14 +32,11 @@ void Predict_PreFrame(player pl) pl.net_teleport_time = pl.teleport_time; pl.net_viewzoom = pl.viewzoom; pl.net_punchangle = pl.punchangle; - -#ifdef VALVE pl.net_w_attack_next = pl.w_attack_next; pl.net_w_idle_next = pl.w_idle_next; pl.net_ammo1 = pl.a_ammo1; pl.net_ammo2 = pl.a_ammo2; pl.net_ammo3 = pl.a_ammo3; -#endif pl.net_weapontime = pl.weapontime; //self.netpmove_flags = self.pmove_flags; @@ -86,13 +83,12 @@ void Predict_PostFrame(player pl) pl.punchangle = pl.net_punchangle; //pl.hook.origin = pl.net_hookpos; -#ifdef VALVE 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; -#endif + pl.weapontime = pl.net_weapontime; //self.pmove_flags = self.netpmove_flags; diff --git a/src/client/view.c b/src/client/view.c index f2fdcc90..b543211b 100644 --- a/src/client/view.c +++ b/src/client/view.c @@ -19,14 +19,6 @@ var int autocvar_v_camroll = TRUE; void View_Init(void) { -#ifdef CSTRIKE - string wm; - for (int i = 0; i < (CS_WEAPON_COUNT - 1); i++) { - wm = sprintf("models/%s", sViewModels[i]); - precache_model(wm); - } -#endif - for (int s = seats.length; s-- > numclientseats;) { pSeat = &seats[s]; if(!pSeat->eViewModel) { diff --git a/src/gs-entbase/client/point_message.cpp b/src/gs-entbase/client/point_message.cpp index 6c49a5ec..4a380040 100644 --- a/src/gs-entbase/client/point_message.cpp +++ b/src/gs-entbase/client/point_message.cpp @@ -88,6 +88,8 @@ void PointMessage_Draw(void) #endif #ifdef WASTES + string msg; + float distance; for ( entity eFind = world; ( eFind = find( eFind, ::classname, "point_message" ) ); ) { point_message m = (point_message)eFind; msg = m.m_strMessage; diff --git a/src/server/cstrike/ammo.c b/src/server/cstrike.old/ammo.c similarity index 100% rename from src/server/cstrike/ammo.c rename to src/server/cstrike.old/ammo.c diff --git a/src/server/cstrike.old/armoury_entity.cpp b/src/server/cstrike.old/armoury_entity.cpp new file mode 100755 index 00000000..c7a81a78 --- /dev/null +++ b/src/server/cstrike.old/armoury_entity.cpp @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2016-2019 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +int iArmouryItems[19] = { + WEAPON_MP5, + WEAPON_TMP, + WEAPON_P90, + WEAPON_MAC10, + WEAPON_AK47, + WEAPON_SG552, + WEAPON_M4A1, + WEAPON_AUG, + WEAPON_SCOUT, + WEAPON_G3SG1, + WEAPON_AWP, + WEAPON_M3, + WEAPON_XM1014, + WEAPON_PARA, + WEAPON_FLASHBANG, + WEAPON_HEGRENADE, + EQUIPMENT_KEVLAR, + EQUIPMENT_HELMET, + WEAPON_SMOKEGRENADE +}; + +string sArmouryModels[19] = { + "models/w_mp5.mdl", + "models/w_tmp.mdl", + "models/w_p90.mdl", + "models/w_mac10.mdl", + "models/w_ak47.mdl", + "models/w_sg552.mdl", + "models/w_m4a1.mdl", + "models/w_aug.mdl", + "models/w_scout.mdl", + "models/w_g3sg1.mdl", + "models/w_awp.mdl", + "models/w_m3.mdl", + "models/w_xm1014.mdl", + "models/w_m249.mdl", + "models/w_flashbang.mdl", + "models/w_hegrenade.mdl", + "models/w_kevlar.mdl", + "models/w_assault.mdl", + "models/w_smokegrenade.mdl" +}; + +class armoury_entity:CBaseEntity +{ + int m_iCount; + int m_iLeft; + int m_iItem; + + void() armoury_entity; + virtual void() touch; + virtual void() Respawn; +}; + +int amoury_entity_pickup(armoury_entity item, entity player) +{ + entity eOld = self; + self = player; + + // Only MP5 til PARA + if (item.m_iItem < 14) { + if (Weapon_SlotEmpty(Weapon_GetSlot(iArmouryItems[item.m_iItem]))) { + Weapon_AddItem(iArmouryItems[item.m_iItem]); + Weapon_Draw(iArmouryItems[item.m_iItem]); + } else { + self = eOld; + return FALSE; + } + } else { + // Equipment + if (iArmouryItems[item.m_iItem] == EQUIPMENT_KEVLAR) { + if (self.armor != 100) { + self.armor = 100; + } else { + self = eOld; + return FALSE; + } + } else if (iArmouryItems[item.m_iItem] == EQUIPMENT_HELMET) { + if (self.armor == 100) { + if (!(self.iEquipment & EQUIPMENT_HELMET)) { + sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE); + } else { + self = eOld; + return FALSE; + } + } else { + if (self.iEquipment & EQUIPMENT_HELMET) { + self.armor = 100; + sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE); + } else { + self.armor = 100; + self.iEquipment = self.iEquipment | EQUIPMENT_HELMET; + sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE); + } + } + } else { + int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE; + if (iNades < 3) { + if (iArmouryItems[item.m_iItem] == WEAPON_FLASHBANG) { + self.iAmmo_FLASHBANG++; + sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE); + } else if (iArmouryItems[item.m_iItem] == WEAPON_HEGRENADE) { + self.iAmmo_HEGRENADE++; + sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE); + } else if (iArmouryItems[item.m_iItem] == WEAPON_SMOKEGRENADE) { + self.iAmmo_SMOKEGRENADE++; + sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE); + } + } else { + self = eOld; + return FALSE; + } + } + } + self = eOld; + return TRUE; +} + +void armoury_entity::touch(void) +{ + if (other.classname != "player") { + return; + } + + if (amoury_entity_pickup(this, other)) { + m_iLeft--; + + if (m_iLeft <= 0) { + Hide(); + } + } +} + +void armoury_entity::Respawn(void) +{ + CBaseEntity::Respawn(); + + solid = SOLID_TRIGGER; + m_iLeft = m_iCount; + droptofloor(); +} + +void armoury_entity::armoury_entity(void) +{ + if (autocvar_fcs_nopickups == TRUE) { + remove(this); + return; + } + + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "count": + m_iCount = stoi(argv(i + 1)); + break; + case "item": + m_iItem = stoi(argv(i + 1)); + break; + default: + break; + } + } + + model = sArmouryModels[m_iItem]; + + CBaseEntity::CBaseEntity(); + + precache_model(m_oldModel); + setmodel(this, m_oldModel); + setsize(this, [-16,-16,0], [16,16,16]); + + armoury_entity::Respawn(); +} diff --git a/src/server/cstrike.old/client.c b/src/server/cstrike.old/client.c new file mode 100644 index 00000000..d46daf09 --- /dev/null +++ b/src/server/cstrike.old/client.c @@ -0,0 +1,231 @@ +/* + * 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. + */ + +/* +================= +SpectatorThink + +Run every frame on every spectator +================= +*/ +void Game_SpectatorThink(void) +{ + self.SendFlags = 1; +} + +/* +================= +ClientKill + +Suicide command 'kill' executes this function. +================= +*/ +void Game_ClientKill(void) +{ + Damage_Apply(self, self, self.health, TRUE, 0); +} + +/* +================= +ClientConnect + +Run whenever a new client joins +================= +*/ +void Game_ClientConnect(void) {} + +/* +================= +SpectatorConnect + +Called when a spectator joins the game +================= +*/ +void Game_SpectatorConnect(void) +{ + //Spawn_MakeSpectator(); + //Spawn_ObserverCam(); + ClientConnect(); + PutClientInServer(); +} + +/* +================= +SpectatorDisconnect + +Called when a spectator leaves the game +================= +*/ +void Game_SpectatorDisconnect(void) +{ + Spray_RemoveAll(self); +} + +/* +================= +ClientDisconnect + +Run whenever a client quits +================= +*/ +void Game_ClientDisconnect(void) +{ + // We were part of the session + self.health = 0; + Rules_CountPlayers(); + Rules_DeathCheck(); + Spray_RemoveAll(self); +} + +void Game_DecodeChangeParms(void) +{ + g_landmarkpos[0] = parm1; + g_landmarkpos[1] = parm2; + g_landmarkpos[2] = parm3; + self.angles[0] = parm4; + self.angles[1] = parm5; + self.angles[2] = parm6; +} +void Game_SetChangeParms(void) +{ + parm1 = g_landmarkpos[0]; + parm2 = g_landmarkpos[1]; + parm3 = g_landmarkpos[2]; + parm4 = self.angles[0]; + parm5 = self.angles[1]; + parm6 = self.angles[2]; +} + +/* +================= +PutClientInServer + +Puts a client into the world. +================= +*/ +void Game_PutClientInServer(void) +{ + if (cvar("sv_playerslots") == 1) { + entity spot; + self.SendEntity = Player_SendEntity; + + Game_DecodeChangeParms(); + + if (startspot) { + self.origin = Landmark_GetSpot(); + self.fixangle = TRUE; + } else { + spot = find(world, classname, "info_player_start"); + self.origin = spot.origin; + self.angles = spot.angles; + self.fixangle = TRUE; + } + + self.classname = "player"; + self.health = self.max_health = 100; + forceinfokey(self, "*dead", "0"); + self.takedamage = DAMAGE_YES; + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_WALK; + self.flags = FL_CLIENT; +// self.Pain = Player_Pain; + //self.Death = Player_Death; + self.iBleeds = TRUE; + self.pvsflags = PVSF_IGNOREPVS; + self.fSlotGrenade = 0; + self.viewzoom = 1.0; + setmodel(self, "models/player/vip/vip.mdl"); + setsize(self, VEC_HULL_MIN, VEC_HULL_MAX); + self.view_ofs = VEC_PLAYER_VIEWPOS; + self.velocity = '0 0 0'; + self.frame = 1; // Idle frame + self.fBombProgress = 0; + self.team = TEAM_CT; + forceinfokey(self, "*spec", "0"); + return; + } + + entity eTarget = world; + + Spawn_MakeSpectator(); + Spawn_ObserverCam(); + self.SendEntity = Player_SendEntity; + + // Because we don't want to reset these when we die + Money_AddMoney(self, autocvar_mp_startmoney); + + if (cvar("mp_timelimit") > 0) { + if (autocvar_fcs_voxannounce == TRUE) { + float fTimeLeft = cvar("mp_timelimit") - (time / 60); + Vox_Singlecast(self, sprintf("we have %s minutes remaining", Vox_TimeToString(fTimeLeft))); + } + } + + self.team = 0; + forceinfokey(self, "*team", "0"); +} + +/* +================= +SV_RunClientCommand + +Funtion that can interrupt client commands before physics are run +================= +*/ +void Game_RunClientCommand(void) +{ + /*if (clienttype(self) == CLIENTTYPE_BOT) { + ((CBot)self).RunAI(); + }*/ + + if (fGameState == GAME_FREEZE && self.health > 0) { + input_movevalues = '0 0 0'; + //input_buttons = 0; + input_impulse = 0; + } + + // The individual zones will just override this behavior + self.fInBombZone = FALSE; + self.fInBuyZone = FALSE; + self.fInHostageZone = FALSE; + self.fInEscapeZone = FALSE; + self.fInVIPZone = FALSE; + + QPhysics_Run(self); +} + +void Game_SetNewParms(void) +{ + +} + +/* +================= +Client_SendEvent + +Send a game event +================= +*/ +void Client_SendEvent(entity eClient, float fEVType) +{ + Weapon_UpdateCurrents(); + + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, fEVType); + WriteByte(MSG_MULTICAST, num_for_edict(eClient)); + msg_entity = eClient; + multicast(self.origin, MULTICAST_PVS); +} diff --git a/src/server/cstrike/damage.c b/src/server/cstrike.old/damage.c similarity index 100% rename from src/server/cstrike/damage.c rename to src/server/cstrike.old/damage.c diff --git a/src/server/cstrike/defs.h b/src/server/cstrike.old/defs.h similarity index 98% rename from src/server/cstrike/defs.h rename to src/server/cstrike.old/defs.h index 0318e3d5..33e650b8 100755 --- a/src/server/cstrike/defs.h +++ b/src/server/cstrike.old/defs.h @@ -109,6 +109,6 @@ void Ammo_BuySecondary(void); void Animation_PlayerTop(float fFrame); void Animation_PlayerTopTemp(float fFrame, float fTime); -void Damage_Apply(entity, entity, float, vector, int, int); +void Damage_Apply(entity, entity, float, int, int); #define NULL __NULL__ diff --git a/src/server/cstrike/defsfields.h b/src/server/cstrike.old/defsfields.h similarity index 100% rename from src/server/cstrike/defsfields.h rename to src/server/cstrike.old/defsfields.h diff --git a/src/server/cstrike/func_bomb_target.cpp b/src/server/cstrike.old/func_bomb_target.cpp similarity index 100% rename from src/server/cstrike/func_bomb_target.cpp rename to src/server/cstrike.old/func_bomb_target.cpp diff --git a/src/server/cstrike/func_buyzone.cpp b/src/server/cstrike.old/func_buyzone.cpp similarity index 100% rename from src/server/cstrike/func_buyzone.cpp rename to src/server/cstrike.old/func_buyzone.cpp diff --git a/src/server/cstrike/func_escapezone.cpp b/src/server/cstrike.old/func_escapezone.cpp similarity index 100% rename from src/server/cstrike/func_escapezone.cpp rename to src/server/cstrike.old/func_escapezone.cpp diff --git a/src/server/cstrike/func_hostage_rescue.cpp b/src/server/cstrike.old/func_hostage_rescue.cpp similarity index 100% rename from src/server/cstrike/func_hostage_rescue.cpp rename to src/server/cstrike.old/func_hostage_rescue.cpp diff --git a/src/server/cstrike/func_vip_safetyzone.cpp b/src/server/cstrike.old/func_vip_safetyzone.cpp similarity index 100% rename from src/server/cstrike/func_vip_safetyzone.cpp rename to src/server/cstrike.old/func_vip_safetyzone.cpp diff --git a/src/server/cstrike/hostage_entity.cpp b/src/server/cstrike.old/hostage_entity.cpp similarity index 100% rename from src/server/cstrike/hostage_entity.cpp rename to src/server/cstrike.old/hostage_entity.cpp diff --git a/src/server/cstrike/info_hostage_rescue.cpp b/src/server/cstrike.old/info_hostage_rescue.cpp similarity index 100% rename from src/server/cstrike/info_hostage_rescue.cpp rename to src/server/cstrike.old/info_hostage_rescue.cpp diff --git a/src/server/cstrike/info_map_parameters.cpp b/src/server/cstrike.old/info_map_parameters.cpp similarity index 100% rename from src/server/cstrike/info_map_parameters.cpp rename to src/server/cstrike.old/info_map_parameters.cpp diff --git a/src/server/cstrike.old/input.c b/src/server/cstrike.old/input.c new file mode 100644 index 00000000..97f223dc --- /dev/null +++ b/src/server/cstrike.old/input.c @@ -0,0 +1,72 @@ +/* + * 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. + */ + +/* +================= +Input_Handle + +Handles impulse and whatnot +================= +*/ +void Game_Input(void) +{ + // Dead, specatator + if (self.health <= 0) { + /*if (self.button2) { + if (infokey(self, "*spectator") == "0") { + forceinfokey(self, "*spectator", "1"); + } else { + forceinfokey(self, "*spectator", "1"); + } + }*/ + return; + } + + // TODO: Make this fast switch only + if (self.impulse == 3) { + Weapon_Switch(SLOT_MELEE); + } else if (self.impulse == 2) { + Weapon_Switch(SLOT_SECONDARY); + } else if (self.impulse == 1) { + Weapon_Switch(SLOT_PRIMARY); + } else if (self.impulse == 4) { + Weapon_Switch(SLOT_GRENADE); + } + + if (input_buttons & INPUT_BUTTON5) { + Player_UseDown(); + } else { + Player_UseUp(); + } + + if (input_buttons & INPUT_BUTTON0) { + if (fGameState != GAME_FREEZE) { + Weapon_PrimaryAttack(self.weapon); + } + } else if (input_buttons & INPUT_BUTTON4) { + Weapon_Reload(self.weapon); + } else if (input_buttons & INPUT_BUTTON3) { + Weapon_SecondaryAttack(self.weapon); + } else { + Weapon_Release(); + } + + if (self.impulse == 100) { + Flashlight_Toggle(); + } + + self.impulse = 0; +} diff --git a/src/server/cstrike.old/item_suit.cpp b/src/server/cstrike.old/item_suit.cpp new file mode 100644 index 00000000..1d7387e8 --- /dev/null +++ b/src/server/cstrike.old/item_suit.cpp @@ -0,0 +1,66 @@ +/* + * 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. + */ + +class item_suit:CBaseTrigger +{ + void() item_suit; + + virtual void() touch; + virtual void() Respawn; +}; + +void item_suit::touch(void) +{ + if (other.classname != "player") { + return; + } + player pl = (player)other; + /*if (pl.g_items & ITEM_SUIT) { + return; + }*/ + sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); + /*pl.g_items |= ITEM_SUIT;*/ + + CBaseTrigger::UseTargets(); + + if (cvar("sv_playerslots") == 1) { + remove(self); + } else { + Hide(); + think = Respawn; + nextthink = time + 30.0f; + } +} + +void item_suit::Respawn(void) +{ + solid = SOLID_TRIGGER; + movetype = MOVETYPE_TOSS; + setsize(this, VEC_HULL_MIN, VEC_HULL_MAX); + setorigin(this, m_oldOrigin); + setmodel(this, m_oldModel); + + think = __NULL__; + nextthink = -1; +} + +void item_suit::item_suit(void) +{ + model = "models/w_kevlar.mdl"; + precache_sound("items/tr_kevlar.wav"); + CBaseTrigger::CBaseTrigger(); + Respawn(); +} diff --git a/src/server/cstrike/main.c b/src/server/cstrike.old/main.c similarity index 100% rename from src/server/cstrike/main.c rename to src/server/cstrike.old/main.c diff --git a/src/server/cstrike/money.c b/src/server/cstrike.old/money.c similarity index 100% rename from src/server/cstrike/money.c rename to src/server/cstrike.old/money.c diff --git a/src/server/cstrike.old/player.c b/src/server/cstrike.old/player.c new file mode 100644 index 00000000..b311ba58 --- /dev/null +++ b/src/server/cstrike.old/player.c @@ -0,0 +1,267 @@ +/* + * 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. + */ + +string sPainSounds[5] = { + "player/pl_pain2.wav", + "player/pl_pain4.wav", + "player/pl_pain5.wav", + "player/pl_pain6.wav", + "player/pl_pain7.wav" +}; + +/* +================= +Player_SendEntity +================= +*/ +float Player_SendEntity(entity ePEnt, float fChanged) +{ + /* If dead */ + if (self.health <= 0 && ePEnt != self) { + return FALSE; + } + + /* Fix CT/VIP team */ + float t1, t2; + t1 = ePEnt.team; + t2 = self.team; + if (t1 == TEAM_VIP) { + t1 = TEAM_CT; + } else if (t2 == TEAM_VIP) { + t2 = TEAM_CT; + } + + /* Always make team-mates visible */ + if (t1 != t2 && ePEnt.health > 0) { + /* Can we even see them? */ + if (!checkpvs(ePEnt.origin, self)) { + return FALSE; + } else { + /* We're in the same PVS, but we might still not be able to see them */ + traceline(self.origin, ePEnt.origin, FALSE, self); + if (trace_ent != ePEnt) { + return FALSE; + } + } + } + + WriteByte(MSG_ENTITY, ENT_PLAYER); + WriteShort(MSG_ENTITY, self.modelindex); + WriteCoord(MSG_ENTITY, self.origin[0]); + WriteCoord(MSG_ENTITY, self.origin[1]); + WriteCoord(MSG_ENTITY, self.origin[2]); + WriteCoord(MSG_ENTITY, self.v_angle[0]); + WriteCoord(MSG_ENTITY, self.angles[1]); + WriteCoord(MSG_ENTITY, self.angles[2]); + WriteCoord(MSG_ENTITY, self.velocity[0]); + WriteCoord(MSG_ENTITY, self.velocity[1]); + WriteCoord(MSG_ENTITY, self.velocity[2]); + WriteFloat(MSG_ENTITY, self.flags); + WriteFloat(MSG_ENTITY, self.pmove_flags); + WriteByte(MSG_ENTITY, self.weapon); + WriteByte(MSG_ENTITY, self.health); + WriteFloat(MSG_ENTITY, self.movetype); + WriteFloat(MSG_ENTITY, self.view_ofs[2]); + WriteFloat(MSG_ENTITY, self.viewzoom); + WriteFloat(MSG_ENTITY, self.jumptime); + WriteFloat(MSG_ENTITY, self.teleport_time); + return TRUE; +} + +/* +================= +Player_Pain +================= +*/ +void Player_Pain(int iHitBody) +{ + /* + if (iHitBody == BODY_HEAD) { + Animation_PlayerTopTemp(ANIM_HEAD_FLINCH, 0.25f); + } else { + Animation_PlayerTopTemp(ANIM_GUT_FLINCH, 0.25f); + }*/ + + sound(self, CHAN_VOICE, sPainSounds[ floor(random() * 5) ], 1, ATTN_IDLE); + self.velocity = '0 0 0'; +} + +/* +================= +Player_Death +================= +*/ +void Player_Death(int iHitBody) +{ + if (iHitBody == BODY_HEAD) { + sound(self, CHAN_VOICE, sprintf("player/headshot%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM); + } else { + sound(self, CHAN_VOICE, sprintf("player/die%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM); + } + + // Drop a corpse + entity eCorpse = spawn(); + eCorpse.classname = "remove_me"; + setorigin(eCorpse, self.origin); + setmodel(eCorpse, self.model); + setsize(eCorpse, self.mins, self.maxs); + eCorpse.angles = [ 0, self.angles[1], 0 ]; + eCorpse.movetype = MOVETYPE_BOUNCE; + + // Drop primary weapon as well as the bomb if present + if (self.fSlotPrimary) { + Weapon_DropWeapon(SLOT_PRIMARY); + } else { + if (self.fSlotSecondary) { + Weapon_DropWeapon(SLOT_SECONDARY); + } + } + if (self.fSlotGrenade) { + Weapon_DropWeapon(SLOT_GRENADE); + } + + // Make ourselves disappear + self.modelindex = 0; + + if (self.flags & FL_CROUCHING) { + eCorpse.frame = ANIM_CROUCH_DIE; + } else { + switch (iHitBody) { + case BODY_HEAD: + eCorpse.frame = ANIM_DIE_HEAD; + break; + case BODY_STOMACH: + eCorpse.frame = ANIM_DIE_GUT; + break; + case BODY_LEGLEFT: + case BODY_ARMLEFT: + eCorpse.frame = ANIM_DIE_LEFT; + break; + case BODY_LEGRIGHT: + case BODY_ARMRIGHT: + eCorpse.frame = ANIM_DIE_RIGHT; + break; + default: + eCorpse.frame = ANIM_DEATH1 + floor(random() * 3); + break; + } + } + + Spawn_MakeSpectator(); + self.classname = "player"; + self.health = 0; + forceinfokey(self, "*dead", "1"); + forceinfokey(self, "*team", ftos(self.team)); + + Rules_CountPlayers(); + + /* In Assassination, all Terrorists receive a $2500 + * reward if they won by killing the VIP. */ + if (self.team == TEAM_VIP) { + Rules_RoundOver(TEAM_T, 2500, FALSE); + return; + } + + Rules_DeathCheck(); +} + +/* +==================== +UseWorkaround +==================== +*/ +void UseWorkaround(entity eTarget) +{ + eActivator = self; + entity eOldSelf = self; + self = eTarget; + self.PlayerUse(); + self = eOldSelf; +} + +/* +==================== +Player_UseDown +==================== +*/ +void Player_UseDown(void) +{ + if (self.health <= 0) { + return; + } else if (!(self.gflags & GF_USE_RELEASED)) { + return; + } + + vector vSource; + + makevectors(self.v_angle); + vSource = self.origin + self.view_ofs; + traceline (vSource, vSource + (v_forward * 64), FALSE, self); + + if (trace_ent.PlayerUse) { + self.gflags &= ~GF_USE_RELEASED; + + UseWorkaround(trace_ent); + + /* Some entities want to support Use spamming */ + if (!(self.gflags & GF_USE_RELEASED)) { + sound(self, CHAN_ITEM, "common/wpn_select.wav", 0.25, ATTN_IDLE); + } + } else { + sound(self, CHAN_ITEM, "common/wpn_denyselect.wav", 0.25, ATTN_IDLE); + self.gflags &= ~GF_USE_RELEASED; + } +} + +/* +==================== +Player_UseUp +==================== +*/ +void Player_UseUp(void) +{ + if (!(self.gflags & GF_USE_RELEASED)) { + self.gflags |= GF_USE_RELEASED; + self.fProgressBar = 0; + } +} + +/* +================= +PlayerPreThink + +Run before physics +================= +*/ +void Game_PlayerPreThink(void) +{ + BaseGun_ShotMultiplierUpdate(); +} + +/* +================= +PlayerPreThink + +Run after physics +================= +*/ +void Game_PlayerPostThink(void) +{ + Animation_PlayerUpdate(); + Footsteps_Update(); + + self.SendFlags = 1; +} diff --git a/src/server/cstrike.old/progs.src b/src/server/cstrike.old/progs.src new file mode 100755 index 00000000..f3476ee4 --- /dev/null +++ b/src/server/cstrike.old/progs.src @@ -0,0 +1,96 @@ +#pragma target fte +#pragma progs_dat "../../../cstrike/data.pk3dir/progs.dat" + +#define QWSSQC +#define CSTRIKE + +#includelist +../../shared/fteextensions.qc +../../shared/defs.h +defs.h +../../shared/cstrike/defs.h +../../shared/math.h +../../shared/materials.h +../../shared/events.h +../../shared/entities.h +../defs.h +defsfields.h + +../plugins.c +../logging.c +../nodes.c +../skill.c +../sentences.c + +../../gs-entbase/server.src + +money.c +../../shared/cstrike/animations.c +../../shared/cstrike/radio.c +../../shared/cstrike/weaponak47.c +../../shared/cstrike/weaponaug.c +../../shared/cstrike/weaponawp.c +../../shared/cstrike/weaponc4bomb.c +../../shared/cstrike/weapondeagle.c +../../shared/cstrike/weaponelites.c +../../shared/cstrike/weaponfiveseven.c +../../shared/cstrike/weaponflashbang.c +../../shared/cstrike/weapong3sg1.c +../../shared/cstrike/weaponglock18.c +../../shared/cstrike/weaponhegrenade.c +../../shared/cstrike/weaponknife.c +../../shared/cstrike/weaponm3.c +../../shared/cstrike/weaponm4a1.c +../../shared/cstrike/weaponmac10.c +../../shared/cstrike/weaponmp5.c +../../shared/cstrike/weaponp228.c +../../shared/cstrike/weaponp90.c +../../shared/cstrike/weaponpara.c +../../shared/cstrike/weaponscout.c +../../shared/cstrike/weaponsg550.c +../../shared/cstrike/weaponsg552.c +../../shared/cstrike/weaponsmokegrenade.c +../../shared/cstrike/weapontmp.c +../../shared/cstrike/weaponump45.c +../../shared/cstrike/weaponusp45.c +../../shared/cstrike/weaponxm1014.c +../../shared/cstrike/basegun.c +../../shared/cstrike/basemelee.c +../../shared/cstrike/weapons.c +../../shared/cstrike/equipment.c +../../shared/decals.c +../../shared/effects.c +../../shared/spraylogo.cpp +../../shared/valve/player.cpp +../../shared/pmove.c + +armoury_entity.cpp +hostage_entity.cpp +func_hostage_rescue.cpp +item_suit.cpp +info_hostage_rescue.cpp +func_vip_safetyzone.cpp +info_map_parameters.cpp + +../vox.c +ammo.c +../valve/damage.c +../traceattack.c +rules.c +timer.c + +func_bomb_target.cpp +func_buyzone.cpp +func_escapezone.cpp +main.c +player.c +../spawn.c +spawn.c +../footsteps.c +../flashlight.c +input.c +client.c +../client.c +../vote.c +../entry.c +#endlist diff --git a/src/server/cstrike/rules.c b/src/server/cstrike.old/rules.c similarity index 100% rename from src/server/cstrike/rules.c rename to src/server/cstrike.old/rules.c diff --git a/src/server/cstrike/spawn.c b/src/server/cstrike.old/spawn.c similarity index 99% rename from src/server/cstrike/spawn.c rename to src/server/cstrike.old/spawn.c index 67727552..112faabc 100644 --- a/src/server/cstrike/spawn.c +++ b/src/server/cstrike.old/spawn.c @@ -91,8 +91,8 @@ void Spawn_RespawnClient(float fTeam) self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_WALK; self.flags = FL_CLIENT; - self.Pain = Player_Pain; - self.Death = Player_Death; + //self.Pain = Player_Pain; + //self.Death = Player_Death; self.iBleeds = TRUE; self.fSlotC4Bomb = 0; // Clear the C4 self.viewzoom = 1.0; // Clear scopes diff --git a/src/server/cstrike/timer.c b/src/server/cstrike.old/timer.c similarity index 100% rename from src/server/cstrike/timer.c rename to src/server/cstrike.old/timer.c diff --git a/src/server/cstrike/armoury_entity.cpp b/src/server/cstrike/armoury_entity.cpp old mode 100755 new mode 100644 index c7a81a78..0a59488c --- a/src/server/cstrike/armoury_entity.cpp +++ b/src/server/cstrike/armoury_entity.cpp @@ -14,6 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +var int autocvar_fcs_nopickups = FALSE; + int iArmouryItems[19] = { WEAPON_MP5, WEAPON_TMP, @@ -37,24 +39,24 @@ int iArmouryItems[19] = { }; string sArmouryModels[19] = { - "models/w_mp5.mdl", - "models/w_tmp.mdl", - "models/w_p90.mdl", - "models/w_mac10.mdl", - "models/w_ak47.mdl", - "models/w_sg552.mdl", - "models/w_m4a1.mdl", - "models/w_aug.mdl", - "models/w_scout.mdl", - "models/w_g3sg1.mdl", - "models/w_awp.mdl", - "models/w_m3.mdl", - "models/w_xm1014.mdl", - "models/w_m249.mdl", - "models/w_flashbang.mdl", - "models/w_hegrenade.mdl", + "models/w_mp5.mdl", + "models/w_tmp.mdl", + "models/w_p90.mdl", + "models/w_mac10.mdl", + "models/w_ak47.mdl", + "models/w_sg552.mdl", + "models/w_m4a1.mdl", + "models/w_aug.mdl", + "models/w_scout.mdl", + "models/w_g3sg1.mdl", + "models/w_awp.mdl", + "models/w_m3.mdl", + "models/w_xm1014.mdl", + "models/w_m249.mdl", + "models/w_flashbang.mdl", + "models/w_hegrenade.mdl", "models/w_kevlar.mdl", - "models/w_assault.mdl", + "models/w_assault.mdl", "models/w_smokegrenade.mdl" }; @@ -69,71 +71,14 @@ class armoury_entity:CBaseEntity virtual void() Respawn; }; -int amoury_entity_pickup(armoury_entity item, entity player) +int +amoury_entity_pickup(armoury_entity item, entity player) { - entity eOld = self; - self = player; - - // Only MP5 til PARA - if (item.m_iItem < 14) { - if (Weapon_SlotEmpty(Weapon_GetSlot(iArmouryItems[item.m_iItem]))) { - Weapon_AddItem(iArmouryItems[item.m_iItem]); - Weapon_Draw(iArmouryItems[item.m_iItem]); - } else { - self = eOld; - return FALSE; - } - } else { - // Equipment - if (iArmouryItems[item.m_iItem] == EQUIPMENT_KEVLAR) { - if (self.armor != 100) { - self.armor = 100; - } else { - self = eOld; - return FALSE; - } - } else if (iArmouryItems[item.m_iItem] == EQUIPMENT_HELMET) { - if (self.armor == 100) { - if (!(self.iEquipment & EQUIPMENT_HELMET)) { - sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE); - } else { - self = eOld; - return FALSE; - } - } else { - if (self.iEquipment & EQUIPMENT_HELMET) { - self.armor = 100; - sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE); - } else { - self.armor = 100; - self.iEquipment = self.iEquipment | EQUIPMENT_HELMET; - sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE); - } - } - } else { - int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE; - if (iNades < 3) { - if (iArmouryItems[item.m_iItem] == WEAPON_FLASHBANG) { - self.iAmmo_FLASHBANG++; - sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE); - } else if (iArmouryItems[item.m_iItem] == WEAPON_HEGRENADE) { - self.iAmmo_HEGRENADE++; - sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE); - } else if (iArmouryItems[item.m_iItem] == WEAPON_SMOKEGRENADE) { - self.iAmmo_SMOKEGRENADE++; - sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE); - } - } else { - self = eOld; - return FALSE; - } - } - } - self = eOld; - return TRUE; + } -void armoury_entity::touch(void) +void +armoury_entity::touch(void) { if (other.classname != "player") { return; @@ -141,23 +86,24 @@ void armoury_entity::touch(void) if (amoury_entity_pickup(this, other)) { m_iLeft--; - if (m_iLeft <= 0) { Hide(); } } } -void armoury_entity::Respawn(void) +void +armoury_entity::Respawn(void) { - CBaseEntity::Respawn(); - + setmodel(this, m_oldModel); + setsize(this, [-16,-16,0], [16,16,16]); solid = SOLID_TRIGGER; m_iLeft = m_iCount; droptofloor(); } -void armoury_entity::armoury_entity(void) +void +armoury_entity::armoury_entity(void) { if (autocvar_fcs_nopickups == TRUE) { remove(this); @@ -170,20 +116,15 @@ void armoury_entity::armoury_entity(void) m_iCount = stoi(argv(i + 1)); break; case "item": - m_iItem = stoi(argv(i + 1)); + m_iItem = iArmouryItems[stoi(argv(i + 1))]; + model = sArmouryModels[m_iItem]; break; default: break; } } - - model = sArmouryModels[m_iItem]; + precache_model(model); CBaseEntity::CBaseEntity(); - - precache_model(m_oldModel); - setmodel(this, m_oldModel); - setsize(this, [-16,-16,0], [16,16,16]); - armoury_entity::Respawn(); } diff --git a/src/server/cstrike/client.c b/src/server/cstrike/client.c index a7fb160e..b84f0348 100644 --- a/src/server/cstrike/client.c +++ b/src/server/cstrike/client.c @@ -14,218 +14,304 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* -================= -SpectatorThink +var int autocvar_sv_networkeverything = FALSE; -Run every frame on every spectator -================= -*/ -void Game_SpectatorThink(void) +void +Game_ClientConnect(void) { - self.SendFlags = 1; -} + entity a; + bprint(PRINT_HIGH, sprintf("%s connected\n", self.netname)); -/* -================= -ClientKill - -Suicide command 'kill' executes this function. -================= -*/ -void Game_ClientKill(void) -{ - Damage_Apply(self, self, self.health, self.origin, TRUE, 0); -} - -/* -================= -ClientConnect - -Run whenever a new client joins -================= -*/ -void Game_ClientConnect(void) {} - -/* -================= -SpectatorConnect - -Called when a spectator joins the game -================= -*/ -void Game_SpectatorConnect(void) -{ - //Spawn_MakeSpectator(); - //Spawn_ObserverCam(); - ClientConnect(); - PutClientInServer(); -} - -/* -================= -SpectatorDisconnect - -Called when a spectator leaves the game -================= -*/ -void Game_SpectatorDisconnect(void) -{ - Spray_RemoveAll(self); -} - -/* -================= -ClientDisconnect - -Run whenever a client quits -================= -*/ -void Game_ClientDisconnect(void) -{ - // We were part of the session - self.health = 0; - Rules_CountPlayers(); - Rules_DeathCheck(); - Spray_RemoveAll(self); -} - -void Game_DecodeChangeParms(void) -{ - g_landmarkpos[0] = parm1; - g_landmarkpos[1] = parm2; - g_landmarkpos[2] = parm3; - self.angles[0] = parm4; - self.angles[1] = parm5; - self.angles[2] = parm6; -} -void Game_SetChangeParms(void) -{ - parm1 = g_landmarkpos[0]; - parm2 = g_landmarkpos[1]; - parm3 = g_landmarkpos[2]; - parm4 = self.angles[0]; - parm5 = self.angles[1]; - parm6 = self.angles[2]; -} - -/* -================= -PutClientInServer - -Puts a client into the world. -================= -*/ -void Game_PutClientInServer(void) -{ - if (cvar("sv_playerslots") == 1) { - entity spot; - self.SendEntity = Player_SendEntity; - - Game_DecodeChangeParms(); - - if (startspot) { - self.origin = Landmark_GetSpot(); - self.fixangle = TRUE; - } else { - spot = find(world, classname, "info_player_start"); - self.origin = spot.origin; - self.angles = spot.angles; - self.fixangle = TRUE; - } - - self.classname = "player"; - self.health = self.max_health = 100; - forceinfokey(self, "*dead", "0"); - self.takedamage = DAMAGE_YES; - self.solid = SOLID_SLIDEBOX; - self.movetype = MOVETYPE_WALK; - self.flags = FL_CLIENT; - self.Pain = Player_Pain; - self.Death = Player_Death; - self.iBleeds = TRUE; - self.pvsflags = PVSF_IGNOREPVS; - self.fSlotGrenade = 0; - self.viewzoom = 1.0; - setmodel(self, "models/player/vip/vip.mdl"); - setsize(self, VEC_HULL_MIN, VEC_HULL_MAX); - self.view_ofs = VEC_PLAYER_VIEWPOS; - self.velocity = '0 0 0'; - self.frame = 1; // Idle frame - self.fBombProgress = 0; - self.team = TEAM_CT; - forceinfokey(self, "*spec", "0"); - return; + int playercount = 0; + for (a = world; (a = find(a, classname, "player"));) { + playercount++; } - entity eTarget = world; - - Spawn_MakeSpectator(); - Spawn_ObserverCam(); - self.SendEntity = Player_SendEntity; - - // Because we don't want to reset these when we die - Money_AddMoney(self, autocvar_mp_startmoney); - - if (cvar("mp_timelimit") > 0) { - if (autocvar_fcs_voxannounce == TRUE) { - float fTimeLeft = cvar("mp_timelimit") - (time / 60); - Vox_Singlecast(self, sprintf("we have %s minutes remaining", Vox_TimeToString(fTimeLeft))); + /* we're the first. respawn all entities? */ + if (playercount == 0) { + for (a = world; (a = findfloat(a, gflags, GF_CANRESPAWN));) { + CBaseEntity caw = (CBaseEntity)a; + caw.Respawn(); } } +} + +void +Game_ClientDisconnect(void) +{ + bprint(PRINT_HIGH, sprintf("%s disconnected\n", self.netname)); - self.team = 0; - forceinfokey(self, "*team", "0"); + /* Make this unusable */ + self.solid = SOLID_NOT; + self.movetype = MOVETYPE_NONE; + self.modelindex = 0; + self.health = 0; + self.takedamage = 0; + self.SendFlags = PLAYER_MODELINDEX; } -/* -================= -SV_RunClientCommand - -Funtion that can interrupt client commands before physics are run -================= -*/ -void Game_RunClientCommand(void) +void +Game_ClientKill(void) { - /*if (clienttype(self) == CLIENTTYPE_BOT) { - ((CBot)self).RunAI(); - }*/ + Damage_Apply(self, self, self.health, WEAPON_NONE, DMG_SKIP_ARMOR); +} - if (fGameState == GAME_FREEZE && self.health > 0) { - input_movevalues = '0 0 0'; - //input_buttons = 0; - input_impulse = 0; +void +Game_PlayerPreThink(void) +{ + +} + +void +Game_PlayerPostThink(void) +{ + player pl = (player)self; + Animation_PlayerUpdate(); + + pl.SendFlags |= PLAYER_KEEPALIVE; + + if (pl.old_modelindex != pl.modelindex) { + pl.SendFlags |= PLAYER_MODELINDEX; + } + if (pl.old_origin[0] != pl.origin[0]) { + pl.SendFlags |= PLAYER_ORIGIN; + } + if (pl.old_origin[1] != pl.origin[1]) { + pl.SendFlags |= PLAYER_ORIGIN; + } + if (pl.old_origin[2] != pl.origin[2]) { + pl.SendFlags |= PLAYER_ORIGIN_Z; + } + if (pl.old_angles[0] != pl.angles[0]) { + pl.SendFlags |= PLAYER_ANGLES_X; + } + if (pl.old_angles[1] != pl.angles[1]) { + pl.SendFlags |= PLAYER_ANGLES_Y; + } + if (pl.old_angles[2] != pl.angles[2]) { + pl.SendFlags |= PLAYER_ANGLES_Z; + } + if (pl.old_velocity[0] != pl.velocity[0]) { + pl.SendFlags |= PLAYER_VELOCITY; + } + if (pl.old_velocity[1] != pl.velocity[1]) { + pl.SendFlags |= PLAYER_VELOCITY; + } + if (pl.old_velocity[2] != pl.velocity[2]) { + pl.SendFlags |= PLAYER_VELOCITY_Z; + } + if (pl.old_flags != pl.flags) { + pl.SendFlags |= PLAYER_FLAGS; + } + if (pl.old_activeweapon != pl.activeweapon) { + pl.SendFlags |= PLAYER_WEAPON; + } + if (pl.old_items != pl.g_items) { + pl.SendFlags |= PLAYER_ITEMS; + } + if (pl.old_health != pl.health) { + pl.SendFlags |= PLAYER_HEALTH; + } + if (pl.old_armor != pl.armor) { + pl.SendFlags |= PLAYER_ARMOR; + } + if (pl.old_movetype != pl.movetype) { + pl.SendFlags |= PLAYER_MOVETYPE; + } + if (pl.old_viewofs != pl.view_ofs[2]) { + pl.SendFlags |= PLAYER_VIEWOFS; + } + if (pl.old_baseframe != pl.baseframe) { + pl.SendFlags |= PLAYER_BASEFRAME; + } + if (pl.old_frame != pl.frame) { + pl.SendFlags |= PLAYER_FRAME; + } + if (pl.old_a_ammo1 != pl.a_ammo1) { + pl.SendFlags |= PLAYER_AMMO1; + } + if (pl.old_a_ammo2 != pl.a_ammo2) { + pl.SendFlags |= PLAYER_AMMO2; + } + if (pl.old_a_ammo3 != pl.a_ammo3) { + pl.SendFlags |= PLAYER_AMMO3; } - // The individual zones will just override this behavior - self.fInBombZone = FALSE; - self.fInBuyZone = FALSE; - self.fInHostageZone = FALSE; - self.fInEscapeZone = FALSE; - self.fInVIPZone = FALSE; + pl.old_modelindex = pl.modelindex; + pl.old_origin = pl.origin; + pl.old_angles = pl.angles; + pl.old_velocity = pl.velocity; + pl.old_flags = pl.flags; + pl.old_activeweapon = pl.activeweapon; + pl.old_items = pl.g_items; + pl.old_health = pl.health; + pl.old_armor = pl.armor; + pl.old_movetype = pl.movetype; + pl.old_viewofs = pl.view_ofs[2]; + pl.old_baseframe = pl.baseframe; + pl.old_frame = pl.frame; + pl.old_a_ammo1 = pl.a_ammo1; + pl.old_a_ammo2 = pl.a_ammo2; + pl.old_a_ammo3 = pl.a_ammo3; +} +void +Game_RunClientCommand(void) +{ + Footsteps_Update(); QPhysics_Run(self); } -void Game_SetNewParms(void) +void +Game_DecodeChangeParms(void) { - + player pl = (player)self; + g_landmarkpos[0] = parm1; + g_landmarkpos[1] = parm2; + g_landmarkpos[2] = parm3; + pl.angles[0] = parm4; + pl.angles[1] = parm5; + pl.angles[2] = parm6; + pl.velocity[0] = parm7; + pl.velocity[1] = parm8; + pl.velocity[2] = parm9; + pl.g_items = parm10; + pl.activeweapon = parm11; } -/* -================= -Client_SendEvent - -Send a game event -================= -*/ -void Client_SendEvent(entity eClient, float fEVType) +void +Game_SetChangeParms(void) { - Weapon_UpdateCurrents(); + player pl = (player)self; + parm1 = g_landmarkpos[0]; + parm2 = g_landmarkpos[1]; + parm3 = g_landmarkpos[2]; + parm4 = pl.angles[0]; + parm5 = pl.angles[1]; + parm6 = pl.angles[2]; + parm7 = pl.velocity[0]; + parm8 = pl.velocity[1]; + parm9 = pl.velocity[2]; + parm10 = pl.g_items; + parm11 = pl.activeweapon; +} + +void +Game_PutClientInServer(void) +{ + if (self.classname != "player") { + spawnfunc_player(); + } + player pl = (player)self; + + entity spot; + pl.classname = "player"; + pl.health = self.max_health = 100; + + pl.takedamage = DAMAGE_YES; + pl.solid = SOLID_SLIDEBOX; + pl.movetype = MOVETYPE_WALK; + pl.flags = FL_CLIENT; + pl.viewzoom = 1.0; + pl.model = "models/player.mdl"; - WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); - WriteByte(MSG_MULTICAST, fEVType); - WriteByte(MSG_MULTICAST, num_for_edict(eClient)); - msg_entity = eClient; - multicast(self.origin, MULTICAST_PVS); + string mymodel = infokey(pl, "model"); + + if (mymodel) { + mymodel = sprintf("models/player/%s/%s.mdl", mymodel, mymodel); + if (whichpack(mymodel)) { + pl.model = mymodel; + } + } + setmodel(pl, pl.model); + + setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); + pl.view_ofs = VEC_PLAYER_VIEWPOS; + pl.velocity = [0,0,0]; + pl.gravity = __NULL__; + pl.frame = 1; + pl.SendEntity = Player_SendEntity; + pl.SendFlags = UPDATE_ALL; + + pl.customphysics = Empty; + pl.Pain = Player_Pain; + pl.Death = Player_Death; + pl.iBleeds = TRUE; + forceinfokey(pl, "*spec", "0"); + forceinfokey(self, "*deaths", ftos(self.deaths)); + + if (cvar("sv_playerslots") == 1) { + Game_DecodeChangeParms(); + + if (startspot != "") { + setorigin(pl, Landmark_GetSpot()); + } else { + spot = find(world, classname, "info_player_start"); + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + } + } else { + spot = Spawn_SelectRandom("info_player_deathmatch"); + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + pl.g_items |= ITEM_SUIT; + } +} + +void +SV_SendChat(entity sender, string msg, entity eEnt, float fType) +{ + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, fType == 0 ? EV_CHAT:EV_CHAT_TEAM); + WriteByte(MSG_MULTICAST, num_for_edict(sender) - 1); + WriteByte(MSG_MULTICAST, sender.team); + WriteString(MSG_MULTICAST, msg); + if (eEnt) { + msg_entity = eEnt; + multicast([0,0,0], MULTICAST_ONE); + } else { + multicast([0,0,0], MULTICAST_ALL); + } + + localcmd(sprintf("echo [SERVER] %s: %s\n", sender.netname, msg)); +} + +void +Game_ParseClientCommand(string cmd) +{ + tokenize(cmd); + + if (argv(1) == "timeleft") { + string msg; + string timestring; + float timeleft; + timeleft = cvar("mp_timelimit") - (time / 60); + timestring = Vox_TimeToString(timeleft); + msg = sprintf("we have %s minutes remaining", timestring); + Vox_Singlecast(self, msg); + return; + } + + if (argv(0) == "say") { + SV_SendChat(self, argv(1), world, 0); + return; + } else if (argv(0) == "say_team") { + entity a; + for (a = world; (a = find(a, classname, "player"));) { + if (a.team == self.team) { + SV_SendChat(self, argv(1), a, 1); + } + } + return; + } + + clientcommand(self, cmd); +} + +void +Game_SetNewParms(void) +{ + } diff --git a/src/server/cstrike/gamerules.c b/src/server/cstrike/gamerules.c new file mode 100644 index 00000000..1c667d76 --- /dev/null +++ b/src/server/cstrike/gamerules.c @@ -0,0 +1,89 @@ +/* + * 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. + */ + +/* after a level-change is done we need to pick up the scraps and fill the + * info back in. */ +void +Gamerules_DecodeChangeParms(player pl) +{ + g_landmarkpos[0] = parm1; + g_landmarkpos[1] = parm2; + g_landmarkpos[2] = parm3; + pl.angles[0] = parm4; + pl.angles[1] = parm5; + pl.angles[2] = parm6; + pl.velocity[0] = parm7; + pl.velocity[1] = parm8; + pl.velocity[2] = parm9; + pl.g_items = parm10; + pl.activeweapon = parm11; +} + +/* prepare the client-info for level-transition */ +void +Gamerules_SetChangeParms(player pl) +{ + parm1 = g_landmarkpos[0]; + parm2 = g_landmarkpos[1]; + parm3 = g_landmarkpos[2]; + parm4 = pl.angles[0]; + parm5 = pl.angles[1]; + parm6 = pl.angles[2]; + parm7 = pl.velocity[0]; + parm8 = pl.velocity[1]; + parm9 = pl.velocity[2]; + parm10 = pl.g_items; + parm11 = pl.activeweapon; +} + +/* yuck, whenever 'changelevel' does not happen. */ +void +Gamerules_SetNewParms(void) +{ + parm1 = parm2 = parm3 = parm4 = parm5 = parm6 = parm7 = + parm8 = parm9 = parm10 = parm11 = parm12 = parm13 = parm14 = + parm15 = parm16 = parm17 = parm18 = parm19 = parm20 = parm21 = + parm22 = parm23 = parm24 = parm25 = parm26 = parm27 = parm28 = + parm29 = parm30 = 0; +} + +/* called when the player first spawns/respawns */ +void +Gamerules_Spawn(player pl) +{ + entity spot; + + if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) { + if (startspot != "") { + Gamerules_DecodeChangeParms(pl); + setorigin(pl, Landmark_GetSpot()); + } else { + Gamerules_SetNewParms(); + spot = find(world, classname, "info_player_start"); + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + } + Weapons_RefreshAmmo(pl); + } else { + Gamerules_SetNewParms(); + Gamerules_DecodeChangeParms(pl); + spot = Spawn_SelectRandom("info_player_deathmatch"); + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + } +} diff --git a/src/server/cstrike/input.c b/src/server/cstrike/input.c index 97f223dc..4768caa8 100644 --- a/src/server/cstrike/input.c +++ b/src/server/cstrike/input.c @@ -14,36 +14,17 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* -================= -Input_Handle - -Handles impulse and whatnot -================= -*/ -void Game_Input(void) +void +Game_Input(void) { - // Dead, specatator - if (self.health <= 0) { - /*if (self.button2) { - if (infokey(self, "*spectator") == "0") { - forceinfokey(self, "*spectator", "1"); - } else { - forceinfokey(self, "*spectator", "1"); - } - }*/ - return; - } - - // TODO: Make this fast switch only - if (self.impulse == 3) { - Weapon_Switch(SLOT_MELEE); - } else if (self.impulse == 2) { - Weapon_Switch(SLOT_SECONDARY); - } else if (self.impulse == 1) { - Weapon_Switch(SLOT_PRIMARY); - } else if (self.impulse == 4) { - Weapon_Switch(SLOT_GRENADE); + if (input_buttons & INPUT_BUTTON0) { + Weapons_Primary(); + } else if (input_buttons & INPUT_BUTTON4) { + Weapons_Reload(); + } else if (input_buttons & INPUT_BUTTON3) { + Weapons_Secondary(); + } else { + Weapons_Release(); } if (input_buttons & INPUT_BUTTON5) { @@ -51,22 +32,55 @@ void Game_Input(void) } else { Player_UseUp(); } - - if (input_buttons & INPUT_BUTTON0) { - if (fGameState != GAME_FREEZE) { - Weapon_PrimaryAttack(self.weapon); - } - } else if (input_buttons & INPUT_BUTTON4) { - Weapon_Reload(self.weapon); - } else if (input_buttons & INPUT_BUTTON3) { - Weapon_SecondaryAttack(self.weapon); - } else { - Weapon_Release(); - } if (self.impulse == 100) { Flashlight_Toggle(); } - self.impulse = 0; + if (cvar("sv_cheats") == 1) { + player pl = (player)self; + if (self.impulse == 101) { + pl.health = 100; + pl.armor = 100; + + Weapons_AddItem(pl, WEAPON_M3); + Weapons_AddItem(pl, WEAPON_XM1014); + Weapons_AddItem(pl, WEAPON_MP5); + Weapons_AddItem(pl, WEAPON_P90); + Weapons_AddItem(pl, WEAPON_UMP45); + Weapons_AddItem(pl, WEAPON_MAC10); + Weapons_AddItem(pl, WEAPON_TMP); + Weapons_AddItem(pl, WEAPON_AK47); + Weapons_AddItem(pl, WEAPON_SG552); + Weapons_AddItem(pl, WEAPON_M4A1); + Weapons_AddItem(pl, WEAPON_AUG); + Weapons_AddItem(pl, WEAPON_SCOUT); + Weapons_AddItem(pl, WEAPON_AWP); + Weapons_AddItem(pl, WEAPON_G3SG1); + Weapons_AddItem(pl, WEAPON_SG550); + Weapons_AddItem(pl, WEAPON_PARA); + Weapons_AddItem(pl, WEAPON_C4BOMB); + Weapons_AddItem(pl, WEAPON_FLASHBANG); + Weapons_AddItem(pl, WEAPON_HEGRENADE); + Weapons_AddItem(pl, WEAPON_SMOKEGRENADE); + Weapons_AddItem(pl, WEAPON_USP45); + Weapons_AddItem(pl, WEAPON_GLOCK18); + Weapons_AddItem(pl, WEAPON_DEAGLE); + Weapons_AddItem(pl, WEAPON_P228); + Weapons_AddItem(pl, WEAPON_ELITES); + Weapons_AddItem(pl, WEAPON_FIVESEVEN); + Weapons_AddItem(pl, WEAPON_KNIFE); + } + + if (self.impulse == 102) { + // Respawn all the entities + for (entity a = world; (a = findfloat(a, gflags, GF_CANRESPAWN));) { + CBaseEntity caw = (CBaseEntity)a; + caw.Respawn(); + } + bprint(PRINT_HIGH, "Respawning all map entities...\n"); + } + } + + self.impulse = 0; } diff --git a/src/server/cstrike/item_suit.cpp b/src/server/cstrike/item_suit.cpp index 1d7387e8..0aa60126 100644 --- a/src/server/cstrike/item_suit.cpp +++ b/src/server/cstrike/item_suit.cpp @@ -24,18 +24,21 @@ class item_suit:CBaseTrigger void item_suit::touch(void) { - if (other.classname != "player") { + player pl = (player)other; + + if (pl.classname != "player") { return; } - player pl = (player)other; - /*if (pl.g_items & ITEM_SUIT) { + + if (pl.g_items & ITEM_SUIT) { return; - }*/ + } + sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); - /*pl.g_items |= ITEM_SUIT;*/ + pl.g_items |= ITEM_SUIT; CBaseTrigger::UseTargets(); - + if (cvar("sv_playerslots") == 1) { remove(self); } else { diff --git a/src/server/cstrike/player.c b/src/server/cstrike/player.c index b311ba58..0a0687e8 100644 --- a/src/server/cstrike/player.c +++ b/src/server/cstrike/player.c @@ -14,168 +14,44 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -string sPainSounds[5] = { - "player/pl_pain2.wav", - "player/pl_pain4.wav", - "player/pl_pain5.wav", - "player/pl_pain6.wav", - "player/pl_pain7.wav" -}; - -/* -================= -Player_SendEntity -================= -*/ -float Player_SendEntity(entity ePEnt, float fChanged) +void Player_Pain(int hit) { - /* If dead */ - if (self.health <= 0 && ePEnt != self) { - return FALSE; - } - - /* Fix CT/VIP team */ - float t1, t2; - t1 = ePEnt.team; - t2 = self.team; - if (t1 == TEAM_VIP) { - t1 = TEAM_CT; - } else if (t2 == TEAM_VIP) { - t2 = TEAM_CT; - } - - /* Always make team-mates visible */ - if (t1 != t2 && ePEnt.health > 0) { - /* Can we even see them? */ - if (!checkpvs(ePEnt.origin, self)) { - return FALSE; - } else { - /* We're in the same PVS, but we might still not be able to see them */ - traceline(self.origin, ePEnt.origin, FALSE, self); - if (trace_ent != ePEnt) { - return FALSE; - } - } - } - - WriteByte(MSG_ENTITY, ENT_PLAYER); - WriteShort(MSG_ENTITY, self.modelindex); - WriteCoord(MSG_ENTITY, self.origin[0]); - WriteCoord(MSG_ENTITY, self.origin[1]); - WriteCoord(MSG_ENTITY, self.origin[2]); - WriteCoord(MSG_ENTITY, self.v_angle[0]); - WriteCoord(MSG_ENTITY, self.angles[1]); - WriteCoord(MSG_ENTITY, self.angles[2]); - WriteCoord(MSG_ENTITY, self.velocity[0]); - WriteCoord(MSG_ENTITY, self.velocity[1]); - WriteCoord(MSG_ENTITY, self.velocity[2]); - WriteFloat(MSG_ENTITY, self.flags); - WriteFloat(MSG_ENTITY, self.pmove_flags); - WriteByte(MSG_ENTITY, self.weapon); - WriteByte(MSG_ENTITY, self.health); - WriteFloat(MSG_ENTITY, self.movetype); - WriteFloat(MSG_ENTITY, self.view_ofs[2]); - WriteFloat(MSG_ENTITY, self.viewzoom); - WriteFloat(MSG_ENTITY, self.jumptime); - WriteFloat(MSG_ENTITY, self.teleport_time); - return TRUE; + } -/* -================= -Player_Pain -================= -*/ -void Player_Pain(int iHitBody) +void Player_Death(int hit) { - /* - if (iHitBody == BODY_HEAD) { - Animation_PlayerTopTemp(ANIM_HEAD_FLINCH, 0.25f); - } else { - Animation_PlayerTopTemp(ANIM_GUT_FLINCH, 0.25f); - }*/ + player pl = (player)self; + + pl.movetype = MOVETYPE_NONE; + pl.solid = SOLID_NOT; + pl.takedamage = DAMAGE_NO; + pl.flags &= ~FL_FLASHLIGHT; + pl.armor = pl.activeweapon = pl.g_items = 0; - sound(self, CHAN_VOICE, sPainSounds[ floor(random() * 5) ], 1, ATTN_IDLE); - self.velocity = '0 0 0'; -} + pl.think = PutClientInServer; + pl.nextthink = time + 4.0f; + sound(pl, CHAN_AUTO, "fvox/flatline.wav", 1.0, ATTN_NORM); -/* -================= -Player_Death -================= -*/ -void Player_Death(int iHitBody) -{ - if (iHitBody == BODY_HEAD) { - sound(self, CHAN_VOICE, sprintf("player/headshot%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM); - } else { - sound(self, CHAN_VOICE, sprintf("player/die%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM); - } - - // Drop a corpse - entity eCorpse = spawn(); - eCorpse.classname = "remove_me"; - setorigin(eCorpse, self.origin); - setmodel(eCorpse, self.model); - setsize(eCorpse, self.mins, self.maxs); - eCorpse.angles = [ 0, self.angles[1], 0 ]; - eCorpse.movetype = MOVETYPE_BOUNCE; - - // Drop primary weapon as well as the bomb if present - if (self.fSlotPrimary) { - Weapon_DropWeapon(SLOT_PRIMARY); - } else { - if (self.fSlotSecondary) { - Weapon_DropWeapon(SLOT_SECONDARY); - } - } - if (self.fSlotGrenade) { - Weapon_DropWeapon(SLOT_GRENADE); - } - - // Make ourselves disappear - self.modelindex = 0; - - if (self.flags & FL_CROUCHING) { - eCorpse.frame = ANIM_CROUCH_DIE; - } else { - switch (iHitBody) { - case BODY_HEAD: - eCorpse.frame = ANIM_DIE_HEAD; - break; - case BODY_STOMACH: - eCorpse.frame = ANIM_DIE_GUT; - break; - case BODY_LEGLEFT: - case BODY_ARMLEFT: - eCorpse.frame = ANIM_DIE_LEFT; - break; - case BODY_LEGRIGHT: - case BODY_ARMRIGHT: - eCorpse.frame = ANIM_DIE_RIGHT; - break; - default: - eCorpse.frame = ANIM_DEATH1 + floor(random() * 3); - break; - } - } - - Spawn_MakeSpectator(); - self.classname = "player"; - self.health = 0; - forceinfokey(self, "*dead", "1"); - forceinfokey(self, "*team", ftos(self.team)); - - Rules_CountPlayers(); - - /* In Assassination, all Terrorists receive a $2500 - * reward if they won by killing the VIP. */ - if (self.team == TEAM_VIP) { - Rules_RoundOver(TEAM_T, 2500, FALSE); + if (pl.health < -50) { + pl.health = 0; + Effect_GibHuman(pl.origin); return; } - Rules_DeathCheck(); + pl.health = 0; + + /* Let's handle corpses on the clientside */ + entity corpse = spawn(); + setorigin(corpse, pl.origin + [0,0,32]); + setmodel(corpse, pl.model); + setsize(corpse, VEC_HULL_MIN, VEC_HULL_MAX); + corpse.movetype = MOVETYPE_TOSS; + corpse.solid = SOLID_TRIGGER; + corpse.modelindex = pl.modelindex; + corpse.frame = ANIM_DIESIMPLE; + corpse.angles = pl.angles; + corpse.velocity = pl.velocity; } /* @@ -199,12 +75,12 @@ Player_UseDown */ void Player_UseDown(void) { - if (self.health <= 0) { + if (self.health <= 0) { return; } else if (!(self.gflags & GF_USE_RELEASED)) { return; } - + vector vSource; makevectors(self.v_angle); @@ -213,7 +89,7 @@ void Player_UseDown(void) if (trace_ent.PlayerUse) { self.gflags &= ~GF_USE_RELEASED; - + UseWorkaround(trace_ent); /* Some entities want to support Use spamming */ @@ -231,37 +107,99 @@ void Player_UseDown(void) Player_UseUp ==================== */ -void Player_UseUp(void) -{ +void Player_UseUp(void) { if (!(self.gflags & GF_USE_RELEASED)) { self.gflags |= GF_USE_RELEASED; - self.fProgressBar = 0; } } /* ================= -PlayerPreThink - -Run before physics +Player_SendEntity ================= */ -void Game_PlayerPreThink(void) -{ - BaseGun_ShotMultiplierUpdate(); -} - -/* -================= -PlayerPreThink - -Run after physics -================= -*/ -void Game_PlayerPostThink(void) +float Player_SendEntity(entity ePEnt, float fChanged) { - Animation_PlayerUpdate(); - Footsteps_Update(); - - self.SendFlags = 1; + player pl = (player)self; + + if (pl.health <= 0 && ePEnt != pl) { + return FALSE; + } + + WriteByte(MSG_ENTITY, ENT_PLAYER); + WriteFloat(MSG_ENTITY, fChanged); + + /* really trying to get our moneys worth with 23 bits of mantissa */ + if (fChanged & PLAYER_MODELINDEX) { + WriteShort(MSG_ENTITY, pl.modelindex); + } + if (fChanged & PLAYER_ORIGIN) { + WriteCoord(MSG_ENTITY, pl.origin[0]); + WriteCoord(MSG_ENTITY, pl.origin[1]); + } + if (fChanged & PLAYER_ORIGIN_Z) { + WriteCoord(MSG_ENTITY, pl.origin[2]); + } + if (fChanged & PLAYER_ANGLES_X) { + WriteFloat(MSG_ENTITY, pl.v_angle[0]); + } + if (fChanged & PLAYER_ANGLES_Y) { + WriteFloat(MSG_ENTITY, pl.angles[1]); + } + if (fChanged & PLAYER_ANGLES_Z) { + WriteFloat(MSG_ENTITY, pl.angles[2]); + } + if (fChanged & PLAYER_VELOCITY) { + WriteCoord(MSG_ENTITY, pl.velocity[0]); + WriteCoord(MSG_ENTITY, pl.velocity[1]); + } + if (fChanged & PLAYER_VELOCITY_Z) { + WriteCoord(MSG_ENTITY, pl.velocity[2]); + } + if (fChanged & PLAYER_FLAGS) { + WriteFloat(MSG_ENTITY, pl.flags); + } + if (fChanged & PLAYER_WEAPON) { + WriteByte(MSG_ENTITY, pl.activeweapon); + } + if (fChanged & PLAYER_ITEMS) { + WriteFloat(MSG_ENTITY, (__variant)pl.g_items); + } + if (fChanged & PLAYER_HEALTH) { + WriteByte(MSG_ENTITY, pl.health); + } + if (fChanged & PLAYER_ARMOR) { + WriteByte(MSG_ENTITY, pl.armor); + } + if (fChanged & PLAYER_MOVETYPE) { + WriteByte(MSG_ENTITY, pl.movetype); + } + if (fChanged & PLAYER_VIEWOFS) { + WriteFloat(MSG_ENTITY, pl.view_ofs[2]); + } + if (fChanged & PLAYER_BASEFRAME) { + WriteByte(MSG_ENTITY, pl.baseframe); + } + if (fChanged & PLAYER_FRAME) { + WriteByte(MSG_ENTITY, pl.frame); + } + if (fChanged & PLAYER_AMMO1) { + WriteByte(MSG_ENTITY, pl.a_ammo1); + } + if (fChanged & PLAYER_AMMO2) { + WriteByte(MSG_ENTITY, pl.a_ammo2); + } + if (fChanged & PLAYER_AMMO3) { + WriteByte(MSG_ENTITY, pl.a_ammo3); + } + + return TRUE; +} + +void Weapons_Draw(void); +void CSEv_PlayerSwitchWeapon_f(float w) +{ + player pl = (player)self; + pl.activeweapon = (int)w; + Weapons_Draw(); } diff --git a/src/server/cstrike/progs.src b/src/server/cstrike/progs.src index 7058db80..6ec2f7f8 100755 --- a/src/server/cstrike/progs.src +++ b/src/server/cstrike/progs.src @@ -2,91 +2,86 @@ #pragma progs_dat "../../../cstrike/data.pk3dir/progs.dat" #define QWSSQC -#define CSTRIKE +#define VALVE #includelist ../../shared/fteextensions.qc ../../shared/defs.h -defs.h -../../shared/cstrike/defs.h +../valve/defs.h ../../shared/math.h ../../shared/materials.h ../../shared/events.h ../../shared/entities.h +../../shared/valve/animations.h ../defs.h -defsfields.h - ../plugins.c +../logging.c +../nodes.c +../skill.c +../sentences.c ../../gs-entbase/server.src -money.c -../../shared/cstrike/animations.c -../../shared/cstrike/radio.c -../../shared/cstrike/weaponak47.c -../../shared/cstrike/weaponaug.c -../../shared/cstrike/weaponawp.c -../../shared/cstrike/weaponc4bomb.c -../../shared/cstrike/weapondeagle.c -../../shared/cstrike/weaponelites.c -../../shared/cstrike/weaponfiveseven.c -../../shared/cstrike/weaponflashbang.c -../../shared/cstrike/weapong3sg1.c -../../shared/cstrike/weaponglock18.c -../../shared/cstrike/weaponhegrenade.c -../../shared/cstrike/weaponknife.c -../../shared/cstrike/weaponm3.c -../../shared/cstrike/weaponm4a1.c -../../shared/cstrike/weaponmac10.c -../../shared/cstrike/weaponmp5.c -../../shared/cstrike/weaponp228.c -../../shared/cstrike/weaponp90.c -../../shared/cstrike/weaponpara.c -../../shared/cstrike/weaponscout.c -../../shared/cstrike/weaponsg550.c -../../shared/cstrike/weaponsg552.c -../../shared/cstrike/weaponsmokegrenade.c -../../shared/cstrike/weapontmp.c -../../shared/cstrike/weaponump45.c -../../shared/cstrike/weaponusp45.c -../../shared/cstrike/weaponxm1014.c -../../shared/cstrike/basegun.c -../../shared/cstrike/basemelee.c -../../shared/cstrike/weapons.c -../../shared/cstrike/equipment.c ../../shared/decals.c ../../shared/effects.c ../../shared/spraylogo.cpp -../../shared/valve/player.cpp +../../shared/cstrike/player.cpp +../cstrike/player.c ../../shared/pmove.c +../valve/spectator.c -armoury_entity.cpp -hostage_entity.cpp -func_hostage_rescue.cpp -item_suit.cpp -info_hostage_rescue.cpp -func_vip_safetyzone.cpp -info_map_parameters.cpp +../../shared/cstrike/items.h +../../shared/valve/weapon_common.h +../../shared/cstrike/weapons.h +../../shared/cstrike/w_knife.c +../../shared/cstrike/w_usp45.c +../../shared/cstrike/w_glock18.c +../../shared/cstrike/w_deagle.c +../../shared/cstrike/w_p228.c +../../shared/cstrike/w_elites.c +../../shared/cstrike/w_fiveseven.c +../../shared/cstrike/w_m3.c +../../shared/cstrike/w_xm1014.c +../../shared/cstrike/w_mp5.c +../../shared/cstrike/w_p90.c +../../shared/cstrike/w_ump45.c +../../shared/cstrike/w_mac10.c +../../shared/cstrike/w_tmp.c +../../shared/cstrike/w_ak47.c +../../shared/cstrike/w_sg552.c +../../shared/cstrike/w_m4a1.c +../../shared/cstrike/w_aug.c +../../shared/cstrike/w_scout.c +../../shared/cstrike/w_awp.c +../../shared/cstrike/w_g3sg1.c +../../shared/cstrike/w_sg550.c +../../shared/cstrike/w_para.c +../../shared/cstrike/w_c4bomb.c +../../shared/cstrike/w_flashbang.c +../../shared/cstrike/w_hegrenade.c +../../shared/cstrike/w_smokegrenade.c +../../shared/cstrike/weapons.c +../valve/items.cpp +../../shared/valve/weapon_common.c -../vox.c -ammo.c -damage.c -../traceattack.c -rules.c -timer.c +../cstrike/item_suit.cpp -func_bomb_target.cpp -func_buyzone.cpp -func_escapezone.cpp -main.c -player.c ../spawn.c -spawn.c +../vox.c +../../shared/valve/animations.c +../cstrike/gamerules.c +../cstrike/client.c +../client.c +../valve/server.c +../server.c +../valve/damage.c +../traceattack.c +../valve/rules.c ../footsteps.c ../flashlight.c -input.c -client.c -../client.c +../cstrike/input.c +../valve/spawn.c ../vote.c + ../entry.c #endlist diff --git a/src/shared/cstrike/animations.c b/src/shared/cstrike.old/animations.c similarity index 100% rename from src/shared/cstrike/animations.c rename to src/shared/cstrike.old/animations.c diff --git a/src/shared/cstrike/basegun.c b/src/shared/cstrike.old/basegun.c similarity index 100% rename from src/shared/cstrike/basegun.c rename to src/shared/cstrike.old/basegun.c diff --git a/src/shared/cstrike/basemelee.c b/src/shared/cstrike.old/basemelee.c similarity index 98% rename from src/shared/cstrike/basemelee.c rename to src/shared/cstrike.old/basemelee.c index 29c7baf1..ba88b672 100755 --- a/src/shared/cstrike/basemelee.c +++ b/src/shared/cstrike.old/basemelee.c @@ -41,7 +41,7 @@ int BaseMelee_Attack( void ) { Effect_Impact( IMPACT_FLESH, trace_endpos, trace_plane_normal ); sound( self, CHAN_WEAPON, sprintf( "weapons/knife_hit%d.wav", floor( ( random() * 4 ) + 1 ) ), 1, ATTN_NORM ); } - Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, trace_endpos, FALSE, self.weapon); + Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, FALSE, self.weapon); } else { Effect_Impact( IMPACT_MELEE, trace_endpos, trace_plane_normal ); } diff --git a/src/shared/cstrike/defs.h b/src/shared/cstrike.old/defs.h similarity index 100% rename from src/shared/cstrike/defs.h rename to src/shared/cstrike.old/defs.h diff --git a/src/shared/cstrike.old/equipment.c b/src/shared/cstrike.old/equipment.c new file mode 100755 index 00000000..1d7df15a --- /dev/null +++ b/src/shared/cstrike.old/equipment.c @@ -0,0 +1,124 @@ +/* + * 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. + */ + +equipmentinfo_t eqptTable [ CS_EQUIPMENT_COUNT ] = { + { EQUIPMENT_KEVLAR, 650 }, + { EQUIPMENT_HELMET, 1000 }, + { WEAPON_FLASHBANG, 300 }, + { WEAPON_HEGRENADE, 300 }, + { WEAPON_SMOKEGRENADE, 300 }, + { EQUIPMENT_DEFUSALKIT, 200 }, + { EQUIPMENT_NIGHTVISION, 1250 }, +}; + +#ifdef SSQC +void CSEv_PlayerBuyEquipment_f( float fID ) { + if ( Rules_BuyingPossible() == FALSE ) { + return; + } + + if ( ( self.fMoney - eqptTable[ fID ].iPrice ) >= 0 ) { + if ( eqptTable[ fID ].iID == EQUIPMENT_DEFUSALKIT ) { + if ( self.team == TEAM_T ) { return; } + if ( !( self.iEquipment & EQUIPMENT_DEFUSALKIT ) ) { + self.iEquipment |= EQUIPMENT_DEFUSALKIT; + Money_AddMoney( self, -200 ); + sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); + } else { + centerprint( self, "You already have a defusal kit!" ); + } + } else if ( eqptTable[ fID ].iID == EQUIPMENT_NIGHTVISION ) { + if ( !( self.iEquipment & EQUIPMENT_NIGHTVISION ) ) { + self.iEquipment |= EQUIPMENT_NIGHTVISION; + Money_AddMoney( self, -1250 ); + sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); + } else { + centerprint( self, "You already have nightvision goggles!" ); + } + } else if ( eqptTable[ fID ].iID == WEAPON_HEGRENADE ) { + if ( self.iAmmo_HEGRENADE < 2 ) { + self.iAmmo_HEGRENADE++; + Money_AddMoney( self, -300 ); + sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); + } else { + centerprint( self, "You can't carry any more!" ); + } + } else if ( eqptTable[ fID ].iID == WEAPON_FLASHBANG ) { + if ( self.iAmmo_FLASHBANG < 2 ) { + self.iAmmo_FLASHBANG++; + Money_AddMoney( self, -300 ); + sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); + } else { + centerprint( self, "You can't carry any more!" ); + } + } else if ( eqptTable[ fID ].iID == WEAPON_SMOKEGRENADE ) { + if ( self.iAmmo_SMOKEGRENADE < 2 ) { + self.iAmmo_SMOKEGRENADE++; + Money_AddMoney( self, -300 ); + sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); + } else { + centerprint( self, "You can't carry any more!" ); + } + } else if ( eqptTable[ fID ].iID == EQUIPMENT_KEVLAR ) { + if ( self.armor == 100 ) { + // You already own kevlar etc. + centerprint( self, "You already have kevlar!" ); + } else { + self.armor = 100; + Money_AddMoney( self, -650 ); + } + + sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE ); + self.fAttackFinished = time + 1.0; + return; + } else if ( eqptTable[ fID ].iID == EQUIPMENT_HELMET ) { + if ( self.armor == 100 ) { + if ( self.iEquipment & EQUIPMENT_HELMET ) { + // You already have full kevlar and a helmet + centerprint( self, "You already have kevlar and a helmet!" ); + } else { + // You have full kevlar, but no helmet + Money_AddMoney( self, -350 ); + sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE ); + centerprint( self, "You already have some kevlar,\nand now you've bought a helmet!" ); + self.iEquipment = self.iEquipment | EQUIPMENT_HELMET; + } + } else { + if ( self.iEquipment & EQUIPMENT_HELMET ) { + // Only get kevlar + self.armor = 100; + Money_AddMoney( self, -650 ); + sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE ); + centerprint( self, "You already have a helmet,\nand now you've bought some kevlar!" ); + } else { + // Get both + self.armor = 100; + self.iEquipment = self.iEquipment | EQUIPMENT_HELMET; + Money_AddMoney( self, -1000 ); + sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE ); + } + } + + self.fAttackFinished = time + 1.0; + return; + } + } else { + centerprint( self, "You have insufficient funds!" ); + } + + self.fAttackFinished = time + 1.0; +} +#endif diff --git a/src/shared/cstrike.old/player.cpp b/src/shared/cstrike.old/player.cpp new file mode 100644 index 00000000..5dd82eea --- /dev/null +++ b/src/shared/cstrike.old/player.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2016-2019 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +int input_sequence; +class player:CBaseEntity +{ + float health; + float armor; + + /* When the weapon is done firing */ + float w_attack_next; + /* When to play the next idle animation */ + float w_idle_next; + + /* Magazine/Clip */ + int a_ammo1; + /* Rest in the inventory */ + int a_ammo2; + /* Special ammo */ + int a_ammo3; + + /* We can't use the default .items field, because FTE will assume + * effects of some bits. Such as invisibility, quad, etc. */ + int g_items; + + float activeweapon; + float viewzoom; + vector view_ofs; + float weapontime; + + /* any mods that use hooks */ + entity hook; + + /* Weapon specific */ + int usp45_mag; + int glock18_mag; + int deagle_mag; + int p228_mag; + int elites_mag; + int fiveseven_mag; + int m3_mag; + int xm1014_mag; + int mp5_mag; + int p90_mag; + int ump45_mag; + int mac10_mag; + int tmp_mag; + int ak47_mag; + int sg552_mag; + int m4a1_mag; + int aug_mag; + int scout_mag; + int awp_mag; + int g3sg1_mag; + int sg550_mag; + int para_mag; + +#ifdef CSQC + /* External model */ + entity p_model; + int playertype; + int p_hand_bone; + int p_model_bone; + float pitch; + float lastweapon; + + /* Prediction */ + vector net_origin; + vector net_velocity; + float net_flags; + float net_w_attack_next; + float net_w_idle_next; + float net_jumptime; + float net_teleport_time; + float net_weapontime; + float net_viewzoom; + int net_ammo1; + int net_ammo2; + int net_ammo3; + int sequence; + + virtual void() gun_offset; + virtual void() draw; + virtual float() predraw; + virtual void() postdraw; +#else + int ammo_50ae; + int ammo_762mm; + int ammo_556mm; + int ammo_556mmbox; + int ammo_338mag; + int ammo_9mm; + int ammo_buckshot; + int ammo_45acp; + int ammo_357sig; + int ammo_57mm; + + /* conditional networking */ + int old_modelindex; + vector old_origin; + vector old_angles; + vector old_velocity; + int old_flags; + int old_activeweapon; + int old_items; + int old_health; + int old_armor; + int old_movetype; + int old_viewofs; + int old_baseframe; + int old_frame; + int old_a_ammo1; + int old_a_ammo2; + int old_a_ammo3; +#endif +}; diff --git a/src/shared/cstrike.old/radio.c b/src/shared/cstrike.old/radio.c new file mode 100755 index 00000000..323d1dd8 --- /dev/null +++ b/src/shared/cstrike.old/radio.c @@ -0,0 +1,317 @@ +/* + * 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. + */ + +enum { + RADIO_BLOW, + RADIO_BOMBDEF, + RADIO_BOMBPL, + RADIO_CIRCLEBACK, + RADIO_CLEAR, + RADIO_COM_FOLLOWCOM, + RADIO_COM_GETINPOS, + RADIO_COM_GO, + RADIO_COM_REPORTIN, + RADIO_CT_AFFIRM, + RADIO_CT_BACKUP, + RADIO_CT_COVERME, + RADIO_CT_ENEMYS, + RADIO_CT_FIREINHOLE, + RADIO_CT_IMHIT, + RADIO_CT_INPOS, + RADIO_CT_POINT, + RADIO_CT_REPORTINGIN, + RADIO_CTWIN, + RADIO_ENEMYDOWN, + RADIO_FALLBACK, + RADIO_FIREASSIS, + RADIO_FOLLOWME, + RADIO_GETOUT, + RADIO_GO, + RADIO_HITASSIST, + RADIO_HOSDOWN, + RADIO_LETSGO, + RADIO_LOCKNLOAD, + RADIO_MATEDOWN, + RADIO_MEETME, + RADIO_MOVEOUT, + RADIO_NEGATIVE, + RADIO_POSITION, + RADIO_REGROUP, + RADIO_RESCUED, + RADIO_ROGER, + RADIO_ROUNDDRAW, + RADIO_STICKTOG, + RADIO_STORMFRONT, + RADIO_TAKEPOINT, + RADIO_TERWIN, + RADIO_VIP, +}; + +#ifdef CSQC +string sRadioSamples[43] = { + "radio/blow.wav", + "radio/bombdef.wav", + "radio/bombpl.wav", + "radio/circleback.wav", + "radio/clear.wav", + "radio/com_followcom.wav", + "radio/com_getinpos.wav", + "radio/com_go.wav", + "radio/com_reportin.wav", + "radio/ct_affirm.wav", + "radio/ct_backup.wav", + "radio/ct_coverme.wav", + "radio/ct_enemys.wav", + "radio/ct_fireinhole.wav", + "radio/ct_imhit.wav", + "radio/ct_inpos.wav", + "radio/ct_point.wav", + "radio/ct_reportingin.wav", + "radio/ctwin.wav", + "radio/enemydown.wav", + "radio/fallback.wav", + "radio/fireassis.wav", + "radio/followme.wav", + "radio/getout.wav", + "radio/go.wav", + "radio/hitassist.wav", + "radio/hosdown.wav", + "radio/letsgo.wav", + "radio/locknload.wav", + "radio/matedown.wav", + "radio/meetme.wav", + "radio/moveout.wav", + "radio/negative.wav", + "radio/position.wav", + "radio/regroup.wav", + "radio/rescued.wav", + "radio/roger.wav", + "radio/rounddraw.wav", + "radio/sticktog.wav", + "radio/stormfront.wav", + "radio/takepoint.wav", + "radio/terwin.wav", + "radio/vip.wav" +}; + +string sRadioChat[43] = { + _("RADIO_BLOW"), + _("RADIO_BOMBDEF"), + _("RADIO_BOMBPL"), + _("RADIO_CIRCLEBACK"), + _("RADIO_CLEAR"), + _("RADIO_COM_FOLLOWCOM"), + _("RADIO_COM_GETINPOS"), + _("RADIO_COM_GO"), + _("RADIO_COM_REPORTIN"), + _("RADIO_CT_AFFIRM"), + _("RADIO_CT_BACKUP"), + _("RADIO_CT_COVERME"), + _("RADIO_CT_ENEMYS"), + _("RADIO_CT_FIREINHOLE"), + _("RADIO_CT_IMHIT"), + _("RADIO_CT_INPOS"), + _("RADIO_CT_POINT"), + _("RADIO_CT_REPORTINGIN"), + _("RADIO_CTWIN"), + _("RADIO_ENEMYDOWN"), + _("RADIO_FALLBACK"), + _("RADIO_FIREASSIS"), + _("RADIO_FOLLOWME"), + _("RADIO_GETOUT"), + _("RADIO_GO"), + _("RADIO_HITASSIST"), + _("RADIO_HOSDOWN"), + _("RADIO_LETSGO"), + _("RADIO_LOCKNLOAD"), + _("RADIO_MATEDOWN"), + _("RADIO_MEETME"), + _("RADIO_MOVEOUT"), + _("RADIO_NEGATIVE"), + _("RADIO_POSITION"), + _("RADIO_REGROUP"), + _("RADIO_RESCUED"), + _("RADIO_ROGER"), + _("RADIO_ROUNDDRAW"), + _("RADIO_STICKTOG"), + _("RADIO_STORMFRONT"), + _("RADIO_TAKEPOINT"), + _("RADIO_TERWIN"), + _("RADIO_VIP"), +}; + +/* +================= +Radio_InitSounds + +Who doesn't love precaching sounds +================= +*/ +void Radio_InitSounds( void ) { + for ( int i = 0; i < 43; i++ ) { + precache_sound( sRadioSamples[ i ] ); + } +} + +/* +================= +Radio_PlayMessage + +Play a radio message that doesn't come from a player +================= +*/ +void Radio_PlayMessage( float fMessage ) { + sound( world, CHAN_VOICE, sRadioSamples[ fMessage ], 1, ATTN_NONE, 0, SOUNDFLAG_NOSPACIALISE ); + CSQC_Parse_Print( sprintf( "^2[RADIO]^xF80: %s\n", sRadioChat[ fMessage ] ), PRINT_CHAT ); +} + +/* +================= +Radio_PlayPlayerMessage + +This radio message does come from a player +================= +*/ +void Radio_PlayPlayerMessage( float fPlayerNum, float fMessage ) { + sound( world, CHAN_VOICE, sRadioSamples[ fMessage ], 1, ATTN_NONE, 0, SOUNDFLAG_NOSPACIALISE ); + CSQC_Parse_Print( sprintf( "^2[RADIO] %s%s^xF80: %s\n", HUD_GetChatColorHEX( stof( getplayerkeyvalue( fPlayerNum, "*team" ) ) ), getplayerkeyvalue( fPlayerNum, "name" ), sRadioChat[ fMessage ] ), PRINT_CHAT ); +} +#endif + + +#ifdef SSQC +/* +================= +Radio_BroadcastMessage + +A global radio message for all players +================= +*/ +void Radio_BroadcastMessage( float fMessage ) { + WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET ); + WriteByte( MSG_MULTICAST, EV_RADIOMSG ); + WriteByte( MSG_MULTICAST, fMessage ); + msg_entity = self; + multicast( '0 0 0', MULTICAST_ALL ); +} + +/* +================= +Radio_TeamMessage + +A radio message targetted at members of a specific team +================= +*/ +void Radio_TeamMessage( float fMessage, float fTeam ) { + static void Radio_TeamMessage_Send( float fMessage, entity eEnt ) { + WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET ); + WriteByte( MSG_MULTICAST, EV_RADIOMSG ); + WriteByte( MSG_MULTICAST, fMessage ); + msg_entity = eEnt; + multicast( '0 0 0', MULTICAST_ONE ); + } + + for ( entity eFind = world; ( eFind = find( eFind, classname, "player" ) ); ) { + if ( eFind.team == fTeam ) { + Radio_TeamMessage_Send( fMessage, eFind ); + } else if ( eFind.team == TEAM_VIP && fTeam == TEAM_CT ) { + Radio_TeamMessage_Send( fMessage, eFind ); + } + } +} + +/* +================= +Radio_DefaultStart + +Pick a generic, random radio string for global start messages +================= +*/ +float Radio_DefaultStart( void ) { + float fRand = floor( random( 1, 4 ) ); + + if ( fRand == 1 ) { + return RADIO_MOVEOUT; + } else if ( fRand == 2 ) { + return RADIO_LOCKNLOAD; + } else { + return RADIO_LETSGO; + } +} + +/* +================= +Radio_StartMessage + +Decide which startmessage to play at the beginning of each round +================= +*/ +void Radio_StartMessage( void ) { + if ( iVIPZones > 0 ) { + Radio_TeamMessage( RADIO_VIP, TEAM_CT ); + Radio_TeamMessage( Radio_DefaultStart(), TEAM_T ); + } else if ( iEscapeZones > 0 ) { + Radio_TeamMessage( RADIO_GETOUT, TEAM_T ); + Radio_TeamMessage( Radio_DefaultStart(), TEAM_CT ); + } else { + Radio_BroadcastMessage( Radio_DefaultStart() ); + } +} + +/* +================= +CSEv_RadioMessage_f + +Triggered by clients, plays a message to members of the same team +================= +*/ +void CSEv_RadioMessage_f( float fMessage ) { + static void CSEv_RadioMessage_Send( float fMessage, entity eEnt ) { + WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET ); + WriteByte( MSG_MULTICAST, EV_RADIOMSG2 ); + WriteByte( MSG_MULTICAST, num_for_edict( eEnt ) - 1 ); + WriteByte( MSG_MULTICAST, fMessage ); + msg_entity = eEnt; + multicast( '0 0 0', MULTICAST_ONE ); + } + + // Don't allow spamming + if ( self.fRadioFinished > time ) { + return; + } + + // When dead, don't talk + if ( self.health <= 0 ) { + return; + } + + // Make sure that VIPs and CTs get eachother + float fTargetTeam = self.team; + if ( fTargetTeam == TEAM_VIP ) { + fTargetTeam = TEAM_CT; + } + + for ( entity eFind = world; ( eFind = find( eFind, classname, "player" ) ); ) { + if ( eFind.team == fTargetTeam ) { + CSEv_RadioMessage_Send( fMessage, eFind ); + } else if ( eFind.team == TEAM_VIP && fTargetTeam == TEAM_CT ) { + CSEv_RadioMessage_Send( fMessage, eFind ); + } + } + + self.fRadioFinished = time + 3.0f; +} +#endif diff --git a/src/shared/cstrike/weaponak47.c b/src/shared/cstrike.old/weaponak47.c similarity index 100% rename from src/shared/cstrike/weaponak47.c rename to src/shared/cstrike.old/weaponak47.c diff --git a/src/shared/cstrike/weaponaug.c b/src/shared/cstrike.old/weaponaug.c similarity index 100% rename from src/shared/cstrike/weaponaug.c rename to src/shared/cstrike.old/weaponaug.c diff --git a/src/shared/cstrike/weaponawp.c b/src/shared/cstrike.old/weaponawp.c similarity index 100% rename from src/shared/cstrike/weaponawp.c rename to src/shared/cstrike.old/weaponawp.c diff --git a/src/shared/cstrike/weaponc4bomb.c b/src/shared/cstrike.old/weaponc4bomb.c similarity index 100% rename from src/shared/cstrike/weaponc4bomb.c rename to src/shared/cstrike.old/weaponc4bomb.c diff --git a/src/shared/cstrike/weapondeagle.c b/src/shared/cstrike.old/weapondeagle.c similarity index 100% rename from src/shared/cstrike/weapondeagle.c rename to src/shared/cstrike.old/weapondeagle.c diff --git a/src/shared/cstrike/weaponelites.c b/src/shared/cstrike.old/weaponelites.c similarity index 100% rename from src/shared/cstrike/weaponelites.c rename to src/shared/cstrike.old/weaponelites.c diff --git a/src/shared/cstrike/weaponfiveseven.c b/src/shared/cstrike.old/weaponfiveseven.c similarity index 100% rename from src/shared/cstrike/weaponfiveseven.c rename to src/shared/cstrike.old/weaponfiveseven.c diff --git a/src/shared/cstrike/weaponflashbang.c b/src/shared/cstrike.old/weaponflashbang.c similarity index 98% rename from src/shared/cstrike/weaponflashbang.c rename to src/shared/cstrike.old/weaponflashbang.c index 98b5dfeb..178faa6c 100755 --- a/src/shared/cstrike/weaponflashbang.c +++ b/src/shared/cstrike.old/weaponflashbang.c @@ -124,7 +124,7 @@ void WeaponFLASHBANG_Throw( void ) { return; } if ( other.classname == "func_breakable" ) { - Damage_Apply( other, self, 50, self.origin, FALSE, 0); + Damage_Apply( other, self, 50, FALSE, 0); } sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM ); } diff --git a/src/shared/cstrike/weapong3sg1.c b/src/shared/cstrike.old/weapong3sg1.c similarity index 100% rename from src/shared/cstrike/weapong3sg1.c rename to src/shared/cstrike.old/weapong3sg1.c diff --git a/src/shared/cstrike/weaponglock18.c b/src/shared/cstrike.old/weaponglock18.c similarity index 100% rename from src/shared/cstrike/weaponglock18.c rename to src/shared/cstrike.old/weaponglock18.c diff --git a/src/shared/cstrike/weaponhegrenade.c b/src/shared/cstrike.old/weaponhegrenade.c similarity index 100% rename from src/shared/cstrike/weaponhegrenade.c rename to src/shared/cstrike.old/weaponhegrenade.c diff --git a/src/shared/cstrike/weaponknife.c b/src/shared/cstrike.old/weaponknife.c similarity index 100% rename from src/shared/cstrike/weaponknife.c rename to src/shared/cstrike.old/weaponknife.c diff --git a/src/shared/cstrike/weaponm3.c b/src/shared/cstrike.old/weaponm3.c similarity index 100% rename from src/shared/cstrike/weaponm3.c rename to src/shared/cstrike.old/weaponm3.c diff --git a/src/shared/cstrike/weaponm4a1.c b/src/shared/cstrike.old/weaponm4a1.c similarity index 100% rename from src/shared/cstrike/weaponm4a1.c rename to src/shared/cstrike.old/weaponm4a1.c diff --git a/src/shared/cstrike/weaponmac10.c b/src/shared/cstrike.old/weaponmac10.c similarity index 100% rename from src/shared/cstrike/weaponmac10.c rename to src/shared/cstrike.old/weaponmac10.c diff --git a/src/shared/cstrike/weaponmp5.c b/src/shared/cstrike.old/weaponmp5.c similarity index 100% rename from src/shared/cstrike/weaponmp5.c rename to src/shared/cstrike.old/weaponmp5.c diff --git a/src/shared/cstrike/weaponp228.c b/src/shared/cstrike.old/weaponp228.c similarity index 100% rename from src/shared/cstrike/weaponp228.c rename to src/shared/cstrike.old/weaponp228.c diff --git a/src/shared/cstrike/weaponp90.c b/src/shared/cstrike.old/weaponp90.c similarity index 100% rename from src/shared/cstrike/weaponp90.c rename to src/shared/cstrike.old/weaponp90.c diff --git a/src/shared/cstrike/weaponpara.c b/src/shared/cstrike.old/weaponpara.c similarity index 100% rename from src/shared/cstrike/weaponpara.c rename to src/shared/cstrike.old/weaponpara.c diff --git a/src/shared/cstrike.old/weapons.c b/src/shared/cstrike.old/weapons.c new file mode 100755 index 00000000..7e82ec96 --- /dev/null +++ b/src/shared/cstrike.old/weapons.c @@ -0,0 +1,601 @@ +/* + * 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 Temp_Nothing( void ) { } + +#ifdef SSQC +string sWeaponModels[ CS_WEAPON_COUNT ] = { + "", + "models/w_knife.mdl", + "models/w_usp.mdl", + "models/w_glock18.mdl", + "models/w_deagle.mdl", + "models/w_p228.mdl", + "models/w_elite.mdl", + "models/w_fiveseven.mdl", + "models/w_m3.mdl", + "models/w_xm1014.mdl", + "models/w_mp5.mdl", + "models/w_p90.mdl", + "models/w_ump45.mdl", + "models/w_mac10.mdl", + "models/w_tmp.mdl", + "models/w_ak47.mdl", + "models/w_sg552.mdl", + "models/w_m4a1.mdl", + "models/w_aug.mdl", + "models/w_scout.mdl", + "models/w_awp.mdl", + "models/w_g3sg1.mdl", + "models/w_sg550.mdl", + "models/w_m249.mdl", + "models/w_backpack.mdl", + "models/w_flashbang.mdl", + "models/w_hegrenade.mdl", + "models/w_smokegrenade.mdl" +}; +#endif + +weaponfunc_t wpnFuncTable[ CS_WEAPON_COUNT ] = { + { Temp_Nothing, Temp_Nothing, Temp_Nothing, Temp_Nothing }, + { WeaponKNIFE_Draw, WeaponKNIFE_PrimaryFire, WeaponKNIFE_Secondary, Temp_Nothing }, + { WeaponUSP45_Draw, WeaponUSP45_PrimaryFire, WeaponUSP45_Secondary, WeaponUSP45_Reload }, + { WeaponGLOCK18_Draw, WeaponGLOCK18_PrimaryFire, WeaponGLOCK18_Secondary, WeaponGLOCK18_Reload }, + { WeaponDEAGLE_Draw, WeaponDEAGLE_PrimaryFire, Temp_Nothing, WeaponDEAGLE_Reload }, + { WeaponP228_Draw, WeaponP228_PrimaryFire, Temp_Nothing, WeaponP228_Reload }, + { WeaponELITES_Draw, WeaponELITES_PrimaryFire, Temp_Nothing, WeaponELITES_Reload }, + { WeaponFIVESEVEN_Draw, WeaponFIVESEVEN_PrimaryFire, Temp_Nothing, WeaponFIVESEVEN_Reload }, +#ifdef SSQC + { WeaponM3_Draw, WeaponM3_PrimaryFire, Temp_Nothing, WeaponM3_Reload }, + { WeaponXM1014_Draw, WeaponXM1014_PrimaryFire, Temp_Nothing, WeaponXM1014_Reload }, +#else + { WeaponM3_Draw, WeaponM3_PrimaryFire, WeaponM3_Secondary, WeaponM3_Reload }, + { WeaponXM1014_Draw, WeaponXM1014_PrimaryFire, WeaponXM1014_Secondary, WeaponXM1014_Reload }, +#endif + { WeaponMP5_Draw, WeaponMP5_PrimaryFire, Temp_Nothing, WeaponMP5_Reload }, + { WeaponP90_Draw, WeaponP90_PrimaryFire, Temp_Nothing, WeaponP90_Reload }, + { WeaponUMP45_Draw, WeaponUMP45_PrimaryFire, Temp_Nothing, WeaponUMP45_Reload }, + { WeaponMAC10_Draw, WeaponMAC10_PrimaryFire, Temp_Nothing, WeaponMAC10_Reload }, + { WeaponTMP_Draw, WeaponTMP_PrimaryFire, Temp_Nothing, WeaponTMP_Reload }, + { WeaponAK47_Draw, WeaponAK47_PrimaryFire, Temp_Nothing, WeaponAK47_Reload }, + { WeaponSG552_Draw, WeaponSG552_PrimaryFire, WeaponSG552_SecondaryFire, WeaponSG552_Reload }, + { WeaponM4A1_Draw, WeaponM4A1_PrimaryFire, WeaponM4A1_Secondary, WeaponM4A1_Reload }, + { WeaponAUG_Draw, WeaponAUG_PrimaryFire, WeaponAUG_SecondaryFire, WeaponAUG_Reload }, + { WeaponSCOUT_Draw, WeaponSCOUT_PrimaryFire, WeaponSCOUT_SecondaryFire, WeaponSCOUT_Reload }, + { WeaponAWP_Draw, WeaponAWP_PrimaryFire, WeaponAWP_SecondaryFire, WeaponAWP_Reload }, + { WeaponG3SG1_Draw, WeaponG3SG1_PrimaryFire, WeaponG3SG1_SecondaryFire, WeaponG3SG1_Reload }, + { WeaponSG550_Draw, WeaponSG550_PrimaryFire, WeaponSG550_SecondaryFire, WeaponSG550_Reload }, + { WeaponPARA_Draw, WeaponPARA_PrimaryFire, Temp_Nothing, WeaponPARA_Reload }, + { WeaponC4BOMB_Draw, WeaponC4BOMB_PrimaryFire, Temp_Nothing, Temp_Nothing }, + { WeaponFLASHBANG_Draw, WeaponFLASHBANG_PrimaryFire, Temp_Nothing, Temp_Nothing }, + { WeaponHEGRENADE_Draw, WeaponHEGRENADE_PrimaryFire, Temp_Nothing, Temp_Nothing }, + { WeaponSMOKEGRENADE_Draw, WeaponSMOKEGRENADE_PrimaryFire, Temp_Nothing, Temp_Nothing } +}; + +/* +================= +Weapon_Draw +================= +*/ +void Weapon_Draw( float fWeapon ) { + if ( !fWeapon ) { + return; + } + +#ifdef SSQC + // In case reloading logic is still going on + self.think = Empty; + + self.viewzoom = 1.0; + self.weapon = fWeapon; + self.fAttackFinished = time + 1.0; +#endif + +#ifdef CSQC + if ( fWeaponEventPlayer != player_localentnum ) { + return; + } +#endif + + wpnFuncTable[ fWeapon ].vDraw(); +} + +/* +================= +Weapon_PrimaryAttack +================= +*/ +void Weapon_PrimaryAttack( float fWeapon ) { +#ifdef SSQC + if ( self.fAttackFinished > time ) { + return; + } + if ( !( self.flags & FL_SEMI_TOGGLED ) ) { + return; + } +#endif +#ifdef CSQC + if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) { + entity ono = findfloat( world, entnum, fWeaponEventPlayer ); + if ( ono != __NULL__ ) { + Animation_ShootWeapon( ono ); + } + return; + } +#endif + + wpnFuncTable[ fWeapon ].vPrimary(); +} + +/* +================= +Weapon_SecondaryAttack +================= +*/ +void Weapon_SecondaryAttack( float fWeapon ) { +#ifdef SSQC + if ( self.fAttackFinished > time ) { + return; + } +#endif +#ifdef CSQC + if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) { + return; + } +#endif + wpnFuncTable[ fWeapon ].vSecondary(); +} + +/* +================= +Weapon_Reload +================= +*/ +void Weapon_Reload( float fWeapon ) { +#ifdef SSQC + if ( self.fAttackFinished > time ) { + return; + } + self.viewzoom = 1.0; +#endif +#ifdef CSQC + if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) { + entity ono = findfloat( world, entnum, fWeaponEventPlayer ); + if ( ono != __NULL__ ) { + Animation_ReloadWeapon( ono ); + } + return; + } +#endif + wpnFuncTable[ fWeapon ].vReload(); +} + +/* +================= +Weapon_GetAnimType + +Returns which animationset a weapon will use on a player +================= +*/ +float Weapon_GetAnimType( float fWeapon ) { + return wptTable[ fWeapon ].fAnimType; +} + +/* +================= +Weapon_GetFireRate + +Returns the delay between shots of a given weapon +================= +*/ +float Weapon_GetFireRate( float fWeapon ) { + return wptTable[ fWeapon ].fAttackFinished; +} + +/* +================= +Weapon_GetReloadTime + +Returns the reloading delay before being able to be fired again +================= +*/ +float Weapon_GetReloadTime( float fWeapon ) { + return wptTable[ fWeapon ].fReloadFinished; +} + +/* +================= +Weapon_GetSpeedM + +Returns the speed multiplier +================= +*/ +float Weapon_GetSpeedM( float fWeapon ) { + return wptTable[ fWeapon ].fSpeedM; +} + +#ifdef SSQC +/* +================= +Weapon_Release + +Called when letting go one of the weapon firing buttons +================= +*/ +void Weapon_Release( void ) { + self.flags = self.flags | FL_SEMI_TOGGLED; + + if ( self.weapon == WEAPON_FLASHBANG ) { + WeaponFLASHBANG_Release(); + } else if ( self.weapon == WEAPON_HEGRENADE ) { + WeaponHEGRENADE_Release(); + } else if ( self.weapon == WEAPON_SMOKEGRENADE ) { + WeaponSMOKEGRENADE_Release(); + } else if ( self.weapon == WEAPON_C4BOMB ) { + WeaponC4BOMB_Release(); + } else { + if (self.weapon == WEAPON_XM1014) { + return; + } else if (self.weapon == WEAPON_M3) { + return; + } + if (self.(wptTable[ self.weapon ].iMagfld) <= 0) { + if (self.(wptTable[ self.weapon ].iCaliberfld)) { + Weapon_Reload(self.weapon); + } + } + } +} + +/* +================= +Weapon_GetSlot + +Returns which slot a weapon belongs to +================= +*/ +int Weapon_GetSlot( float fWeapon ) { + return wptTable[ fWeapon ].iSlot; +} + +/* +================= +Weapon_AlreadyExists + +Returns whether or not we have the given weapon already +================= +*/ +float Weapon_AlreadyExists( float fWeapon ) { + if ( fWeapon == WEAPON_FLASHBANG || fWeapon == WEAPON_HEGRENADE || fWeapon == WEAPON_SMOKEGRENADE ) { + int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE; + if ( iNades ) { + return TRUE; + } else { + return FALSE; + } + } else { + if ( wptTable[ fWeapon ].iSlot == SLOT_PRIMARY ) { + if ( self.fSlotPrimary == fWeapon ) { + return TRUE; + } + } else if ( wptTable[ fWeapon ].iSlot == SLOT_SECONDARY ) { + if ( self.fSlotSecondary == fWeapon ) { + return TRUE; + } + } else if ( wptTable[ fWeapon ].iSlot == SLOT_GRENADE ) { + if ( self.fSlotGrenade == fWeapon ) { + return TRUE; + } + } else if ( wptTable[ fWeapon ].iSlot == SLOT_C4BOMB ) { + if ( self.fSlotC4Bomb == fWeapon ) { + return TRUE; + } + } + } + + return FALSE; +} + +/* +================= +Weapon_SlotEmpty + +Returns whether or not a slot is empty +================= +*/ +float Weapon_SlotEmpty( int fSlot ) { + if ( fSlot == SLOT_PRIMARY ) { + if ( self.fSlotPrimary == 0 ) { + return TRUE; + } + } else if ( fSlot == SLOT_SECONDARY ) { + if ( self.fSlotSecondary == 0 ) { + return TRUE; + } + } else if ( fSlot == SLOT_GRENADE ) { + if ( self.fSlotGrenade == 0 ) { + return TRUE; + } + } else if ( fSlot == SLOT_C4BOMB ) { + if ( self.fSlotC4Bomb == 0 ) { + return TRUE; + } + } + + return FALSE; +} + +/* +================= +Weapon_Switch + +Switch to the weapon in a given slot +================= +*/ +void Weapon_Switch( int iSlot ) { + float fWeapon; + + if ( iSlot == SLOT_MELEE ) { + fWeapon = self.fSlotMelee; + } else if ( iSlot == SLOT_PRIMARY ) { + fWeapon = self.fSlotPrimary; + } else if ( iSlot == SLOT_SECONDARY ) { + fWeapon = self.fSlotSecondary; + } else if ( iSlot == SLOT_GRENADE ) { + fWeapon = self.fSlotGrenade; + } else if ( iSlot == SLOT_C4BOMB ) { + fWeapon = self.fSlotC4Bomb; + } + + if ( !fWeapon || self.weapon == fWeapon ) { + return; + } + + Weapon_Draw( fWeapon ); +} + +/* +================= +Weapon_UpdateCurrents + +Update the ammo fields for the clientside display +================= +*/ +void Weapon_UpdateCurrents( void ) { + self.iCurrentMag = self.(wptTable[ self.weapon ].iMagfld); + self.iCurrentCaliber = self.(wptTable[ self.weapon ].iCaliberfld); +} + +/* +================= +Weapon_AddItem + +Gives a weapon to the player +================= +*/ +void Weapon_AddItem( float fWeapon ) { + if ( Weapon_SlotEmpty ( wptTable[ fWeapon ].iSlot ) == FALSE ) { + Weapon_DropWeapon( wptTable[ fWeapon ].iSlot ); + } + + // Add the gun to the appropriate slot + if( wptTable[ fWeapon ].iSlot == SLOT_MELEE ) { + self.fSlotMelee = fWeapon; + } else if ( wptTable[ fWeapon ].iSlot == SLOT_SECONDARY ) { + self.fSlotSecondary = fWeapon; + } else if( wptTable[ fWeapon ].iSlot == SLOT_PRIMARY ) { + self.fSlotPrimary = fWeapon; + } else if ( wptTable[ fWeapon ].iSlot == SLOT_GRENADE ) { + self.fSlotGrenade = fWeapon; + } else if ( wptTable[ fWeapon ].iSlot == SLOT_C4BOMB ) { + self.fSlotC4Bomb = fWeapon; + } + + // Make sure we've got at least one full clip + self.(wptTable[ fWeapon ].iMagfld) = wptTable[ fWeapon ].iMagSize; +} + +/* +================= +Weapon_GiveAmmo + +Gives a specific amount of ammo to the player +================= +*/ +void Weapon_GiveAmmo( float fWeapon, float fAmount ) { + self.(wptTable[ fWeapon ].iCaliberfld ) += fAmount; + Weapon_UpdateCurrents(); +} + +/* +================= +Weapon_SwitchBest + +Switches to the currently best suited weapon +================= +*/ +void Weapon_SwitchBest( void ) { + if ( self.fSlotSecondary ) { + Weapon_Switch( SLOT_SECONDARY ); + } else if ( self.fSlotPrimary ) { + Weapon_Switch( SLOT_PRIMARY ); + } else { + Weapon_Switch( SLOT_MELEE ); + } +} + +/* +================= +Weapon_DropWeapon + +Drop the weapon in a given slot +================= +*/ +void Weapon_DropWeapon( int iSlot ) { + static void Weapon_DropWeapon_Touch( void ) { + if ( other.classname != "player" ) { + return; + } else if ( other == self.owner ) { + return; + } + + // No bomb for the CTs + if ( ( self.weapon == WEAPON_C4BOMB ) && ( other.team == TEAM_CT ) ) { + return; + } + + entity eOld = self; + self = other; + + if ( Weapon_SlotEmpty( Weapon_GetSlot( eOld.weapon ) ) ) { + Weapon_AddItem( eOld.weapon ); + Weapon_Draw( eOld.weapon ); + self.(wptTable[ eOld.weapon ].iMagfld) = eOld.health; + Weapon_UpdateCurrents(); + } else { + self = eOld; + return; + } + + self = eOld; + remove( self ); + } + + static void Weapon_DropWeapon_Think( void ) { + self.owner = world; + } + + float fWeapon; + + if ( iSlot == SLOT_PRIMARY ) { + fWeapon = self.fSlotPrimary; + self.fSlotPrimary = 0; + } else if ( iSlot == SLOT_SECONDARY ) { + fWeapon = self.fSlotSecondary; + self.fSlotSecondary = 0; + } else if ( iSlot == SLOT_GRENADE ) { + fWeapon = self.fSlotGrenade; + self.fSlotGrenade = 0; + } else if ( iSlot == SLOT_C4BOMB ) { + fWeapon = self.fSlotC4Bomb; + self.fSlotC4Bomb = 0; + } else { + return; + } + + entity eDrop = spawn(); + setorigin( eDrop, self.origin + self.view_ofs ); + setmodel( eDrop, sWeaponModels[ fWeapon ] ); + eDrop.classname = "remove_me"; + eDrop.owner = self; + eDrop.movetype = MOVETYPE_TOSS; + eDrop.solid = SOLID_TRIGGER; + eDrop.weapon = fWeapon; + eDrop.think = Weapon_DropWeapon_Think; + eDrop.touch = Weapon_DropWeapon_Touch; + eDrop.nextthink = time + 1.0f; + eDrop.health = self.(wptTable[ fWeapon ].iMagfld); + setsize( eDrop, '-16 -16 0', '16 16 16' ); + + makevectors( self.v_angle ); + + if (fWeapon == WEAPON_C4BOMB && autocvar_fcs_bombaltthrow) { + eDrop.velocity = v_forward * random(32, 96); + eDrop.velocity += v_right * random(-64, 64); + eDrop.velocity[2] = 0; + } else { + eDrop.velocity = self.velocity + v_forward * 256; + } + + self.weapon = 0; + Weapon_SwitchBest(); +} + +/* +================= +CSEv_PlayerBuyWeapon_f + +Client call for buying a weapon through GUI or console command +================= +*/ +void CSEv_PlayerBuyWeapon_f( float fWeapon ) { + if ( Rules_BuyingPossible() == FALSE ) { + return; + } + + if ( self.team == TEAM_T ) { + if ( fWeapon == WEAPON_M4A1 ) { return; } + if ( fWeapon == WEAPON_AUG ) { return; } + if ( fWeapon == WEAPON_SG550 ) { return; } + if ( fWeapon == WEAPON_FIVESEVEN ) { return; } + if ( fWeapon == WEAPON_TMP ) { return; } + } else if ( self.team == TEAM_CT ) { + if ( fWeapon == WEAPON_AK47 ) { return; } + if ( fWeapon == WEAPON_SG552 ) { return; } + if ( fWeapon == WEAPON_G3SG1 ) { return; } + if ( fWeapon == WEAPON_ELITES ) { return; } + if ( fWeapon == WEAPON_MAC10 ) { return; } + } + + if ( ( self.fMoney - wptTable[ fWeapon ].iPrice ) >= 0 ) { + Weapon_AddItem(fWeapon); + Ammo_AutoFill(fWeapon); + + Weapon_Draw( fWeapon ); + Money_AddMoney( self, -wptTable[ fWeapon ].iPrice ); + + sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); + } else { + centerprint( self, "You have insufficient funds!" ); + } +} + +/* +================= +CSEv_PlayerSwitchWeapon_f + +Client-HUD call that switches to a specific weapon +================= +*/ +void CSEv_PlayerSwitchWeapon_f( float fWeapon ) { + if ( ( Weapon_AlreadyExists( fWeapon ) == FALSE ) && ( fWeapon != WEAPON_KNIFE ) ) { + return; + } + if (wptTable[fWeapon].iSlot == SLOT_GRENADE) { + if (fWeapon == WEAPON_HEGRENADE && !(self.iAmmo_HEGRENADE)) { + return; + } else if (fWeapon == WEAPON_FLASHBANG && !(self.iAmmo_FLASHBANG)) { + return; + } else if (fWeapon == WEAPON_SMOKEGRENADE && !(self.iAmmo_SMOKEGRENADE)) { + return; + } + } + if ( fWeapon != self.weapon ) { + Weapon_Draw( fWeapon ); + } +} + +/* +================= +CSEv_WeaponDrop + +Client call that tells us to drop the currently equipped weapon +================= +*/ +void CSEv_WeaponDrop( void ) { + Weapon_DropWeapon( wptTable[ self.weapon ].iSlot ); +} +#endif diff --git a/src/shared/cstrike/weaponscout.c b/src/shared/cstrike.old/weaponscout.c similarity index 100% rename from src/shared/cstrike/weaponscout.c rename to src/shared/cstrike.old/weaponscout.c diff --git a/src/shared/cstrike/weaponsg550.c b/src/shared/cstrike.old/weaponsg550.c similarity index 100% rename from src/shared/cstrike/weaponsg550.c rename to src/shared/cstrike.old/weaponsg550.c diff --git a/src/shared/cstrike/weaponsg552.c b/src/shared/cstrike.old/weaponsg552.c similarity index 100% rename from src/shared/cstrike/weaponsg552.c rename to src/shared/cstrike.old/weaponsg552.c diff --git a/src/shared/cstrike/weaponsmokegrenade.c b/src/shared/cstrike.old/weaponsmokegrenade.c similarity index 98% rename from src/shared/cstrike/weaponsmokegrenade.c rename to src/shared/cstrike.old/weaponsmokegrenade.c index dcbe706d..e47ebad1 100755 --- a/src/shared/cstrike/weaponsmokegrenade.c +++ b/src/shared/cstrike.old/weaponsmokegrenade.c @@ -114,7 +114,7 @@ void WeaponSMOKEGRENADE_Throw( void ) { return; } if ( other.classname == "func_breakable" ) { - Damage_Apply( other, self, 50, self.origin, FALSE, 0); + Damage_Apply( other, self, 50, FALSE, 0); self.velocity = Caliber_Reflect( self.velocity, trace_plane_normal ); } sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM ); diff --git a/src/shared/cstrike/weapontmp.c b/src/shared/cstrike.old/weapontmp.c similarity index 100% rename from src/shared/cstrike/weapontmp.c rename to src/shared/cstrike.old/weapontmp.c diff --git a/src/shared/cstrike/weaponump45.c b/src/shared/cstrike.old/weaponump45.c similarity index 100% rename from src/shared/cstrike/weaponump45.c rename to src/shared/cstrike.old/weaponump45.c diff --git a/src/shared/cstrike/weaponusp45.c b/src/shared/cstrike.old/weaponusp45.c similarity index 100% rename from src/shared/cstrike/weaponusp45.c rename to src/shared/cstrike.old/weaponusp45.c diff --git a/src/shared/cstrike/weaponxm1014.c b/src/shared/cstrike.old/weaponxm1014.c similarity index 100% rename from src/shared/cstrike/weaponxm1014.c rename to src/shared/cstrike.old/weaponxm1014.c diff --git a/src/shared/cstrike/equipment.c b/src/shared/cstrike/equipment.c index 1d7df15a..9ed32fb0 100755 --- a/src/shared/cstrike/equipment.c +++ b/src/shared/cstrike/equipment.c @@ -14,19 +14,9 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -equipmentinfo_t eqptTable [ CS_EQUIPMENT_COUNT ] = { - { EQUIPMENT_KEVLAR, 650 }, - { EQUIPMENT_HELMET, 1000 }, - { WEAPON_FLASHBANG, 300 }, - { WEAPON_HEGRENADE, 300 }, - { WEAPON_SMOKEGRENADE, 300 }, - { EQUIPMENT_DEFUSALKIT, 200 }, - { EQUIPMENT_NIGHTVISION, 1250 }, -}; - #ifdef SSQC void CSEv_PlayerBuyEquipment_f( float fID ) { - if ( Rules_BuyingPossible() == FALSE ) { +/* if ( Rules_BuyingPossible() == FALSE ) { return; } @@ -119,6 +109,6 @@ void CSEv_PlayerBuyEquipment_f( float fID ) { centerprint( self, "You have insufficient funds!" ); } - self.fAttackFinished = time + 1.0; + self.fAttackFinished = time + 1.0;*/ } #endif diff --git a/src/shared/cstrike/items.h b/src/shared/cstrike/items.h new file mode 100644 index 00000000..419c73e5 --- /dev/null +++ b/src/shared/cstrike/items.h @@ -0,0 +1,51 @@ +/* + * 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 ITEM_KNIFE 0x00000001i +#define ITEM_USP45 0x00000002i +#define ITEM_GLOCK18 0x00000004i +#define ITEM_DEAGLE 0x00000008i +#define ITEM_P228 0x00000010i +#define ITEM_ELITES 0x00000020i +#define ITEM_FIVESEVEN 0x00000040i +#define ITEM_M3 0x00000080i + +#define ITEM_XM1014 0x00000100i +#define ITEM_MP5 0x00000200i +#define ITEM_P90 0x00000400i +#define ITEM_UMP45 0x00000800i +#define ITEM_MAC10 0x00001000i +#define ITEM_TMP 0x00002000i +#define ITEM_SUIT 0x00004000i +#define ITEM_LONGJUMP 0x00008000i + +#define ITEM_AK47 0x00010000i +#define ITEM_SG552 0x00020000i +#define ITEM_M4A1 0x00040000i +#define ITEM_AUG 0x00080000i +#define ITEM_SCOUT 0x00100000i +#define ITEM_AWP 0x00200000i +#define ITEM_G3SG1 0x00400000i +#define ITEM_SG550 0x00800000i + +#define ITEM_PARA 0x01000000i +#define ITEM_C4BOMB 0x02000000i +#define ITEM_FLASHBANG 0x04000000i +#define ITEM_HEGRENADE 0x08000000i +#define ITEM_SMOKEGRENADE 0x10000000i +#define ITEM_DEFUSAL 0x20000000i +#define ITEM_NIGHTVISION 0x40000000i +#define ITEM_HELMET 0x80000000i diff --git a/src/shared/cstrike/player.cpp b/src/shared/cstrike/player.cpp index 5dd82eea..05a824ef 100644 --- a/src/shared/cstrike/player.cpp +++ b/src/shared/cstrike/player.cpp @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -int input_sequence; +noref int input_sequence; class player:CBaseEntity { float health; diff --git a/src/shared/cstrike/w_ak47.c b/src/shared/cstrike/w_ak47.c new file mode 100644 index 00000000..aab12c22 --- /dev/null +++ b/src/shared/cstrike/w_ak47.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + AK47_IDLE, + AK47_RELOAD, + AK47_DRAW, + AK47_SHOOT1, + AK47_SHOOT2, + AK47_SHOOT3 +}; + +void +w_ak47_precache(void) +{ + precache_model("models/v_ak47.mdl"); + precache_model("models/w_ak47.mdl"); + precache_model("models/p_ak47.mdl"); +} + +void +w_ak47_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.ak47_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_ak47_wmodel(void) +{ + return "models/w_ak47.mdl"; +} + +string +w_ak47_pmodel(void) +{ + return "models/p_ak47.mdl"; +} + +string +w_ak47_deathmsg(void) +{ + return ""; +} + +int +w_ak47_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.ak47_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_ak47_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_ak47.mdl"); + Weapons_ViewAnimation(AK47_DRAW); +#endif +} + +void +w_ak47_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(AK47_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(AK47_SHOOT2); + break; + default: + Weapons_ViewAnimation(AK47_SHOOT3); + break; + } +#else + if (!pl.ak47_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_AK47); + + pl.ak47_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/ak47-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/ak47-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_ak47_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.ak47_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + 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; +} + +float +w_ak47_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_ak47_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_ak47_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud11.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud11.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_ak47 = +{ + ITEM_AK47, + 0, + 7, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_ak47_draw, + __NULL__, + w_ak47_primary, + __NULL__, + w_ak47_reload, + __NULL__, + w_ak47_hud, + w_ak47_precache, + w_ak47_pickup, + w_ak47_updateammo, + w_ak47_wmodel, + w_ak47_pmodel, + w_ak47_deathmsg, + w_ak47_aimanim, + w_ak47_hudpic +}; + +#ifdef SSQC +void +weapon_ak47(void) +{ + Weapons_InitItem(WEAPON_AK47); +} +#endif diff --git a/src/shared/cstrike/w_aug.c b/src/shared/cstrike/w_aug.c new file mode 100644 index 00000000..25c739d0 --- /dev/null +++ b/src/shared/cstrike/w_aug.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + AUG_IDLE, + AUG_RELOAD, + AUG_DRAW, + AUG_SHOOT1, + AUG_SHOOT2, + AUG_SHOOT3 +}; + +void +w_aug_precache(void) +{ + precache_model("models/v_aug.mdl"); + precache_model("models/w_aug.mdl"); + precache_model("models/p_aug.mdl"); +} + +void +w_aug_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.aug_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_aug_wmodel(void) +{ + return "models/w_aug.mdl"; +} + +string +w_aug_pmodel(void) +{ + return "models/p_aug.mdl"; +} + +string +w_aug_deathmsg(void) +{ + return ""; +} + +int +w_aug_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.aug_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_aug_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_aug.mdl"); + Weapons_ViewAnimation(AUG_DRAW); +#endif +} + +void +w_aug_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(AUG_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(AUG_SHOOT2); + break; + default: + Weapons_ViewAnimation(AUG_SHOOT3); + break; + } +#else + if (!pl.aug_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/aug-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/aug-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_aug_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.aug_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + 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; +} + +float +w_aug_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_aug_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_aug_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud15.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud14.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_aug = +{ + ITEM_AUG, + 0, + 10, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_aug_draw, + __NULL__, + w_aug_primary, + __NULL__, + w_aug_reload, + __NULL__, + w_aug_hud, + w_aug_precache, + w_aug_pickup, + w_aug_updateammo, + w_aug_wmodel, + w_aug_pmodel, + w_aug_deathmsg, + w_aug_aimanim, + w_aug_hudpic +}; + +#ifdef SSQC +void +weapon_aug(void) +{ + Weapons_InitItem(WEAPON_AUG); +} +#endif diff --git a/src/shared/cstrike/w_awp.c b/src/shared/cstrike/w_awp.c new file mode 100644 index 00000000..a4f729e4 --- /dev/null +++ b/src/shared/cstrike/w_awp.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + AWP_IDLE, + AWP_RELOAD, + AWP_DRAW, + AWP_SHOOT1, + AWP_SHOOT2, + AWP_SHOOT3 +}; + +void +w_awp_precache(void) +{ + precache_model("models/v_awp.mdl"); + precache_model("models/w_awp.mdl"); + precache_model("models/p_awp.mdl"); +} + +void +w_awp_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_awp_wmodel(void) +{ + return "models/w_awp.mdl"; +} + +string +w_awp_pmodel(void) +{ + return "models/p_awp.mdl"; +} + +string +w_awp_deathmsg(void) +{ + return ""; +} + +int +w_awp_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.awp_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_awp_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_awp.mdl"); + Weapons_ViewAnimation(AWP_DRAW); +#endif +} + +void +w_awp_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(AWP_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(AWP_SHOOT2); + break; + default: + Weapons_ViewAnimation(AWP_SHOOT3); + break; + } +#else + if (!pl.awp_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/awp-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/awp-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_awp_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.awp_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::awp_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.awp_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(AWP_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_awp_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_awp_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_awp_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud5.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud2.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_awp = +{ + ITEM_AWP, + 0, + 12, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_awp_draw, + __NULL__, + w_awp_primary, + __NULL__, + w_awp_reload, + __NULL__, + w_awp_hud, + w_awp_precache, + w_awp_pickup, + w_awp_updateammo, + w_awp_wmodel, + w_awp_pmodel, + w_awp_deathmsg, + w_awp_aimanim, + w_awp_hudpic +}; + +#ifdef SSQC +void +weapon_awp(void) +{ + Weapons_InitItem(WEAPON_AWP); +} +#endif diff --git a/src/shared/cstrike/w_c4bomb.c b/src/shared/cstrike/w_c4bomb.c new file mode 100644 index 00000000..1f80a52c --- /dev/null +++ b/src/shared/cstrike/w_c4bomb.c @@ -0,0 +1,166 @@ +/* + * 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. + */ + +enum { + C4BOMB_IDLE, + C4BOMB_RELOAD, + C4BOMB_DRAW, + C4BOMB_SHOOT1, + C4BOMB_SHOOT2, + C4BOMB_SHOOT3 +}; + +void +w_c4bomb_precache(void) +{ + precache_model("models/v_c4bomb.mdl"); + precache_model("models/w_c4bomb.mdl"); + precache_model("models/p_c4bomb.mdl"); +} + +void +w_c4bomb_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, -1, -1, -1); +#endif +} + +string +w_c4bomb_wmodel(void) +{ + return "models/w_c4bomb.mdl"; +} + +string +w_c4bomb_pmodel(void) +{ + return "models/p_c4bomb.mdl"; +} + +string +w_c4bomb_deathmsg(void) +{ + return ""; +} + +void +w_c4bomb_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_c4bomb.mdl"); + Weapons_ViewAnimation(C4BOMB_DRAW); +#endif +} + +void +w_c4bomb_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(C4BOMB_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(C4BOMB_SHOOT2); + break; + default: + Weapons_ViewAnimation(C4BOMB_SHOOT3); + break; + } +#endif + + pl.w_attack_next = 0.0955f; +} + +float +w_c4bomb_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_c4bomb_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_c4bomb = +{ + ITEM_C4BOMB, + 4, + 0, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_c4bomb_draw, + __NULL__, + w_c4bomb_primary, + __NULL__, + __NULL__, + __NULL__, + __NULL__, + w_c4bomb_precache, + __NULL__, + w_c4bomb_updateammo, + w_c4bomb_wmodel, + w_c4bomb_pmodel, + w_c4bomb_deathmsg, + w_c4bomb_aimanim, + w_c4bomb_hudpic +}; + +#ifdef SSQC +void +weapon_c4bomb(void) +{ + Weapons_InitItem(WEAPON_C4BOMB); +} +#endif diff --git a/src/shared/cstrike/w_deagle.c b/src/shared/cstrike/w_deagle.c new file mode 100644 index 00000000..560ff103 --- /dev/null +++ b/src/shared/cstrike/w_deagle.c @@ -0,0 +1,254 @@ +/* + * 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. + */ + +enum { + DEAGLE_IDLE, + DEAGLE_RELOAD, + DEAGLE_DRAW, + DEAGLE_SHOOT1, + DEAGLE_SHOOT2, + DEAGLE_SHOOT3 +}; + +void +w_deagle_precache(void) +{ + precache_model("models/v_deagle.mdl"); + precache_model("models/w_deagle.mdl"); + precache_model("models/p_deagle.mdl"); + precache_sound("weapons/deagle-1.wav"); + precache_sound("weapons/deagle-2.wav"); +} + +void +w_deagle_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.deagle_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_deagle_wmodel(void) +{ + return "models/w_deagle.mdl"; +} + +string +w_deagle_pmodel(void) +{ + return "models/p_deagle.mdl"; +} + +string +w_deagle_deathmsg(void) +{ + return ""; +} + +int +w_deagle_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.deagle_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_deagle_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_deagle.mdl"); + Weapons_ViewAnimation(DEAGLE_DRAW); +#endif +} + +void +w_deagle_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(DEAGLE_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(DEAGLE_SHOOT2); + break; + default: + Weapons_ViewAnimation(DEAGLE_SHOOT3); + break; + } +#else + if (!pl.deagle_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_DEAGLE); + + pl.deagle_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/deagle-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/deagle-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_deagle_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.deagle_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::deagle_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.deagle_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(DEAGLE_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_deagle_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_deagle_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_deagle_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud11.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud10.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_deagle = +{ + ITEM_DEAGLE, + 1, + 2, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_deagle_draw, + __NULL__, + w_deagle_primary, + __NULL__, + w_deagle_reload, + __NULL__, + w_deagle_hud, + w_deagle_precache, + w_deagle_pickup, + w_deagle_updateammo, + w_deagle_wmodel, + w_deagle_pmodel, + w_deagle_deathmsg, + w_deagle_aimanim, + w_deagle_hudpic +}; + +#ifdef SSQC +void +weapon_deagle(void) +{ + Weapons_InitItem(WEAPON_DEAGLE); +} +#endif diff --git a/src/shared/cstrike/w_elites.c b/src/shared/cstrike/w_elites.c new file mode 100644 index 00000000..391a2f46 --- /dev/null +++ b/src/shared/cstrike/w_elites.c @@ -0,0 +1,254 @@ +/* + * 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. + */ + +enum { + ELITES_IDLE, + ELITES_RELOAD, + ELITES_DRAW, + ELITES_SHOOT1, + ELITES_SHOOT2, + ELITES_SHOOT3 +}; + +void +w_elites_precache(void) +{ + precache_model("models/v_elites.mdl"); + precache_model("models/w_elites.mdl"); + precache_model("models/p_elites.mdl"); + precache_sound("weapons/elites-1.wav"); + precache_sound("weapons/elites-2.wav"); +} + +void +w_elites_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_elites_wmodel(void) +{ + return "models/w_elites.mdl"; +} + +string +w_elites_pmodel(void) +{ + return "models/p_elites.mdl"; +} + +string +w_elites_deathmsg(void) +{ + return ""; +} + +int +w_elites_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.elites_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_elites_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_elites.mdl"); + Weapons_ViewAnimation(ELITES_DRAW); +#endif +} + +void +w_elites_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(ELITES_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(ELITES_SHOOT2); + break; + default: + Weapons_ViewAnimation(ELITES_SHOOT3); + break; + } +#else + if (!pl.elites_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_ELITES); + + pl.elites_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/elites-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/elites-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_elites_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.elites_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::elites_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.elites_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(ELITES_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_elites_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_elites_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_elites_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud15.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud14.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_elites = +{ + ITEM_ELITES, + 1, + 4, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_elites_draw, + __NULL__, + w_elites_primary, + __NULL__, + w_elites_reload, + __NULL__, + w_elites_hud, + w_elites_precache, + w_elites_pickup, + w_elites_updateammo, + w_elites_wmodel, + w_elites_pmodel, + w_elites_deathmsg, + w_elites_aimanim, + w_elites_hudpic +}; + +#ifdef SSQC +void +weapon_elites(void) +{ + Weapons_InitItem(WEAPON_ELITES); +} +#endif diff --git a/src/shared/cstrike/w_fiveseven.c b/src/shared/cstrike/w_fiveseven.c new file mode 100644 index 00000000..998d67dc --- /dev/null +++ b/src/shared/cstrike/w_fiveseven.c @@ -0,0 +1,254 @@ +/* + * 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. + */ + +enum { + FIVESEVEN_IDLE, + FIVESEVEN_RELOAD, + FIVESEVEN_DRAW, + FIVESEVEN_SHOOT1, + FIVESEVEN_SHOOT2, + FIVESEVEN_SHOOT3 +}; + +void +w_fiveseven_precache(void) +{ + precache_model("models/v_fiveseven.mdl"); + precache_model("models/w_fiveseven.mdl"); + precache_model("models/p_fiveseven.mdl"); + precache_sound("weapons/fiveseven-1.wav"); + precache_sound("weapons/fiveseven-2.wav"); +} + +void +w_fiveseven_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_fiveseven_wmodel(void) +{ + return "models/w_fiveseven.mdl"; +} + +string +w_fiveseven_pmodel(void) +{ + return "models/p_fiveseven.mdl"; +} + +string +w_fiveseven_deathmsg(void) +{ + return ""; +} + +int +w_fiveseven_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.fiveseven_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_fiveseven_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_fiveseven.mdl"); + Weapons_ViewAnimation(FIVESEVEN_DRAW); +#endif +} + +void +w_fiveseven_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(FIVESEVEN_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(FIVESEVEN_SHOOT2); + break; + default: + Weapons_ViewAnimation(FIVESEVEN_SHOOT3); + break; + } +#else + if (!pl.fiveseven_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_FIVESEVEN); + + pl.fiveseven_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/fiveseven-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/fiveseven-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_fiveseven_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.fiveseven_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::fiveseven_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.fiveseven_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(FIVESEVEN_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_fiveseven_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_fiveseven_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_fiveseven_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud15.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud14.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_fiveseven = +{ + ITEM_FIVESEVEN, + 1, + 5, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_fiveseven_draw, + __NULL__, + w_fiveseven_primary, + __NULL__, + w_fiveseven_reload, + __NULL__, + w_fiveseven_hud, + w_fiveseven_precache, + w_fiveseven_pickup, + w_fiveseven_updateammo, + w_fiveseven_wmodel, + w_fiveseven_pmodel, + w_fiveseven_deathmsg, + w_fiveseven_aimanim, + w_fiveseven_hudpic +}; + +#ifdef SSQC +void +weapon_fiveseven(void) +{ + Weapons_InitItem(WEAPON_FIVESEVEN); +} +#endif diff --git a/src/shared/cstrike/w_flashbang.c b/src/shared/cstrike/w_flashbang.c new file mode 100644 index 00000000..4ae1fcad --- /dev/null +++ b/src/shared/cstrike/w_flashbang.c @@ -0,0 +1,166 @@ +/* + * 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. + */ + +enum { + FLASHBANG_IDLE, + FLASHBANG_RELOAD, + FLASHBANG_DRAW, + FLASHBANG_SHOOT1, + FLASHBANG_SHOOT2, + FLASHBANG_SHOOT3 +}; + +void +w_flashbang_precache(void) +{ + precache_model("models/v_flashbang.mdl"); + precache_model("models/w_flashbang.mdl"); + precache_model("models/p_flashbang.mdl"); +} + +void +w_flashbang_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, -1, -1, -1); +#endif +} + +string +w_flashbang_wmodel(void) +{ + return "models/w_flashbang.mdl"; +} + +string +w_flashbang_pmodel(void) +{ + return "models/p_flashbang.mdl"; +} + +string +w_flashbang_deathmsg(void) +{ + return ""; +} + +void +w_flashbang_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_flashbang.mdl"); + Weapons_ViewAnimation(FLASHBANG_DRAW); +#endif +} + +void +w_flashbang_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(FLASHBANG_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(FLASHBANG_SHOOT2); + break; + default: + Weapons_ViewAnimation(FLASHBANG_SHOOT3); + break; + } +#endif + + pl.w_attack_next = 0.0955f; +} + +float +w_flashbang_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_flashbang_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud6.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud3.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_flashbang = +{ + ITEM_FLASHBANG, + 3, + 1, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_flashbang_draw, + __NULL__, + w_flashbang_primary, + __NULL__, + __NULL__, + __NULL__, + __NULL__, + w_flashbang_precache, + __NULL__, + w_flashbang_updateammo, + w_flashbang_wmodel, + w_flashbang_pmodel, + w_flashbang_deathmsg, + w_flashbang_aimanim, + w_flashbang_hudpic +}; + +#ifdef SSQC +void +weapon_flashbang(void) +{ + Weapons_InitItem(WEAPON_FLASHBANG); +} +#endif diff --git a/src/shared/cstrike/w_g3sg1.c b/src/shared/cstrike/w_g3sg1.c new file mode 100644 index 00000000..c79fdbd8 --- /dev/null +++ b/src/shared/cstrike/w_g3sg1.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + G3SG1_IDLE, + G3SG1_RELOAD, + G3SG1_DRAW, + G3SG1_SHOOT1, + G3SG1_SHOOT2, + G3SG1_SHOOT3 +}; + +void +w_g3sg1_precache(void) +{ + precache_model("models/v_g3sg1.mdl"); + precache_model("models/w_g3sg1.mdl"); + precache_model("models/p_g3sg1.mdl"); +} + +void +w_g3sg1_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.g3sg1_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_g3sg1_wmodel(void) +{ + return "models/w_g3sg1.mdl"; +} + +string +w_g3sg1_pmodel(void) +{ + return "models/p_g3sg1.mdl"; +} + +string +w_g3sg1_deathmsg(void) +{ + return ""; +} + +int +w_g3sg1_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.g3sg1_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_g3sg1_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_g3sg1.mdl"); + Weapons_ViewAnimation(G3SG1_DRAW); +#endif +} + +void +w_g3sg1_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_G3SG1); + + pl.g3sg1_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/g3sg1-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/g3sg1-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_g3sg1_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.g3sg1_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::g3sg1_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.g3sg1_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(G3SG1_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_g3sg1_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_g3sg1_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_g3sg1_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud5.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud2.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_g3sg1 = +{ + ITEM_G3SG1, + 0, + 13, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_g3sg1_draw, + __NULL__, + w_g3sg1_primary, + __NULL__, + w_g3sg1_reload, + __NULL__, + w_g3sg1_hud, + w_g3sg1_precache, + w_g3sg1_pickup, + w_g3sg1_updateammo, + w_g3sg1_wmodel, + w_g3sg1_pmodel, + w_g3sg1_deathmsg, + w_g3sg1_aimanim, + w_g3sg1_hudpic +}; + +#ifdef SSQC +void +weapon_g3sg1(void) +{ + Weapons_InitItem(WEAPON_G3SG1); +} +#endif diff --git a/src/shared/cstrike/w_glock18.c b/src/shared/cstrike/w_glock18.c new file mode 100644 index 00000000..cb337f1e --- /dev/null +++ b/src/shared/cstrike/w_glock18.c @@ -0,0 +1,254 @@ +/* + * 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. + */ + +enum { + GLOCK18_IDLE, + GLOCK18_RELOAD, + GLOCK18_DRAW, + GLOCK18_SHOOT1, + GLOCK18_SHOOT2, + GLOCK18_SHOOT3 +}; + +void +w_glock18_precache(void) +{ + precache_model("models/v_glock18.mdl"); + precache_model("models/w_glock18.mdl"); + precache_model("models/p_glock18.mdl"); + precache_sound("weapons/glock18-1.wav"); + precache_sound("weapons/glock18-2.wav"); +} + +void +w_glock18_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_glock18_wmodel(void) +{ + return "models/w_glock18.mdl"; +} + +string +w_glock18_pmodel(void) +{ + return "models/p_glock18.mdl"; +} + +string +w_glock18_deathmsg(void) +{ + return ""; +} + +int +w_glock18_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.glock18_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_glock18_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_glock18.mdl"); + Weapons_ViewAnimation(GLOCK18_DRAW); +#endif +} + +void +w_glock18_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(GLOCK18_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(GLOCK18_SHOOT2); + break; + default: + Weapons_ViewAnimation(GLOCK18_SHOOT3); + break; + } +#else + if (!pl.glock18_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_GLOCK18); + + pl.glock18_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/glock18-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/glock18-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_glock18_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.glock18_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::glock18_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.glock18_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(GLOCK18_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_glock18_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_glock18_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_glock18_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_glock18 = +{ + ITEM_GLOCK18, + 1, + 1, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_glock18_draw, + __NULL__, + w_glock18_primary, + __NULL__, + w_glock18_reload, + __NULL__, + w_glock18_hud, + w_glock18_precache, + w_glock18_pickup, + w_glock18_updateammo, + w_glock18_wmodel, + w_glock18_pmodel, + w_glock18_deathmsg, + w_glock18_aimanim, + w_glock18_hudpic +}; + +#ifdef SSQC +void +weapon_glock18(void) +{ + Weapons_InitItem(WEAPON_GLOCK18); +} +#endif diff --git a/src/shared/cstrike/w_hegrenade.c b/src/shared/cstrike/w_hegrenade.c new file mode 100644 index 00000000..f486da37 --- /dev/null +++ b/src/shared/cstrike/w_hegrenade.c @@ -0,0 +1,166 @@ +/* + * 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. + */ + +enum { + HEGRENADE_IDLE, + HEGRENADE_RELOAD, + HEGRENADE_DRAW, + HEGRENADE_SHOOT1, + HEGRENADE_SHOOT2, + HEGRENADE_SHOOT3 +}; + +void +w_hegrenade_precache(void) +{ + precache_model("models/v_hegrenade.mdl"); + precache_model("models/w_hegrenade.mdl"); + precache_model("models/p_hegrenade.mdl"); +} + +void +w_hegrenade_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, -1, -1, -1); +#endif +} + +string +w_hegrenade_wmodel(void) +{ + return "models/w_hegrenade.mdl"; +} + +string +w_hegrenade_pmodel(void) +{ + return "models/p_hegrenade.mdl"; +} + +string +w_hegrenade_deathmsg(void) +{ + return ""; +} + +void +w_hegrenade_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_hegrenade.mdl"); + Weapons_ViewAnimation(HEGRENADE_DRAW); +#endif +} + +void +w_hegrenade_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(HEGRENADE_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(HEGRENADE_SHOOT2); + break; + default: + Weapons_ViewAnimation(HEGRENADE_SHOOT3); + break; + } +#endif + + pl.w_attack_next = 0.0955f; +} + +float +w_hegrenade_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_hegrenade_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud6.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud3.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_hegrenade = +{ + ITEM_HEGRENADE, + 3, + 0, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_hegrenade_draw, + __NULL__, + w_hegrenade_primary, + __NULL__, + __NULL__, + __NULL__, + __NULL__, + w_hegrenade_precache, + __NULL__, + w_hegrenade_updateammo, + w_hegrenade_wmodel, + w_hegrenade_pmodel, + w_hegrenade_deathmsg, + w_hegrenade_aimanim, + w_hegrenade_hudpic +}; + +#ifdef SSQC +void +weapon_hegrenade(void) +{ + Weapons_InitItem(WEAPON_HEGRENADE); +} +#endif diff --git a/src/shared/cstrike/w_knife.c b/src/shared/cstrike/w_knife.c new file mode 100644 index 00000000..cfcdbe8d --- /dev/null +++ b/src/shared/cstrike/w_knife.c @@ -0,0 +1,166 @@ +/* + * 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. + */ + +enum { + KNIFE_IDLE, + KNIFE_RELOAD, + KNIFE_DRAW, + KNIFE_SHOOT1, + KNIFE_SHOOT2, + KNIFE_SHOOT3 +}; + +void +w_knife_precache(void) +{ + precache_model("models/v_knife.mdl"); + precache_model("models/w_knife.mdl"); + precache_model("models/p_knife.mdl"); +} + +void +w_knife_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, -1, -1, -1); +#endif +} + +string +w_knife_wmodel(void) +{ + return "models/w_knife.mdl"; +} + +string +w_knife_pmodel(void) +{ + return "models/p_knife.mdl"; +} + +string +w_knife_deathmsg(void) +{ + return ""; +} + +void +w_knife_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_knife.mdl"); + Weapons_ViewAnimation(KNIFE_DRAW); +#endif +} + +void +w_knife_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(KNIFE_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(KNIFE_SHOOT2); + break; + default: + Weapons_ViewAnimation(KNIFE_SHOOT3); + break; + } +#endif + + pl.w_attack_next = 0.0955f; +} + +float +w_knife_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_knife_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud11.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud10.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_knife = +{ + ITEM_KNIFE, + 2, + 0, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_knife_draw, + __NULL__, + w_knife_primary, + __NULL__, + __NULL__, + __NULL__, + __NULL__, + w_knife_precache, + __NULL__, + w_knife_updateammo, + w_knife_wmodel, + w_knife_pmodel, + w_knife_deathmsg, + w_knife_aimanim, + w_knife_hudpic +}; + +#ifdef SSQC +void +weapon_knife(void) +{ + Weapons_InitItem(WEAPON_KNIFE); +} +#endif diff --git a/src/shared/cstrike/w_m3.c b/src/shared/cstrike/w_m3.c new file mode 100644 index 00000000..35bbd999 --- /dev/null +++ b/src/shared/cstrike/w_m3.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + M3_IDLE, + M3_RELOAD, + M3_DRAW, + M3_SHOOT1, + M3_SHOOT2, + M3_SHOOT3 +}; + +void +w_m3_precache(void) +{ + precache_model("models/v_m3.mdl"); + precache_model("models/w_m3.mdl"); + precache_model("models/p_m3.mdl"); +} + +void +w_m3_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.m3_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_m3_wmodel(void) +{ + return "models/w_m3.mdl"; +} + +string +w_m3_pmodel(void) +{ + return "models/p_m3.mdl"; +} + +string +w_m3_deathmsg(void) +{ + return ""; +} + +int +w_m3_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.m3_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_m3_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_m3.mdl"); + Weapons_ViewAnimation(M3_DRAW); +#endif +} + +void +w_m3_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_M3); + + pl.m3_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/m3-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/m3-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_m3_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.m3_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::m3_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.m3_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(M3_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_m3_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_m3_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_m3_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_m3 = +{ + ITEM_M3, + 0, + 0, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_m3_draw, + __NULL__, + w_m3_primary, + __NULL__, + w_m3_reload, + __NULL__, + w_m3_hud, + w_m3_precache, + w_m3_pickup, + w_m3_updateammo, + w_m3_wmodel, + w_m3_pmodel, + w_m3_deathmsg, + w_m3_aimanim, + w_m3_hudpic +}; + +#ifdef SSQC +void +weapon_m3(void) +{ + Weapons_InitItem(WEAPON_M3); +} +#endif diff --git a/src/shared/cstrike/w_m4a1.c b/src/shared/cstrike/w_m4a1.c new file mode 100644 index 00000000..36b6ec2c --- /dev/null +++ b/src/shared/cstrike/w_m4a1.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + M4A1_IDLE, + M4A1_RELOAD, + M4A1_DRAW, + M4A1_SHOOT1, + M4A1_SHOOT2, + M4A1_SHOOT3 +}; + +void +w_m4a1_precache(void) +{ + precache_model("models/v_m4a1.mdl"); + precache_model("models/w_m4a1.mdl"); + precache_model("models/p_m4a1.mdl"); +} + +void +w_m4a1_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.m4a1_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_m4a1_wmodel(void) +{ + return "models/w_m4a1.mdl"; +} + +string +w_m4a1_pmodel(void) +{ + return "models/p_m4a1.mdl"; +} + +string +w_m4a1_deathmsg(void) +{ + return ""; +} + +int +w_m4a1_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.m4a1_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_m4a1_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_m4a1.mdl"); + Weapons_ViewAnimation(M4A1_DRAW); +#endif +} + +void +w_m4a1_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(M4A1_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(M4A1_SHOOT2); + break; + default: + Weapons_ViewAnimation(M4A1_SHOOT3); + break; + } +#else + if (!pl.m4a1_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_M4A1); + + pl.m4a1_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/m4a1-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/m4a1-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_m4a1_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.m4a1_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::m4a1_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.m4a1_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(M4A1_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_m4a1_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_m4a1_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_m4a1_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud5.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud2.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_m4a1 = +{ + ITEM_M4A1, + 0, + 9, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_m4a1_draw, + __NULL__, + w_m4a1_primary, + __NULL__, + w_m4a1_reload, + __NULL__, + w_m4a1_hud, + w_m4a1_precache, + w_m4a1_pickup, + w_m4a1_updateammo, + w_m4a1_wmodel, + w_m4a1_pmodel, + w_m4a1_deathmsg, + w_m4a1_aimanim, + w_m4a1_hudpic +}; + +#ifdef SSQC +void +weapon_m4a1(void) +{ + Weapons_InitItem(WEAPON_M4A1); +} +#endif diff --git a/src/shared/cstrike/w_mac10.c b/src/shared/cstrike/w_mac10.c new file mode 100644 index 00000000..b9558a74 --- /dev/null +++ b/src/shared/cstrike/w_mac10.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + MAC10_IDLE, + MAC10_RELOAD, + MAC10_DRAW, + MAC10_SHOOT1, + MAC10_SHOOT2, + MAC10_SHOOT3 +}; + +void +w_mac10_precache(void) +{ + precache_model("models/v_mac10.mdl"); + precache_model("models/w_mac10.mdl"); + precache_model("models/p_mac10.mdl"); +} + +void +w_mac10_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_mac10_wmodel(void) +{ + return "models/w_mac10.mdl"; +} + +string +w_mac10_pmodel(void) +{ + return "models/p_mac10.mdl"; +} + +string +w_mac10_deathmsg(void) +{ + return ""; +} + +int +w_mac10_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.mac10_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_mac10_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_mac10.mdl"); + Weapons_ViewAnimation(MAC10_DRAW); +#endif +} + +void +w_mac10_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(MAC10_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(MAC10_SHOOT2); + break; + default: + Weapons_ViewAnimation(MAC10_SHOOT3); + break; + } +#else + if (!pl.mac10_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/mac10-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/mac10-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_mac10_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.mac10_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::mac10_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.mac10_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(MAC10_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_mac10_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_mac10_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_mac10_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud15.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud14.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_mac10 = +{ + ITEM_MAC10, + 0, + 5, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_mac10_draw, + __NULL__, + w_mac10_primary, + __NULL__, + w_mac10_reload, + __NULL__, + w_mac10_hud, + w_mac10_precache, + w_mac10_pickup, + w_mac10_updateammo, + w_mac10_wmodel, + w_mac10_pmodel, + w_mac10_deathmsg, + w_mac10_aimanim, + w_mac10_hudpic +}; + +#ifdef SSQC +void +weapon_mac10(void) +{ + Weapons_InitItem(WEAPON_MAC10); +} +#endif diff --git a/src/shared/cstrike/w_mp5.c b/src/shared/cstrike/w_mp5.c new file mode 100644 index 00000000..f9a44257 --- /dev/null +++ b/src/shared/cstrike/w_mp5.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + MP5_IDLE, + MP5_RELOAD, + MP5_DRAW, + MP5_SHOOT1, + MP5_SHOOT2, + MP5_SHOOT3 +}; + +void +w_mp5_precache(void) +{ + precache_model("models/v_mp5.mdl"); + precache_model("models/w_mp5.mdl"); + precache_model("models/p_mp5.mdl"); +} + +void +w_mp5_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.mp5_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_mp5_wmodel(void) +{ + return "models/w_mp5.mdl"; +} + +string +w_mp5_pmodel(void) +{ + return "models/p_mp5.mdl"; +} + +string +w_mp5_deathmsg(void) +{ + return ""; +} + +int +w_mp5_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.mp5_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_mp5_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_mp5.mdl"); + Weapons_ViewAnimation(MP5_DRAW); +#endif +} + +void +w_mp5_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(MP5_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(MP5_SHOOT2); + break; + default: + Weapons_ViewAnimation(MP5_SHOOT3); + break; + } +#else + if (!pl.mp5_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/mp5-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/mp5-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_mp5_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.mp5_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::mp5_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.mp5_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(MP5_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_mp5_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_mp5_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_mp5_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_mp5 = +{ + ITEM_MP5, + 0, + 2, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_mp5_draw, + __NULL__, + w_mp5_primary, + __NULL__, + w_mp5_reload, + __NULL__, + w_mp5_hud, + w_mp5_precache, + w_mp5_pickup, + w_mp5_updateammo, + w_mp5_wmodel, + w_mp5_pmodel, + w_mp5_deathmsg, + w_mp5_aimanim, + w_mp5_hudpic +}; + +#ifdef SSQC +void +weapon_mp5(void) +{ + Weapons_InitItem(WEAPON_MP5); +} +#endif diff --git a/src/shared/cstrike/w_p228.c b/src/shared/cstrike/w_p228.c new file mode 100644 index 00000000..5c6a7fe1 --- /dev/null +++ b/src/shared/cstrike/w_p228.c @@ -0,0 +1,254 @@ +/* + * 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. + */ + +enum { + P228_IDLE, + P228_RELOAD, + P228_DRAW, + P228_SHOOT1, + P228_SHOOT2, + P228_SHOOT3 +}; + +void +w_p228_precache(void) +{ + precache_model("models/v_p228.mdl"); + precache_model("models/w_p228.mdl"); + precache_model("models/p_p228.mdl"); + precache_sound("weapons/p228-1.wav"); + precache_sound("weapons/p228-2.wav"); +} + +void +w_p228_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_p228_wmodel(void) +{ + return "models/w_p228.mdl"; +} + +string +w_p228_pmodel(void) +{ + return "models/p_p228.mdl"; +} + +string +w_p228_deathmsg(void) +{ + return ""; +} + +int +w_p228_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.p228_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_p228_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_p228.mdl"); + Weapons_ViewAnimation(P228_DRAW); +#endif +} + +void +w_p228_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_P228); + + pl.p228_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/p228-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/p228-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_p228_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.p228_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::p228_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.p228_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(P228_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_p228_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_p228_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_p228_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud13.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud12.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_p228 = +{ + ITEM_P228, + 1, + 3, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_p228_draw, + __NULL__, + w_p228_primary, + __NULL__, + w_p228_reload, + __NULL__, + w_p228_hud, + w_p228_precache, + w_p228_pickup, + w_p228_updateammo, + w_p228_wmodel, + w_p228_pmodel, + w_p228_deathmsg, + w_p228_aimanim, + w_p228_hudpic +}; + +#ifdef SSQC +void +weapon_p228(void) +{ + Weapons_InitItem(WEAPON_P228); +} +#endif diff --git a/src/shared/cstrike/w_p90.c b/src/shared/cstrike/w_p90.c new file mode 100644 index 00000000..f669868f --- /dev/null +++ b/src/shared/cstrike/w_p90.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + P90_IDLE, + P90_RELOAD, + P90_DRAW, + P90_SHOOT1, + P90_SHOOT2, + P90_SHOOT3 +}; + +void +w_p90_precache(void) +{ + precache_model("models/v_p90.mdl"); + precache_model("models/w_p90.mdl"); + precache_model("models/p_p90.mdl"); +} + +void +w_p90_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_p90_wmodel(void) +{ + return "models/w_p90.mdl"; +} + +string +w_p90_pmodel(void) +{ + return "models/p_p90.mdl"; +} + +string +w_p90_deathmsg(void) +{ + return ""; +} + +int +w_p90_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.p90_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_p90_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_p90.mdl"); + Weapons_ViewAnimation(P90_DRAW); +#endif +} + +void +w_p90_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(P90_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(P90_SHOOT2); + break; + default: + Weapons_ViewAnimation(P90_SHOOT3); + break; + } +#else + if (!pl.p90_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/p90-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/p90-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_p90_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.p90_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::p90_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.p90_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(P90_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_p90_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_p90_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_p90_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud13.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud12.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_p90 = +{ + ITEM_P90, + 0, + 3, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_p90_draw, + __NULL__, + w_p90_primary, + __NULL__, + w_p90_reload, + __NULL__, + w_p90_hud, + w_p90_precache, + w_p90_pickup, + w_p90_updateammo, + w_p90_wmodel, + w_p90_pmodel, + w_p90_deathmsg, + w_p90_aimanim, + w_p90_hudpic +}; + +#ifdef SSQC +void +weapon_p90(void) +{ + Weapons_InitItem(WEAPON_P90); +} +#endif diff --git a/src/shared/cstrike/w_para.c b/src/shared/cstrike/w_para.c new file mode 100644 index 00000000..c3e51ef2 --- /dev/null +++ b/src/shared/cstrike/w_para.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + PARA_IDLE, + PARA_RELOAD, + PARA_DRAW, + PARA_SHOOT1, + PARA_SHOOT2, + PARA_SHOOT3 +}; + +void +w_para_precache(void) +{ + precache_model("models/v_para.mdl"); + precache_model("models/w_para.mdl"); + precache_model("models/p_para.mdl"); +} + +void +w_para_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_para_wmodel(void) +{ + return "models/w_para.mdl"; +} + +string +w_para_pmodel(void) +{ + return "models/p_para.mdl"; +} + +string +w_para_deathmsg(void) +{ + return ""; +} + +int +w_para_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.para_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_para_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_para.mdl"); + Weapons_ViewAnimation(PARA_DRAW); +#endif +} + +void +w_para_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_PARA); + + pl.para_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/para-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/para-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_para_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.para_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::para_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.para_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(PARA_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_para_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_para_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_para_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud6.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud3.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_para = +{ + ITEM_PARA, + 0, + 15, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_para_draw, + __NULL__, + w_para_primary, + __NULL__, + w_para_reload, + __NULL__, + w_para_hud, + w_para_precache, + w_para_pickup, + w_para_updateammo, + w_para_wmodel, + w_para_pmodel, + w_para_deathmsg, + w_para_aimanim, + w_para_hudpic +}; + +#ifdef SSQC +void +weapon_para(void) +{ + Weapons_InitItem(WEAPON_PARA); +} +#endif diff --git a/src/shared/cstrike/w_scout.c b/src/shared/cstrike/w_scout.c new file mode 100644 index 00000000..876e05cc --- /dev/null +++ b/src/shared/cstrike/w_scout.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + SCOUT_IDLE, + SCOUT_RELOAD, + SCOUT_DRAW, + SCOUT_SHOOT1, + SCOUT_SHOOT2, + SCOUT_SHOOT3 +}; + +void +w_scout_precache(void) +{ + precache_model("models/v_scout.mdl"); + precache_model("models/w_scout.mdl"); + precache_model("models/p_scout.mdl"); +} + +void +w_scout_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.scout_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_scout_wmodel(void) +{ + return "models/w_scout.mdl"; +} + +string +w_scout_pmodel(void) +{ + return "models/p_scout.mdl"; +} + +string +w_scout_deathmsg(void) +{ + return ""; +} + +int +w_scout_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.scout_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_scout_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_scout.mdl"); + Weapons_ViewAnimation(SCOUT_DRAW); +#endif +} + +void +w_scout_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_SCOUT); + + pl.scout_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/scout-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/scout-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_scout_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.scout_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::scout_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.scout_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(SCOUT_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_scout_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_scout_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_scout_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud13.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud12.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_scout = +{ + ITEM_SCOUT, + 0, + 11, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_scout_draw, + __NULL__, + w_scout_primary, + __NULL__, + w_scout_reload, + __NULL__, + w_scout_hud, + w_scout_precache, + w_scout_pickup, + w_scout_updateammo, + w_scout_wmodel, + w_scout_pmodel, + w_scout_deathmsg, + w_scout_aimanim, + w_scout_hudpic +}; + +#ifdef SSQC +void +weapon_scout(void) +{ + Weapons_InitItem(WEAPON_SCOUT); +} +#endif diff --git a/src/shared/cstrike/w_sg550.c b/src/shared/cstrike/w_sg550.c new file mode 100644 index 00000000..400fb7bd --- /dev/null +++ b/src/shared/cstrike/w_sg550.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + SG550_IDLE, + SG550_RELOAD, + SG550_DRAW, + SG550_SHOOT1, + SG550_SHOOT2, + SG550_SHOOT3 +}; + +void +w_sg550_precache(void) +{ + precache_model("models/v_sg550.mdl"); + precache_model("models/w_sg550.mdl"); + precache_model("models/p_sg550.mdl"); +} + +void +w_sg550_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_sg550_wmodel(void) +{ + return "models/w_sg550.mdl"; +} + +string +w_sg550_pmodel(void) +{ + return "models/p_sg550.mdl"; +} + +string +w_sg550_deathmsg(void) +{ + return ""; +} + +int +w_sg550_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.sg550_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_sg550_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_sg550.mdl"); + Weapons_ViewAnimation(SG550_DRAW); +#endif +} + +void +w_sg550_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_SG550); + + pl.sg550_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/sg550-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/sg550-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_sg550_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.sg550_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::sg550_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.sg550_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(SG550_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_sg550_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_sg550_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_sg550_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud15.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud14.spr_0.tga", + [0,180/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_sg550 = +{ + ITEM_SG550, + 0, + 14, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_sg550_draw, + __NULL__, + w_sg550_primary, + __NULL__, + w_sg550_reload, + __NULL__, + w_sg550_hud, + w_sg550_precache, + w_sg550_pickup, + w_sg550_updateammo, + w_sg550_wmodel, + w_sg550_pmodel, + w_sg550_deathmsg, + w_sg550_aimanim, + w_sg550_hudpic +}; + +#ifdef SSQC +void +weapon_sg550(void) +{ + Weapons_InitItem(WEAPON_SG550); +} +#endif diff --git a/src/shared/cstrike/w_sg552.c b/src/shared/cstrike/w_sg552.c new file mode 100644 index 00000000..058bf27c --- /dev/null +++ b/src/shared/cstrike/w_sg552.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + SG552_IDLE, + SG552_RELOAD, + SG552_DRAW, + SG552_SHOOT1, + SG552_SHOOT2, + SG552_SHOOT3 +}; + +void +w_sg552_precache(void) +{ + precache_model("models/v_sg552.mdl"); + precache_model("models/w_sg552.mdl"); + precache_model("models/p_sg552.mdl"); +} + +void +w_sg552_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_sg552_wmodel(void) +{ + return "models/w_sg552.mdl"; +} + +string +w_sg552_pmodel(void) +{ + return "models/p_sg552.mdl"; +} + +string +w_sg552_deathmsg(void) +{ + return ""; +} + +int +w_sg552_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.sg552_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_sg552_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_sg552.mdl"); + Weapons_ViewAnimation(SG552_DRAW); +#endif +} + +void +w_sg552_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(SG552_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(SG552_SHOOT2); + break; + default: + Weapons_ViewAnimation(SG552_SHOOT3); + break; + } +#else + if (!pl.sg552_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/sg552-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/sg552-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_sg552_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.sg552_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::sg552_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.sg552_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(SG552_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_sg552_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_sg552_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_sg552_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud11.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud10.spr_0.tga", + [0,45/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_sg552 = +{ + ITEM_SG552, + 0, + 8, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_sg552_draw, + __NULL__, + w_sg552_primary, + __NULL__, + w_sg552_reload, + __NULL__, + w_sg552_hud, + w_sg552_precache, + w_sg552_pickup, + w_sg552_updateammo, + w_sg552_wmodel, + w_sg552_pmodel, + w_sg552_deathmsg, + w_sg552_aimanim, + w_sg552_hudpic +}; + +#ifdef SSQC +void +weapon_sg552(void) +{ + Weapons_InitItem(WEAPON_SG552); +} +#endif diff --git a/src/shared/cstrike/w_smokegrenade.c b/src/shared/cstrike/w_smokegrenade.c new file mode 100644 index 00000000..0f225686 --- /dev/null +++ b/src/shared/cstrike/w_smokegrenade.c @@ -0,0 +1,166 @@ +/* + * 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. + */ + +enum { + SMOKEGRENADE_IDLE, + SMOKEGRENADE_RELOAD, + SMOKEGRENADE_DRAW, + SMOKEGRENADE_SHOOT1, + SMOKEGRENADE_SHOOT2, + SMOKEGRENADE_SHOOT3 +}; + +void +w_smokegrenade_precache(void) +{ + precache_model("models/v_smokegrenade.mdl"); + precache_model("models/w_smokegrenade.mdl"); + precache_model("models/p_smokegrenade.mdl"); +} + +void +w_smokegrenade_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, -1, -1, -1); +#endif +} + +string +w_smokegrenade_wmodel(void) +{ + return "models/w_smokegrenade.mdl"; +} + +string +w_smokegrenade_pmodel(void) +{ + return "models/p_smokegrenade.mdl"; +} + +string +w_smokegrenade_deathmsg(void) +{ + return ""; +} + +void +w_smokegrenade_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_smokegrenade.mdl"); + Weapons_ViewAnimation(SMOKEGRENADE_DRAW); +#endif +} + +void +w_smokegrenade_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(SMOKEGRENADE_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(SMOKEGRENADE_SHOOT2); + break; + default: + Weapons_ViewAnimation(SMOKEGRENADE_SHOOT3); + break; + } +#endif + + pl.w_attack_next = 0.0955f; +} + +float +w_smokegrenade_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_smokegrenade_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud6.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud3.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_smokegrenade = +{ + ITEM_SMOKEGRENADE, + 3, + 2, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_smokegrenade_draw, + __NULL__, + w_smokegrenade_primary, + __NULL__, + __NULL__, + __NULL__, + __NULL__, + w_smokegrenade_precache, + __NULL__, + w_smokegrenade_updateammo, + w_smokegrenade_wmodel, + w_smokegrenade_pmodel, + w_smokegrenade_deathmsg, + w_smokegrenade_aimanim, + w_smokegrenade_hudpic +}; + +#ifdef SSQC +void +weapon_smokegrenade(void) +{ + Weapons_InitItem(WEAPON_SMOKEGRENADE); +} +#endif diff --git a/src/shared/cstrike/w_tmp.c b/src/shared/cstrike/w_tmp.c new file mode 100644 index 00000000..b10c0b6e --- /dev/null +++ b/src/shared/cstrike/w_tmp.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + TMP_IDLE, + TMP_RELOAD, + TMP_DRAW, + TMP_SHOOT1, + TMP_SHOOT2, + TMP_SHOOT3 +}; + +void +w_tmp_precache(void) +{ + precache_model("models/v_tmp.mdl"); + precache_model("models/w_tmp.mdl"); + precache_model("models/p_tmp.mdl"); +} + +void +w_tmp_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_tmp_wmodel(void) +{ + return "models/w_tmp.mdl"; +} + +string +w_tmp_pmodel(void) +{ + return "models/p_tmp.mdl"; +} + +string +w_tmp_deathmsg(void) +{ + return ""; +} + +int +w_tmp_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.tmp_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_tmp_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_tmp.mdl"); + Weapons_ViewAnimation(TMP_DRAW); +#endif +} + +void +w_tmp_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(TMP_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(TMP_SHOOT2); + break; + default: + Weapons_ViewAnimation(TMP_SHOOT3); + break; + } +#else + if (!pl.tmp_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/tmp-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/tmp-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_tmp_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.tmp_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::tmp_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.tmp_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(TMP_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_tmp_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_tmp_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_tmp_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud5.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud2.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_tmp = +{ + ITEM_TMP, + 0, + 6, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_tmp_draw, + __NULL__, + w_tmp_primary, + __NULL__, + w_tmp_reload, + __NULL__, + w_tmp_hud, + w_tmp_precache, + w_tmp_pickup, + w_tmp_updateammo, + w_tmp_wmodel, + w_tmp_pmodel, + w_tmp_deathmsg, + w_tmp_aimanim, + w_tmp_hudpic +}; + +#ifdef SSQC +void +weapon_tmp(void) +{ + Weapons_InitItem(WEAPON_TMP); +} +#endif diff --git a/src/shared/cstrike/w_ump45.c b/src/shared/cstrike/w_ump45.c new file mode 100644 index 00000000..ec078f2d --- /dev/null +++ b/src/shared/cstrike/w_ump45.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + UMP45_IDLE, + UMP45_RELOAD, + UMP45_DRAW, + UMP45_SHOOT1, + UMP45_SHOOT2, + UMP45_SHOOT3 +}; + +void +w_ump45_precache(void) +{ + precache_model("models/v_ump45.mdl"); + precache_model("models/w_ump45.mdl"); + precache_model("models/p_ump45.mdl"); +} + +void +w_ump45_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.ump45_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_ump45_wmodel(void) +{ + return "models/w_ump45.mdl"; +} + +string +w_ump45_pmodel(void) +{ + return "models/p_ump45.mdl"; +} + +string +w_ump45_deathmsg(void) +{ + return ""; +} + +int +w_ump45_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.ump45_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_ump45_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_ump45.mdl"); + Weapons_ViewAnimation(UMP45_DRAW); +#endif +} + +void +w_ump45_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(UMP45_SHOOT1); + break; + case 1: + Weapons_ViewAnimation(UMP45_SHOOT2); + break; + default: + Weapons_ViewAnimation(UMP45_SHOOT3); + break; + } +#else + if (!pl.ump45_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [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); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/ump45-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/ump45-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_ump45_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.ump45_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::ump45_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.ump45_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(UMP45_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_ump45_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_ump45_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_ump45_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud16.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud16.spr_0.tga", + [0,0], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_ump45 = +{ + ITEM_UMP45, + 0, + 4, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_ump45_draw, + __NULL__, + w_ump45_primary, + __NULL__, + w_ump45_reload, + __NULL__, + w_ump45_hud, + w_ump45_precache, + w_ump45_pickup, + w_ump45_updateammo, + w_ump45_wmodel, + w_ump45_pmodel, + w_ump45_deathmsg, + w_ump45_aimanim, + w_ump45_hudpic +}; + +#ifdef SSQC +void +weapon_ump45(void) +{ + Weapons_InitItem(WEAPON_UMP45); +} +#endif diff --git a/src/shared/cstrike/w_usp45.c b/src/shared/cstrike/w_usp45.c new file mode 100644 index 00000000..96168722 --- /dev/null +++ b/src/shared/cstrike/w_usp45.c @@ -0,0 +1,254 @@ +/* + * 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. + */ + +enum { + USP45_IDLE, + USP45_RELOAD, + USP45_DRAW, + USP45_SHOOT1, + USP45_SHOOT2, + USP45_SHOOT3 +}; + +void +w_usp45_precache(void) +{ + 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"); +} + +void +w_usp45_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.usp45_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_usp45_wmodel(void) +{ + return "models/w_usp45.mdl"; +} + +string +w_usp45_pmodel(void) +{ + return "models/p_usp45.mdl"; +} + +string +w_usp45_deathmsg(void) +{ + return ""; +} + +int +w_usp45_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.usp45_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_usp45_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_usp45.mdl"); + Weapons_ViewAnimation(USP45_DRAW); +#endif +} + +void +w_usp45_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,3)); + 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.usp45_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_USP45); + + pl.usp45_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/usp45-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/usp45-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_usp45_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.usp45_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::usp45_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.usp45_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(USP45_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_usp45_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_usp45_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_usp45_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud4.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud1.spr_0.tga", + [0,90/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_usp45 = +{ + ITEM_USP45, + 1, + 0, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_usp45_draw, + __NULL__, + w_usp45_primary, + __NULL__, + w_usp45_reload, + __NULL__, + w_usp45_hud, + w_usp45_precache, + w_usp45_pickup, + w_usp45_updateammo, + w_usp45_wmodel, + w_usp45_pmodel, + w_usp45_deathmsg, + w_usp45_aimanim, + w_usp45_hudpic +}; + +#ifdef SSQC +void +weapon_usp45(void) +{ + Weapons_InitItem(WEAPON_USP45); +} +#endif diff --git a/src/shared/cstrike/w_xm1014.c b/src/shared/cstrike/w_xm1014.c new file mode 100644 index 00000000..9053a8fd --- /dev/null +++ b/src/shared/cstrike/w_xm1014.c @@ -0,0 +1,252 @@ +/* + * 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. + */ + +enum { + XM1014_IDLE, + XM1014_RELOAD, + XM1014_DRAW, + XM1014_SHOOT1, + XM1014_SHOOT2, + XM1014_SHOOT3 +}; + +void +w_xm1014_precache(void) +{ + precache_model("models/v_xm1014.mdl"); + precache_model("models/w_xm1014.mdl"); + precache_model("models/p_xm1014.mdl"); +} + +void +w_xm1014_updateammo(player pl) +{ +#ifdef SSQC + Weapons_UpdateAmmo(pl, pl.xm1014_mag, pl.ammo_762mm, -1); +#endif +} + +string +w_xm1014_wmodel(void) +{ + return "models/w_xm1014.mdl"; +} + +string +w_xm1014_pmodel(void) +{ + return "models/p_xm1014.mdl"; +} + +string +w_xm1014_deathmsg(void) +{ + return ""; +} + +int +w_xm1014_pickup(int new) +{ +#ifdef SSQC + player pl = (player)self; + + if (new) { + pl.xm1014_mag = 30; + } else { + if (pl.ammo_762mm < 90) { + pl.ammo_762mm = bound(0, pl.ammo_762mm + 30, 90); + } else { + return FALSE; + } + } +#endif + return TRUE; +} + +void +w_xm1014_draw(void) +{ +#ifdef CSQC + Weapons_SetModel("models/v_xm1014.mdl"); + Weapons_ViewAnimation(XM1014_DRAW); +#endif +} + +void +w_xm1014_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + View_SetMuzzleflash(MUZZLE_RIFLE); + Weapons_ViewPunchAngle([-2,0,0]); + + int r = floor(random(0,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; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs, 8, [0.01,0,01], WEAPON_XM1014); + + pl.xm1014_mag--; + + if (self.flags & FL_CROUCHING) + Animation_PlayerTopTemp(ANIM_SHOOT1HAND, 0.45f); + else + Animation_PlayerTopTemp(ANIM_CR_SHOOT1HAND, 0.45f); + + if (random() < 0.5) { + sound(pl, CHAN_WEAPON, "weapons/xm1014-1.wav", 1.0f, ATTN_NORM); + } else { + sound(pl, CHAN_WEAPON, "weapons/xm1014-2.wav", 1.0f, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.0955f; +} + +void +w_xm1014_reload(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (pl.a_ammo1 >= 30) { + return; + } + if (!pl.a_ammo2) { + return; + } +#else + if (pl.xm1014_mag >= 30) { + return; + } + if (!pl.ammo_762mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::xm1014_mag, player::ammo_762mm, 30); + Weapons_UpdateAmmo(pl, pl.xm1014_mag, pl.ammo_762mm, -1); +#endif + + Weapons_ViewAnimation(XM1014_RELOAD); + pl.w_attack_next = 2.0f; +} + +float +w_xm1014_aimanim(void) +{ + return self.flags & FL_CROUCHING ? ANIM_CR_AIM1HAND : ANIM_AIM1HAND; +} + +void +w_xm1014_hud(void) +{ +#ifdef CSQC + + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); + vector aicon_pos = video_mins + [video_res[0] - 48, video_res[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); +#endif +} + +void +w_xm1014_hudpic(int selected, vector pos, float a) +{ +#ifdef CSQC + if (selected) { + drawsubpic( + pos, + [170,45], + "sprites/640hud13.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } else { + drawsubpic( + pos, + [170,45], + "sprites/640hud12.spr_0.tga", + [0,135/256], + [170/256,45/256], + g_hud_color, + 1.0f, + DRAWFLAG_ADDITIVE + ); + } +#endif +} + +weapon_t w_xm1014 = +{ + ITEM_XM1014, + 0, + 1, + "sprites/640hud1.spr_0.tga", + [32,16], + [192,16], + w_xm1014_draw, + __NULL__, + w_xm1014_primary, + __NULL__, + w_xm1014_reload, + __NULL__, + w_xm1014_hud, + w_xm1014_precache, + w_xm1014_pickup, + w_xm1014_updateammo, + w_xm1014_wmodel, + w_xm1014_pmodel, + w_xm1014_deathmsg, + w_xm1014_aimanim, + w_xm1014_hudpic +}; + +#ifdef SSQC +void +weapon_xm1014(void) +{ + Weapons_InitItem(WEAPON_XM1014); +} +#endif diff --git a/src/shared/cstrike/weapons.c b/src/shared/cstrike/weapons.c old mode 100755 new mode 100644 index 7e82ec96..40844d74 --- a/src/shared/cstrike/weapons.c +++ b/src/shared/cstrike/weapons.c @@ -14,588 +14,34 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -void Temp_Nothing( void ) { } - -#ifdef SSQC -string sWeaponModels[ CS_WEAPON_COUNT ] = { - "", - "models/w_knife.mdl", - "models/w_usp.mdl", - "models/w_glock18.mdl", - "models/w_deagle.mdl", - "models/w_p228.mdl", - "models/w_elite.mdl", - "models/w_fiveseven.mdl", - "models/w_m3.mdl", - "models/w_xm1014.mdl", - "models/w_mp5.mdl", - "models/w_p90.mdl", - "models/w_ump45.mdl", - "models/w_mac10.mdl", - "models/w_tmp.mdl", - "models/w_ak47.mdl", - "models/w_sg552.mdl", - "models/w_m4a1.mdl", - "models/w_aug.mdl", - "models/w_scout.mdl", - "models/w_awp.mdl", - "models/w_g3sg1.mdl", - "models/w_sg550.mdl", - "models/w_m249.mdl", - "models/w_backpack.mdl", - "models/w_flashbang.mdl", - "models/w_hegrenade.mdl", - "models/w_smokegrenade.mdl" +weapon_t w_null = {}; +weapon_t g_weapons[] = { + w_null, + w_m3, + w_xm1014, + w_mp5, + w_p90, + w_ump45, + w_mac10, + w_tmp, + w_ak47, + w_sg552, + w_m4a1, + w_aug, + w_scout, + w_awp, + w_g3sg1, + w_sg550, + w_para, + w_usp45, + w_glock18, + w_deagle, + w_p228, + w_elites, + w_fiveseven, + w_knife, + w_hegrenade, + w_flashbang, + w_smokegrenade, + w_c4bomb }; -#endif - -weaponfunc_t wpnFuncTable[ CS_WEAPON_COUNT ] = { - { Temp_Nothing, Temp_Nothing, Temp_Nothing, Temp_Nothing }, - { WeaponKNIFE_Draw, WeaponKNIFE_PrimaryFire, WeaponKNIFE_Secondary, Temp_Nothing }, - { WeaponUSP45_Draw, WeaponUSP45_PrimaryFire, WeaponUSP45_Secondary, WeaponUSP45_Reload }, - { WeaponGLOCK18_Draw, WeaponGLOCK18_PrimaryFire, WeaponGLOCK18_Secondary, WeaponGLOCK18_Reload }, - { WeaponDEAGLE_Draw, WeaponDEAGLE_PrimaryFire, Temp_Nothing, WeaponDEAGLE_Reload }, - { WeaponP228_Draw, WeaponP228_PrimaryFire, Temp_Nothing, WeaponP228_Reload }, - { WeaponELITES_Draw, WeaponELITES_PrimaryFire, Temp_Nothing, WeaponELITES_Reload }, - { WeaponFIVESEVEN_Draw, WeaponFIVESEVEN_PrimaryFire, Temp_Nothing, WeaponFIVESEVEN_Reload }, -#ifdef SSQC - { WeaponM3_Draw, WeaponM3_PrimaryFire, Temp_Nothing, WeaponM3_Reload }, - { WeaponXM1014_Draw, WeaponXM1014_PrimaryFire, Temp_Nothing, WeaponXM1014_Reload }, -#else - { WeaponM3_Draw, WeaponM3_PrimaryFire, WeaponM3_Secondary, WeaponM3_Reload }, - { WeaponXM1014_Draw, WeaponXM1014_PrimaryFire, WeaponXM1014_Secondary, WeaponXM1014_Reload }, -#endif - { WeaponMP5_Draw, WeaponMP5_PrimaryFire, Temp_Nothing, WeaponMP5_Reload }, - { WeaponP90_Draw, WeaponP90_PrimaryFire, Temp_Nothing, WeaponP90_Reload }, - { WeaponUMP45_Draw, WeaponUMP45_PrimaryFire, Temp_Nothing, WeaponUMP45_Reload }, - { WeaponMAC10_Draw, WeaponMAC10_PrimaryFire, Temp_Nothing, WeaponMAC10_Reload }, - { WeaponTMP_Draw, WeaponTMP_PrimaryFire, Temp_Nothing, WeaponTMP_Reload }, - { WeaponAK47_Draw, WeaponAK47_PrimaryFire, Temp_Nothing, WeaponAK47_Reload }, - { WeaponSG552_Draw, WeaponSG552_PrimaryFire, WeaponSG552_SecondaryFire, WeaponSG552_Reload }, - { WeaponM4A1_Draw, WeaponM4A1_PrimaryFire, WeaponM4A1_Secondary, WeaponM4A1_Reload }, - { WeaponAUG_Draw, WeaponAUG_PrimaryFire, WeaponAUG_SecondaryFire, WeaponAUG_Reload }, - { WeaponSCOUT_Draw, WeaponSCOUT_PrimaryFire, WeaponSCOUT_SecondaryFire, WeaponSCOUT_Reload }, - { WeaponAWP_Draw, WeaponAWP_PrimaryFire, WeaponAWP_SecondaryFire, WeaponAWP_Reload }, - { WeaponG3SG1_Draw, WeaponG3SG1_PrimaryFire, WeaponG3SG1_SecondaryFire, WeaponG3SG1_Reload }, - { WeaponSG550_Draw, WeaponSG550_PrimaryFire, WeaponSG550_SecondaryFire, WeaponSG550_Reload }, - { WeaponPARA_Draw, WeaponPARA_PrimaryFire, Temp_Nothing, WeaponPARA_Reload }, - { WeaponC4BOMB_Draw, WeaponC4BOMB_PrimaryFire, Temp_Nothing, Temp_Nothing }, - { WeaponFLASHBANG_Draw, WeaponFLASHBANG_PrimaryFire, Temp_Nothing, Temp_Nothing }, - { WeaponHEGRENADE_Draw, WeaponHEGRENADE_PrimaryFire, Temp_Nothing, Temp_Nothing }, - { WeaponSMOKEGRENADE_Draw, WeaponSMOKEGRENADE_PrimaryFire, Temp_Nothing, Temp_Nothing } -}; - -/* -================= -Weapon_Draw -================= -*/ -void Weapon_Draw( float fWeapon ) { - if ( !fWeapon ) { - return; - } - -#ifdef SSQC - // In case reloading logic is still going on - self.think = Empty; - - self.viewzoom = 1.0; - self.weapon = fWeapon; - self.fAttackFinished = time + 1.0; -#endif - -#ifdef CSQC - if ( fWeaponEventPlayer != player_localentnum ) { - return; - } -#endif - - wpnFuncTable[ fWeapon ].vDraw(); -} - -/* -================= -Weapon_PrimaryAttack -================= -*/ -void Weapon_PrimaryAttack( float fWeapon ) { -#ifdef SSQC - if ( self.fAttackFinished > time ) { - return; - } - if ( !( self.flags & FL_SEMI_TOGGLED ) ) { - return; - } -#endif -#ifdef CSQC - if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) { - entity ono = findfloat( world, entnum, fWeaponEventPlayer ); - if ( ono != __NULL__ ) { - Animation_ShootWeapon( ono ); - } - return; - } -#endif - - wpnFuncTable[ fWeapon ].vPrimary(); -} - -/* -================= -Weapon_SecondaryAttack -================= -*/ -void Weapon_SecondaryAttack( float fWeapon ) { -#ifdef SSQC - if ( self.fAttackFinished > time ) { - return; - } -#endif -#ifdef CSQC - if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) { - return; - } -#endif - wpnFuncTable[ fWeapon ].vSecondary(); -} - -/* -================= -Weapon_Reload -================= -*/ -void Weapon_Reload( float fWeapon ) { -#ifdef SSQC - if ( self.fAttackFinished > time ) { - return; - } - self.viewzoom = 1.0; -#endif -#ifdef CSQC - if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) { - entity ono = findfloat( world, entnum, fWeaponEventPlayer ); - if ( ono != __NULL__ ) { - Animation_ReloadWeapon( ono ); - } - return; - } -#endif - wpnFuncTable[ fWeapon ].vReload(); -} - -/* -================= -Weapon_GetAnimType - -Returns which animationset a weapon will use on a player -================= -*/ -float Weapon_GetAnimType( float fWeapon ) { - return wptTable[ fWeapon ].fAnimType; -} - -/* -================= -Weapon_GetFireRate - -Returns the delay between shots of a given weapon -================= -*/ -float Weapon_GetFireRate( float fWeapon ) { - return wptTable[ fWeapon ].fAttackFinished; -} - -/* -================= -Weapon_GetReloadTime - -Returns the reloading delay before being able to be fired again -================= -*/ -float Weapon_GetReloadTime( float fWeapon ) { - return wptTable[ fWeapon ].fReloadFinished; -} - -/* -================= -Weapon_GetSpeedM - -Returns the speed multiplier -================= -*/ -float Weapon_GetSpeedM( float fWeapon ) { - return wptTable[ fWeapon ].fSpeedM; -} - -#ifdef SSQC -/* -================= -Weapon_Release - -Called when letting go one of the weapon firing buttons -================= -*/ -void Weapon_Release( void ) { - self.flags = self.flags | FL_SEMI_TOGGLED; - - if ( self.weapon == WEAPON_FLASHBANG ) { - WeaponFLASHBANG_Release(); - } else if ( self.weapon == WEAPON_HEGRENADE ) { - WeaponHEGRENADE_Release(); - } else if ( self.weapon == WEAPON_SMOKEGRENADE ) { - WeaponSMOKEGRENADE_Release(); - } else if ( self.weapon == WEAPON_C4BOMB ) { - WeaponC4BOMB_Release(); - } else { - if (self.weapon == WEAPON_XM1014) { - return; - } else if (self.weapon == WEAPON_M3) { - return; - } - if (self.(wptTable[ self.weapon ].iMagfld) <= 0) { - if (self.(wptTable[ self.weapon ].iCaliberfld)) { - Weapon_Reload(self.weapon); - } - } - } -} - -/* -================= -Weapon_GetSlot - -Returns which slot a weapon belongs to -================= -*/ -int Weapon_GetSlot( float fWeapon ) { - return wptTable[ fWeapon ].iSlot; -} - -/* -================= -Weapon_AlreadyExists - -Returns whether or not we have the given weapon already -================= -*/ -float Weapon_AlreadyExists( float fWeapon ) { - if ( fWeapon == WEAPON_FLASHBANG || fWeapon == WEAPON_HEGRENADE || fWeapon == WEAPON_SMOKEGRENADE ) { - int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE; - if ( iNades ) { - return TRUE; - } else { - return FALSE; - } - } else { - if ( wptTable[ fWeapon ].iSlot == SLOT_PRIMARY ) { - if ( self.fSlotPrimary == fWeapon ) { - return TRUE; - } - } else if ( wptTable[ fWeapon ].iSlot == SLOT_SECONDARY ) { - if ( self.fSlotSecondary == fWeapon ) { - return TRUE; - } - } else if ( wptTable[ fWeapon ].iSlot == SLOT_GRENADE ) { - if ( self.fSlotGrenade == fWeapon ) { - return TRUE; - } - } else if ( wptTable[ fWeapon ].iSlot == SLOT_C4BOMB ) { - if ( self.fSlotC4Bomb == fWeapon ) { - return TRUE; - } - } - } - - return FALSE; -} - -/* -================= -Weapon_SlotEmpty - -Returns whether or not a slot is empty -================= -*/ -float Weapon_SlotEmpty( int fSlot ) { - if ( fSlot == SLOT_PRIMARY ) { - if ( self.fSlotPrimary == 0 ) { - return TRUE; - } - } else if ( fSlot == SLOT_SECONDARY ) { - if ( self.fSlotSecondary == 0 ) { - return TRUE; - } - } else if ( fSlot == SLOT_GRENADE ) { - if ( self.fSlotGrenade == 0 ) { - return TRUE; - } - } else if ( fSlot == SLOT_C4BOMB ) { - if ( self.fSlotC4Bomb == 0 ) { - return TRUE; - } - } - - return FALSE; -} - -/* -================= -Weapon_Switch - -Switch to the weapon in a given slot -================= -*/ -void Weapon_Switch( int iSlot ) { - float fWeapon; - - if ( iSlot == SLOT_MELEE ) { - fWeapon = self.fSlotMelee; - } else if ( iSlot == SLOT_PRIMARY ) { - fWeapon = self.fSlotPrimary; - } else if ( iSlot == SLOT_SECONDARY ) { - fWeapon = self.fSlotSecondary; - } else if ( iSlot == SLOT_GRENADE ) { - fWeapon = self.fSlotGrenade; - } else if ( iSlot == SLOT_C4BOMB ) { - fWeapon = self.fSlotC4Bomb; - } - - if ( !fWeapon || self.weapon == fWeapon ) { - return; - } - - Weapon_Draw( fWeapon ); -} - -/* -================= -Weapon_UpdateCurrents - -Update the ammo fields for the clientside display -================= -*/ -void Weapon_UpdateCurrents( void ) { - self.iCurrentMag = self.(wptTable[ self.weapon ].iMagfld); - self.iCurrentCaliber = self.(wptTable[ self.weapon ].iCaliberfld); -} - -/* -================= -Weapon_AddItem - -Gives a weapon to the player -================= -*/ -void Weapon_AddItem( float fWeapon ) { - if ( Weapon_SlotEmpty ( wptTable[ fWeapon ].iSlot ) == FALSE ) { - Weapon_DropWeapon( wptTable[ fWeapon ].iSlot ); - } - - // Add the gun to the appropriate slot - if( wptTable[ fWeapon ].iSlot == SLOT_MELEE ) { - self.fSlotMelee = fWeapon; - } else if ( wptTable[ fWeapon ].iSlot == SLOT_SECONDARY ) { - self.fSlotSecondary = fWeapon; - } else if( wptTable[ fWeapon ].iSlot == SLOT_PRIMARY ) { - self.fSlotPrimary = fWeapon; - } else if ( wptTable[ fWeapon ].iSlot == SLOT_GRENADE ) { - self.fSlotGrenade = fWeapon; - } else if ( wptTable[ fWeapon ].iSlot == SLOT_C4BOMB ) { - self.fSlotC4Bomb = fWeapon; - } - - // Make sure we've got at least one full clip - self.(wptTable[ fWeapon ].iMagfld) = wptTable[ fWeapon ].iMagSize; -} - -/* -================= -Weapon_GiveAmmo - -Gives a specific amount of ammo to the player -================= -*/ -void Weapon_GiveAmmo( float fWeapon, float fAmount ) { - self.(wptTable[ fWeapon ].iCaliberfld ) += fAmount; - Weapon_UpdateCurrents(); -} - -/* -================= -Weapon_SwitchBest - -Switches to the currently best suited weapon -================= -*/ -void Weapon_SwitchBest( void ) { - if ( self.fSlotSecondary ) { - Weapon_Switch( SLOT_SECONDARY ); - } else if ( self.fSlotPrimary ) { - Weapon_Switch( SLOT_PRIMARY ); - } else { - Weapon_Switch( SLOT_MELEE ); - } -} - -/* -================= -Weapon_DropWeapon - -Drop the weapon in a given slot -================= -*/ -void Weapon_DropWeapon( int iSlot ) { - static void Weapon_DropWeapon_Touch( void ) { - if ( other.classname != "player" ) { - return; - } else if ( other == self.owner ) { - return; - } - - // No bomb for the CTs - if ( ( self.weapon == WEAPON_C4BOMB ) && ( other.team == TEAM_CT ) ) { - return; - } - - entity eOld = self; - self = other; - - if ( Weapon_SlotEmpty( Weapon_GetSlot( eOld.weapon ) ) ) { - Weapon_AddItem( eOld.weapon ); - Weapon_Draw( eOld.weapon ); - self.(wptTable[ eOld.weapon ].iMagfld) = eOld.health; - Weapon_UpdateCurrents(); - } else { - self = eOld; - return; - } - - self = eOld; - remove( self ); - } - - static void Weapon_DropWeapon_Think( void ) { - self.owner = world; - } - - float fWeapon; - - if ( iSlot == SLOT_PRIMARY ) { - fWeapon = self.fSlotPrimary; - self.fSlotPrimary = 0; - } else if ( iSlot == SLOT_SECONDARY ) { - fWeapon = self.fSlotSecondary; - self.fSlotSecondary = 0; - } else if ( iSlot == SLOT_GRENADE ) { - fWeapon = self.fSlotGrenade; - self.fSlotGrenade = 0; - } else if ( iSlot == SLOT_C4BOMB ) { - fWeapon = self.fSlotC4Bomb; - self.fSlotC4Bomb = 0; - } else { - return; - } - - entity eDrop = spawn(); - setorigin( eDrop, self.origin + self.view_ofs ); - setmodel( eDrop, sWeaponModels[ fWeapon ] ); - eDrop.classname = "remove_me"; - eDrop.owner = self; - eDrop.movetype = MOVETYPE_TOSS; - eDrop.solid = SOLID_TRIGGER; - eDrop.weapon = fWeapon; - eDrop.think = Weapon_DropWeapon_Think; - eDrop.touch = Weapon_DropWeapon_Touch; - eDrop.nextthink = time + 1.0f; - eDrop.health = self.(wptTable[ fWeapon ].iMagfld); - setsize( eDrop, '-16 -16 0', '16 16 16' ); - - makevectors( self.v_angle ); - - if (fWeapon == WEAPON_C4BOMB && autocvar_fcs_bombaltthrow) { - eDrop.velocity = v_forward * random(32, 96); - eDrop.velocity += v_right * random(-64, 64); - eDrop.velocity[2] = 0; - } else { - eDrop.velocity = self.velocity + v_forward * 256; - } - - self.weapon = 0; - Weapon_SwitchBest(); -} - -/* -================= -CSEv_PlayerBuyWeapon_f - -Client call for buying a weapon through GUI or console command -================= -*/ -void CSEv_PlayerBuyWeapon_f( float fWeapon ) { - if ( Rules_BuyingPossible() == FALSE ) { - return; - } - - if ( self.team == TEAM_T ) { - if ( fWeapon == WEAPON_M4A1 ) { return; } - if ( fWeapon == WEAPON_AUG ) { return; } - if ( fWeapon == WEAPON_SG550 ) { return; } - if ( fWeapon == WEAPON_FIVESEVEN ) { return; } - if ( fWeapon == WEAPON_TMP ) { return; } - } else if ( self.team == TEAM_CT ) { - if ( fWeapon == WEAPON_AK47 ) { return; } - if ( fWeapon == WEAPON_SG552 ) { return; } - if ( fWeapon == WEAPON_G3SG1 ) { return; } - if ( fWeapon == WEAPON_ELITES ) { return; } - if ( fWeapon == WEAPON_MAC10 ) { return; } - } - - if ( ( self.fMoney - wptTable[ fWeapon ].iPrice ) >= 0 ) { - Weapon_AddItem(fWeapon); - Ammo_AutoFill(fWeapon); - - Weapon_Draw( fWeapon ); - Money_AddMoney( self, -wptTable[ fWeapon ].iPrice ); - - sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE ); - } else { - centerprint( self, "You have insufficient funds!" ); - } -} - -/* -================= -CSEv_PlayerSwitchWeapon_f - -Client-HUD call that switches to a specific weapon -================= -*/ -void CSEv_PlayerSwitchWeapon_f( float fWeapon ) { - if ( ( Weapon_AlreadyExists( fWeapon ) == FALSE ) && ( fWeapon != WEAPON_KNIFE ) ) { - return; - } - if (wptTable[fWeapon].iSlot == SLOT_GRENADE) { - if (fWeapon == WEAPON_HEGRENADE && !(self.iAmmo_HEGRENADE)) { - return; - } else if (fWeapon == WEAPON_FLASHBANG && !(self.iAmmo_FLASHBANG)) { - return; - } else if (fWeapon == WEAPON_SMOKEGRENADE && !(self.iAmmo_SMOKEGRENADE)) { - return; - } - } - if ( fWeapon != self.weapon ) { - Weapon_Draw( fWeapon ); - } -} - -/* -================= -CSEv_WeaponDrop - -Client call that tells us to drop the currently equipped weapon -================= -*/ -void CSEv_WeaponDrop( void ) { - Weapon_DropWeapon( wptTable[ self.weapon ].iSlot ); -} -#endif diff --git a/src/shared/cstrike/weapons.h b/src/shared/cstrike/weapons.h new file mode 100644 index 00000000..ee24704d --- /dev/null +++ b/src/shared/cstrike/weapons.h @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/* Weapon Indices for the weapon table */ +enum +{ + WEAPON_NONE, + WEAPON_M3, + WEAPON_XM1014, + WEAPON_MP5, + WEAPON_P90, + WEAPON_UMP45, + WEAPON_MAC10, + WEAPON_TMP, + WEAPON_AK47, + WEAPON_SG552, + WEAPON_M4A1, + WEAPON_AUG, + WEAPON_SCOUT, + WEAPON_AWP, + WEAPON_G3SG1, + WEAPON_SG550, + WEAPON_PARA, + WEAPON_USP45, + WEAPON_GLOCK18, + WEAPON_DEAGLE, + WEAPON_P228, + WEAPON_ELITES, + WEAPON_FIVESEVEN, + WEAPON_KNIFE, + WEAPON_HEGRENADE, + WEAPON_FLASHBANG, + WEAPON_SMOKEGRENADE, + WEAPON_C4BOMB +};