Code fixups against latest Nuclide. Move gamerules into their own module.
This commit is contained in:
parent
4dba3af403
commit
35bbae956b
25 changed files with 475 additions and 289 deletions
14
engine.h
14
engine.h
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
/* disable quake specific hacks and overrides */
|
/* disable quake specific hacks and overrides */
|
||||||
#define QUAKETC
|
#define QUAKETC
|
||||||
#define NOBUILTINMENUS
|
//#define NOBUILTINMENUS
|
||||||
#define NOLEGACY
|
#define NOLEGACY
|
||||||
|
|
||||||
/* engine behaviour */
|
/* engine behaviour */
|
||||||
|
@ -43,8 +43,11 @@
|
||||||
#define USEAREAGRID /* leave it on, improves performance */
|
#define USEAREAGRID /* leave it on, improves performance */
|
||||||
#define AVAIL_DINPUT /* input for Windows */
|
#define AVAIL_DINPUT /* input for Windows */
|
||||||
#define AVAIL_FREETYPE /* for truetype font rendering */
|
#define AVAIL_FREETYPE /* for truetype font rendering */
|
||||||
#define AVAIL_STBI /* avoid libpng/libjpeg dependancies */
|
//#define AVAIL_STBI /* avoid libpng/libjpeg dependancies */
|
||||||
#define ENGINE_ROUTING /* engine-side, fast routing */
|
#define ENGINE_ROUTING /* engine-side, fast routing */
|
||||||
|
#define HAVE_MEDIA_DECODER /* can play cin/roq, more with plugins */
|
||||||
|
#define HAVE_MEDIA_ENCODER /* capture/capturedemo work */
|
||||||
|
#define PACKAGEMANAGER /* enable/disable/download packages and plugins */
|
||||||
|
|
||||||
#ifndef LEGACY_GPU
|
#ifndef LEGACY_GPU
|
||||||
#define RTLIGHTS
|
#define RTLIGHTS
|
||||||
|
@ -141,8 +144,8 @@
|
||||||
#undef HAVE_SPEEX /* .xz decompression */
|
#undef HAVE_SPEEX /* .xz decompression */
|
||||||
#undef AVAIL_GZDEC /* .gz decompression */
|
#undef AVAIL_GZDEC /* .gz decompression */
|
||||||
#undef PACKAGE_DZIP /* .dzip special-case archive support */
|
#undef PACKAGE_DZIP /* .dzip special-case archive support */
|
||||||
#undef AVAIL_PNGLIB /* .png image format support (read+screenshots) */
|
#define AVAIL_PNGLIB /* .png image format support (read+screenshots) */
|
||||||
#undef AVAIL_JPEGLIB /* .jpeg image format support (read+screenshots) */
|
#define AVAIL_JPEGLIB /* .jpeg image format support (read+screenshots) */
|
||||||
#undef AVAIL_MP3_ACM /* .mp3 support (in windows). */
|
#undef AVAIL_MP3_ACM /* .mp3 support (in windows). */
|
||||||
#undef IMAGEFMT_DDS
|
#undef IMAGEFMT_DDS
|
||||||
#undef IMAGEFMT_PKM
|
#undef IMAGEFMT_PKM
|
||||||
|
@ -179,11 +182,8 @@
|
||||||
#undef HLSERVER /* regressed, unfinished */
|
#undef HLSERVER /* regressed, unfinished */
|
||||||
#undef FTPSERVER
|
#undef FTPSERVER
|
||||||
#undef HAVE_JUKEBO /* includes built-in jukebox */
|
#undef HAVE_JUKEBO /* includes built-in jukebox */
|
||||||
#define HAVE_MEDIA_DECODER /* can play cin/roq, more with plugins */
|
|
||||||
#undef HAVE_MEDIA_ENCODER /* capture/capturedemo work */
|
|
||||||
#undef HAVE_SPEECHTOTEXT /* Windows speech-to-text thing */
|
#undef HAVE_SPEECHTOTEXT /* Windows speech-to-text thing */
|
||||||
#undef SAVEDGAMES
|
#undef SAVEDGAMES
|
||||||
#undef PACKAGEMANAGER /* enable/disable/download packages and plugins */
|
|
||||||
#undef HEADLESSQUAKE
|
#undef HEADLESSQUAKE
|
||||||
#undef WAYLANDQUAKE
|
#undef WAYLANDQUAKE
|
||||||
#undef SERVER_DEMO_PLAYBACK /* deprecated */
|
#undef SERVER_DEMO_PLAYBACK /* deprecated */
|
||||||
|
|
|
@ -4,3 +4,5 @@ all:
|
||||||
cd client && $(MAKE)
|
cd client && $(MAKE)
|
||||||
cd server && $(MAKE)
|
cd server && $(MAKE)
|
||||||
cd menu && $(MAKE)
|
cd menu && $(MAKE)
|
||||||
|
cd ../zpak001.pk3dir/maps/mp/gametypes/ && $(QCC) dm.qc
|
||||||
|
cd ../zpak001.pk3dir/maps/ && $(QCC) singleplayer.qc
|
|
@ -24,7 +24,7 @@ ClientGame_ConsoleCommand(void)
|
||||||
{
|
{
|
||||||
switch(argv(0)) {
|
switch(argv(0)) {
|
||||||
case "chooseteam":
|
case "chooseteam":
|
||||||
sendevent("HLDM_Chooseteam", "s", argv(1));
|
localcmd(sprintf("cmd %s %s\n", argv(0), argv(1)));
|
||||||
break;
|
break;
|
||||||
case "invnext":
|
case "invnext":
|
||||||
pSeatLocal->weaponSelectionHUD.SelectNext(false);
|
pSeatLocal->weaponSelectionHUD.SelectNext(false);
|
||||||
|
|
|
@ -144,12 +144,6 @@ HUD_DrawHealth(void)
|
||||||
pSeatLocal->m_flHealthAlpha = 1.0;
|
pSeatLocal->m_flHealthAlpha = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSeatLocal->m_flHealthAlpha >= HUD_ALPHA) {
|
|
||||||
pSeatLocal->m_flHealthAlpha -= clframetime * 0.5;
|
|
||||||
} else {
|
|
||||||
pSeatLocal->m_flHealthAlpha = HUD_ALPHA;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = g_hudmins + [88, g_hudres[1] - 42];
|
pos = g_hudmins + [88, g_hudres[1] - 42];
|
||||||
if (pl.health > 25) {
|
if (pl.health > 25) {
|
||||||
drawsubpic(
|
drawsubpic(
|
||||||
|
@ -178,6 +172,12 @@ HUD_DrawHealth(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
pSeatLocal->m_iHealthOld = pl.health;
|
pSeatLocal->m_iHealthOld = pl.health;
|
||||||
|
|
||||||
|
if (pSeatLocal->m_flHealthAlpha >= HUD_ALPHA) {
|
||||||
|
pSeatLocal->m_flHealthAlpha = bound(HUD_ALPHA, pSeatLocal->m_flHealthAlpha - (clframetime * 0.5), 1.0);
|
||||||
|
} else {
|
||||||
|
pSeatLocal->m_flHealthAlpha = HUD_ALPHA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* armor/suit charge */
|
/* armor/suit charge */
|
||||||
|
@ -193,12 +193,6 @@ HUD_DrawArmor(void)
|
||||||
pSeatLocal->m_flArmorAlpha = 1.0;
|
pSeatLocal->m_flArmorAlpha = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSeatLocal->m_flArmorAlpha >= HUD_ALPHA) {
|
|
||||||
pSeatLocal->m_flArmorAlpha -= clframetime * 0.5;
|
|
||||||
} else {
|
|
||||||
pSeatLocal->m_flArmorAlpha = HUD_ALPHA;
|
|
||||||
}
|
|
||||||
|
|
||||||
drawsubpic(
|
drawsubpic(
|
||||||
pos + [-80,-9],
|
pos + [-80,-9],
|
||||||
[40,40],
|
[40,40],
|
||||||
|
@ -226,6 +220,12 @@ HUD_DrawArmor(void)
|
||||||
|
|
||||||
HUD_DrawNums(pl.armor, pos, pSeatLocal->m_flArmorAlpha, g_hud_color);
|
HUD_DrawNums(pl.armor, pos, pSeatLocal->m_flArmorAlpha, g_hud_color);
|
||||||
pSeatLocal->m_iArmorOld = pl.armor;
|
pSeatLocal->m_iArmorOld = pl.armor;
|
||||||
|
|
||||||
|
if (pSeatLocal->m_flArmorAlpha >= HUD_ALPHA) {
|
||||||
|
pSeatLocal->m_flArmorAlpha = bound(HUD_ALPHA, pSeatLocal->m_flArmorAlpha - (clframetime * 0.5), 1.0);
|
||||||
|
} else {
|
||||||
|
pSeatLocal->m_flArmorAlpha = HUD_ALPHA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* magazine/clip ammo */
|
/* magazine/clip ammo */
|
||||||
|
@ -240,15 +240,15 @@ HUD_DrawAmmo1(void)
|
||||||
pSeatLocal->m_iAmmo1Old = pl.a_ammo1;
|
pSeatLocal->m_iAmmo1Old = pl.a_ammo1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSeatLocal->m_flAmmo1Alpha >= HUD_ALPHA) {
|
|
||||||
pSeatLocal->m_flAmmo1Alpha -= clframetime * 0.5;
|
|
||||||
} else {
|
|
||||||
pSeatLocal->m_flAmmo1Alpha = HUD_ALPHA;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = g_hudmins + [g_hudres[0] - 152, g_hudres[1] - 42];
|
pos = g_hudmins + [g_hudres[0] - 152, g_hudres[1] - 42];
|
||||||
HUD_DrawNums(pl.a_ammo1, pos, pSeatLocal->m_flAmmo1Alpha, g_hud_color);
|
HUD_DrawNums(pl.a_ammo1, pos, pSeatLocal->m_flAmmo1Alpha, g_hud_color);
|
||||||
HUD_DrawSeperator(pos + [30,0]);
|
HUD_DrawSeperator(pos + [30,0]);
|
||||||
|
|
||||||
|
if (pSeatLocal->m_flAmmo1Alpha >= HUD_ALPHA) {
|
||||||
|
pSeatLocal->m_flAmmo1Alpha = bound(HUD_ALPHA, pSeatLocal->m_flAmmo1Alpha - (clframetime * 0.5), 1.0);
|
||||||
|
} else {
|
||||||
|
pSeatLocal->m_flAmmo1Alpha = HUD_ALPHA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* leftover type ammo */
|
/* leftover type ammo */
|
||||||
|
@ -263,14 +263,14 @@ HUD_DrawAmmo2(void)
|
||||||
pSeatLocal->m_iAmmo2Old = pl.a_ammo2;
|
pSeatLocal->m_iAmmo2Old = pl.a_ammo2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pos = g_hudmins + [g_hudres[0] - 72, g_hudres[1] - 42];
|
||||||
|
HUD_DrawNums(pl.a_ammo2, pos, pSeatLocal->m_flAmmo2Alpha, g_hud_color);
|
||||||
|
|
||||||
if (pSeatLocal->m_flAmmo2Alpha >= HUD_ALPHA) {
|
if (pSeatLocal->m_flAmmo2Alpha >= HUD_ALPHA) {
|
||||||
pSeatLocal->m_flAmmo2Alpha -= clframetime * 0.5;
|
pSeatLocal->m_flAmmo2Alpha = bound(HUD_ALPHA, pSeatLocal->m_flAmmo2Alpha - (clframetime * 0.5), 1.0);
|
||||||
} else {
|
} else {
|
||||||
pSeatLocal->m_flAmmo2Alpha = HUD_ALPHA;
|
pSeatLocal->m_flAmmo2Alpha = HUD_ALPHA;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = g_hudmins + [g_hudres[0] - 72, g_hudres[1] - 42];
|
|
||||||
HUD_DrawNums(pl.a_ammo2, pos, pSeatLocal->m_flAmmo2Alpha, g_hud_color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* special ammo */
|
/* special ammo */
|
||||||
|
@ -285,14 +285,15 @@ HUD_DrawAmmo3(void)
|
||||||
pSeatLocal->m_iAmmo3Old = pl.a_ammo3;
|
pSeatLocal->m_iAmmo3Old = pl.a_ammo3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pos = g_hudmins + [g_hudres[0] - 72, g_hudres[1] - 74];
|
||||||
|
HUD_DrawNums(pl.a_ammo3, pos, pSeatLocal->m_flAmmo3Alpha, g_hud_color);
|
||||||
|
|
||||||
if (pSeatLocal->m_flAmmo3Alpha >= HUD_ALPHA) {
|
if (pSeatLocal->m_flAmmo3Alpha >= HUD_ALPHA) {
|
||||||
pSeatLocal->m_flAmmo3Alpha -= clframetime * 0.5;
|
pSeatLocal->m_flAmmo3Alpha = bound(HUD_ALPHA, pSeatLocal->m_flAmmo3Alpha - (clframetime * 0.5), 1.0);
|
||||||
} else {
|
} else {
|
||||||
pSeatLocal->m_flAmmo3Alpha = HUD_ALPHA;
|
pSeatLocal->m_flAmmo3Alpha = HUD_ALPHA;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = g_hudmins + [g_hudres[0] - 72, g_hudres[1] - 74];
|
|
||||||
HUD_DrawNums(pl.a_ammo3, pos, pSeatLocal->m_flAmmo3Alpha, g_hud_color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ammo bar */
|
/* ammo bar */
|
||||||
|
|
|
@ -27,15 +27,12 @@ typedef struct {
|
||||||
string src_sprite; /* precaching reasons */
|
string src_sprite; /* precaching reasons */
|
||||||
} obituaryimg_t;
|
} obituaryimg_t;
|
||||||
|
|
||||||
obituaryimg_t *g_obtypes;
|
|
||||||
int g_obtype_count;
|
|
||||||
|
|
||||||
/* actual obituary storage */
|
/* actual obituary storage */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
string attacker;
|
string attacker;
|
||||||
string victim;
|
string victim;
|
||||||
int icon;
|
string icon;
|
||||||
} obituary_t;
|
} obituary_t;
|
||||||
|
|
||||||
obituary_t g_obituary[OBITUARY_LINES];
|
obituary_t g_obituary[OBITUARY_LINES];
|
||||||
|
|
|
@ -17,114 +17,38 @@
|
||||||
void
|
void
|
||||||
Obituary_Init(void)
|
Obituary_Init(void)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
int c;
|
|
||||||
int i;
|
|
||||||
filestream fh;
|
|
||||||
string line;
|
|
||||||
vector tmp;
|
|
||||||
|
|
||||||
if (g_obtype_count > 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_obtype_count = 0;
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
fh = fopen("sprites/hud.txt", FILE_READ);
|
|
||||||
if (fh < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* count valid entries */
|
|
||||||
while ((line = fgets(fh))) {
|
|
||||||
if (substring(line, 0, 2) == "d_") {
|
|
||||||
c = tokenize(line);
|
|
||||||
if (c == 7 && argv(1) == "640") {
|
|
||||||
g_obtype_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_obtypes = memalloc(sizeof(obituaryimg_t) * g_obtype_count);
|
|
||||||
|
|
||||||
fseek(fh, 0);
|
|
||||||
|
|
||||||
/* read them in */
|
|
||||||
while ((line = fgets(fh))) {
|
|
||||||
if (substring(line, 0, 2) == "d_") {
|
|
||||||
c = tokenize(line);
|
|
||||||
|
|
||||||
/* we only care about the high-res (640) variants. the 320
|
|
||||||
* HUD is useless to us. Just use the builtin scaler */
|
|
||||||
if (c == 7 && argv(1) == "640") {
|
|
||||||
g_obtypes[i].name = substring(argv(0), 2, -1);
|
|
||||||
g_obtypes[i].src_sprite = sprintf("sprites/%s.spr", argv(2));
|
|
||||||
precache_model(g_obtypes[i].src_sprite);
|
|
||||||
g_obtypes[i].sprite = spriteframe(sprintf("sprites/%s.spr", argv(2)), 0, 0.0f);
|
|
||||||
g_obtypes[i].size[0] = stof(argv(5));
|
|
||||||
g_obtypes[i].size[1] = stof(argv(6));
|
|
||||||
tmp = drawgetimagesize(g_obtypes[i].sprite);
|
|
||||||
g_obtypes[i].src_pos[0] = stof(argv(3)) / tmp[0];
|
|
||||||
g_obtypes[i].src_pos[1] = stof(argv(4)) / tmp[1];
|
|
||||||
g_obtypes[i].src_size[0] = g_obtypes[i].size[0] / tmp[0];
|
|
||||||
g_obtypes[i].src_size[1] = g_obtypes[i].size[1] / tmp[1];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fh);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Obituary_Precache(void)
|
Obituary_Precache(void)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < g_obtype_count; i++)
|
|
||||||
precache_model(g_obtypes[i].src_sprite);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Obituary_KillIcon(int id, float w)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
if (w > 0)
|
|
||||||
for (int i = 0; i < g_obtype_count; i++) {
|
|
||||||
if (g_weapons[w].name == g_obtypes[i].name) {
|
|
||||||
g_obituary[id].icon = i;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look for skull instead */
|
|
||||||
for (int i = 0; i < g_obtype_count; i++) {
|
|
||||||
if (g_obtypes[i].name == "skull") {
|
|
||||||
g_obituary[id].icon = i;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Obituary_Add(string attacker, string victim, float weapon, float flags)
|
Obituary_Add(string attacker, string victim, string weapon, float flags)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
int i;
|
int i;
|
||||||
int x, y;
|
int x, y;
|
||||||
x = OBITUARY_LINES;
|
x = OBITUARY_LINES;
|
||||||
|
string weaponIcon = "";
|
||||||
|
|
||||||
if (attacker == "worldspawn" || attacker == victim) {
|
if (attacker == "worldspawn" || attacker == victim) {
|
||||||
attacker = "";
|
attacker = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
weaponIcon = EntityDef_GetKeyValue(weapon, "killIcon");
|
||||||
|
|
||||||
|
if (weaponIcon == "") {
|
||||||
|
weaponIcon = "d_skull";
|
||||||
|
}
|
||||||
|
|
||||||
/* we're not full yet, so fill up the buffer */
|
/* we're not full yet, so fill up the buffer */
|
||||||
if (g_obituary_count < x) {
|
if (g_obituary_count < x) {
|
||||||
y = g_obituary_count;
|
y = g_obituary_count;
|
||||||
g_obituary[y].attacker = attacker;
|
g_obituary[y].attacker = attacker;
|
||||||
g_obituary[y].victim = victim;
|
g_obituary[y].victim = victim;
|
||||||
Obituary_KillIcon(y, weapon);
|
g_obituary[y].icon = weaponIcon;
|
||||||
g_obituary_count++;
|
g_obituary_count++;
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < (x-1); i++) {
|
for (i = 0; i < (x-1); i++) {
|
||||||
|
@ -135,11 +59,12 @@ Obituary_Add(string attacker, string victim, float weapon, float flags)
|
||||||
/* after rearranging, add the newest to the bottom. */
|
/* after rearranging, add the newest to the bottom. */
|
||||||
g_obituary[x-1].attacker = attacker;
|
g_obituary[x-1].attacker = attacker;
|
||||||
g_obituary[x-1].victim = victim;
|
g_obituary[x-1].victim = victim;
|
||||||
Obituary_KillIcon(x-1, weapon);
|
g_obituary[x-1].icon = weaponIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_obituary_time = OBITUARY_TIME;
|
g_obituary_time = OBITUARY_TIME;
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (g_weapons[weapon].deathmsg) {
|
if (g_weapons[weapon].deathmsg) {
|
||||||
string conprint = g_weapons[weapon].deathmsg();
|
string conprint = g_weapons[weapon].deathmsg();
|
||||||
|
|
||||||
|
@ -191,18 +116,13 @@ Obituary_Draw(void)
|
||||||
v = g_obituary[i].victim;
|
v = g_obituary[i].victim;
|
||||||
drawstring_r(item + [0,2], v, [12,12], [1,1,1], 1.0f, 0);
|
drawstring_r(item + [0,2], v, [12,12], [1,1,1], 1.0f, 0);
|
||||||
item[0] -= stringwidth(v, TRUE, [12,12]) + 4;
|
item[0] -= stringwidth(v, TRUE, [12,12]) + 4;
|
||||||
item[0] -= g_obtypes[g_obituary[i].icon].size[0];
|
|
||||||
|
|
||||||
drawsubpic(
|
|
||||||
item,
|
//item[0] -= g_obtypes[g_obituary[i].icon].size[0];
|
||||||
[g_obtypes[g_obituary[i].icon].size[0], g_obtypes[g_obituary[i].icon].size[1]],
|
|
||||||
g_obtypes[g_obituary[i].icon].sprite,
|
HLSprite_Draw_RGBA(g_obituary[i].icon, item, g_hud_color, 1.0f, true);
|
||||||
[g_obtypes[g_obituary[i].icon].src_pos[0],g_obtypes[g_obituary[i].icon].src_pos[1]],
|
|
||||||
[g_obtypes[g_obituary[i].icon].src_size[0],g_obtypes[g_obituary[i].icon].src_size[1]],
|
// draw g_obituary[i].icon
|
||||||
g_hud_color,
|
|
||||||
1.0f,
|
|
||||||
DRAWFLAG_ADDITIVE
|
|
||||||
);
|
|
||||||
|
|
||||||
a = g_obituary[i].attacker;
|
a = g_obituary[i].attacker;
|
||||||
drawstring_r(item + [-4,2], a, [12,12], [1,1,1], 1.0f, 0);
|
drawstring_r(item + [-4,2], a, [12,12], [1,1,1], 1.0f, 0);
|
||||||
|
@ -217,12 +137,12 @@ Obituary_Parse(void)
|
||||||
{
|
{
|
||||||
string attacker;
|
string attacker;
|
||||||
string victim;
|
string victim;
|
||||||
float weapon;
|
string weapon;
|
||||||
float flags;
|
float flags;
|
||||||
|
|
||||||
attacker = readstring();
|
attacker = readstring();
|
||||||
victim = readstring();
|
victim = readstring();
|
||||||
weapon = readbyte();
|
weapon = readstring();
|
||||||
flags = readbyte();
|
flags = readbyte();
|
||||||
|
|
||||||
if (!attacker) {
|
if (!attacker) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#pragma target fte_5768
|
#pragma target fte_5768
|
||||||
#pragma progs_dat "../../zpak001.pk3dir/csprogs.dat"
|
#pragma progs_dat "../../csprogs.dat"
|
||||||
|
|
||||||
#define CSQC
|
#define CSQC
|
||||||
#define CLIENT
|
#define CLIENT
|
||||||
|
|
|
@ -33,7 +33,7 @@ class HLSingleplayerRules:HLGameRules
|
||||||
{
|
{
|
||||||
/* client */
|
/* client */
|
||||||
virtual void(NSClientPlayer) PlayerSpawn;
|
virtual void(NSClientPlayer) PlayerSpawn;
|
||||||
virtual void(NSClientPlayer) PlayerDeath;
|
virtual void(NSClientPlayer, NSActor, NSDict) PlayerDeath;
|
||||||
virtual bool(void) IsMultiplayer;
|
virtual bool(void) IsMultiplayer;
|
||||||
virtual bool ImpulseCommand(NSClient, float);
|
virtual bool ImpulseCommand(NSClient, float);
|
||||||
};
|
};
|
||||||
|
@ -52,7 +52,7 @@ class HLMultiplayerRules:HLGameRules
|
||||||
|
|
||||||
/* client */
|
/* client */
|
||||||
virtual void(NSClientPlayer) PlayerSpawn;
|
virtual void(NSClientPlayer) PlayerSpawn;
|
||||||
virtual void(NSClientPlayer) PlayerDeath;
|
virtual void(NSClientPlayer, NSActor, NSDict) PlayerDeath;
|
||||||
virtual bool(NSClientPlayer, string) ConsoleCommand;
|
virtual bool(NSClientPlayer, string) ConsoleCommand;
|
||||||
virtual bool(void) IsMultiplayer;
|
virtual bool(void) IsMultiplayer;
|
||||||
virtual bool(void) IsTeamplay;
|
virtual bool(void) IsTeamplay;
|
||||||
|
|
|
@ -34,29 +34,6 @@ HLGameRules::LevelDecodeParms(NSClientPlayer pl)
|
||||||
pl.g_items = parm10;
|
pl.g_items = parm10;
|
||||||
pl.activeweapon = parm11;
|
pl.activeweapon = parm11;
|
||||||
pl.flags = parm64;
|
pl.flags = parm64;
|
||||||
|
|
||||||
#if 0
|
|
||||||
pl.ammo_9mm = parm12;
|
|
||||||
pl.ammo_357 = parm13;
|
|
||||||
pl.ammo_buckshot = parm14;
|
|
||||||
pl.ammo_m203_grenade = parm15;
|
|
||||||
pl.ammo_bolt = parm16;
|
|
||||||
pl.ammo_rocket = parm17;
|
|
||||||
pl.ammo_uranium = parm18;
|
|
||||||
pl.ammo_handgrenade = parm19;
|
|
||||||
pl.ammo_satchel = parm20;
|
|
||||||
pl.ammo_tripmine = parm21;
|
|
||||||
pl.ammo_snark = parm22;
|
|
||||||
pl.ammo_hornet = parm23;
|
|
||||||
|
|
||||||
pl.glock_mag = parm24;
|
|
||||||
pl.mp5_mag = parm25;
|
|
||||||
pl.python_mag = parm26;
|
|
||||||
pl.shotgun_mag = parm27;
|
|
||||||
pl.crossbow_mag = parm28;
|
|
||||||
pl.rpg_mag = parm29;
|
|
||||||
pl.satchel_chg = parm30;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -93,31 +93,37 @@ HLMultiplayerRules::CheckRules(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLMultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
HLMultiplayerRules::PlayerDeath(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
||||||
{
|
{
|
||||||
|
vector damageLocation = damageDecl.GetVector("location");
|
||||||
|
int hitBody = (int)damageDecl.GetFloat("hitbody");
|
||||||
|
int damagePoints = (int)damageDecl.GetFloat("damage");
|
||||||
|
|
||||||
/* obituary networking */
|
/* obituary networking */
|
||||||
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
||||||
WriteByte(MSG_MULTICAST, EV_OBITUARY);
|
WriteByte(MSG_MULTICAST, EV_OBITUARY);
|
||||||
WriteString(MSG_MULTICAST, (g_dmg_eAttacker.netname) ? g_dmg_eAttacker.netname : g_dmg_eAttacker.classname);
|
WriteString(MSG_MULTICAST, (attacker.netname) ? attacker.netname : attacker.classname);
|
||||||
WriteString(MSG_MULTICAST, pl.netname);
|
WriteString(MSG_MULTICAST, pl.netname);
|
||||||
WriteByte(MSG_MULTICAST, g_dmg_iWeapon);
|
WriteString(MSG_MULTICAST, damageDecl.GetString("weapon"));
|
||||||
WriteByte(MSG_MULTICAST, 0);
|
WriteByte(MSG_MULTICAST, 0);
|
||||||
msg_entity = world;
|
msg_entity = world;
|
||||||
multicast([0,0,0], MULTICAST_ALL);
|
multicast([0,0,0], MULTICAST_ALL);
|
||||||
|
|
||||||
Plugin_PlayerObituary(g_dmg_eAttacker, g_dmg_eTarget, g_dmg_iWeapon, g_dmg_iHitBody, g_dmg_iDamage);
|
//Plugin_PlayerObituary(g_dmg_eAttacker, g_dmg_eTarget, g_dmg_iWeapon, g_dmg_iHitBody, g_dmg_iDamage);
|
||||||
|
|
||||||
/* death-counter */
|
/* death-counter */
|
||||||
pl.deaths++;
|
pl.deaths++;
|
||||||
pl.SetInfoKey("*deaths", ftos(pl.deaths));
|
pl.SetInfoKey("*deaths", ftos(pl.deaths));
|
||||||
|
|
||||||
/* update score-counter */
|
/* update score-counter */
|
||||||
if (pl.flags & FL_CLIENT || pl.flags & FL_MONSTER)
|
if (isPlayer(pl) || isAI(pl)) {
|
||||||
if (g_dmg_eAttacker.flags & FL_CLIENT) {
|
if (isPlayer(attacker)) {
|
||||||
if (pl == g_dmg_eAttacker)
|
if (pl == attacker) {
|
||||||
g_dmg_eAttacker.frags--;
|
attacker.frags--;
|
||||||
else
|
} else {
|
||||||
g_dmg_eAttacker.frags++;
|
attacker.frags++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VALVE
|
#ifdef VALVE
|
||||||
|
@ -129,14 +135,13 @@ HLMultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
|
|
||||||
/* either gib, or make a corpse */
|
/* either gib, or make a corpse */
|
||||||
if (pl.health < -50) {
|
if (pl.health < -50) {
|
||||||
vector gibDir = vectoangles(pl.origin - g_dmg_eAttacker.origin);
|
vector gibDir = vectoangles(pl.origin - attacker.origin);
|
||||||
float gibStrength = g_dmg_iDamage * 2.0f;
|
float gibStrength = damagePoints * 2.0f;
|
||||||
BreakModel_Entity(pl, gibDir, gibStrength);
|
BreakModel_Entity(pl, gibDir, gibStrength);
|
||||||
} else {
|
} else {
|
||||||
#if 0
|
|
||||||
float deathAnimation = ANIM_DIESIMPLE;
|
float deathAnimation = ANIM_DIESIMPLE;
|
||||||
|
|
||||||
switch (g_dmg_iHitBody) {
|
switch (hitBody) {
|
||||||
case BODY_HEAD:
|
case BODY_HEAD:
|
||||||
deathAnimation = ANIM_DIEHEADSHOT;
|
deathAnimation = ANIM_DIEHEADSHOT;
|
||||||
break;
|
break;
|
||||||
|
@ -147,7 +152,7 @@ HLMultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
deathAnimation = ANIM_DIEGUTSHOT;
|
deathAnimation = ANIM_DIEGUTSHOT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
bool isFacing = pl.IsFacingPosition(g_dmg_vecLocation);
|
bool isFacing = pl.IsFacingPosition(damageLocation);
|
||||||
|
|
||||||
/* we still want a change to play ANIM_DIESIMPLE */
|
/* we still want a change to play ANIM_DIESIMPLE */
|
||||||
if (random() < 0.5)
|
if (random() < 0.5)
|
||||||
|
@ -166,11 +171,10 @@ HLMultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
if (pl.IsCrouching()) {
|
if (pl.IsCrouching()) {
|
||||||
newCorpse.SetSize(VEC_HULL_MIN, [16, 16, -16]);
|
newCorpse.SetSize(VEC_HULL_MIN, [16, 16, -16]);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now let's make the real client invisible */
|
/* now let's make the real client invisible */
|
||||||
pl.SetTakedamage(DAMAGE_NO);
|
pl.MakeInvulnerable();
|
||||||
pl.gflags &= ~GF_FLASHLIGHT;
|
pl.gflags &= ~GF_FLASHLIGHT;
|
||||||
pl.gflags &= ~GF_EGONBEAM;
|
pl.gflags &= ~GF_EGONBEAM;
|
||||||
|
|
||||||
|
@ -192,14 +196,8 @@ HLMultiplayerRules::PlayerSpawn(NSClientPlayer pl)
|
||||||
/* this is where the mods want to deviate */
|
/* this is where the mods want to deviate */
|
||||||
entity spot;
|
entity spot;
|
||||||
|
|
||||||
pl.classname = "player";
|
EntityDef_SwitchClass(pl, "player_mp");
|
||||||
pl.SetMaxHealth(100);
|
pl.MakePlayer();
|
||||||
pl.SetHealth(100);
|
|
||||||
pl.SetTakedamage(DAMAGE_YES);
|
|
||||||
pl.SetSolid(SOLID_SLIDEBOX);
|
|
||||||
pl.SetMovetype(MOVETYPE_WALK);
|
|
||||||
pl.AddFlags(FL_CLIENT);
|
|
||||||
pl.viewzoom = 1.0;
|
|
||||||
|
|
||||||
/* player model selection */
|
/* player model selection */
|
||||||
if (IsTeamplay() == true) {
|
if (IsTeamplay() == true) {
|
||||||
|
@ -229,28 +227,7 @@ HLMultiplayerRules::PlayerSpawn(NSClientPlayer pl)
|
||||||
playerModel = "models/player.mdl";
|
playerModel = "models/player.mdl";
|
||||||
}
|
}
|
||||||
|
|
||||||
pl.SetModel(playerModel);
|
pl.SetModelindex(getmodelindex(playerModel)); /* keep OG size */
|
||||||
pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX);
|
|
||||||
pl.ClearVelocity();
|
|
||||||
pl.gravity = __NULL__;
|
|
||||||
pl.SetFrame(1);
|
|
||||||
pl.SendFlags = UPDATE_ALL;
|
|
||||||
pl.SetInfoKey("*spec", "0");
|
|
||||||
pl.SetInfoKey("*dead", "0");
|
|
||||||
pl.SetInfoKey("*deaths", ftos(pl.deaths));
|
|
||||||
pl.SetPropData("actor_human");
|
|
||||||
pl.EnableBleeding();
|
|
||||||
|
|
||||||
LevelNewParms();
|
|
||||||
LevelDecodeParms(pl);
|
|
||||||
|
|
||||||
#if defined (VALVE) || defined (GEARBOX)
|
|
||||||
pl.GiveItem("item_suit");
|
|
||||||
pl.GiveItem("weapon_9mmhandgun");
|
|
||||||
pl.GiveItem("weapon_crowbar");
|
|
||||||
//pl.ammo_9mm = 44;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
spot = Spawn_SelectRandom("info_player_deathmatch");
|
spot = Spawn_SelectRandom("info_player_deathmatch");
|
||||||
pl.Transport(spot.origin, spot.angles);
|
pl.Transport(spot.origin, spot.angles);
|
||||||
Client_FixAngle(pl, pl.angles);
|
Client_FixAngle(pl, pl.angles);
|
||||||
|
@ -287,32 +264,3 @@ HLMultiplayerRules::HLMultiplayerRules(void)
|
||||||
autocvar(timelimit, 15, "Timelimit for multiplayer rounds");
|
autocvar(timelimit, 15, "Timelimit for multiplayer rounds");
|
||||||
autocvar(fraglimit, 15, "Points limit for multiplayer rounds");
|
autocvar(fraglimit, 15, "Points limit for multiplayer rounds");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CSEv_HLDM_Chooseteam_s(string teamName)
|
|
||||||
{
|
|
||||||
HLGameRules rules = (HLGameRules)g_grMode;
|
|
||||||
NSClientPlayer pl = (NSClientPlayer)self;
|
|
||||||
|
|
||||||
if (!teamName)
|
|
||||||
return;
|
|
||||||
if (rules.IsMultiplayer() == false)
|
|
||||||
return;
|
|
||||||
if (rules.IsTeamplay() == false)
|
|
||||||
return;
|
|
||||||
if (pl.IsDead() == true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
HLMultiplayerRules mprules = (HLMultiplayerRules)rules;
|
|
||||||
int c = tokenizebyseparator(mprules.m_strTeamList, ";");
|
|
||||||
|
|
||||||
for (int i = 0; i < c; i++) {
|
|
||||||
if (argv(i) == teamName) {
|
|
||||||
pl.SetTeam((float)i + 1);
|
|
||||||
pl.SetHealth(-100);
|
|
||||||
pl.Death(pl, pl, 100i, g_vec_null, 0i);
|
|
||||||
//Damage_Apply(pl, pl, 100, 0, DMG_SKIP_ARMOR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -21,11 +21,11 @@ HLSingleplayerRules::IsMultiplayer(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
HLSingleplayerRules::PlayerDeath(NSClientPlayer pl)
|
HLSingleplayerRules::PlayerDeath(NSClientPlayer pl, NSActor attacker, NSDict damageDecl)
|
||||||
{
|
{
|
||||||
pl.SetMovetype(MOVETYPE_NONE);
|
pl.SetMovetype(MOVETYPE_NONE);
|
||||||
pl.SetSolid(SOLID_NOT);
|
pl.SetSolid(SOLID_NOT);
|
||||||
pl.SetTakedamage(DAMAGE_NO);
|
pl.MakeInvulnerable();
|
||||||
pl.SetHealth(0);
|
pl.SetHealth(0);
|
||||||
pl.StartSoundDef("Player.Death", CHAN_AUTO, true);
|
pl.StartSoundDef("Player.Death", CHAN_AUTO, true);
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ HLSingleplayerRules::PlayerSpawn(NSClientPlayer pl)
|
||||||
pl.classname = "player";
|
pl.classname = "player";
|
||||||
pl.SetHealth(100);
|
pl.SetHealth(100);
|
||||||
pl.SetMaxHealth(100);
|
pl.SetMaxHealth(100);
|
||||||
pl.SetTakedamage(DAMAGE_YES);
|
pl.MakeVulnerable();
|
||||||
pl.SetSolid(SOLID_SLIDEBOX);
|
pl.SetSolid(SOLID_SLIDEBOX);
|
||||||
pl.SetMovetype(MOVETYPE_WALK);
|
pl.SetMovetype(MOVETYPE_WALK);
|
||||||
pl.AddFlags(FL_CLIENT);
|
pl.AddFlags(FL_CLIENT);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#pragma target fte_5768
|
#pragma target fte_5768
|
||||||
//#pragma flag enable assumeint
|
//#pragma flag enable assumeint
|
||||||
#pragma progs_dat "../../zpak001.pk3dir/progs.dat"
|
#pragma progs_dat "../../progs.dat"
|
||||||
|
|
||||||
#define QWSSQC
|
#define QWSSQC
|
||||||
#define SERVER
|
#define SERVER
|
||||||
|
|
|
@ -17,10 +17,13 @@
|
||||||
void
|
void
|
||||||
Game_InitRules(void)
|
Game_InitRules(void)
|
||||||
{
|
{
|
||||||
|
Player_Precache();
|
||||||
|
FX_Corpse_Init();
|
||||||
|
|
||||||
if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) {
|
if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) {
|
||||||
g_grMode = spawn(HLSingleplayerRules);
|
g_grMode = NSGameRules::InitFromProgs("maps/singleplayer.dat");
|
||||||
} else {
|
} else {
|
||||||
g_grMode = spawn(HLMultiplayerRules);
|
g_grMode = NSGameRules::InitFromProgs("maps/mp/gametypes/dm.dat");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,9 +33,6 @@ Game_Worldspawn(void)
|
||||||
Sound_Precache("Player.FlashLightOff");
|
Sound_Precache("Player.FlashLightOff");
|
||||||
Sound_Precache("Player.FlashLightOn");
|
Sound_Precache("Player.FlashLightOn");
|
||||||
Sound_Precache("item_weaponbox.Pickup");
|
Sound_Precache("item_weaponbox.Pickup");
|
||||||
|
|
||||||
precache_model("models/player.mdl");
|
precache_model("models/player.mdl");
|
||||||
precache_model("models/w_weaponbox.mdl");
|
precache_model("models/w_weaponbox.mdl");
|
||||||
Player_Precache();
|
|
||||||
FX_Corpse_Init();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ FX_Corpse_Spawn(NSClientPlayer pl, float anim)
|
||||||
NSRenderableEntity body_next = (NSRenderableEntity)FX_Corpse_Next();
|
NSRenderableEntity body_next = (NSRenderableEntity)FX_Corpse_Next();
|
||||||
body_next.SetMovetype(MOVETYPE_BOUNCE);
|
body_next.SetMovetype(MOVETYPE_BOUNCE);
|
||||||
body_next.SetSolid(SOLID_CORPSE);
|
body_next.SetSolid(SOLID_CORPSE);
|
||||||
body_next.SetModel(pl.GetModel());
|
body_next.SetModelindex(pl.GetModelindex());
|
||||||
|
|
||||||
if (pl.IsCrouching()) {
|
if (pl.IsCrouching()) {
|
||||||
body_next.SetOrigin(pl.GetOrigin() + [0,0,32]);
|
body_next.SetOrigin(pl.GetOrigin() + [0,0,32]);
|
||||||
|
@ -75,6 +75,7 @@ FX_Corpse_Spawn(NSClientPlayer pl, float anim)
|
||||||
body_next.ScheduleThink(FX_Corpse_Update, 0.0f);
|
body_next.ScheduleThink(FX_Corpse_Update, 0.0f);
|
||||||
body_next.colormap = pl.colormap;
|
body_next.colormap = pl.colormap;
|
||||||
body_next.frame1time = 0.0f;
|
body_next.frame1time = 0.0f;
|
||||||
|
printf("CORPSE SPAWNED: modelindex %d; origin: %v\n", body_next.modelindex, body_next.origin);
|
||||||
return (entity)body_next;
|
return (entity)body_next;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
../../../valve/src/shared/events.h
|
../../../valve/src/shared/events.h
|
||||||
../../../valve/src/shared/flags.h
|
../../../valve/src/shared/flags.h
|
||||||
../../../valve/src/shared/skeleton.h
|
../../../valve/src/shared/skeleton.h
|
||||||
|
../../../valve/src/shared/fx_corpse.qc
|
||||||
../../../valve/src/shared/player.qc
|
../../../valve/src/shared/player.qc
|
||||||
../../../valve/src/shared/animations.qc
|
../../../valve/src/shared/animations.qc
|
||||||
../../../valve/src/shared/fx_blood.qc
|
../../../valve/src/shared/fx_blood.qc
|
||||||
../../../valve/src/shared/fx_gaussbeam.qc
|
../../../valve/src/shared/fx_gaussbeam.qc
|
||||||
../../../valve/src/shared/fx_corpse.qc
|
|
||||||
../../../valve/src/shared/HLGaussBeam.qc
|
../../../valve/src/shared/HLGaussBeam.qc
|
||||||
../../../valve/src/shared/HLWeapon.qc
|
../../../valve/src/shared/HLWeapon.qc
|
||||||
../../../valve/src/shared/w_tripmine.qc
|
../../../valve/src/shared/w_tripmine.qc
|
||||||
|
|
|
@ -45,6 +45,7 @@ class HLPlayer:NSClientPlayer
|
||||||
virtual void UpdateAliveCam(void);
|
virtual void UpdateAliveCam(void);
|
||||||
virtual void ClientInputFrame(void);
|
virtual void ClientInputFrame(void);
|
||||||
#else
|
#else
|
||||||
|
virtual void Death(entity, entity, int, vector, int);
|
||||||
virtual void EvaluateEntity(void);
|
virtual void EvaluateEntity(void);
|
||||||
virtual float SendEntity(entity, float);
|
virtual float SendEntity(entity, float);
|
||||||
virtual void Save(float);
|
virtual void Save(float);
|
||||||
|
@ -339,6 +340,52 @@ HLPlayer::EvaluateEntity(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HLPlayer::Death(entity inflictor, entity attacker, int damagePoints, vector dir, int location)
|
||||||
|
{
|
||||||
|
/* either gib, or make a corpse */
|
||||||
|
if (GetHealth()< -50) {
|
||||||
|
vector gibDir = vectoangles(GetOrigin() - attacker.origin);
|
||||||
|
float gibStrength = damagePoints * 2.0f;
|
||||||
|
BreakModel_Entity(this, gibDir, gibStrength);
|
||||||
|
} else {
|
||||||
|
float deathAnimation = ANIM_DIESIMPLE;
|
||||||
|
|
||||||
|
switch (location) {
|
||||||
|
case BODY_HEAD:
|
||||||
|
deathAnimation = ANIM_DIEHEADSHOT;
|
||||||
|
break;
|
||||||
|
case BODY_CHEST:
|
||||||
|
deathAnimation = ANIM_DIESPIN;
|
||||||
|
break;
|
||||||
|
case BODY_STOMACH:
|
||||||
|
deathAnimation = ANIM_DIEGUTSHOT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
bool isFacing = IsFacingPosition(GetOrigin() + (dir * 128));
|
||||||
|
|
||||||
|
/* we still want a change to play ANIM_DIESIMPLE */
|
||||||
|
if (random() < 0.5)
|
||||||
|
if (isFacing == false) {
|
||||||
|
deathAnimation = ANIM_DIEFORWARD;
|
||||||
|
} else {
|
||||||
|
deathAnimation = random() < 0.5 ? ANIM_DIEBACKWARDS1 : ANIM_DIEBACKWARDS1;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSEntity newCorpse = (NSEntity)FX_Corpse_Spawn(this, deathAnimation);
|
||||||
|
|
||||||
|
/* if we were crouching, adjust the bbox (thx 2 lack of crouch death animation) */
|
||||||
|
if (IsCrouching()) {
|
||||||
|
newCorpse.SetSize(VEC_HULL_MIN, [16, 16, -16]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
super::Death(inflictor, attacker, damagePoints, dir, location);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
HLPlayer::SendEntity
|
HLPlayer::SendEntity
|
||||||
|
|
|
@ -84,7 +84,7 @@ HLTripmine::Spawned(void)
|
||||||
{
|
{
|
||||||
super::Spawned();
|
super::Spawned();
|
||||||
|
|
||||||
SetTakedamage(DAMAGE_NO);
|
MakeInvulnerable();
|
||||||
SetSolid(SOLID_NOT);
|
SetSolid(SOLID_NOT);
|
||||||
SetMovetype(MOVETYPE_NONE);
|
SetMovetype(MOVETYPE_NONE);
|
||||||
SetSize([-8,-8,-8], [8,8,8]);
|
SetSize([-8,-8,-8], [8,8,8]);
|
||||||
|
@ -105,7 +105,7 @@ HLTripmine::Death(entity inflictor, entity attacker, int damage, vector dir, int
|
||||||
float explosionRadius = explosionDamage * 2.5f;
|
float explosionRadius = explosionDamage * 2.5f;
|
||||||
|
|
||||||
/* This is to prevent infinite loops in Damage_Radius */
|
/* This is to prevent infinite loops in Damage_Radius */
|
||||||
SetTakedamage(DAMAGE_NO);
|
MakeInvulnerable();
|
||||||
|
|
||||||
pointparticles(particleeffectnum("fx_explosion.main"), GetOrigin(), [0,0,0], 1);
|
pointparticles(particleeffectnum("fx_explosion.main"), GetOrigin(), [0,0,0], 1);
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ HLTripmine::Ready(void)
|
||||||
/* Laser calibrated to N units! */
|
/* Laser calibrated to N units! */
|
||||||
m_vecEndPos = trace_endpos;
|
m_vecEndPos = trace_endpos;
|
||||||
SetHealth(1);
|
SetHealth(1);
|
||||||
SetTakedamage(DAMAGE_YES);
|
MakeVulnerable();
|
||||||
StartSoundDef("weapon_tripmine.activate", CHAN_WEAPON, true);
|
StartSoundDef("weapon_tripmine.activate", CHAN_WEAPON, true);
|
||||||
SetSolid(SOLID_BBOX);
|
SetSolid(SOLID_BBOX);
|
||||||
ForceNetworkUpdate();
|
ForceNetworkUpdate();
|
||||||
|
|
|
@ -9,7 +9,6 @@ set ai_enable "1" // Disable AI behaviour when set.
|
||||||
set bot_aimless "0" // Bots will not set goals for themselves when set.
|
set bot_aimless "0" // Bots will not set goals for themselves when set.
|
||||||
set bot_backspeed "133" // Bots desired maximum backwards speed.
|
set bot_backspeed "133" // Bots desired maximum backwards speed.
|
||||||
set bot_crouch "0" // Bots are all forced to move crouched.
|
set bot_crouch "0" // Bots are all forced to move crouched.
|
||||||
set bot_debug "0" // TODO: needs to be logLevel?
|
|
||||||
set bot_developer "0" // TODO: remove?
|
set bot_developer "0" // TODO: remove?
|
||||||
set bot_dont_shoot "0" // Bots never actually shoot.
|
set bot_dont_shoot "0" // Bots never actually shoot.
|
||||||
set bot_enable "1" // Bot support enabled when set.
|
set bot_enable "1" // Bot support enabled when set.
|
||||||
|
@ -53,6 +52,7 @@ set dev_skyscale "" // Override for the sky_camera room scale.
|
||||||
|
|
||||||
set dsp_soundscapes "1" // Enable the use of sound scapes.
|
set dsp_soundscapes "1" // Enable the use of sound scapes.
|
||||||
|
|
||||||
|
set g_damageScale "1" // final damage scale on objects
|
||||||
set g_logLevel "2" // Game console log levels. 0 = None, 1 = Errors, 2 = Warnings, 3 = Extra Messages
|
set g_logLevel "2" // Game console log levels. 0 = None, 1 = Errors, 2 = Warnings, 3 = Extra Messages
|
||||||
set g_logTimestamps "0" // When 1, will print time stamps before the log message
|
set g_logTimestamps "0" // When 1, will print time stamps before the log message
|
||||||
set g_gravity "800" // Global gravity setting.
|
set g_gravity "800" // Global gravity setting.
|
||||||
|
|
|
@ -2,5 +2,5 @@ entityDef ammo_rpgclip
|
||||||
{
|
{
|
||||||
"inherit" "ammo_base"
|
"inherit" "ammo_base"
|
||||||
"model" "models/w_rpgammo.mdl"
|
"model" "models/w_rpgammo.mdl"
|
||||||
"inv_ammo_uranium" "1"
|
"inv_ammo_rocket" "1"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,19 @@
|
||||||
entityDef player
|
entityDef player
|
||||||
{
|
{
|
||||||
"spawnclass" "HLPlayer"
|
"spawnclass" "HLPlayer"
|
||||||
|
"health" "100"
|
||||||
|
"maxarmor" "100"
|
||||||
|
"bleeds" "1"
|
||||||
|
"propdata" "actor_human"
|
||||||
|
"armorProtection" "0.2"
|
||||||
|
"armorBonus" "0.5"
|
||||||
|
}
|
||||||
|
|
||||||
|
entityDef player_mp
|
||||||
|
{
|
||||||
|
"inherit" "player"
|
||||||
|
"ammo_9mm" "44"
|
||||||
|
"item" "item_suit"
|
||||||
|
"weapon" "weapon_crowbar,weapon_9mmhandgun"
|
||||||
|
"current_weapon" "1"
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ entityDef weapon_357
|
||||||
"hudSlot" "1"
|
"hudSlot" "1"
|
||||||
"hudSlotPos" "1"
|
"hudSlotPos" "1"
|
||||||
"weight" "15"
|
"weight" "15"
|
||||||
|
"killIcon" "d_357"
|
||||||
}
|
}
|
||||||
|
|
||||||
entityDef weapon_python
|
entityDef weapon_python
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
|
|
||||||
entityDef weapon_handgrenade
|
entityDef weapon_handgrenade
|
||||||
{
|
{
|
||||||
"editor_color" ".3 .3 1"
|
"editor_color" ".3 .3 1"
|
||||||
"editor_mins" "-16 -16 -16"
|
"editor_mins" "-16 -16 -16"
|
||||||
"editor_maxs" "16 16 16"
|
"editor_maxs" "16 16 16"
|
||||||
"editor_usage" "Hand Grenade"
|
"editor_usage" "Hand Grenade"
|
||||||
"editor_rotatable" "1"
|
"editor_rotatable" "1"
|
||||||
|
|
||||||
"spawnclass" "HLWeapon"
|
"spawnclass" "HLWeapon"
|
||||||
"model" "models/w_grenade.mdl"
|
"model" "models/w_grenade.mdl"
|
||||||
"model_view" "models/v_grenade.mdl"
|
"model_view" "models/v_grenade.mdl"
|
||||||
"snd_acquire" "weapon.pickup"
|
"snd_acquire" "weapon.pickup"
|
||||||
"snd_respawn" "item.respawn"
|
"snd_respawn" "item.respawn"
|
||||||
|
|
||||||
"inv_name" "Hand Grenade"
|
"inv_name" "Hand Grenade"
|
||||||
"inv_weapon" "weapon_handgrenade"
|
"inv_weapon" "weapon_handgrenade"
|
||||||
"inv_ammo_handgrenade" "5"
|
"inv_ammo_handgrenade" "5"
|
||||||
"def_onRelease" "projectile_handgrenade"
|
"def_onRelease" "projectile_handgrenade"
|
||||||
"def_explode_inhand" "env_handgrenade_explodeinhand"
|
"def_explode_inhand" "env_handgrenade_explodeinhand"
|
||||||
"def_damage_inhand" "damage_handgrenadeSplash"
|
"def_damage_inhand" "damage_handgrenadeSplash"
|
||||||
"ammoType" "ammo_handgrenade"
|
"ammoType" "ammo_handgrenade"
|
||||||
|
@ -25,17 +25,17 @@ entityDef weapon_handgrenade
|
||||||
"primed_fuse" "4"
|
"primed_fuse" "4"
|
||||||
"removeOnEmpty" "1"
|
"removeOnEmpty" "1"
|
||||||
|
|
||||||
"actIdle" "0,1"
|
"actIdle" "0,1"
|
||||||
"actDraw" "7"
|
"actDraw" "7"
|
||||||
"actHolster" "6"
|
"actHolster" "6"
|
||||||
"actFire" "2"
|
"actFire" "2"
|
||||||
"actRelease" "3,4,5"
|
"actRelease" "3,4,5"
|
||||||
|
|
||||||
// HLWeapon specific
|
// HLWeapon specific
|
||||||
"hudSlot" "4"
|
"hudSlot" "4"
|
||||||
"hudSlotPos" "0"
|
"hudSlotPos" "0"
|
||||||
"weight" "5"
|
"weight" "5"
|
||||||
"crosshair" "none"
|
"crosshair" "none"
|
||||||
}
|
}
|
||||||
|
|
||||||
entityDef projectile_handgrenade
|
entityDef projectile_handgrenade
|
||||||
|
@ -52,7 +52,6 @@ entityDef projectile_handgrenade
|
||||||
"snd_explode" "fx.explosion"
|
"snd_explode" "fx.explosion"
|
||||||
"snd_bounce" "weapon_handgrenade.bounce"
|
"snd_bounce" "weapon_handgrenade.bounce"
|
||||||
"decal_detonate" "ExplosionScorch"
|
"decal_detonate" "ExplosionScorch"
|
||||||
|
|
||||||
"def_damage" "damage_handgrenadeDirect"
|
"def_damage" "damage_handgrenadeDirect"
|
||||||
"def_splash_damage" "damage_handgrenadeSplash"
|
"def_splash_damage" "damage_handgrenadeSplash"
|
||||||
}
|
}
|
||||||
|
@ -67,9 +66,3 @@ entityDef damage_handgrenadeSplash
|
||||||
"damage" "skill:plr_hand_grenade"
|
"damage" "skill:plr_hand_grenade"
|
||||||
"radius" "250"
|
"radius" "250"
|
||||||
}
|
}
|
||||||
|
|
||||||
entityDef env_handgrenade_explodeinhand
|
|
||||||
{
|
|
||||||
"spawnclass" "idAnimatedEntity"
|
|
||||||
"model" "grenadeExplosion.prt"
|
|
||||||
}
|
|
||||||
|
|
198
zpak001.pk3dir/maps/mp/gametypes/dm.qc
Normal file
198
zpak001.pk3dir/maps/mp/gametypes/dm.qc
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 Marco Cawthorne <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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma PROGS_DAT "dm.dat"
|
||||||
|
|
||||||
|
#include "../../../../../src/server/mapC.h"
|
||||||
|
|
||||||
|
entity lastSpawn;
|
||||||
|
string g_strTeamList;
|
||||||
|
const string mp_teamlist_fallback = "scientist;hgrunt";
|
||||||
|
var string autocvar_mp_teamlist = mp_teamlist_fallback;
|
||||||
|
|
||||||
|
bool
|
||||||
|
IsTeamplay(void)
|
||||||
|
{
|
||||||
|
return getCvarInt("mp_teamplay") ? (true) : (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
AllowFlashlight(void)
|
||||||
|
{
|
||||||
|
return getCvarInt("mp_flashlight") ? (true) : (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_StartGameType(void)
|
||||||
|
{
|
||||||
|
//MOTD_LoadDefault();
|
||||||
|
|
||||||
|
setServerInfo("scorepoints", "0");
|
||||||
|
|
||||||
|
if (IsTeamplay() == true) {
|
||||||
|
int c;
|
||||||
|
|
||||||
|
/* get the segments from our cvar */
|
||||||
|
g_strTeamList = autocvar_mp_teamlist;
|
||||||
|
c = tokenizebyseparator(g_strTeamList, ";");
|
||||||
|
|
||||||
|
/* if we've got less than 2 teams, use the fallback... */
|
||||||
|
if (c < 2) {
|
||||||
|
g_strTeamList = mp_teamlist_fallback;
|
||||||
|
c = tokenizebyseparator(g_strTeamList, ";");
|
||||||
|
}
|
||||||
|
|
||||||
|
setServerInfo("teams", itos(c));
|
||||||
|
|
||||||
|
/* initialize all dem teams */
|
||||||
|
for (int i = 0; i < c; i++) {
|
||||||
|
setServerInfo(sprintf("team_%i", i+1i), argv(i));
|
||||||
|
setServerInfo(sprintf("teamscore_%i", i+1i), "0");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setServerInfo("teams", "0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_PlayerSpawn(void)
|
||||||
|
{
|
||||||
|
string playerModel;
|
||||||
|
|
||||||
|
changeClass(self, "player_mp");
|
||||||
|
|
||||||
|
if (IsTeamplay() == true) {
|
||||||
|
float teamCount = tokenizebyseparator(g_strTeamList, ";");
|
||||||
|
float playerTeam = self.team;
|
||||||
|
string teamModel;
|
||||||
|
|
||||||
|
/* not part of a team? pick one of the ones we have */
|
||||||
|
/* TODO: this should sort us into the lowest team */
|
||||||
|
if (playerTeam == 0) {
|
||||||
|
playerTeam = 1 + floor(random(0, teamCount)); /* teams start at 1 after all */
|
||||||
|
sendInput(self, "SetTeam", ftos(playerTeam), self);
|
||||||
|
}
|
||||||
|
|
||||||
|
teamModel = argv(playerTeam - 1);
|
||||||
|
playerModel = sprintf("models/player/%s/%s.mdl", teamModel, teamModel);
|
||||||
|
} else {
|
||||||
|
/* interpret the 'model' InfoKey */
|
||||||
|
playerModel = getUserInfo(self, "model");
|
||||||
|
|
||||||
|
if (playerModel != "") {
|
||||||
|
playerModel = sprintf("models/player/%s/%s.mdl", playerModel, playerModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fallback is always models/player.mdl for Half-Life */
|
||||||
|
if (playerModel == "" || fileExists(playerModel) == false) {
|
||||||
|
playerModel = "models/player.mdl";
|
||||||
|
}
|
||||||
|
|
||||||
|
self.modelindex = getmodelindex(playerModel); /* keep OG size */
|
||||||
|
lastSpawn = getSpawnpoint("info_player_deathmatch");
|
||||||
|
setorigin(self, lastSpawn.origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_PlayerDisconnect(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CodeCallback_PlayerRequestRespawn(void)
|
||||||
|
{
|
||||||
|
CodeCallback_PlayerSpawn();
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_PlayerDamage(entity inflictor, entity attacker)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_PlayerKilled(entity inflictor, entity attacker, string weapon)
|
||||||
|
{
|
||||||
|
obituary(self.netname, attacker.netname, weapon, "");
|
||||||
|
|
||||||
|
/* death-counter */
|
||||||
|
self.deaths++;
|
||||||
|
|
||||||
|
/* update score-counter */
|
||||||
|
if (isPlayer(attacker)) {
|
||||||
|
if (self == attacker) {
|
||||||
|
attacker.frags--;
|
||||||
|
} else {
|
||||||
|
attacker.frags++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CodeCallback_ClientCommand(string command)
|
||||||
|
{
|
||||||
|
float commandArgs = tokenize(command);
|
||||||
|
|
||||||
|
switch (argv(0)) {
|
||||||
|
case "chooseteam":
|
||||||
|
string teamName = argv(1);
|
||||||
|
|
||||||
|
/* wrong mode */
|
||||||
|
if (IsTeamplay() == false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no team defined */
|
||||||
|
if (!teamName) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
float c = tokenizebyseparator(g_strTeamList, ";");
|
||||||
|
|
||||||
|
for (float i = 0; i < c; i++) {
|
||||||
|
if (argv(i) == teamName) {
|
||||||
|
string newTeam = ftos(i + 1);
|
||||||
|
sendInput(self, "SetTeam", newTeam, self);
|
||||||
|
sendInput(self, "Damage", "1000", self);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CodeCallback_ImpulseCommand(float impulseNum)
|
||||||
|
{
|
||||||
|
switch (impulseNum) {
|
||||||
|
case 100:
|
||||||
|
if (AllowFlashlight() == true) {
|
||||||
|
sendInput(self, "UseItem", "item_suit", self);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
86
zpak001.pk3dir/maps/singleplayer.qc
Normal file
86
zpak001.pk3dir/maps/singleplayer.qc
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 Marco Cawthorne <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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma PROGS_DAT "singleplayer.dat"
|
||||||
|
|
||||||
|
#include "../../../src/server/mapC.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_StartGameType(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeCallback_PlayerSpawn(void)
|
||||||
|
{
|
||||||
|
changeClass(self, "player");
|
||||||
|
|
||||||
|
entity lastSpawn = getSpawnpoint("info_player_start");
|
||||||
|
setorigin(self, lastSpawn.origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CodeCallback_PlayerRequestRespawn(void)
|
||||||
|
{
|
||||||
|
localcmd("load quick\n");
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
CodeCallback_ImpulseCommand(float impulseNum)
|
||||||
|
{
|
||||||
|
switch (impulseNum) {
|
||||||
|
case 100:
|
||||||
|
sendInput(self, "UseItem", "item_suit", self);
|
||||||
|
break;
|
||||||
|
case 101:
|
||||||
|
sendInput(self, "SetHealth", "100", self);
|
||||||
|
sendInput(self, "SetArmor", "100", self);
|
||||||
|
sendInput(self, "GiveItem", "item_suit", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_357", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_9mmAR", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_9mmhandgun", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_crossbow", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_crowbar", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_egon", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_gauss", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_handgrenade", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_hornetgun", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_rpg", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_satchel", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_shotgun", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_snark", self);
|
||||||
|
sendInput(self, "GiveItem", "weapon_tripmine", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_9mm 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_357 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_buckshot 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_bolt 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_rocket 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_uranium 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_handgrenade 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_satchel 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_tripmine 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_snark 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_hornet 255", self);
|
||||||
|
sendInput(self, "GiveAmmo", "ammo_m203_grenade 255", self);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
Loading…
Reference in a new issue