Flashlight: Add the HUD indicator in the 'valve' base

Rewolf: Preparing initial work
Effects: Added Gib-Human effect
CBaseEntity: Make sure things that are hidden can't be damaged by default. E.g. func_breakables that are hidden
func_door_rotating: Minor tweak saving us a few bytes
item_food/sodacan: Make bounding box bigger, fix classname check to apply to "player", not "Player" (TW leftover)
Damage_Radius: Fix how damage radius checks for brush based entities.

Scientist Hunt specific stuff:
- impulse 103 test cvar added to destroy everything around the map
- scientists can be gibbed
- scientists scream when falling
- new cvar sh_scialert that spawn scientists alerted
- new cvar sh_scispeed that is mirrored from the original mod
- new cvar sh_scimax that will limit the amount of scientists spawned by the shdata system
- new cvar sh_sciyaw that will randomize the spawn yaw angle when there's no other specified
This commit is contained in:
Marco Cawthorne 2019-03-09 15:50:11 +01:00
parent 99a2bd0c4b
commit 7c15bed7bb
25 changed files with 323 additions and 56 deletions

View File

@ -8,3 +8,5 @@ qc-progs:
$(CC) server/scihunt.src
$(CC) client/cstrike.src
$(CC) server/cstrike.src
$(CC) client/rewolf.src
$(CC) server/rewolf.src

View File

@ -374,14 +374,21 @@ void CSQC_Parse_Event(void)
break;
case EV_SPARK:
vector vSparkPos, vSparkAngle;
vSparkPos_x = readcoord();
vSparkPos_y = readcoord();
vSparkPos_z = readcoord();
vSparkAngle_x = readcoord();
vSparkAngle_y = readcoord();
vSparkAngle_z = readcoord();
vSparkPos[0] = readcoord();
vSparkPos[1] = readcoord();
vSparkPos[2] = readcoord();
vSparkAngle[0] = readcoord();
vSparkAngle[1] = readcoord();
vSparkAngle[2] = readcoord();
Effect_CreateSpark(vSparkPos, vSparkAngle);
break;
case EV_GIBHUMAN:
vector vGibPos, vGibAngle;
vGibPos[0] = readcoord();
vGibPos[1] = readcoord();
vGibPos[2] = readcoord();
Effect_GibHuman(vGibPos);
break;
case EV_BLOOD:
vector vBloodPos;
vector vBloodAngle;
@ -399,22 +406,22 @@ void CSQC_Parse_Event(void)
case EV_EXPLOSION:
vector vExploPos;
vExploPos_x = readcoord();
vExploPos_y = readcoord();
vExploPos_z = readcoord();
vExploPos[0] = readcoord();
vExploPos[1] = readcoord();
vExploPos[2] = readcoord();
Effect_CreateExplosion(vExploPos);
break;
case EV_MODELGIB:
vector vPos;
vPos_x = readcoord();
vPos_y = readcoord();
vPos_z = readcoord();
vPos[0] = readcoord();
vPos[1] = readcoord();
vPos[2] = readcoord();
vector vSize;
vSize_x = readcoord();
vSize_y = readcoord();
vSize_z = readcoord();
vSize[0] = readcoord();
vSize[1] = readcoord();
vSize[2] = readcoord();
float fStyle = readbyte();
Effect_BreakModel(vPos, vSize, [0,0,0], fStyle);
@ -435,13 +442,13 @@ void CSQC_Parse_Event(void)
vector vOrigin, vNormal;
iType = (int)readbyte();
vOrigin_x = readcoord();
vOrigin_y = readcoord();
vOrigin_z = readcoord();
vOrigin[0] = readcoord();
vOrigin[1] = readcoord();
vOrigin[2] = readcoord();
vNormal_x = readcoord();
vNormal_y = readcoord();
vNormal_z = readcoord();
vNormal[0] = readcoord();
vNormal[1] = readcoord();
vNormal[2] = readcoord();
Effect_Impact(iType, vOrigin, vNormal);
break;

