Compare commits

...

3 Commits

6 changed files with 52 additions and 31 deletions

View File

@ -11,29 +11,29 @@ are present.
This is 100% original code, feel free to audit however you wish.
No proprietary SDKs have been looked at or taken apart, unlike similar projects.
The engine you want to use to run this is FTEQW (https://www.fteqw.org), which is a project
unrelated to this. It just happens to support the file-formats FreeHL needs.
![Preview 1](img/preview1.jpg)
![Preview 2](img/preview2.jpg)
![Preview 3](img/preview3.jpg)
![Preview 4](img/preview4.jpg)
## Installing
To run it, all you need is [FTEQW](https://www.fteqw.org) and [the latest release .pk3 file](https://www.frag-net.com/pkgs/package_valve.pk3), which you save into `Half-Life/valve/`. That's about it. You can install updates through the **Configuration > Updates** menu.
## Building
Clone the repository into the Nuclide-SDK:
Clone the repository into the Nuclide-SDK and build it:
> git clone REPOURL valve
```
$ git clone https://code.idtech.space/fn/valve valve
$ SKIP_UPDATE=1 SKIP_RADIANT=1 ./build_game.sh valve
```
then either run Nuclide's ./build_game.sh shell script, or issue 'make' inside
./valve/src!
Obviously make sure that Nuclide has fteqw and fteqcc set-up for building and that you have some proficiency in QuakeC.
You can also issue `make` inside `valve/src/`, but it won't build an `entities.def` file for use in Radiant (level editor family).
## Notes
If you're playing a mod that relies on FreeHL, selecting it from the Custom Game
menu alone works fine. However if you want to launch it via the command-line
you need to make sure to add `-game valve` before `-game modname`.
The order is important.
The engine should automatically detect Half-Life when placed within the game directory, however you may need to pass `-halflife` just in case you have one massive directory with multiple FTE-supported games in it for example.
You can also launch mods like this: `fteqw -halflife -game cstrike`
Useful for development, so you don't always have to use the **Custom Game** menu.
## Community
@ -48,10 +48,18 @@ and other such things. It's bridged with the Matrix room of the same name!
### Others
We've had people ask in the oddest of places for help, please don't do that.
## Special Thanks
- Spike for FTEQW and for being the most helpful person all around!
- Xylemon for the hundreds of test maps, verifying entity and game-logic behaviour
- Theuaredead`, preston22, dqus for various patches
- To my supporters on Patreon, who are always eager to follow what I do.
- Any and all people trying it, tinkering with it etc. :)
## License
ISC License
Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
Copyright (c) 2016-2024 Marco Hladik <marco@icculus.org>
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above

View File

@ -110,6 +110,10 @@ Obituary_Add(string attacker, string victim, float weapon, float flags)
int x, y;
x = OBITUARY_LINES;
if (attacker == "worldspawn" || attacker == victim) {
attacker = "";
}
/* we're not full yet, so fill up the buffer */
if (g_obituary_count < x) {
y = g_obituary_count;
@ -157,6 +161,8 @@ Obituary_Draw(void)
g_obituary[i].icon = g_obituary[i+1].icon;
}
g_obituary[OBITUARY_LINES-1].attacker = "";
g_obituary[OBITUARY_LINES-1].victim = "";
g_obituary[OBITUARY_LINES-1].icon = 0;
g_obituary_time = OBITUARY_TIME;
g_obituary_count--;
@ -170,7 +176,7 @@ Obituary_Draw(void)
for (i = 0; i < OBITUARY_LINES; i++) {
string a, v;
if (!g_obituary[i].attacker) {
if (!g_obituary[i].victim) {
break;
}

View File

@ -123,15 +123,13 @@ HLGameRules::PlayerPostFrame(NSClientPlayer pl)
void
HLGameRules::PlayerConnect(NSClientPlayer pl)
{
if (Plugin_PlayerConnect(pl) == FALSE)
bprint(PRINT_HIGH, sprintf("%s connected\n", pl.netname));
super::PlayerConnect(pl);
}
void
HLGameRules::PlayerDisconnect(NSClientPlayer pl)
{
if (Plugin_PlayerDisconnect(pl) == FALSE)
bprint(PRINT_HIGH, sprintf("%s disconnected\n", pl.netname));
super::PlayerDisconnect(pl);
}
void

View File

@ -58,18 +58,23 @@ entity
FX_Corpse_Spawn(player pl, float anim)
{
NSRenderableEntity body_next = (NSRenderableEntity)FX_Corpse_Next();
setorigin(body_next, pl.origin + [0,0,32]);
body_next.SetMovetype(MOVETYPE_TOSS);
if (pl.flags & FL_CROUCHING) {
body_next.SetOrigin(pl.GetOrigin() + [0,0,32]);
} else {
body_next.SetOrigin(pl.GetOrigin());
}
body_next.SetMovetype(MOVETYPE_BOUNCE);
body_next.SetSolid(SOLID_CORPSE);
setmodel(body_next, pl.model);
setsize(body_next, VEC_HULL_MIN, [16, 16, -16]);
body_next.SetModelindex(pl.modelindex);
body_next.SetAngles(pl.angles);
body_next.velocity = (pl.velocity) + [0,0,120];
body_next.colormap = pl.colormap;
body_next.SetModel(pl.GetModel());
body_next.SetSize(VEC_HULL_MIN, [16, 16, -16]);
body_next.SetAngles(pl.GetAngles());
body_next.SetVelocity(pl.GetVelocity() + [0,0,120]);
body_next.SetFrame(anim);
body_next.frame1time = 0.0f;
body_next.ScheduleThink(FX_Corpse_Update, 0.0f);
body_next.colormap = pl.colormap;
body_next.frame1time = 0.0f;
return (entity)body_next;
}
#endif

View File

@ -3,7 +3,7 @@ entityDef monster_alien_grunt
"spawnclass" "NSMonster"
"model" "models/agrunt.mdl"
"netname" "Alien Grunt"
"health" "skill:alien_grunt_health"
"health" "skill:agrunt_health"
"mins" "-16 -16 0"
"maxs" "16 16 72"
"eye_height" "64"

View File

@ -1,8 +1,12 @@
monster_generic.thud
BodyDrop.Light
{
sample common/bodydrop1.wav
sample common/bodydrop2.wav
sample common/bodydrop3.wav
}
BodyDrop.Heavy
{
sample common/bodydrop1.wav
sample common/bodydrop4.wav
}