Initial commit.
This commit is contained in:
commit
d77429ae74
46 changed files with 2442 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
data.pk3dir/
|
38
README.md
Normal file
38
README.md
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
# FreeCoD
|
||||||
|
|
||||||
|
Blub blub.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## To-do list:
|
||||||
|
|
||||||
|
- Everything.
|
||||||
|
|
||||||
|
Other than that, it should be fairly representative of Call of Duty.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This is a port of Call of Duty (MP) to Nuclide.
|
||||||
|
|
||||||
|
You have to own a copy of the game to play this.
|
||||||
|
All the code, resources etc. in this repo are of my own research and creation.
|
||||||
|
|
||||||
|
## License
|
||||||
|
ISC License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Marco Hladik <marco@icculus.org>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||||||
|
OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
BIN
img/preview1.jpg
Normal file
BIN
img/preview1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 148 KiB |
BIN
img/preview2.jpg
Normal file
BIN
img/preview2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 153 KiB |
BIN
img/preview3.jpg
Normal file
BIN
img/preview3.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
BIN
img/preview4.jpg
Normal file
BIN
img/preview4.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 94 KiB |
14
manifest.fmf
Normal file
14
manifest.fmf
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
FTEMANIFEST 1
|
||||||
|
NAME "Call of Duty"
|
||||||
|
GAME cod
|
||||||
|
BASEGAME platform
|
||||||
|
BASEGAME cod
|
||||||
|
|
||||||
|
// you don't really want to change these
|
||||||
|
RTCBROKER master.frag-net.com:27950
|
||||||
|
PROTOCOLNAME "Nuclide"
|
||||||
|
MAINCONFIG nuclide.cfg
|
||||||
|
DOWNLOADSURL ""
|
||||||
|
|
||||||
|
-exec platform_default.cfg
|
||||||
|
-plug_load cod
|
6
src/Makefile
Normal file
6
src/Makefile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
CC=fteqcc
|
||||||
|
|
||||||
|
all:
|
||||||
|
cd client && $(MAKE)
|
||||||
|
cd server && $(MAKE)
|
||||||
|
cd menu && $(MAKE)
|
4
src/client/Makefile
Normal file
4
src/client/Makefile
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
CC=fteqcc
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(CC) progs.src
|
81
src/client/camera.qc
Normal file
81
src/client/camera.qc
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float m_flSpeed;
|
||||||
|
float m_flFracSin;
|
||||||
|
float m_flTime;
|
||||||
|
float m_flMove;
|
||||||
|
float m_flDelta;
|
||||||
|
int m_iCycle;
|
||||||
|
} g_camBobVars[4], *pCamBob;
|
||||||
|
|
||||||
|
/* tilts the camera for a head-bob like effect when moving */
|
||||||
|
void
|
||||||
|
Camera_RunBob(__inout vector camera_angle)
|
||||||
|
{
|
||||||
|
if (!autocvar(v_cambob, 1, "Enables bobbing effect for the first-person camera"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
int s = (float)getproperty(VF_ACTIVESEAT);
|
||||||
|
pCamBob = &g_camBobVars[s];
|
||||||
|
|
||||||
|
/* we don't really care about the vertical velocity */
|
||||||
|
vector speed = pSeat->m_vecPredictedVelocity;
|
||||||
|
speed[2] = 0.0f;
|
||||||
|
pCamBob->m_flSpeed = vlen(speed);
|
||||||
|
|
||||||
|
/* don't bother on low speeds */
|
||||||
|
if ( pCamBob->m_flSpeed < 5.0f ) {
|
||||||
|
pCamBob->m_flMove = 0.0f;
|
||||||
|
pCamBob->m_flTime = 0.0f; /* progress has halted, start anew */
|
||||||
|
return;
|
||||||
|
} else if (pSeat->m_ePlayer.flags & FL_ONGROUND && pSeat->m_ePlayer.waterlevel == 0) {
|
||||||
|
pCamBob->m_flMove = clframetime * (pCamBob->m_flSpeed * 0.01);
|
||||||
|
} else {
|
||||||
|
pCamBob->m_flMove = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCamBob->m_flTime = (pCamBob->m_flTime += pCamBob->m_flMove);
|
||||||
|
pCamBob->m_flFracSin = fabs(sin(pCamBob->m_flTime * M_PI));
|
||||||
|
pCamBob->m_iCycle = (int)pCamBob->m_flTime;
|
||||||
|
pCamBob->m_flDelta = (pCamBob->m_flFracSin * 0.0025f) * pCamBob->m_flSpeed;
|
||||||
|
|
||||||
|
camera_angle[0] += pCamBob->m_flDelta;
|
||||||
|
|
||||||
|
if (pCamBob->m_iCycle & 1) {
|
||||||
|
pCamBob->m_flDelta = -pCamBob->m_flDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
camera_angle[2] += pCamBob->m_flDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* applies a tilt to the camera for when we're strafing left to right */
|
||||||
|
void
|
||||||
|
Camera_StrafeRoll(__inout vector camera_angle)
|
||||||
|
{
|
||||||
|
if (!autocvar(v_camroll, 0, "Enables strafe-roll for the first-person camera"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
float roll;
|
||||||
|
makevectors(camera_angle);
|
||||||
|
|
||||||
|
roll = dotproduct(pSeat->m_vecPredictedVelocity, v_right);
|
||||||
|
roll *= 0.015f;
|
||||||
|
|
||||||
|
camera_angle[2] += roll;
|
||||||
|
}
|
27
src/client/cmds.qc
Normal file
27
src/client/cmds.qc
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This is where custom game-specific commands go!
|
||||||
|
* You'll also inherit all the commands defined in entry.c */
|
||||||
|
int
|
||||||
|
ClientGame_ConsoleCommand(void)
|
||||||
|
{
|
||||||
|
switch(argv(0)) {
|
||||||
|
default:
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
23
src/client/defs.h
Normal file
23
src/client/defs.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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 g_hudmins;
|
||||||
|
vector g_hudres;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float temp;
|
||||||
|
} g_seatslocal[4], *pSeatLocal;
|
27
src/client/draw.qc
Normal file
27
src/client/draw.qc
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
ClientGame_PreDraw(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClientGame_PostDraw(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
26
src/client/entities.qc
Normal file
26
src/client/entities.qc
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
ClientGame_EntityUpdate(float id, float new)
|
||||||
|
{
|
||||||
|
switch (id) {
|
||||||
|
default:
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
39
src/client/game_event.qc
Normal file
39
src/client/game_event.qc
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
ClientGame_EventParse(float fHeader)
|
||||||
|
{
|
||||||
|
switch (fHeader) {
|
||||||
|
case EV_CHAT:
|
||||||
|
float fSender = readbyte();
|
||||||
|
float fTeam = readbyte();
|
||||||
|
string sMessage = readstring();
|
||||||
|
|
||||||
|
CSQC_Parse_Print(sprintf("%s: %s", getplayerkeyvalue(fSender, "name"), sMessage), PRINT_CHAT);
|
||||||
|
break;
|
||||||
|
case EV_CHAT_TEAM:
|
||||||
|
float fSender2 = readbyte();
|
||||||
|
float fTeam2 = readbyte();
|
||||||
|
string sMessage2 = readstring();
|
||||||
|
|
||||||
|
CSQC_Parse_Print(sprintf("[TEAM] %s: %s", getplayerkeyvalue(fSender2, "name"), sMessage2), PRINT_CHAT);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
39
src/client/hud.qc
Normal file
39
src/client/hud.qc
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const float baseIconSize = 32.0;
|
||||||
|
const float baseIconPadding = 16.0;
|
||||||
|
|
||||||
|
/* main entry */
|
||||||
|
void
|
||||||
|
HUD_Init(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* main entry */
|
||||||
|
void
|
||||||
|
HUD_Draw(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
Textmenu_Draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* specatator main entry */
|
||||||
|
void
|
||||||
|
HUD_DrawSpectator(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
50
src/client/hud_weaponselect.qc
Normal file
50
src/client/hud_weaponselect.qc
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
HUD_DrawWeaponSelect_Forward(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HUD_DrawWeaponSelect_Back(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HUD_DrawWeaponSelect_Trigger(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HUD_DrawWeaponSelect_Last(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HUD_SlotSelect(int slot)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HUD_DrawWeaponSelect(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
37
src/client/init.qc
Normal file
37
src/client/init.qc
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
ClientGame_Init
|
||||||
|
|
||||||
|
Comparable to worldspawn in SSQC in that it's mostly used for precaches
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ClientGame_Init(float apilevel, string enginename, float engineversion)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClientGame_InitDone(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClientGame_RendererRestart(string rstr)
|
||||||
|
{
|
||||||
|
}
|
40
src/client/progs.src
Normal file
40
src/client/progs.src
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#pragma target fte_5768
|
||||||
|
#pragma progs_dat "../../csprogs.dat"
|
||||||
|
|
||||||
|
#define CSQC
|
||||||
|
#define CLIENT
|
||||||
|
|
||||||
|
#includelist
|
||||||
|
/* first the engine, then nuclide headers for client/shared */
|
||||||
|
../../../src/shared/fteextensions.qc
|
||||||
|
../../../src/shared/defs.h
|
||||||
|
../../../src/client/defs.h
|
||||||
|
|
||||||
|
/* mod specific header */
|
||||||
|
defs.h
|
||||||
|
|
||||||
|
/* for VGUI elements, we want to include this (optional) */
|
||||||
|
../../../src/vgui/include.src
|
||||||
|
|
||||||
|
/* include the entity codebase */
|
||||||
|
../../../src/gs-entbase/client.src
|
||||||
|
../../../src/gs-entbase/shared.src
|
||||||
|
|
||||||
|
/* mod specific functions */
|
||||||
|
../shared/include.src
|
||||||
|
|
||||||
|
draw.qc
|
||||||
|
init.qc
|
||||||
|
entities.qc
|
||||||
|
camera.qc
|
||||||
|
cmds.qc
|
||||||
|
game_event.qc
|
||||||
|
viewmodel.qc
|
||||||
|
hud.qc
|
||||||
|
hud_weaponselect.qc
|
||||||
|
scoreboard.qc
|
||||||
|
|
||||||
|
/* global client/shared code */
|
||||||
|
../../../src/client/include.src
|
||||||
|
../../../src/shared/include.src
|
||||||
|
#endlist
|
168
src/client/scoreboard.qc
Normal file
168
src/client/scoreboard.qc
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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 SCORE_HEADER_C [255/255,156/255,0]
|
||||||
|
#define SCORE_LINE_C [255/255,200/255,0]
|
||||||
|
|
||||||
|
var int autocvar_cl_centerscores = FALSE;
|
||||||
|
var int g_scores_teamplay = 0;
|
||||||
|
|
||||||
|
void
|
||||||
|
Scores_Init(void)
|
||||||
|
{
|
||||||
|
g_scores_teamplay = (int)serverkeyfloat("teamplay");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Scores_DrawTeam(player pl, vector pos)
|
||||||
|
{
|
||||||
|
drawfill(pos, [290, 1], SCORE_LINE_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
drawfont = Font_GetID(FONT_20);
|
||||||
|
drawstring(pos + [0,-18], "Teams", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [124,-18], "kills / deaths", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [240,-18], "latency", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
pos[1] += 12;
|
||||||
|
|
||||||
|
for (int t = 1; t <= serverkeyfloat("teams"); t++) {
|
||||||
|
float l;
|
||||||
|
string temp;
|
||||||
|
drawstring(pos, serverkey(sprintf("team_%i", t)), [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
temp = serverkey(sprintf("teamscore_%i", t));
|
||||||
|
l = stringwidth(temp, FALSE, [8,8]);
|
||||||
|
drawstring(pos + [150-l, 0], temp, [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [158, 0], "wins", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
pos[1] += 16;
|
||||||
|
|
||||||
|
for (int i = -1; i > -32; i--) {
|
||||||
|
if (getplayerkeyfloat(i, "*team") != t) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = getplayerkeyvalue(i, "name");
|
||||||
|
|
||||||
|
/* Out of players */
|
||||||
|
if (!temp) {
|
||||||
|
break;
|
||||||
|
} else if (temp == getplayerkeyvalue(pl.entnum-1, "name")) {
|
||||||
|
drawfill(pos, [290, 13], [0,0,1], 0.5f, DRAWFLAG_ADDITIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawstring(pos + [24,0], getplayerkeyvalue(i, "name"), [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [154,0], "/", [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
/* Get the kills and align them left to right */
|
||||||
|
temp = getplayerkeyvalue(i, "frags");
|
||||||
|
l = stringwidth(temp, FALSE, [8,8]);
|
||||||
|
drawstring(pos + [150 - l,0], temp, [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
/* Deaths are right to left aligned */
|
||||||
|
temp = getplayerkeyvalue(i, "*deaths");
|
||||||
|
drawstring(pos + [165,0], temp, [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
/* Get the latency and align it left to right */
|
||||||
|
temp = getplayerkeyvalue(i, "ping");
|
||||||
|
l = stringwidth(temp, FALSE, [8,8]);
|
||||||
|
|
||||||
|
drawstring(pos + [290 - l,0], temp, [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
pos[1] += 20;
|
||||||
|
}
|
||||||
|
pos[1] += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawfont = Font_GetID(FONT_CON);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Scores_DrawNormal(player pl, vector pos)
|
||||||
|
{
|
||||||
|
drawfill(pos, [290, 1], SCORE_LINE_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
drawfont = Font_GetID(FONT_20);
|
||||||
|
drawstring(pos + [0,-18], "Player", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [124,-18], "kills / deaths", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [240,-18], "latency", [8,8], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
pos[1] += 12;
|
||||||
|
for (int i = -1; i > -32; i--) {
|
||||||
|
float l;
|
||||||
|
string ping;
|
||||||
|
string kills;
|
||||||
|
string deaths;
|
||||||
|
string name;
|
||||||
|
|
||||||
|
name = getplayerkeyvalue(i, "name");
|
||||||
|
|
||||||
|
/* Out of players */
|
||||||
|
if (!name) {
|
||||||
|
break;
|
||||||
|
} else if (name == getplayerkeyvalue(pl.entnum-1, "name")) {
|
||||||
|
drawfill(pos, [290, 13], [0,0,1], 0.5f, DRAWFLAG_ADDITIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawstring(pos, getplayerkeyvalue(i, "name"), [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
drawstring(pos + [154,0], "/", [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
/* Get the kills and align them left to right */
|
||||||
|
kills = getplayerkeyvalue(i, "frags");
|
||||||
|
l = stringwidth(kills, FALSE, [8,8]);
|
||||||
|
drawstring(pos + [150 - l,0], kills, [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
/* Deaths are right to left aligned */
|
||||||
|
deaths = getplayerkeyvalue(i, "*deaths");
|
||||||
|
drawstring(pos + [165,0], deaths, [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
|
||||||
|
/* Get the latency and align it left to right */
|
||||||
|
ping = getplayerkeyvalue(i, "ping");
|
||||||
|
l = stringwidth(ping, FALSE, [8,8]);
|
||||||
|
|
||||||
|
drawstring(pos + [290 - l,0], ping, [8,8], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
|
||||||
|
pos[1] += 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawfont = Font_GetID(FONT_CON);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Scores_Draw(void)
|
||||||
|
{
|
||||||
|
vector pos;
|
||||||
|
player pl;
|
||||||
|
|
||||||
|
pl = (player)pSeat->m_ePlayer;
|
||||||
|
|
||||||
|
if (autocvar_cl_centerscores) {
|
||||||
|
int c = 10;
|
||||||
|
|
||||||
|
/* calculate all valid entries */
|
||||||
|
for (int i = -1; i > -32; i--) {
|
||||||
|
if (getplayerkeyvalue(i, "name")) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
c += 10;
|
||||||
|
}
|
||||||
|
pos = video_mins + [(video_res[0] / 2) - 145, (video_res[1] / 2) - c];
|
||||||
|
} else {
|
||||||
|
pos = video_mins + [(video_res[0] / 2) - 145, 30];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Util_IsTeamplay()) {
|
||||||
|
Scores_DrawTeam(pl, pos);
|
||||||
|
} else {
|
||||||
|
Scores_DrawNormal(pl, pos);
|
||||||
|
}
|
||||||
|
}
|
140
src/client/viewmodel.qc
Normal file
140
src/client/viewmodel.qc
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var float autocvar_v_bob = 0.01f;
|
||||||
|
var float autocvar_v_bobcycle = 1.0f;
|
||||||
|
var float autocvar_v_bobup = 0.5f;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float m_flBobTime;
|
||||||
|
float m_flBobTime2;
|
||||||
|
float m_flBob;
|
||||||
|
float m_flBob2;
|
||||||
|
float m_flBobCycle;
|
||||||
|
float m_flBobCycle2;
|
||||||
|
float m_flSpeed;
|
||||||
|
} g_viewBobVars[4], *pViewBob;
|
||||||
|
|
||||||
|
|
||||||
|
/* bob vars are calculated separately from application, so that if there's
|
||||||
|
* more than one viewmodel we won't affect the speed of the bob by running
|
||||||
|
* the math too many times */
|
||||||
|
void
|
||||||
|
Viewmodel_CalcBob(void)
|
||||||
|
{
|
||||||
|
int s = (float)getproperty(VF_ACTIVESEAT);
|
||||||
|
pViewBob = &g_viewBobVars[s];
|
||||||
|
|
||||||
|
vector vecVel;
|
||||||
|
float flBob;
|
||||||
|
|
||||||
|
float var_bob;
|
||||||
|
float var_cycle;
|
||||||
|
float var_up;
|
||||||
|
|
||||||
|
var_bob = autocvar_v_bob;
|
||||||
|
var_cycle = autocvar_v_bobcycle;
|
||||||
|
var_up = autocvar_v_bobup;
|
||||||
|
|
||||||
|
pViewBob->m_flBobTime += clframetime;
|
||||||
|
pViewBob->m_flBobTime2 += clframetime;
|
||||||
|
pViewBob->m_flBobCycle = pViewBob->m_flBobTime - (int)(pViewBob->m_flBobTime / var_cycle) * var_cycle;
|
||||||
|
pViewBob->m_flBobCycle /= var_cycle;
|
||||||
|
|
||||||
|
if (pViewBob->m_flBobCycle < var_up) {
|
||||||
|
pViewBob->m_flBobCycle = MATH_PI * pViewBob->m_flBobCycle / var_up;
|
||||||
|
} else {
|
||||||
|
pViewBob->m_flBobCycle = MATH_PI + MATH_PI * (pViewBob->m_flBobCycle - var_up)/(1.0 - var_up);
|
||||||
|
}
|
||||||
|
|
||||||
|
vecVel = pSeat->m_vecPredictedVelocity;
|
||||||
|
vecVel[2] = 0;
|
||||||
|
pViewBob->m_flSpeed = vlen(vecVel);
|
||||||
|
|
||||||
|
flBob = pViewBob->m_flSpeed * var_bob;
|
||||||
|
flBob = flBob * 0.3 + flBob * 0.7 * sin(pViewBob->m_flBobCycle);
|
||||||
|
pViewBob->m_flBob = bound(-7, flBob, 4);
|
||||||
|
|
||||||
|
/* BOB2, which is half the cycle of bob1 */
|
||||||
|
pViewBob->m_flBobCycle2 = pViewBob->m_flBobTime2 - (int)(pViewBob->m_flBobTime2 / (var_cycle * 0.5f)) * (var_cycle * 0.5f);
|
||||||
|
pViewBob->m_flBobCycle2 /= (var_cycle * 0.5f);
|
||||||
|
|
||||||
|
if (pViewBob->m_flBobCycle2 < var_up) {
|
||||||
|
pViewBob->m_flBobCycle2 = MATH_PI * pViewBob->m_flBobCycle2 / var_up;
|
||||||
|
} else {
|
||||||
|
pViewBob->m_flBobCycle2 = MATH_PI + MATH_PI * (pViewBob->m_flBobCycle2 - var_up)/(1.0 - var_up);
|
||||||
|
}
|
||||||
|
|
||||||
|
flBob = pViewBob->m_flSpeed * var_bob;
|
||||||
|
flBob = flBob * 0.3 + flBob * 0.7 * sin(pViewBob->m_flBobCycle2);
|
||||||
|
pViewBob->m_flBob2 = bound(-7, flBob, 4);
|
||||||
|
|
||||||
|
/* make sure it's adjusted for scale */
|
||||||
|
pViewBob->m_flBob *= autocvar_cg_viewmodelScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Viewmodel_ApplyBob(entity gun)
|
||||||
|
{
|
||||||
|
int s = (float)getproperty(VF_ACTIVESEAT);
|
||||||
|
pViewBob = &g_viewBobVars[s];
|
||||||
|
|
||||||
|
float sintime;
|
||||||
|
float strength;
|
||||||
|
gun.angles[2] = -pViewBob->m_flBob;
|
||||||
|
|
||||||
|
vector angmod = [0,0,0];
|
||||||
|
angmod[0] -= pViewBob->m_flBob2 * 0.5f;
|
||||||
|
angmod[1] += pViewBob->m_flBob * 2.5f;
|
||||||
|
angmod[2] += pViewBob->m_flBob * 3.0f;
|
||||||
|
gun.angles += angmod * 1.5f;
|
||||||
|
|
||||||
|
/* sway with speed */
|
||||||
|
sintime = sin(time);
|
||||||
|
strength = pViewBob->m_flSpeed;
|
||||||
|
|
||||||
|
if (strength > 240)
|
||||||
|
strength = 240;
|
||||||
|
|
||||||
|
strength = 240 - strength;
|
||||||
|
strength *= 0.005f;
|
||||||
|
|
||||||
|
#ifdef WASTES
|
||||||
|
float sprint;
|
||||||
|
if (pSeatLocal->m_iSprinting && vlen(pSeat->m_vecPredictedVelocity) > 240) {
|
||||||
|
pSeatLocal->m_flSprintLerp = bound(0.0f, pSeatLocal->m_flSprintLerp + clframetime, 1.0f);
|
||||||
|
} else {
|
||||||
|
pSeatLocal->m_flSprintLerp = bound(0.0f, pSeatLocal->m_flSprintLerp - clframetime, 1.0f);
|
||||||
|
}
|
||||||
|
sprint = 20 * pSeatLocal->m_flSprintLerp;
|
||||||
|
gun.angles[0] += sprint;
|
||||||
|
gun.angles[1] += sprint + (sprint * pViewBob->m_flBob) * 0.25f;
|
||||||
|
|
||||||
|
if (pSeat->m_ePlayer.gflags & GF_IS_HEALING) {
|
||||||
|
pSeatLocal->m_flHealLerp = bound(0.0f, pSeatLocal->m_flHealLerp + clframetime, 1.0f);
|
||||||
|
} else {
|
||||||
|
pSeatLocal->m_flHealLerp = bound(0.0f, pSeatLocal->m_flHealLerp - clframetime, 1.0f);
|
||||||
|
}
|
||||||
|
gun.angles[0] += pSeatLocal->m_flHealLerp * 45;
|
||||||
|
gun.origin[2] -= pSeatLocal->m_flHealLerp * 5;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gun.angles[0] += strength * sintime;
|
||||||
|
gun.angles[1] += strength * sintime;
|
||||||
|
gun.angles[2] += strength * sintime;
|
||||||
|
gun.origin += [0,0,-1];
|
||||||
|
}
|
4
src/menu/Makefile
Normal file
4
src/menu/Makefile
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
CC=fteqcc
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(CC) progs.src
|
10
src/menu/progs.src
Normal file
10
src/menu/progs.src
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma target fte_5768
|
||||||
|
//#pragma flag enable assumeint
|
||||||
|
#pragma progs_dat "../../menu.dat"
|
||||||
|
#define MENU
|
||||||
|
#define GAME_DIR "base"
|
||||||
|
|
||||||
|
#includelist
|
||||||
|
../../../src/menu-vgui/includes.src
|
||||||
|
#endlist
|
||||||
|
|
3
src/progs.src
Normal file
3
src/progs.src
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#pragma sourcefile client/progs.src
|
||||||
|
#pragma sourcefile server/progs.src
|
||||||
|
#pragma sourcefile menu/progs.src
|
4
src/server/Makefile
Normal file
4
src/server/Makefile
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
CC=fteqcc
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(CC) progs.src
|
15
src/server/damage.qc
Normal file
15
src/server/damage.qc
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
28
src/server/defs.h
Normal file
28
src/server/defs.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
||||||
|
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gamerules.h"
|
||||||
|
#include "items.h"
|
||||||
|
|
||||||
|
// stubs for spawning
|
||||||
|
void info_player_deathmatch(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void info_player_start(void)
|
||||||
|
{
|
||||||
|
}
|
53
src/server/gamerules.h
Normal file
53
src/server/gamerules.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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 GameRules:CGameRules
|
||||||
|
{
|
||||||
|
void GameRules(void);
|
||||||
|
|
||||||
|
virtual void(NSClientPlayer) PlayerConnect;
|
||||||
|
virtual void(NSClientPlayer) PlayerDisconnect;
|
||||||
|
virtual void(NSClientPlayer) PlayerKill;
|
||||||
|
virtual void(NSClientPlayer) PlayerPostFrame;
|
||||||
|
|
||||||
|
virtual void(NSClientPlayer) LevelDecodeParms;
|
||||||
|
virtual void(NSClientPlayer) LevelChangeParms;
|
||||||
|
virtual void(void) LevelNewParms;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SingleplayerRules:GameRules
|
||||||
|
{
|
||||||
|
void SingleplayerRules(void);
|
||||||
|
|
||||||
|
/* client */
|
||||||
|
virtual void(NSClientPlayer) PlayerSpawn;
|
||||||
|
virtual void(NSClientPlayer) PlayerDeath;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MultiplayerRules:GameRules
|
||||||
|
{
|
||||||
|
|
||||||
|
int m_iIntermission;
|
||||||
|
int m_iIntermissionTime;
|
||||||
|
|
||||||
|
void MultiplayerRules(void);
|
||||||
|
virtual void(void) FrameStart;
|
||||||
|
|
||||||
|
/* client */
|
||||||
|
virtual void(NSClientPlayer) PlayerSpawn;
|
||||||
|
virtual void(NSClientPlayer) PlayerDeath;
|
||||||
|
virtual bool(NSClientPlayer, string) ConsoleCommand;
|
||||||
|
};
|
115
src/server/gamerules.qc
Normal file
115
src/server/gamerules.qc
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
GameRules::GameRules(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GameRules::LevelDecodeParms(NSClientPlayer pp)
|
||||||
|
{
|
||||||
|
player pl = (player)pp;
|
||||||
|
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;
|
||||||
|
pl.flags = parm64;
|
||||||
|
|
||||||
|
if (pl.flags & FL_CROUCHING) {
|
||||||
|
setsize(pl, VEC_CHULL_MIN, VEC_CHULL_MAX);
|
||||||
|
} else {
|
||||||
|
setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GameRules::LevelChangeParms(NSClientPlayer pp)
|
||||||
|
{
|
||||||
|
player pl = (player)pp;
|
||||||
|
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];
|
||||||
|
parm64 = pl.flags;
|
||||||
|
parm10 = pl.g_items;
|
||||||
|
parm11 = pl.activeweapon;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GameRules::LevelNewParms(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;
|
||||||
|
parm64 = FL_CLIENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we check what fields have changed over the course of the frame and network
|
||||||
|
* only the ones that have actually changed */
|
||||||
|
void
|
||||||
|
GameRules::PlayerPostFrame(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GameRules::PlayerConnect(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
if (Plugin_PlayerConnect(pl) == FALSE)
|
||||||
|
bprint(PRINT_HIGH, sprintf("%s connected\n", pl.netname));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GameRules::PlayerDisconnect(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
if (Plugin_PlayerDisconnect(pl) == FALSE)
|
||||||
|
bprint(PRINT_HIGH, sprintf("%s disconnected\n", pl.netname));
|
||||||
|
|
||||||
|
/* Make this unusable */
|
||||||
|
pl.solid = SOLID_NOT;
|
||||||
|
pl.movetype = MOVETYPE_NONE;
|
||||||
|
pl.modelindex = 0;
|
||||||
|
pl.health = 0;
|
||||||
|
pl.takedamage = 0;
|
||||||
|
pl.SendFlags = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GameRules::PlayerKill(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
Damage_Apply(pl, pl, pl.health, 0, DMG_SKIP_ARMOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Game_Worldspawn(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
129
src/server/gamerules_multiplayer.qc
Normal file
129
src/server/gamerules_multiplayer.qc
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
MultiplayerRules::MultiplayerRules(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MultiplayerRules::FrameStart(void)
|
||||||
|
{
|
||||||
|
if (cvar("mp_timelimit"))
|
||||||
|
if (time >= (cvar("mp_timelimit") * 60)) {
|
||||||
|
IntermissionStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
IntermissionCycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
Plugin_PlayerObituary(g_dmg_eAttacker, g_dmg_eTarget, g_dmg_iWeapon, g_dmg_iHitBody, g_dmg_iDamage);
|
||||||
|
|
||||||
|
/* death-counter */
|
||||||
|
pl.deaths++;
|
||||||
|
forceinfokey(pl, "*deaths", ftos(pl.deaths));
|
||||||
|
|
||||||
|
/* update score-counter */
|
||||||
|
if (pl.flags & FL_CLIENT || pl.flags & FL_MONSTER)
|
||||||
|
if (g_dmg_eAttacker.flags & FL_CLIENT) {
|
||||||
|
if (pl == g_dmg_eAttacker)
|
||||||
|
g_dmg_eAttacker.frags--;
|
||||||
|
else
|
||||||
|
g_dmg_eAttacker.frags++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* in DM we only care about the frags */
|
||||||
|
if (cvar("mp_fraglimit"))
|
||||||
|
if (g_dmg_eAttacker.frags >= cvar("mp_fraglimit")) {
|
||||||
|
IntermissionStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
pl.SetMovetype(MOVETYPE_NONE);
|
||||||
|
pl.SetSolid(SOLID_NOT);
|
||||||
|
pl.SetModelindex(0);
|
||||||
|
pl.takedamage = DAMAGE_NO;
|
||||||
|
pl.armor = pl.activeweapon = pl.g_items = 0;
|
||||||
|
|
||||||
|
pl.think = PutClientInServer;
|
||||||
|
pl.nextthink = time + 4.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MultiplayerRules::PlayerSpawn(NSClientPlayer pp)
|
||||||
|
{
|
||||||
|
player pl = (player)pp;
|
||||||
|
/* this is where the mods want to deviate */
|
||||||
|
entity spot;
|
||||||
|
|
||||||
|
pl.classname = "player";
|
||||||
|
pl.health = pl.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";
|
||||||
|
setmodel(pl, pl.model);
|
||||||
|
|
||||||
|
setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX);
|
||||||
|
pl.velocity = [0,0,0];
|
||||||
|
pl.gravity = __NULL__;
|
||||||
|
pl.frame = 1;
|
||||||
|
pl.SendFlags = UPDATE_ALL;
|
||||||
|
pl.customphysics = Empty;
|
||||||
|
pl.iBleeds = TRUE;
|
||||||
|
forceinfokey(pl, "*spec", "0");
|
||||||
|
forceinfokey(pl, "*deaths", ftos(pl.deaths));
|
||||||
|
|
||||||
|
LevelNewParms();
|
||||||
|
LevelDecodeParms(pl);
|
||||||
|
|
||||||
|
spot = Spawn_SelectRandom("info_player_deathmatch");
|
||||||
|
setorigin(pl, spot.origin);
|
||||||
|
pl.angles = spot.angles;
|
||||||
|
Weapons_RefreshAmmo(pl);
|
||||||
|
|
||||||
|
Client_FixAngle(pl, pl.angles);
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
MultiplayerRules::ConsoleCommand(NSClientPlayer pp, string cmd)
|
||||||
|
{
|
||||||
|
tokenize(cmd);
|
||||||
|
|
||||||
|
switch (argv(0)) {
|
||||||
|
default:
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Game_InitRules(void)
|
||||||
|
{
|
||||||
|
g_grMode = spawn(MultiplayerRules);
|
||||||
|
|
||||||
|
if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) {
|
||||||
|
g_grMode = spawn(SingleplayerRules);
|
||||||
|
} else {
|
||||||
|
g_grMode = spawn(MultiplayerRules);
|
||||||
|
}
|
||||||
|
}
|
78
src/server/gamerules_singleplayer.qc
Normal file
78
src/server/gamerules_singleplayer.qc
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
SingleplayerRules::SingleplayerRules(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SingleplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
pl.movetype = MOVETYPE_NONE;
|
||||||
|
pl.solid = SOLID_NOT;
|
||||||
|
pl.takedamage = DAMAGE_NO;
|
||||||
|
pl.armor = pl.activeweapon = pl.g_items = pl.weapon = 0;
|
||||||
|
pl.health = 0;
|
||||||
|
|
||||||
|
if (cvar("coop") == 1) {
|
||||||
|
pl.think = PutClientInServer;
|
||||||
|
pl.nextthink = time + 4.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SingleplayerRules::PlayerSpawn(NSClientPlayer pl)
|
||||||
|
{
|
||||||
|
pl.classname = "player";
|
||||||
|
pl.health = pl.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";
|
||||||
|
setmodel(pl, pl.model);
|
||||||
|
pl.AddEffects(EF_NOSHADOW);
|
||||||
|
|
||||||
|
setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX);
|
||||||
|
pl.velocity = [0,0,0];
|
||||||
|
pl.gravity = __NULL__;
|
||||||
|
pl.frame = 1;
|
||||||
|
pl.SendFlags = UPDATE_ALL;
|
||||||
|
pl.customphysics = Empty;
|
||||||
|
pl.iBleeds = TRUE;
|
||||||
|
forceinfokey(pl, "*spec", "0");
|
||||||
|
forceinfokey(pl, "*deaths", ftos(pl.deaths));
|
||||||
|
|
||||||
|
/* this is where the mods want to deviate */
|
||||||
|
entity spot;
|
||||||
|
|
||||||
|
if (startspot != "") {
|
||||||
|
dprint(sprintf("^3Gamerules_Spawn^7: Startspot is %s\n", startspot));
|
||||||
|
LevelDecodeParms(pl);
|
||||||
|
setorigin(pl, Landmark_GetSpot());
|
||||||
|
} else {
|
||||||
|
LevelNewParms();
|
||||||
|
spot = find(world, ::classname, "info_player_start");
|
||||||
|
setorigin(pl, spot.origin);
|
||||||
|
pl.angles = spot.angles;
|
||||||
|
}
|
||||||
|
|
||||||
|
Weapons_RefreshAmmo(pl);
|
||||||
|
Client_FixAngle(pl, pl.angles);
|
||||||
|
}
|
32
src/server/items.h
Normal file
32
src/server/items.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* PICKUP ITEMS */
|
||||||
|
class item_pickup:NSRenderableEntity
|
||||||
|
{
|
||||||
|
int m_bFloating;
|
||||||
|
int m_iClip;
|
||||||
|
int m_iWasDropped;
|
||||||
|
int id;
|
||||||
|
void item_pickup(void);
|
||||||
|
|
||||||
|
virtual void Spawned(void);
|
||||||
|
virtual void Touch(entity);
|
||||||
|
virtual void SetItem(int i);
|
||||||
|
virtual void Respawn(void);
|
||||||
|
virtual void SetFloating(int);
|
||||||
|
virtual void PickupRespawn(void);
|
||||||
|
};
|
92
src/server/items.qc
Normal file
92
src/server/items.qc
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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 item_pickup::Touch(entity eToucher)
|
||||||
|
{
|
||||||
|
if (eToucher.classname != "player") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* don't remove if AddItem fails */
|
||||||
|
if (Weapons_AddItem((player)eToucher, id, m_iClip) == FALSE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logging_Pickup(eToucher, this, __NULL__);
|
||||||
|
Sound_Play(other, CHAN_ITEM, "weapon.pickup");
|
||||||
|
|
||||||
|
UseTargets(eToucher, TRIG_TOGGLE, m_flDelay);
|
||||||
|
|
||||||
|
if (real_owner || m_iWasDropped == 1 || cvar("sv_playerslots") == 1) {
|
||||||
|
Destroy();
|
||||||
|
} else {
|
||||||
|
Disappear();
|
||||||
|
ScheduleThink(PickupRespawn, 30.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void item_pickup::SetItem(int i)
|
||||||
|
{
|
||||||
|
id = i;
|
||||||
|
m_oldModel = Weapons_GetWorldmodel(id);
|
||||||
|
SetModel(GetSpawnModel());
|
||||||
|
SetSize([-16,-16,0], [16,16,16]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void item_pickup::SetFloating(int i)
|
||||||
|
{
|
||||||
|
m_bFloating = rint(bound(0, m_bFloating, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
item_pickup::PickupRespawn(void)
|
||||||
|
{
|
||||||
|
Respawn();
|
||||||
|
Sound_Play(this, CHAN_ITEM, "item.respawn");
|
||||||
|
}
|
||||||
|
|
||||||
|
void item_pickup::Respawn(void)
|
||||||
|
{
|
||||||
|
SetSolid(SOLID_TRIGGER);
|
||||||
|
SetOrigin(GetSpawnOrigin());
|
||||||
|
botinfo = BOTINFO_WEAPON;
|
||||||
|
|
||||||
|
/* At some points, the item id might not yet be set */
|
||||||
|
if (GetSpawnModel()) {
|
||||||
|
SetModel(GetSpawnModel());
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSize([-16,-16,0], [16,16,16]);
|
||||||
|
ReleaseThink();
|
||||||
|
|
||||||
|
if (!m_bFloating) {
|
||||||
|
DropToFloor();
|
||||||
|
SetMovetype(MOVETYPE_TOSS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
item_pickup::Spawned(void)
|
||||||
|
{
|
||||||
|
super::Spawned();
|
||||||
|
|
||||||
|
Sound_Precache("item.respawn");
|
||||||
|
Sound_Precache("weapon.pickup");
|
||||||
|
}
|
||||||
|
|
||||||
|
void item_pickup::item_pickup(void)
|
||||||
|
{
|
||||||
|
}
|
25
src/server/modelevent.qc
Normal file
25
src/server/modelevent.qc
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
Game_ServerModelEvent(float flTimeStamp, int iCode, string strData)
|
||||||
|
{
|
||||||
|
switch (iCode) {
|
||||||
|
default:
|
||||||
|
Event_ServerModelEvent(flTimeStamp, iCode, strData);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
35
src/server/progs.src
Normal file
35
src/server/progs.src
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#pragma target fte_5768
|
||||||
|
//#pragma flag enable assumeint
|
||||||
|
#pragma progs_dat "../../progs.dat"
|
||||||
|
|
||||||
|
#define QWSSQC
|
||||||
|
#define SERVER
|
||||||
|
|
||||||
|
#includelist
|
||||||
|
/* engine, then nuclide headers & functions */
|
||||||
|
../../../src/shared/fteextensions.qc
|
||||||
|
../../../src/shared/defs.h
|
||||||
|
../../../src/server/defs.h
|
||||||
|
../../../src/botlib/botinfo.h
|
||||||
|
../../../src/gs-entbase/server.src
|
||||||
|
../../../src/gs-entbase/shared.src
|
||||||
|
|
||||||
|
/* mod specific header */
|
||||||
|
defs.h
|
||||||
|
|
||||||
|
../shared/include.src
|
||||||
|
|
||||||
|
/* include the botlib if desired (optional) */
|
||||||
|
../../../src/botlib/include.src
|
||||||
|
|
||||||
|
/* mod specific functions */
|
||||||
|
gamerules.qc
|
||||||
|
gamerules_singleplayer.qc
|
||||||
|
gamerules_multiplayer.qc
|
||||||
|
modelevent.qc
|
||||||
|
items.qc
|
||||||
|
|
||||||
|
/* global server/shared code */
|
||||||
|
../../../src/server/include.src
|
||||||
|
../../../src/shared/include.src
|
||||||
|
#endlist
|
40
src/shared/flags.h
Normal file
40
src/shared/flags.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* game flags */
|
||||||
|
#define GF_SEMI_TOGGLED (int)(1<<0)
|
||||||
|
#define GF_FLASHLIGHT (int)(1<<1)
|
||||||
|
#define GF_UNUSED3 (int)(1<<2)
|
||||||
|
#define GF_UNUSED4 (int)(1<<3)
|
||||||
|
#define GF_UNUSED5 (int)(1<<4)
|
||||||
|
#define GF_UNUSED6 (int)(1<<5)
|
||||||
|
#define GF_UNUSED7 (int)(1<<6)
|
||||||
|
#define GF_UNUSED8 (int)(1<<7)
|
||||||
|
#define GF_UNUSED9 (int)(1<<8)
|
||||||
|
#define GF_UNUSED10 (int)(1<<9)
|
||||||
|
#define GF_UNUSED11 (int)(1<<10)
|
||||||
|
#define GF_UNUSED12 (int)(1<<11)
|
||||||
|
#define GF_UNUSED13 (int)(1<<12)
|
||||||
|
#define GF_UNUSED14 (int)(1<<14)
|
||||||
|
#define GF_UNUSED15 (int)(1<<16)
|
||||||
|
#define GF_UNUSED16 (int)(1<<13)
|
||||||
|
#define GF_UNUSED17 (int)(1<<17)
|
||||||
|
#define GF_UNUSED18 (int)(1<<18)
|
||||||
|
#define GF_UNUSED19 (int)(1<<19)
|
||||||
|
#define GF_UNUSED20 (int)(1<<20)
|
||||||
|
#define GF_UNUSED21 (int)(1<<21)
|
||||||
|
#define GF_UNUSED22 (int)(1<<22)
|
||||||
|
#define GF_UNUSED23 (int)(1<<23)
|
48
src/shared/fx_blood.qc
Normal file
48
src/shared/fx_blood.qc
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
var float PARTICLE_BLOOD;
|
||||||
|
|
||||||
|
void
|
||||||
|
FX_Blood_Init(void)
|
||||||
|
{
|
||||||
|
PARTICLE_BLOOD = particleeffectnum("part_blood");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
FX_Blood(vector pos, vector color)
|
||||||
|
{
|
||||||
|
#ifdef SERVER
|
||||||
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
||||||
|
WriteByte(MSG_MULTICAST, EV_BLOOD);
|
||||||
|
WriteCoord(MSG_MULTICAST, pos[0]);
|
||||||
|
WriteCoord(MSG_MULTICAST, pos[1]);
|
||||||
|
WriteCoord(MSG_MULTICAST, pos[2]);
|
||||||
|
WriteByte(MSG_MULTICAST, color[0] * 255);
|
||||||
|
WriteByte(MSG_MULTICAST, color[1] * 255);
|
||||||
|
WriteByte(MSG_MULTICAST, color[2] * 255);
|
||||||
|
msg_entity = self;
|
||||||
|
multicast(pos, MULTICAST_PVS);
|
||||||
|
#else
|
||||||
|
if (cvar("violence_hblood") <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pointparticles(PARTICLE_BLOOD, pos, [0,0,0], 1);
|
||||||
|
#endif
|
||||||
|
}
|
63
src/shared/fx_corpse.qc
Normal file
63
src/shared/fx_corpse.qc
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef SERVER
|
||||||
|
#define CORPSES_MAX 16
|
||||||
|
entity g_bodies;
|
||||||
|
|
||||||
|
void
|
||||||
|
FX_Corpse_Init(void)
|
||||||
|
{
|
||||||
|
entity next = spawn(NSRenderableEntity);
|
||||||
|
g_bodies = next;
|
||||||
|
|
||||||
|
for ( int i = 0; i <= CORPSES_MAX; i++ ) {
|
||||||
|
next.classname = "corpse";
|
||||||
|
next.owner = spawn(NSRenderableEntity);
|
||||||
|
|
||||||
|
if ( i == CORPSES_MAX ) {
|
||||||
|
next.owner = g_bodies;
|
||||||
|
} else {
|
||||||
|
next = next.owner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
entity
|
||||||
|
FX_Corpse_Next(void)
|
||||||
|
{
|
||||||
|
entity r = g_bodies;
|
||||||
|
g_bodies = g_bodies.owner;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
entity
|
||||||
|
FX_Corpse_Spawn(player pl, float anim)
|
||||||
|
{
|
||||||
|
NSRenderableEntity body_next = (NSRenderableEntity)FX_Corpse_Next();
|
||||||
|
setorigin(body_next, pl.origin + [0,0,32]);
|
||||||
|
body_next.SetMovetype(MOVETYPE_TOSS);
|
||||||
|
body_next.SetSolid(SOLID_CORPSE);
|
||||||
|
setmodel(body_next, pl.model);
|
||||||
|
setsize(body_next, VEC_HULL_MIN, VEC_HULL_MAX);
|
||||||
|
body_next.SetModelindex(pl.modelindex);
|
||||||
|
body_next.SetAngles(pl.angles);
|
||||||
|
body_next.velocity = (pl.velocity) + [0,0,120];
|
||||||
|
body_next.colormap = pl.colormap;
|
||||||
|
body_next.SetFrame(anim);
|
||||||
|
return (entity)body_next;
|
||||||
|
}
|
||||||
|
#endif
|
10
src/shared/include.src
Normal file
10
src/shared/include.src
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#includelist
|
||||||
|
player.qc
|
||||||
|
weapon_common.h
|
||||||
|
weapons.h
|
||||||
|
flags.h
|
||||||
|
fx_blood.qc
|
||||||
|
fx_corpse.qc
|
||||||
|
weapons.qc
|
||||||
|
weapon_common.qc
|
||||||
|
#endlist
|
114
src/shared/player.qc
Normal file
114
src/shared/player.qc
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* all potential SendFlags bits we can possibly send */
|
||||||
|
enumflags
|
||||||
|
{
|
||||||
|
PLAYER_AMMO1 = PLAYER_CUSTOMFIELDSTART,
|
||||||
|
PLAYER_AMMO2,
|
||||||
|
PLAYER_AMMO3,
|
||||||
|
PLAYER_UNUSED5,
|
||||||
|
PLAYER_UNUSED6,
|
||||||
|
PLAYER_UNUSED7,
|
||||||
|
PLAYER_UNUSED7,
|
||||||
|
PLAYER_UNUSED8
|
||||||
|
};
|
||||||
|
|
||||||
|
class player:NSClientPlayer
|
||||||
|
{
|
||||||
|
PREDICTED_INT(mode_tempstate)
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
virtual void(float,float) ReceiveEntity;
|
||||||
|
virtual void(void) PredictPreFrame;
|
||||||
|
virtual void(void) PredictPostFrame;
|
||||||
|
#else
|
||||||
|
virtual void(void) EvaluateEntity;
|
||||||
|
virtual float(entity, float) SendEntity;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
player::ReceiveEntity
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
player::ReceiveEntity(float new, float fl)
|
||||||
|
{
|
||||||
|
NSClientPlayer::ReceiveEntity(new, fl);
|
||||||
|
setorigin(this, origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
player::PredictPostFrame
|
||||||
|
|
||||||
|
Save the last valid server values away in the _net variants of each field
|
||||||
|
so we can roll them back later.
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
player::PredictPreFrame(void)
|
||||||
|
{
|
||||||
|
NSClientPlayer::PredictPreFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
player::PredictPostFrame
|
||||||
|
|
||||||
|
Where we roll back our values to the ones last sent/verified by the server.
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
player::PredictPostFrame(void)
|
||||||
|
{
|
||||||
|
NSClientPlayer::PredictPostFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
void
|
||||||
|
player::EvaluateEntity(void)
|
||||||
|
{
|
||||||
|
NSClientPlayer::EvaluateEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
player::SendEntity
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
float
|
||||||
|
player::SendEntity(entity ePEnt, float fChanged)
|
||||||
|
{
|
||||||
|
/* don't broadcast invisible players */
|
||||||
|
if (IsFakeSpectator() && ePEnt != this)
|
||||||
|
return (0);
|
||||||
|
if (!GetModelindex() && ePEnt != this)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fChanged = OptimiseChangedFlags(ePEnt, fChanged);
|
||||||
|
|
||||||
|
WriteByte(MSG_ENTITY, ENT_PLAYER);
|
||||||
|
WriteFloat(MSG_ENTITY, fChanged);
|
||||||
|
|
||||||
|
/* the generic client attributes */
|
||||||
|
NSClientPlayer::SendEntity(ePEnt, fChanged);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
#endif
|
99
src/shared/weapon_common.h
Normal file
99
src/shared/weapon_common.h
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NEW_INVENTORY
|
||||||
|
/* for AI identification purposes */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
WPNTYPE_INVALID, /* no logic */
|
||||||
|
WPNTYPE_RANGED, /* will want to keep their distance mostly */
|
||||||
|
WPNTYPE_THROW, /* has to keep some distance, but not too far */
|
||||||
|
WPNTYPE_CLOSE, /* have to get really close */
|
||||||
|
WPNTYPE_FULLAUTO, /* for things that need to be held down */
|
||||||
|
WPNTYPE_SEMI /* semi automatic */
|
||||||
|
} weapontype_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
string name;
|
||||||
|
int id; /* bitflag id */
|
||||||
|
int slot;
|
||||||
|
int slot_pos;
|
||||||
|
int allow_drop;
|
||||||
|
int weight; /* required for bestweapon */
|
||||||
|
void(void) precache;
|
||||||
|
string() wmodel;
|
||||||
|
string() deathmsg;
|
||||||
|
|
||||||
|
/* player specific */
|
||||||
|
string(player) pmodel;
|
||||||
|
float(player) aimanim;
|
||||||
|
weapontype_t(player) type; /* required for bot-AI */
|
||||||
|
void(player) draw;
|
||||||
|
void(player) holster;
|
||||||
|
void(player) primary;
|
||||||
|
void(player) secondary;
|
||||||
|
void(player) reload;
|
||||||
|
void(player) release;
|
||||||
|
int(player, int, int) pickup;
|
||||||
|
void(player) updateammo;
|
||||||
|
|
||||||
|
void(player, int) predraw; /* predraw... */
|
||||||
|
void(player) postdraw; /* postdraw... */
|
||||||
|
|
||||||
|
int(player) isempty; /* kinda handy */
|
||||||
|
void(player, int, vector, float) hudpic;
|
||||||
|
} weapon_t;
|
||||||
|
|
||||||
|
void Weapons_Holster(player pl);
|
||||||
|
void Weapons_Primary(player pl);
|
||||||
|
void Weapons_Secondary(player pl);
|
||||||
|
void Weapons_Reload(player pl);
|
||||||
|
void Weapons_Release(player pl);
|
||||||
|
void Weapons_PreDraw(player pl, int);
|
||||||
|
|
||||||
|
float Weapons_GetAim(player, int);
|
||||||
|
int Weapons_IsEmpty(player, int);
|
||||||
|
void Weapons_DrawCrosshair(player pl);
|
||||||
|
void Weapons_MakeVectors(player pl);
|
||||||
|
vector Weapons_GetCameraPos(player pl);
|
||||||
|
void Weapons_ViewAnimation(player pl, int);
|
||||||
|
void Weapons_ViewPunchAngle(player pl, vector);
|
||||||
|
int Weapons_IsPresent(player, int);
|
||||||
|
void Weapons_UpdateAmmo(player, int, int, int);
|
||||||
|
int Weapons_GetAnimation(player pl);
|
||||||
|
void Weapons_EnableModel(void);
|
||||||
|
void Weapons_DisableModel(void);
|
||||||
|
weapontype_t Weapons_GetType(player, int);
|
||||||
|
|
||||||
|
void Weapons_SetLeftModel(string);
|
||||||
|
void Weapons_SetRightModel(string);
|
||||||
|
|
||||||
|
void Weapons_SetRightGeomset(string);
|
||||||
|
void Weapons_SetLeftGeomset(string);
|
||||||
|
|
||||||
|
/* compat */
|
||||||
|
void Weapons_SetGeomset(string);
|
||||||
|
void Weapons_SetModel(string);
|
||||||
|
|
||||||
|
void Weapons_Sound(entity, float, string);
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
string Weapons_GetPlayermodel(player, int);
|
||||||
|
void Weapons_HUDPic(player, int, int, vector, float);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#endif
|
478
src/shared/weapon_common.qc
Normal file
478
src/shared/weapon_common.qc
Normal file
|
@ -0,0 +1,478 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NEW_INVENTORY
|
||||||
|
var int g_weapon_weights[g_weapons.length];
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
var int g_weapon_order[g_weapons.length];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Init(void)
|
||||||
|
{
|
||||||
|
/* in the future we'll have no internal weapon table, then this will fill
|
||||||
|
* one up... */
|
||||||
|
/*searchhandle sh;
|
||||||
|
filestream fh;
|
||||||
|
string line;
|
||||||
|
sh = search_begin("scripts/weapon_*.txt", TRUE, TRUE);
|
||||||
|
for (int i = 0; i < search_getsize(sh); i++) {
|
||||||
|
fh = fopen(search_getfilename(sh, i), FILE_READ);
|
||||||
|
if (fh < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((line = fgets(fh))) {
|
||||||
|
int w = tokenize(line);
|
||||||
|
switch (argv(0)) {
|
||||||
|
case "name":
|
||||||
|
break;
|
||||||
|
case "slot":
|
||||||
|
break;
|
||||||
|
case "slot_pos":
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fh);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
for (int i = 0; i < g_weapons.length; i++)
|
||||||
|
if (g_weapons[i].precache != __NULL__)
|
||||||
|
g_weapons[i].precache();
|
||||||
|
|
||||||
|
/* check our weapon weights */
|
||||||
|
int max = 0;
|
||||||
|
for (int i = 0; i < g_weapons.length; i++)
|
||||||
|
if (g_weapons[i].weight > max)
|
||||||
|
max = g_weapons[i].weight;
|
||||||
|
|
||||||
|
/* don't bother building the list if we've got no weights */
|
||||||
|
if (max <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* position in the weight array */
|
||||||
|
int w = 0;
|
||||||
|
|
||||||
|
/* loop through all weights */
|
||||||
|
for (int b = 0; b <= max; b++) {
|
||||||
|
/* loop through all weapons */
|
||||||
|
for (int i = 0; i < g_weapons.length; i++) {
|
||||||
|
/* if we've found a valid weight, add the weapon to the list */
|
||||||
|
if (g_weapons[i].weight == b) {
|
||||||
|
g_weapon_weights[w] = i;
|
||||||
|
w++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
for (int i = 0; i < g_weapons.length; i++)
|
||||||
|
print(sprintf("Weapon-Weight order: %s, %i\n", g_weapons[g_weapon_weights[i]].name, i));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
/* build our slot-order table */
|
||||||
|
int st = 0;
|
||||||
|
|
||||||
|
int max_slots = 0;
|
||||||
|
for (int i = 0; i < g_weapons.length; i++)
|
||||||
|
if (g_weapons[i].slot > max_slots)
|
||||||
|
max_slots = g_weapons[i].slot;
|
||||||
|
int max_pos = 0;
|
||||||
|
for (int i = 0; i < g_weapons.length; i++)
|
||||||
|
if (g_weapons[i].slot_pos > max_pos)
|
||||||
|
max_pos = g_weapons[i].slot_pos;
|
||||||
|
|
||||||
|
/* loop through all slots */
|
||||||
|
for (int s = 0; s <= max_slots; s++) {
|
||||||
|
/* loop through all positions */
|
||||||
|
for (int p = 0; p < max_pos; p++) {
|
||||||
|
/* loop through all the weapons */
|
||||||
|
for (int i = 0; i < g_weapons.length; i++) {
|
||||||
|
if (g_weapons[i].slot == s && g_weapons[i].slot_pos == p) {
|
||||||
|
g_weapon_order[st] = i;
|
||||||
|
st++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
for (int i = 0; i < g_weapons.length; i++)
|
||||||
|
print(sprintf("Weapon-List order: %s, %i\n", g_weapons[g_weapon_order[i]].name, i));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_SetLeftModel(string mdl)
|
||||||
|
{
|
||||||
|
#ifdef CLIENT
|
||||||
|
setmodel(pSeat->m_eViewModelL, mdl);
|
||||||
|
setsize(pSeat->m_eViewModelL, [0,0,0], [0,0,0]);
|
||||||
|
pSeat->m_eViewModelL.effects |= EF_NOSHADOW;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void
|
||||||
|
Weapons_SetRightModel(string mdl)
|
||||||
|
{
|
||||||
|
#ifdef CLIENT
|
||||||
|
setmodel(pSeat->m_eViewModel, mdl);
|
||||||
|
setsize(pSeat->m_eViewModel, [0,0,0], [0,0,0]);
|
||||||
|
pSeat->m_eViewModel.effects |= EF_NOSHADOW;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_SetModel(string mdl)
|
||||||
|
{
|
||||||
|
Weapons_SetRightModel(mdl);
|
||||||
|
Weapons_SetLeftModel("");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_SetRightGeomset(string set)
|
||||||
|
{
|
||||||
|
#ifdef CLIENT
|
||||||
|
setcustomskin(pSeat->m_eViewModel, "", set);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void
|
||||||
|
Weapons_SetLeftGeomset(string set)
|
||||||
|
{
|
||||||
|
#ifdef CLIENT
|
||||||
|
setcustomskin(pSeat->m_eViewModelL, "", set);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_SetGeomset(string set)
|
||||||
|
{
|
||||||
|
Weapons_SetRightGeomset(set);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Draw(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
/* In case the previous weapon hid the model */
|
||||||
|
Weapons_EnableModel();
|
||||||
|
|
||||||
|
pl.w_attack_next = 0.5f;
|
||||||
|
pl.w_idle_next = 2.5f;
|
||||||
|
pl.viewzoom = 1.0f;
|
||||||
|
|
||||||
|
/* we're meant to respawn when we're dead, don't unset! */
|
||||||
|
if (pl.health > 0) {
|
||||||
|
pl.think = __NULL__;
|
||||||
|
pl.nextthink = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make sure this is all wiped */
|
||||||
|
pl.a_ammo1 = pl.a_ammo2 = pl.a_ammo3 = 0;
|
||||||
|
|
||||||
|
if (g_weapons[i].draw != __NULL__)
|
||||||
|
g_weapons[i].draw(pl);
|
||||||
|
|
||||||
|
if (g_weapons[i].updateammo != __NULL__)
|
||||||
|
g_weapons[i].updateammo(pl);
|
||||||
|
|
||||||
|
pl.gflags |= GF_SEMI_TOGGLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Holster(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].holster != __NULL__)
|
||||||
|
g_weapons[i].holster(pl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Primary(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (pl.gflags & GF_SEMI_TOGGLED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (g_weapons[i].primary != __NULL__)
|
||||||
|
g_weapons[i].primary(pl);
|
||||||
|
|
||||||
|
if (g_weapons[i].updateammo != __NULL__)
|
||||||
|
g_weapons[i].updateammo(pl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_AmmoUpdate(entity target)
|
||||||
|
{
|
||||||
|
player pl = (player)target;
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].updateammo != __NULL__)
|
||||||
|
g_weapons[i].updateammo(pl);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Secondary(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].secondary != __NULL__)
|
||||||
|
g_weapons[i].secondary(pl);
|
||||||
|
|
||||||
|
if (g_weapons[i].updateammo != __NULL__)
|
||||||
|
g_weapons[i].updateammo(pl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Reload(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].reload != __NULL__)
|
||||||
|
g_weapons[i].reload(pl);
|
||||||
|
|
||||||
|
if (g_weapons[i].updateammo != __NULL__)
|
||||||
|
g_weapons[i].updateammo(pl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Release(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].release != __NULL__)
|
||||||
|
g_weapons[i].release(pl);
|
||||||
|
|
||||||
|
pl.gflags &= ~GF_SEMI_TOGGLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_PreDraw(player pl, int thirdperson)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].predraw != __NULL__)
|
||||||
|
g_weapons[i].predraw(pl, thirdperson);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Weapons_IsEmpty(player pl, int w)
|
||||||
|
{
|
||||||
|
int r = 0;
|
||||||
|
|
||||||
|
entity oself = self;
|
||||||
|
self = pl;
|
||||||
|
|
||||||
|
if (g_weapons[w].isempty != __NULL__)
|
||||||
|
r = g_weapons[w].isempty(pl);
|
||||||
|
|
||||||
|
self = oself;
|
||||||
|
|
||||||
|
return (r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
weapontype_t
|
||||||
|
Weapons_GetType(player pl, int w)
|
||||||
|
{
|
||||||
|
weapontype_t r = WPNTYPE_INVALID;
|
||||||
|
|
||||||
|
entity oself = self;
|
||||||
|
self = pl;
|
||||||
|
|
||||||
|
if (g_weapons[w].type != __NULL__)
|
||||||
|
r = g_weapons[w].type(pl);
|
||||||
|
|
||||||
|
self = oself;
|
||||||
|
|
||||||
|
return (r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_DrawCrosshair(player pl)
|
||||||
|
{
|
||||||
|
int i = pl.activeweapon;
|
||||||
|
|
||||||
|
if (g_weapons[i].postdraw != __NULL__)
|
||||||
|
g_weapons[i].postdraw(pl);
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
Weapons_GetWorldmodel(int id)
|
||||||
|
{
|
||||||
|
if (g_weapons[id].wmodel != __NULL__)
|
||||||
|
return g_weapons[id].wmodel();
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
Weapons_GetPlayermodel(player pl, int id)
|
||||||
|
{
|
||||||
|
if (g_weapons[id].pmodel != __NULL__)
|
||||||
|
return g_weapons[id].pmodel(pl);
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
Weapons_GetDeathmessage(int id)
|
||||||
|
{
|
||||||
|
if (g_weapons[id].deathmsg != __NULL__)
|
||||||
|
return g_weapons[id].deathmsg();
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
Weapons_GetAim(player pl, int id)
|
||||||
|
{
|
||||||
|
if (g_weapons[id].aimanim != __NULL__)
|
||||||
|
return g_weapons[id].aimanim(pl);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
void
|
||||||
|
Weapons_HUDPic(player pl, int id, int s, vector pos, float a)
|
||||||
|
{
|
||||||
|
if (g_weapons[id].hudpic != __NULL__)
|
||||||
|
g_weapons[id].hudpic(pl, s, pos, a);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_MakeVectors(player pl)
|
||||||
|
{
|
||||||
|
#ifdef SERVER
|
||||||
|
makevectors(pl.v_angle);
|
||||||
|
#else
|
||||||
|
makevectors(view_angles);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
vector
|
||||||
|
Weapons_GetCameraPos(player pl)
|
||||||
|
{
|
||||||
|
#ifdef SERVER
|
||||||
|
return (pl.origin + pl.view_ofs);
|
||||||
|
#else
|
||||||
|
return getproperty(VF_ORIGIN);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_ViewAnimation(player pl, int i)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
View_PlayAnimation(i);
|
||||||
|
#endif
|
||||||
|
pl.weaponframe = i;
|
||||||
|
pl.weapontime = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
|
int View_GetAnimation(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
Weapons_GetAnimation(player pl)
|
||||||
|
{
|
||||||
|
return pl.weaponframe;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_ViewPunchAngle(player pl, vector add)
|
||||||
|
{
|
||||||
|
pl.punchangle += add;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Weapons_IsPresent(player pl, int w)
|
||||||
|
{
|
||||||
|
if (pl.g_items & g_weapons[w].id) {
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_EnableModel(void)
|
||||||
|
{
|
||||||
|
#ifdef CLIENT
|
||||||
|
View_EnableViewmodel();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_DisableModel(void)
|
||||||
|
{
|
||||||
|
#ifdef CLIENT
|
||||||
|
View_DisableViewmodel();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Weapons_UpdateAmmo
|
||||||
|
|
||||||
|
Sets .a_ammoX fields and clamps them so they can be networked as a single byte.
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Weapons_UpdateAmmo(player pl, int a1, int a2, int a3)
|
||||||
|
{
|
||||||
|
/* no change */
|
||||||
|
if (a1 == -1)
|
||||||
|
a1 = pl.a_ammo1;
|
||||||
|
if (a2 == -1)
|
||||||
|
a2 = pl.a_ammo2;
|
||||||
|
if (a3 == -1)
|
||||||
|
a3 = pl.a_ammo3;
|
||||||
|
|
||||||
|
/* networked as bytes, since we don't need more. Clamp to avoid errors */
|
||||||
|
pl.a_ammo1 = a1;
|
||||||
|
pl.a_ammo2 = a2;
|
||||||
|
pl.a_ammo3 = a3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Weapons_Sound(entity pl, float channel, string snd)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
#ifdef SERVER
|
||||||
|
float prev = pl.dimension_see;
|
||||||
|
pl.dimension_see=0;
|
||||||
|
Sound_Play(pl, channel, snd);
|
||||||
|
pl.dimension_see = prev;
|
||||||
|
#else
|
||||||
|
/* client side == immediately */
|
||||||
|
Sound_Play(pl, channel, snd);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef SERVER
|
||||||
|
Sound_Play(pl, channel, snd);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
20
src/shared/weapons.h
Normal file
20
src/shared/weapons.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
{
|
||||||
|
WEAPON_NONE
|
||||||
|
};
|
20
src/shared/weapons.qc
Normal file
20
src/shared/weapons.qc
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Vera Visions LLC.
|
||||||
|
*
|
||||||
|
* 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_t w_null = {};
|
||||||
|
weapon_t g_weapons[] = {
|
||||||
|
w_null
|
||||||
|
};
|
116
zpak001.pk3dir/def/spawns.def
Normal file
116
zpak001.pk3dir/def/spawns.def
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
entityDef info_player_start
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Singleplayer Spawn Point"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef mp_deathmatch_spawn
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Deathmatch Spawn Point"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef mp_teamdeathmatch_spawn
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Team Deathmatch Spawn Point"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef mp_retrieval_spawn_allied
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Retrieval: Allied Spawn"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef mp_retrieval_spawn_axis
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Retrieval: Axis Spawn"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef mp_searchanddestroy_spawn_allied
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Search & Destroy: Allied Spawn"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef mp_searchanddestroy_spawn_axis
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Search & Destroy: Axis Spawn"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
|
||||||
|
spawnclass NSSpawnPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef misc_model
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Decorative Model"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass NSRenderableEntity
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef script_model
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Scripted Model"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass NSRenderableEntity
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef func_static
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Static Brush Model"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass func_wall
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef script_brushmodel
|
||||||
|
{
|
||||||
|
editor_mins "-16 -16 -36"
|
||||||
|
editor_maxs "16 16 36"
|
||||||
|
editor_description "Scripted Brush Model"
|
||||||
|
editor_color "1 0 0"
|
||||||
|
|
||||||
|
spawnclass func_wall
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
51
zpak001.pk3dir/def/weapons.def
Normal file
51
zpak001.pk3dir/def/weapons.def
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
entityDef item_ammo_stielhandgranate_open
|
||||||
|
{
|
||||||
|
editor_color ".3 .3 1"
|
||||||
|
editor_mins "-16 -16 -16"
|
||||||
|
editor_maxs "16 16 16"
|
||||||
|
|
||||||
|
model "xmodel/ammo_stielhandgranate1"
|
||||||
|
spawnclass NSItem
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
entityDef item_ammo_stielhandgranate_closed
|
||||||
|
{
|
||||||
|
editor_color ".3 .3 1"
|
||||||
|
editor_mins "-16 -16 -16"
|
||||||
|
editor_maxs "16 16 16"
|
||||||
|
model "xmodel/ammo_stielhandgranate2"
|
||||||
|
spawnclass NSItem
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
entityDef item_health_small
|
||||||
|
{
|
||||||
|
editor_color ".3 .3 1"
|
||||||
|
editor_mins "-16 -16 -16"
|
||||||
|
editor_maxs "16 16 16"
|
||||||
|
|
||||||
|
model "xmodel/health_small"
|
||||||
|
spawnclass NSItem
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef item_health
|
||||||
|
{
|
||||||
|
editor_color ".3 .3 1"
|
||||||
|
editor_mins "-16 -16 -16"
|
||||||
|
editor_maxs "16 16 16"
|
||||||
|
|
||||||
|
model xmodel/health_medium"
|
||||||
|
spawnclass NSItem
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
entityDef item_health_large
|
||||||
|
{
|
||||||
|
editor_color ".3 .3 1"
|
||||||
|
editor_mins "-16 -16 -16"
|
||||||
|
editor_maxs "16 16 16"
|
||||||
|
|
||||||
|
model xmodel/health_large"
|
||||||
|
spawnclass NSItem
|
||||||
|
}
|
Loading…
Reference in a new issue