71
Source/client/rewolf.src Executable file
View File

@ -0,0 +1,71 @@
#pragma target fte
#pragma progs_dat "../../rewolf/csprogs.dat"
#define CSQC
#define VALVE
#includelist
../builtins.h
../defs.h
../math.h
../materials.h
../events.h
../entities.h
valve/defs.h
defs.h
vgui.h
util.c
valve/init.c
../gs-entbase/client.src
sound.c
text.c
voice.c
../shared/valve/animations.c
../shared/valve/player.cpp
player.c
../shared/pmove.c
predict.c
../shared/decals.c
../shared/effects.c
../shared/spraylogo.cpp
../shared/valve/items.h
../shared/valve/crosshair.h
../shared/valve/weapons.h
../shared/valve/w_crowbar.c
../shared/valve/w_glock.c
../shared/valve/w_python.c
../shared/valve/w_mp5.c
../shared/valve/w_crossbow.c
../shared/valve/w_shotgun.c
../shared/valve/w_rpg.c
../shared/valve/w_gauss.c
../shared/valve/w_egon.c
../shared/valve/w_hornetgun.c
../shared/valve/w_handgrenade.c
../shared/valve/w_tripmine.c
../shared/valve/w_satchel.c
../shared/valve/w_snark.c
../shared/valve/weapons.c
valve/player.c
entities.c
valve/cmds.c
valve/game_event.c
events.c
valve/view.c
view.c
damage.c
chat.c
valve/hud.c
valve/hud_weaponselect.c
valve/scoreboard.c
valve/input.c
entry.c
#endlist

View File

