Compare commits

...

2 Commits

19 changed files with 545 additions and 55 deletions

View File

@ -24,6 +24,8 @@ class HLGameRules:CGameRules
/* client */
virtual void(NSClientPlayer) PlayerSpawn;
virtual void(NSClientPlayer) PlayerDeath;
virtual bool PlayerRequestRespawn(NSClientPlayer);
virtual bool ImpulseCommand(NSClient, float);
virtual void(NSClientPlayer) PlayerPostFrame;
virtual void(NSClientPlayer, entity) ScientistKill;
virtual void(void) RegisterSciDeath;
@ -55,7 +57,6 @@ class SHTeamRules:HLGameRules
virtual void(void) RestartRound;
virtual void(NSClientPlayer) PlayerSpawn;
virtual void(NSClientPlayer) PlayerTeamSpawn;
virtual bool(void) IsTeamplay;
virtual void(void) AddTeam1Kill;
virtual void(void) AddTeam2Kill;
@ -68,6 +69,8 @@ class SHInvasionRules:HLGameRules
{
void(void) SHInvasionRules;
virtual void(void) RegisterSciDeath;
virtual string Title(void);
};
/* Standard Hunting (0):
@ -76,6 +79,8 @@ class SHInvasionRules:HLGameRules
class SHGameHunt:SHTeamRules
{
void(void) SHGameHunt;
virtual string Title(void);
};
/* Stealth Hunting (1):
@ -84,6 +89,8 @@ class SHGameHunt:SHTeamRules
class SHGameStealth:SHTeamRules
{
void(void) SHGameStealth;
virtual string Title(void);
};
/* Traditional Slaughter (2):
@ -92,14 +99,19 @@ class SHGameStealth:SHTeamRules
class SHGameSlaughter:HLGameRules
{
void(void) SHGameSlaughter;
virtual string Title(void);
};
/* Live in Fear (3):
Unique round-based gamemode where players have to only kill an evil randomly selected player controlled scientist causing chaos. Those who kill good scientists are punished with lost points. The evil scientist gains one point from every kill (NPC or Players). Scientists respawn.
*/
class SHGameFear:HLGameRules
class SHGameFear:SHTeamRules
{
void(void) SHGameFear;
virtual void(NSClientPlayer, entity) ScientistKill;
virtual string Title(void);
};
/* Madness (4):
@ -108,6 +120,8 @@ class SHGameFear:HLGameRules
class SHGameMadness:HLGameRules
{
void(void) SHGameMadness;
virtual string Title(void);
};
/* Invasion (5):
@ -116,6 +130,8 @@ class SHGameMadness:HLGameRules
class SHGameInvasion:SHInvasionRules
{
void(void) SHGameInvasion;
virtual string Title(void);
};
typedef enum

View File

@ -278,7 +278,6 @@ HLGameRules::CheckRules(void)
void
HLGameRules::PlayerDeath(NSClientPlayer pl)
{
player sh_pl = (player)pl;
/* obituary networking */
@ -343,6 +342,17 @@ HLGameRules::PlayerDeath(NSClientPlayer pl)
CheckRules();
}
bool
HLGameRules::PlayerRequestRespawn(NSClientPlayer bp)
{
if (bp.TimeSinceDeath() > 0.5f) {
bp.ScheduleThink(PutClientInServer, 0.0f);
return true;
}
return false;
}
void
HLGameRules::PlayerSpawn(NSClientPlayer pp)
{
@ -350,6 +360,7 @@ HLGameRules::PlayerSpawn(NSClientPlayer pp)
/* this is where the mods want to deviate */
entity spot;
pl.MakePlayer();
pl.classname = "player";
pl.SetMaxHealth(100);
pl.SetHealth(100);
@ -361,15 +372,21 @@ HLGameRules::PlayerSpawn(NSClientPlayer pp)
pl.model = "models/player.mdl";
string mymodel = infokey(pl, "model");
if (mymodel) {
mymodel = sprintf("models/player/%s/%s.mdl", mymodel, mymodel);
if (whichpack(mymodel)) {
pl.model = mymodel;
if (pl.team == 1) {
pl.model = "models/scientist.mdl";
setmodel(pl, pl.model);
pl.SetSize(VEC_HULL_MIN + [0, 0, 64], VEC_HULL_MAX + [0, 0, 64]);
} else {
if (mymodel) {
mymodel = sprintf("models/player/%s/%s.mdl", mymodel, mymodel);
if (whichpack(mymodel)) {
pl.model = mymodel;
}
}
setmodel(pl, pl.model);
pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX);
}
setmodel(pl, pl.model);
pl.SetSize(VEC_HULL_MIN, VEC_HULL_MAX);
pl.ClearVelocity();
pl.gravity = __NULL__;
pl.SetFrame(1);
@ -428,10 +445,15 @@ HLGameRules::PlayerSpawn(NSClientPlayer pp)
setorigin(pl, spot.origin);
pl.angles = spot.angles;
pl.g_items = ITEM_CROWBAR | ITEM_GLOCK | ITEM_SUIT;
pl.activeweapon = WEAPON_GLOCK;
pl.glock_mag = 18;
pl.ammo_9mm = 44;
if (pl.IsScientist() == true) {
pl.g_items = ITEM_NEEDLE | ITEM_SUIT;
pl.activeweapon = WEAPON_NEEDLE;
} else {
pl.g_items = ITEM_CROWBAR | ITEM_GLOCK | ITEM_SUIT;
pl.activeweapon = WEAPON_GLOCK;
pl.glock_mag = 18;
pl.ammo_9mm = 44;
}
Weapons_RefreshAmmo(pl);
SHData_GetItems(pl);
@ -462,13 +484,6 @@ HLGameRules::HLGameRules(void)
* have a race condition */
forceinfokey(world, "sci_count", "0");
/* realistic is an odd name, allow people to use sv_gamemode as an alias */
if (cvar("sv_gamemode")) {
cvar_set("sh_realistic",cvar_string("sv_gamemode"));
} else {
cvar_set("sv_gamemode",cvar_string("sh_realistic"));
}
/* if the previous map set this value but the current doesn't
* then set the default */
cvar_set("sh_scispeed","40");
@ -538,6 +553,7 @@ SHTeamRules::PlayerSpawn(NSClientPlayer pp)
{
player pl = (player)pp;
print(sprintf("team: %d\n", pl.team));
if (pl.team > 0) {
super::PlayerSpawn(pl);
return;
@ -547,15 +563,6 @@ SHTeamRules::PlayerSpawn(NSClientPlayer pp)
Spawn_ObserverCam(pl);
}
void
SHTeamRules::PlayerTeamSpawn(NSClientPlayer pl)
{
int red = 0;
int blue = 0;
super::PlayerSpawn(pl);
}
void
SHTeamRules::ScientistKill(NSClientPlayer cl, entity sci)
{
@ -667,12 +674,43 @@ SHInvasionRules::PlayerDeath(NSClientPlayer pl)
}
string
SHInvasionRules::Title(void)
{
return ("Invasion");
}
void
SHInvasionRules::SHInvasionRules(void)
{
}
void
TriggerFlashlight(NSClient target)
{
entity oldself = self;
self = target;
Flashlight_Toggle();
self = oldself;
}
bool
HLGameRules::ImpulseCommand(NSClient bp, float num)
{
switch (num) {
case 100:
TriggerFlashlight(bp);
break;
default:
return super::ImpulseCommand(bp, num);
}
return true;
}
void
CSEv_JoinAuto(void)
{
@ -704,7 +742,7 @@ CSEv_JoinAuto(void)
forceinfokey(pl, "*team", sprintf("%d", pl.team));
rules.PlayerTeamSpawn(pl);
rules.PlayerSpawn(pl);
}
void
@ -720,8 +758,9 @@ CSEv_JoinTeam_f(float teamNumber)
pl.team = teamNumber;
forceinfokey(pl, "*team", sprintf("%d", pl.team));
breakpoint();
rules.PlayerTeamSpawn(pl);
rules.PlayerSpawn(pl);
}
void

View File

@ -2,4 +2,23 @@ void
SHGameFear::SHGameFear(void)
{
}
void
SHGameFear::ScientistKill(NSClientPlayer pp, entity sci)
{
player pl = (player)pp;
if (pl.IsScientist() == true) {
pl.frags++;
} else {
pl.frags--;
}
}
string
SHGameFear::Title(void)
{
return ("Stealth");
}

View File

@ -2,4 +2,10 @@ void
SHGameHunt::SHGameHunt(void)
{
}
string
SHGameHunt::Title(void)
{
return ("Hunt");
}

View File

@ -3,4 +3,10 @@ SHGameInvasion::SHGameInvasion(void)
{
}
string
SHGameInvasion::Title(void)
{
return ("Invasion");
}

View File

@ -2,4 +2,10 @@ void
SHGameMadness::SHGameMadness(void)
{
}
string
SHGameMadness::Title(void)
{
return ("Madness");
}

View File

@ -2,4 +2,10 @@ void
SHGameSlaughter::SHGameSlaughter(void)
{
}
string
SHGameSlaughter::Title(void)
{
return ("Slaughter");
}

View File

@ -3,4 +3,10 @@ SHGameStealth::SHGameStealth(void)
{
}
string
SHGameStealth::Title(void)
{
return ("Stealth");
}

View File

@ -29,7 +29,7 @@ SHData_SpawnScientist(void)
}
slimit++;
}
spawnfunc_monster_scientist();
//spawnfunc_monster_scientist();
}
void
@ -87,6 +87,11 @@ SHData_NewAngles(void)
void
SHData_GetItems(player pl)
{
if (pl.IsScientist() == true) {
Weapons_AddItem(pl, WEAPON_NEEDLE, -1);
return;
}
/* TODO: Parse the config files */
pl.ammo_9mm = 68;
pl.ammo_buckshot = 34;

View File

@ -31,6 +31,7 @@ weapons.h
w_cannon.qc
w_chainsaw.qc
w_hammer.qc
w_needle.qc
weapons.qc
../../../valve/src/shared/weapon_common.qc
#endlist

View File

@ -37,7 +37,7 @@
#define ITEM_CANNON 0x00040000
#define ITEM_CHAINSAW 0x00080000
#define ITEM_HAMMER 0x00100000
#define ITEM_UNUSED22 0x00200000
#define ITEM_NEEDLE 0x00200000
#define ITEM_UNUSED23 0x00400000
#define ITEM_UNUSED24 0x00800000

View File

@ -16,6 +16,7 @@
#include "../../../valve/src/shared/skeleton.h"
#include "scianims.h"
/* all custom SendFlags bits we can possibly send */
enumflags
@ -76,6 +77,7 @@ class player:NSClientPlayer
PREDICTED_FLOAT(sh_insanetime)
PREDICTED_FLOAT(sh_insaneactive)
virtual bool IsScientist(void);
virtual void Physics_Jump(void);
virtual void UpdatePlayerAnimation(float);
@ -83,6 +85,8 @@ class player:NSClientPlayer
virtual float Physics_MaxSpeed(void);
virtual void Physics_InputPreMove(void);
virtual void Physics_InputPostMove(void);
virtual void Physics_SetViewParms(void);
virtual void Physics_Crouch(void);
#ifdef CLIENT
////virtual void(void) draw;
@ -103,14 +107,116 @@ class player:NSClientPlayer
#endif
};
void
SHSciAnim_PlayerUpdate(NSClientPlayer playerTarget)
{
bool useTopAnim;
player pl = (player)playerTarget;
if (pl.anim_top_delay <= 0.0f) {
useTopAnim = false;
} else {
useTopAnim = true;
}
if (vlen(pl.velocity) == 0) {
pl.frame = SCIANIM_IDLE1;
} else if (vlen(pl.velocity) < 150) {
pl.frame = SCIANIM_WALK;
} else if (vlen(pl.velocity) > 150) {
pl.frame = SCIANIM_RUN;
}
if (useTopAnim) {
pl.frame = pl.anim_top;
}
pl.baseframe = 0;
pl.basebone = 0;
pl.frame1time = pl.anim_top_time;
}
bool
player::IsScientist(void)
{
#ifdef CLIENT
float myTeam = getplayerkeyfloat(this.entnum-1, "*team");
#else
float myTeam = team;
#endif
return myTeam == 1 ? true : false;
}
#ifndef PHY_VIEWPOS
#define PHY_VIEWPOS [0,0,28]
#endif
#ifndef PHY_VIEWPOS_CROUCHED
#define PHY_VIEWPOS_CROUCHED [0,0,12]
#endif
#ifndef PHY_HULL_MIN
#define PHY_HULL_MIN [-16,-16,-36]
#endif
#ifndef PHY_HULL_MAX
#define PHY_HULL_MAX [16,16,36]
#endif
#ifndef PHY_HULL_CROUCHED_MIN
#define PHY_HULL_CROUCHED_MIN [-16,-16,-18]
#endif
#ifndef PHY_HULL_CROUCHED_MAX
#define PHY_HULL_CROUCHED_MAX [16,16,18]
#endif
void
player::Physics_Crouch(void)
{
if (IsScientist() == true) {
view_ofs = PHY_VIEWPOS + [0,0, 36];
return;
}
super::Physics_Crouch();
}
void
player::Physics_SetViewParms(void)
{
vector bboxOffset = g_vec_null;
if (IsScientist() == true) {
bboxOffset = [0, 0, 36];
}
if (GetFlags() & FL_CROUCHING) {
mins = PHY_HULL_CROUCHED_MIN;
maxs = PHY_HULL_CROUCHED_MAX;
view_ofs = PHY_VIEWPOS_CROUCHED;
} else {
mins = PHY_HULL_MIN;
maxs = PHY_HULL_MAX;
view_ofs = PHY_VIEWPOS;
}
SetSize(mins + bboxOffset, maxs + bboxOffset);
}
void Animation_PlayerUpdate(player);
void Animation_TimerUpdate(player, float);
void
player::UpdatePlayerAnimation(float timelength)
{
/* calculate our skeletal progression */
Animation_PlayerUpdate(this);
if (IsScientist() == true) {
SHSciAnim_PlayerUpdate(this);
} else {
/* calculate our skeletal progression */
Animation_PlayerUpdate(this);
}
/* advance animation timers */
Animation_TimerUpdate(this, timelength);
}
@ -152,9 +258,15 @@ player::UpdateAliveCam(void)
.string oldmodel;
string Weapons_GetPlayermodel(player, int);
void
player::UpdatePlayerAttachments(bool visible)
{
if (IsScientist()) {
p_model.modelindex = 0;
return;
}
/* draw the flashlight */
if (gflags & GF_FLASHLIGHT) {
vector src;

130
src/shared/scianims.h Normal file
View File

@ -0,0 +1,130 @@
typedef enum {
SCIANIM_WALK = 0,
SCIANIM_WALK_SCARED = 1,
SCIANIM_RUN = 2,
SCIANIM_RUN1 = 3,
SCIANIM_RUN2 = 4,
SCIANIM_180_LEFT = 5,
SCIANIM_180_RIGHT = 6,
SCIANIM_FLINCH = 7,
SCIANIM_FLINCH1 = 8,
SCIANIM_LAFLINCH = 9,
SCIANIM_RAFLINCH = 10,
SCIANIM_LLFLINCH = 11,
SCIANIM_RLFLINCH = 12,
SCIANIM_IDLE1 = 13,
SCIANIM_IDLE3 = 14,
SCIANIM_IDLE4 = 15,
SCIANIM_IDLE5 = 16,
SCIANIM_IDLE6 = 17,
SCIANIM_IDLE7 = 18,
SCIANIM_CROUCHSTAND = 19,
SCIANIM_CROUCH_IDLE = 20,
SCIANIM_CROUCH_IDLE2 = 21,
SCIANIM_CROUCH_IDLE3 = 22,
SCIANIM_CROUCH_IDLE3 = 23,
SCIANIM_PANIC = 24,
SCIANIM_FEAR1 = 25,
SCIANIM_FEAR2 = 26,
SCIANIM_EYE_WIPE = 27,
SCIANIM_PULL_NEEDLE = 28,
SCIANIM_RETURN_NEEDLE = 29,
SCIANIM_GIVE_SHOT = 30,
SCIANIM_DIESIMPLE = 31,
SCIANIM_DIEFORWARD = 32,
SCIANIM_DIEFORWARD1 = 33,
SCIANIM_DIEBACKWARD = 34,
SCIANIM_HEADSHOT = 35,
SCIANIM_GUTSHOT = 36,
SCIANIM_LYING_ON_BACK = 37,
SCIANIM_LYING_ON_STOMACH = 38,
SCIANIM_DEAD_SITTING = 39,
SCIANIM_DEAD_TABLE1 = 40,
SCIANIM_DEAD_TABLE2 = 41,
SCIANIM_DEAD_TABLE3 = 42,
SCIANIM_BARNACLED1 = 43,
SCIANIM_BARNACLED2 = 44,
SCIANIM_BARNACLED3 = 45,
SCIANIM_BARNACLED4 = 46,
SCIANIM_CONSOLE = 47,
SCIANIM_CHECKTIE = 48,
SCIANIM_DRYHANDS = 49,
SCIANIM_TIESHOE = 50,
SCIANIM_WRITEBOARD = 51,
SCIANIM_STUDYCART = 52,
SCIANIM_LEAN = 53,
SCIANIM_PONDERING = 54,
SCIANIM_PONDERING2 = 55,
SCIANIM_PONDERING3 = 56,
SCIANIM_BUYSODA = 57,
SCIANIM_PAUSE = 58,
SCIANIM_YES = 59,
SCIANIM_NO = 60,
SCIANIM_PUSH_BUTTON = 61,
SCIANIM_CONVERSE1 = 62,
SCIANIM_CONVERSE2 = 63,
SCIANIM_RETINA = 64,
SCIANIM_TALKLEFT = 65,
SCIANIM_TALKRIGHT = 66,
SCIANIM_DESKIDLE = 67,
SCIANIM_COFFEE = 68,
SCIANIM_FRANTICBUTTON = 69,
SCIANIM_STARTLE = 70,
SCIANIM_SITLOOKLEFT = 71,
SCIANIM_SITLOOKRIGHT = 72,
SCIANIM_SITSCARED = 73,
SCIANIM_SITTING2 = 74,
SCIANIM_SITTING3 = 75,
SCIANIM_CPRSCIENTIST = 76,
SCIANIM_CPRSCIENTISTREVIVE = 77,
SCIANIM_COWERING_IN_CORNER = 78,
SCIANIM_SSTRUGGLEIDLE = 79,
SCIANIM_SSTRUGGLE = 80,
SCIANIM_HEADCRABBED = 81,
SCIANIM_C1A0_CATWALKIDLE = 82,
SCIANIM_C1A0_CATWALK = 83,
SCIANIM_CEILING_DANGLE = 84,
SCIANIM_VENTPULL1 = 85,
SCIANIM_VENTPULL2 = 86,
SCIANIM_VENTPULLIDLE1 = 87,
SCIANIM_VENTPULLIDLE2 = 88,
SCIANIM_SITIDLE = 89,
SCIANIM_SITSTAND = 90,
SCIANIM_KEYPAD = 91,
SCIANIM_PANIC1 = 92,
SCIANIM_LOOKWINDOW = 93,
SCIANIM_WAVE = 94,
SCIANIM_PULLDOOR = 95,
SCIANIM_BEATDOOR = 96,
SCIANIM_FALLINGLOOP = 97,
SCIANIM_CRAWLWINDOW = 98,
SCIANIM_DIVEWINDOW = 99,
SCIANIM_LOCKED_DOOR = 100,
SCIANIM_PUSH_BUTTON2 = 101,
SCIANIM_UNLOCK_DOOR = 102,
SCIANIM_QUICKLOOK = 103,
SCIANIM_HANDRAILIDLE = 104,
SCIANIM_HANDRAIL = 105,
SCIANIM_HANGING_IDLE = 106,
SCIANIM_FALL = 107,
SCIANIM_SCIENTIST_GET_PULLED = 108,
SCIANIM_HANGING_IDLE2 = 109,
SCIANIM_FALL_ELEVATOR = 110,
SCIANIM_SCIENTIST_IDLEWALL = 111,
SCIANIM_ICKYJUMP_SCI = 112,
SCIANIM_HAULSCIENTIST = 113,
SCIANIM_C1A4_WOUNDED_IDLE = 114,
SCIANIM_C1A4_DYING_SPEECH = 115,
SCIANIM_TENTACLE_GRAB = 116,
SCIANIM_HELICACK = 117,
SCIANIM_WINDIVE = 118,
SCIANIM_SCICRASHIDLE = 119,
SCIANIM_SCICRASH = 120,
SCIANIM_ONGUARD = 121,
SCIANIM_SEEYA = 122,
SCIANIM_ROCKETCRAWL = 123,
SCIANIM_PORTAL = 124,
SCIANIM_GLUONSHOW = 125,
SCIANIM_CROUCH = 126,
SCIANIM_KNEEL = 127,
} sh_scianims_e;

123
src/shared/w_needle.qc Normal file
View File

@ -0,0 +1,123 @@
/*
* Copyright (c) 2016-2020 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.
*/
void w_needle_precache(void)
{
}
void w_needle_updateammo(player pl)
{
Weapons_UpdateAmmo(pl, -1, -1, -1);
}
string w_needle_pmodel(player pl)
{
return __NULL__;
}
string w_needle_deathmsg(void)
{
return "%s poisoned %s.";
}
void w_needle_draw(player pl)
{
}
void w_needle_holster(player pl)
{
}
void w_needle_primary(player pl)
{
if (pl.w_attack_next > 0.0) {
return;
}
vector startTrace = pl.GetEyePos();
vector endTrace;
makevectors(pl.v_angle);
endTrace = startTrace + (v_forward * 96);
traceline(startTrace, endTrace, MOVE_NORMAL, pl);
pl.w_attack_next = 1.0f;
Animation_PlayerTop(pl, SCIANIM_PUSH_BUTTON, 1.0f);
#ifdef SERVER
if (trace_fraction >= 1.0) {
return;
}
if (trace_ent.takedamage == DAMAGE_NO) {
return;
}
if not (trace_ent.flags & FL_CLIENT || trace_ent.flags & FL_MONSTER) {
return;
}
Damage_Apply(trace_ent, pl, 7, WEAPON_NEEDLE, DMG_POISON);
#endif
}
void w_needle_secondary(player pl)
{
/* TODO: switch between first/third person */
}
float w_needle_aimanim(player pl)
{
return 0; /* not used */
}
void w_needle_hudpic(player pl, int s, vector pos, float a)
{
#ifdef CLIENT
if (s) {
drawsubpic(pos, [170,45], g_hammer_spr, [0,48/256], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(pos, [170,45], g_hammer_spr, [0,0], [170/256,45/256], g_hud_color, a, DRAWFLAG_ADDITIVE);
}
#endif
}
bool
w_needle_isempty(player pl)
{
return false;
}
weapon_t w_needle =
{
.name = "needle",
.id = ITEM_NEEDLE,
.slot = 0,
.slot_pos = 2,
.draw = w_needle_draw,
.holster = w_needle_holster,
.primary = w_needle_primary,
.secondary = w_needle_secondary,
.reload = __NULL__,
.release = __NULL__,
.postdraw = __NULL__,
.precache = w_needle_precache,
.pickup = __NULL__,
.updateammo = w_needle_updateammo,
.wmodel = __NULL__,
.pmodel = w_needle_pmodel,
.deathmsg = w_needle_deathmsg,
.aimanim = w_needle_aimanim,
.isempty = w_needle_isempty,
.hudpic = w_needle_hudpic
};

View File

@ -21,6 +21,7 @@ enum
WEAPON_CROWBAR,
WEAPON_HAMMER,
WEAPON_CHAINSAW,
WEAPON_NEEDLE,
WEAPON_GLOCK,
WEAPON_PYTHON,
WEAPON_MP5,

View File

@ -20,6 +20,7 @@ weapon_t g_weapons[] = {
w_crowbar,
w_hammer,
w_chainsaw,
w_needle,
w_glock,
w_python,
w_mp5,

View File

@ -50,7 +50,8 @@ seta v_muzzledlight 0
// config compat
alias mp_timelimit timelimit
alias mp_fraglimit fraglimit
alias sv_gamemode sh_realistic
// video settings
seta gl_overbright 0
seta gl_ldr 1

View File

@ -3,17 +3,18 @@ WEAPON_NONE 0
WEAPON_CROWBAR 1
WEAPON_HAMMER 2
WEAPON_CHAINSAW 3
WEAPON_GLOCK 4
WEAPON_PYTHON 5
WEAPON_MP5 6
WEAPON_SHOTGUN 7
WEAPON_CROSSBOW 8
WEAPON_CANNON 9
WEAPON_RPG 10
WEAPON_GAUSS 11
WEAPON_EGON 12
WEAPON_HORNETGUN 13
WEAPON_HANDGRENADE 14
WEAPON_SATCHEL 15
WEAPON_TRIPMINE 16
WEAPON_SNARK 17
WEAPON_NEEDLE 4
WEAPON_GLOCK 5
WEAPON_PYTHON 6
WEAPON_MP5 7
WEAPON_SHOTGUN 8
WEAPON_CROSSBOW 9
WEAPON_CANNON 10
WEAPON_RPG 11
WEAPON_GAUSS 12
WEAPON_EGON 13
WEAPON_HORNETGUN 14
WEAPON_HANDGRENADE 15
WEAPON_SATCHEL 16
WEAPON_TRIPMINE 17
WEAPON_SNARK 18

View File

@ -1,10 +1,21 @@
streetglass
{
portal
if $programs
polygonOffset 1
diffusemap "textures/sfx/mirror.tga"
normalmap "textures/sfx/mirror_n.tga"
{
map glass_dark
blendFunc add
tcMod scale -4.5 1.0
depthWrite
program lightmapped_reflect
map $reflection
}
{
map textures/sfx/reflection.tga
blendFunc filter
tcGen environment
}
else
portal
endif
}