diff --git a/Source/Makefile b/Source/Makefile index 0f272e1a..e09e567e 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -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 diff --git a/Source/client/entry.c b/Source/client/entry.c index 5c103b24..05a02e39 100644 --- a/Source/client/entry.c +++ b/Source/client/entry.c @@ -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; diff --git a/Source/client/rewolf.src b/Source/client/rewolf.src new file mode 100755 index 00000000..267fd73c --- /dev/null +++ b/Source/client/rewolf.src @@ -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 diff --git a/Source/client/valve/hud.c b/Source/client/valve/hud.c index 399f488e..29d32295 100644 --- a/Source/client/valve/hud.c +++ b/Source/client/valve/hud.c @@ -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) diff --git a/Source/events.h b/Source/events.h index 5b3e5ed9..2defda6a 100644 --- a/Source/events.h +++ b/Source/events.h @@ -6,6 +6,7 @@ enum { EV_WEAPON_SECONDARYATTACK, EV_WEAPON_RELOAD, EV_IMPACT, + EV_GIBHUMAN, EV_BLOOD, EV_EXPLOSION, EV_SPARK, diff --git a/Source/gs-entbase/server/baseentity.cpp b/Source/gs-entbase/server/baseentity.cpp index 92f97c02..85191905 100644 --- a/Source/gs-entbase/server/baseentity.cpp +++ b/Source/gs-entbase/server/baseentity.cpp @@ -112,4 +112,5 @@ void CBaseEntity :: Hide ( void ) setmodel( this, "" ); solid = SOLID_NOT; movetype = MOVETYPE_NONE; + takedamage = DAMAGE_NO; } diff --git a/Source/gs-entbase/server/func_door_rotating.cpp b/Source/gs-entbase/server/func_door_rotating.cpp index 53f16a2e..6368e58b 100644 --- a/Source/gs-entbase/server/func_door_rotating.cpp +++ b/Source/gs-entbase/server/func_door_rotating.cpp @@ -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; } } diff --git a/Source/gs-entbase/server/item_food.cpp b/Source/gs-entbase/server/item_food.cpp index d0c85c91..fa50b8a9 100644 --- a/Source/gs-entbase/server/item_food.cpp +++ b/Source/gs-entbase/server/item_food.cpp @@ -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 ) { diff --git a/Source/server/defs.h b/Source/server/defs.h index c12c825e..51487081 100644 --- a/Source/server/defs.h +++ b/Source/server/defs.h @@ -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); diff --git a/Source/server/rewolf.src b/Source/server/rewolf.src new file mode 100755 index 00000000..a6f08341 --- /dev/null +++ b/Source/server/rewolf.src @@ -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 diff --git a/Source/server/scihunt/input.c b/Source/server/scihunt/input.c index e0f5f4e8..c0b59228 100644 --- a/Source/server/scihunt/input.c +++ b/Source/server/scihunt/input.c @@ -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; diff --git a/Source/server/scihunt/monster_scientist.cpp b/Source/server/scihunt/monster_scientist.cpp index 453f0a6e..3a5b0ec8 100644 --- a/Source/server/scihunt/monster_scientist.cpp +++ b/Source/server/scihunt/monster_scientist.cpp @@ -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) diff --git a/Source/server/scihunt/shdata_parse.c b/Source/server/scihunt/shdata_parse.c index 68174e50..c5187f37 100644 --- a/Source/server/scihunt/shdata_parse.c +++ b/Source/server/scihunt/shdata_parse.c @@ -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") { diff --git a/Source/server/valve/damage.c b/Source/server/valve/damage.c index c9fbabd5..9a4547fa 100644 --- a/Source/server/valve/damage.c +++ b/Source/server/valve/damage.c @@ -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); diff --git a/Source/shared/decals.c b/Source/shared/decals.c index a941dfbb..accb47f5 100644 --- a/Source/shared/decals.c +++ b/Source/shared/decals.c @@ -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 diff --git a/Source/shared/effects.c b/Source/shared/effects.c index 0db668a7..a6dfecb4 100755 --- a/Source/shared/effects.c +++ b/Source/shared/effects.c @@ -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 diff --git a/cstrike/csprogs.dat b/cstrike/csprogs.dat index a72f370f..057736bf 100644 Binary files a/cstrike/csprogs.dat and b/cstrike/csprogs.dat differ diff --git a/cstrike/progs.dat b/cstrike/progs.dat index a2a222e1..cfc19ae6 100644 Binary files a/cstrike/progs.dat and b/cstrike/progs.dat differ diff --git a/rewolf/csprogs.dat b/rewolf/csprogs.dat new file mode 100644 index 00000000..26175885 Binary files /dev/null and b/rewolf/csprogs.dat differ diff --git a/rewolf/progs.dat b/rewolf/progs.dat new file mode 100644 index 00000000..ded0ed96 Binary files /dev/null and b/rewolf/progs.dat differ diff --git a/scihunt/csprogs.dat b/scihunt/csprogs.dat index 0ed74de8..e7d450da 100644 Binary files a/scihunt/csprogs.dat and b/scihunt/csprogs.dat differ diff --git a/scihunt/progs.dat b/scihunt/progs.dat index 267cb556..2ae905c8 100644 Binary files a/scihunt/progs.dat and b/scihunt/progs.dat differ diff --git a/valve/csprogs.dat b/valve/csprogs.dat index c02a139a..3ff8a237 100644 Binary files a/valve/csprogs.dat and b/valve/csprogs.dat differ diff --git a/valve/menu.dat b/valve/menu.dat index ab2cfa34..d02e352d 100644 Binary files a/valve/menu.dat and b/valve/menu.dat differ diff --git a/valve/progs.dat b/valve/progs.dat index 43d42a80..ea8c2e18 100644 Binary files a/valve/progs.dat and b/valve/progs.dat differ