@ -263,10 +263,18 @@ void HUD_DrawAmmo3(void)
void HUD_DrawFlashlight(void)
{
vector pos;
player pl = (player)pSeat->ePlayer;
pos = video_mins + [video_res[0] - 48, 16];
drawsubpic(pos, [32,32], HUD_NUMS, [spr_flash1[0], spr_flash1[1]],
if (pl.flags & FL_FLASHLIGHT) {
drawsubpic(pos, [32,32], HUD_NUMS, [spr_flash1[0], spr_flash1[1]],
[spr_flash1[2], spr_flash1[3]], g_hud_color, 1.0, DRAWFLAG_ADDITIVE);
drawsubpic(pos, [48,32], HUD_NUMS, [spr_flash2[0], spr_flash2[1]],
[spr_flash2[2], spr_flash2[3]], g_hud_color, 1.0, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(pos, [32,32], HUD_NUMS, [spr_flash1[0], spr_flash1[1]],
[spr_flash1[2], spr_flash1[3]], g_hud_color, HUD_ALPHA, DRAWFLAG_ADDITIVE);
}
}
void HUD_Draw(void)

View File

@ -6,6 +6,7 @@ enum {
EV_WEAPON_SECONDARYATTACK,
EV_WEAPON_RELOAD,
EV_IMPACT,
EV_GIBHUMAN,
EV_BLOOD,
EV_EXPLOSION,
EV_SPARK,

View File

@ -112,4 +112,5 @@ void CBaseEntity :: Hide ( void )
setmodel( this, "" );
solid = SOLID_NOT;
movetype = MOVETYPE_NONE;
takedamage = DAMAGE_NO;
}

View File

@ -150,14 +150,14 @@ void func_door_rotating::Away(void)
if (!(spawnflags & SF_ROT_ONEWAY)) {
/* One way doors only work on the Y axis */
if (!(spawnflags & SF_ROT_ZAXIS || spawnflags & SF_ROT_XAXIS)) {
vector vDifference = eActivator.origin - origin;
vector vDifference = (eActivator.origin - eActivator.view_ofs) - origin;
vector vAngles = eActivator.angles;
vAngles[0] = vAngles[2] = 0;
makevectors(vAngles);
vector vNext = (eActivator.origin + (v_forward * 10)) - origin;
vAngles = (eActivator.origin + (v_forward * 10)) - origin;
if (((vDifference[0] * vNext[1]) - (vDifference[1] * vNext[0])) < 0) {
if (((vDifference[0] * vAngles[1]) - (vDifference[1] * vAngles[0])) < 0) {
fDirection = -1.0f;
}
}

View File

@ -16,7 +16,7 @@ class item_food
void item_food :: Touch ( void )
{
if ( other.classname != "Player" ) {
if ( other.classname != "player" ) {
return;
}
@ -25,6 +25,7 @@ void item_food :: Touch ( void )
bevOwner.m_iReady = TRUE;
}
Damage_Apply(other, this, -1, other.origin, FALSE);
solid = SOLID_NOT;
remove( this );
}
@ -32,7 +33,7 @@ void item_food :: Touch ( void )
void item_food :: Setup ( void )
{
solid = SOLID_TRIGGER;
setsize( this, '-8 -8 -8', '8 8 8' );
setsize( this, '-16 -16 -16', '16 16 16' );
touch = Touch;
if ( m_iIsCan ) {

View File

@ -12,6 +12,7 @@ var int autocvar_mp_flashlight = TRUE;
void Effect_Impact( int iType, vector vPos, vector vNormal );
void Effect_CreateExplosion( vector vPos );
void Effect_GibHuman( vector vPos);
void Footsteps_Update( void );
void TraceAttack_FireBullets( int iShots, vector vPos, int iDamage, vector vecAccuracy);

66
Source/server/rewolf.src Executable file
View File

@ -0,0 +1,66 @@
#pragma target fte
#pragma progs_dat "../../rewolf/progs.dat"
#define QWSSQC
#define VALVE
#includelist
../builtins.h
../defs.h
valve/defs.h
../math.h
../materials.h
../events.h
../entities.h
defs.h
../gs-entbase/server.src
valve/monster_rat.cpp
../shared/decals.c
../shared/effects.c
../shared/spraylogo.cpp
../shared/valve/player.cpp
valve/player.c
../shared/pmove.c
valve/spectator.c
../shared/valve/items.h
../shared/valve/crosshair.h
../shared/valve/weapons.h
../shared/valve/w_crowbar.c
../shared/valve/w_glock.c
../shared/valve/w_python.c
../shared/valve/w_mp5.c
../shared/valve/w_crossbow.c
../shared/valve/w_shotgun.c
../shared/valve/w_rpg.c
../shared/valve/w_gauss.c
../shared/valve/w_egon.c
../shared/valve/w_hornetgun.c
../shared/valve/w_handgrenade.c
../shared/valve/w_tripmine.c
../shared/valve/w_satchel.c
../shared/valve/w_snark.c
valve/items.cpp
../shared/valve/weapons.c
spawn.c
valve/client.c
client.c
valve/server.c
server.c
valve/damage.c
traceattack.c
vox.c
footsteps.c
flashlight.c
valve/input.c
valve/spawn.c
entry.c
#endlist

View File

@ -46,6 +46,16 @@ void Game_Input(void)
}
bprint(PRINT_HIGH, "Respawning all map entities...\n");
}
if (self.impulse == 103) {
// Respawn all the entities
for (entity a = world; (a = find(a, classname, "func_breakable"));) {
func_breakable caw = (func_breakable)a;
caw.vDeath(world, 0, 0);
}
bprint(PRINT_HIGH, "BREAK EVERYTHING!\n");
}
}
self.impulse = 0;

View File

@ -6,10 +6,14 @@
*
****/
var int autocvar_sh_scialert = FALSE;
var int autocvar_sh_scispeed = 40;
enum {
SCI_IDLE,
SCI_WALK,
SCI_RUN
SCI_RUN,
SCI_DEAD
};
enum {
@ -63,7 +67,8 @@ enumflags
SCIF_USED,
SCIF_SCARED,
SCIF_FEAR,
SCIF_SEEN
SCIF_SEEN,
SCIF_FALLING
};
string sci_snddie[] = {
@ -292,15 +297,13 @@ class monster_scientist:CBaseEntity
virtual void() WarnOthers;
};
void monster_scientist::Gib(void)
{
takedamage = DAMAGE_NO;
Effect_GibHuman(this.origin);
Hide();
for (int i = 0; i < 5; i++) {
entity gib = spawn();
//gib.think = Util_Remove;
gib.nextthink = 10.0f;
}
}
void monster_scientist::WarnOthers(void)
@ -404,7 +407,8 @@ void monster_scientist::Physics(void)
}
} else if (m_iFlags & SCIF_FEAR) {
Scream();
input_movevalues = [240, 0, 0];
maxspeed = 240 * (autocvar_sh_scispeed/40);
input_movevalues = [maxspeed, 0, 0];
if (m_flTraceTime < time) {
traceline(self.origin, self.origin + (v_forward * 32), FALSE, this);
@ -439,6 +443,15 @@ void monster_scientist::Physics(void)
runstandardplayerphysics(this);
Footsteps_Update();
if (!(flags & FL_ONGROUND) && velocity[2] < -100) {
if (!(m_iFlags & SCIF_FALLING)) {
sound(this, CHAN_VOICE, sci_sndscream[0], 1.0, ATTN_NORM, m_flPitch);
}
m_iFlags |= SCIF_FALLING;
} else {
m_iFlags -= (flags & SCIF_FALLING);
}
movetype = MOVETYPE_NONE;
}
@ -492,18 +505,27 @@ void monster_scientist::vDeath(int iHitBody)
r = floor(random(0,sci_snddie.length));
sound(this, CHAN_VOICE, sci_snddie[r], 1.0, ATTN_NORM, m_flPitch);
solid = SOLID_CORPSE;
takedamage = DAMAGE_NO;
frame = SCIA_DIE_SIMPLE + floor(random(0, 6));
WarnOthers();
think = Respawn;
nextthink = time + 10.0f;
m_eUser = world;
customphysics = __NULL__;
m_iFlags = 0x0;
think = Respawn;
nextthink = time + 10.0f;
if (health < -50) {
Gib();
return;
}
WarnOthers();
solid = SOLID_CORPSE;
//takedamage = DAMAGE_NO;
if (style != SCI_DEAD) {
frame = SCIA_DIE_SIMPLE + floor(random(0, 6));
style = SCI_DEAD;
}
}
void monster_scientist::Hide(void)
@ -536,6 +558,10 @@ void monster_scientist::Respawn(void)
health = 50;
velocity = [0,0,0];
m_iFlags = 0x0;
if (autocvar_sh_scialert) {
m_iFlags |= SCIF_FEAR;
}
}
void monster_scientist::monster_scientist(void)

View File

@ -6,21 +6,46 @@
*
****/
/* If only origin parameters are applied, make something up */
var int autocvar_sh_sciyaw = TRUE;
/* Limit the amount of scientists spawned */
var int autocvar_sh_scimax = 30;
string g_shItemList;
void SHData_SpawnScientist(void)
{
static int slimit = 0;
if (autocvar_sh_scimax) {
if (slimit >= autocvar_sh_scimax) {
dprint("shdata: scientist limit hit. ignored\n");
remove(self);
return;
}
slimit++;
}
spawnfunc_monster_scientist();
}
void SHData_New(void)
{
entity new = spawn();
new.origin[0] = stof(argv(1));
new.origin[1] = stof(argv(2));
new.origin[2] = stof(argv(3));
if (autocvar_sh_sciyaw) {
new.angles[1] = Math_FixDelta(random(0,360));
}
setorigin(new, new.origin);
entity oldself = self;
self = new;
if (argv(0) == "monster_scientist") {
spawnfunc_monster_scientist();
SHData_SpawnScientist();
} else if (argv(0) == "info_player_team1") {
self.classname = "info_player_deathmatch";
} else if (argv(0) == "info_player_team2") {
@ -44,7 +69,7 @@ void SHData_NewAngles(void)
self = new;
if (argv(0) == "monster_scientist") {
spawnfunc_monster_scientist();
SHData_SpawnScientist();
} else if (argv(0) == "info_player_team1") {
self.classname = "info_player_deathmatch";
} else if (argv(0) == "info_player_team2") {

View File

@ -75,7 +75,6 @@ void Damage_Apply(entity eTarget, entity eAttacker, float fDamage, vector vHitPo
self = eTarget;
if (self.health <= 0) {
self.health = 0;
self.vDeath(trace_surface_id);
} else {
self.vPain(trace_surface_id);
@ -163,7 +162,7 @@ void Damage_Radius(vector vOrigin, entity eAttacker, float fDamage, float fRadiu
fDamage = rint(fDamage * fDiff);
if (fDiff > 0) {
Damage_Apply(eDChain, eAttacker, fDamage, eDChain.origin, 0);
Damage_Apply(eDChain, eAttacker, fDamage, vecRealPos, 0);
/*if (eDChain.movetype != MOVETYPE_NONE) {
vPush = vectoangles(vecRealPos - vOrigin);
makevectors(vPush);

View File

@ -81,3 +81,12 @@ void Decals_PlaceScorch(vector pos)
decal.nextthink = time /*+ 0.1f*/;
#endif
}
#ifdef CSQC
float Effect_Decal(void)
{
adddecal(self.classname, self.origin, self.mins, self.maxs, self.color, 1.0f);
addentity(self);
return PREDRAW_NEXT;
}
#endif

View File

@ -7,6 +7,15 @@
****/
#ifdef CSQC
string g_hgibs[] = {
"models/gib_b_bone.mdl",
"models/gib_legbone.mdl",
"models/gib_lung.mdl",
"models/gib_skull.mdl",
"models/gib_b_gib.mdl"
};
void Effects_Init(void)
{
precache_model("sprites/fexplo.spr");
@ -49,6 +58,11 @@ void Effects_Init(void)
precache_sound("weapons/ric3.wav");
precache_sound("weapons/ric4.wav");
precache_sound("weapons/ric5.wav");
precache_sound("common/bodysplat.wav");
for (int i = 0; i < g_hgibs.length; i++) {
precache_model(g_hgibs[i]);
}
// Half-Life only has generic ric1-5
#ifdef CSTRIKE
@ -61,6 +75,41 @@ void Effects_Init(void)
}
#endif
void Effect_GibHuman(vector pos) {
#ifdef SSQC
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_GIBHUMAN);
WriteCoord(MSG_MULTICAST, pos[0]);
WriteCoord(MSG_MULTICAST, pos[1]);
WriteCoord(MSG_MULTICAST, pos[2]);
msg_entity = __NULL__;
multicast(pos, MULTICAST_PVS);
#else
static void Gib_Remove(void) {
remove(self);
}
for (int i = 0; i < 5; i++) {
vector vel;
vel[0] = random(-128,128);
vel[1] = random(-128,128);
vel[2] = (300 + random() * 64);
entity gibb = spawn();
setmodel(gibb, g_hgibs[i]);
setorigin(gibb, pos);
gibb.movetype = MOVETYPE_BOUNCE;
gibb.velocity = vel;
gibb.avelocity = vectoangles(gibb.velocity);
gibb.think = Gib_Remove;
gibb.nextthink = time + 5.0f;
gibb.drawmask = MASK_ENGINE;
}
pointsound(pos, "common/bodysplat.wav", 1, ATTN_NORM);
#endif
}
void Effect_CreateExplosion(vector vPos) {
#ifdef SSQC
Decals_PlaceScorch(vPos);
@ -408,12 +457,3 @@ void Effect_BreakModel(vector vMins, vector vMaxs, vector vVel, float fStyle) {
}
#endif
}
#ifdef CSQC
float Effect_Decal(void)
{
adddecal(self.classname, self.origin, self.mins, self.maxs, self.color, 1.0f);
addentity(self);
return PREDRAW_NEXT;
}
#endif

Binary file not shown.

Binary file not shown.

BIN
rewolf/csprogs.dat Normal file

Binary file not shown.

BIN
rewolf/progs.dat Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.