Compare commits
3 Commits
0f445d8e2b
...
8e3f5f2752
Author | SHA1 | Date |
---|---|---|
Marco Cawthorne | 8e3f5f2752 | |
Marco Cawthorne | 7994088423 | |
Marco Cawthorne | ab3d4a9346 |
79
README.md
79
README.md
|
@ -23,62 +23,40 @@ The engine you want to use to run this is FTEQW (https://www.fteqw.org), which i
|
||||||
![Preview 4](img/preview4.jpg)
|
![Preview 4](img/preview4.jpg)
|
||||||
|
|
||||||
## Features and Improvements
|
## Features and Improvements
|
||||||
* Native support for Windows/Mac/Linux/BSD and wherever else FTEQW runs on
|
|
||||||
* Better support for higher display modes and aspect ratios
|
|
||||||
* Much easier modding by having the entire logic be in modern QuakeC
|
|
||||||
* Netcode that's always improving and more advanced prediction
|
|
||||||
* Open-source code for transparent modding
|
|
||||||
* Very permissive license (ISC/BSD)
|
|
||||||
* The code doesn't rely on others work, so nobody can shut it down :-)
|
|
||||||
|
|
||||||
## Installation
|
- Native support for Windows/Mac/Linux/BSD and wherever else FTEQW runs on
|
||||||
Grab the latest binary release, extract and put an FTEQW engine binary (for your platform) into the same folder as the default.fmf and readme file.
|
- Better support for higher display modes and aspect ratios
|
||||||
Get FTEQW here: https://www.fteqw.org/
|
- Much easier modding by having the entire logic be in modern QuakeC
|
||||||
|
- Netcode that's always improving and more advanced prediction
|
||||||
|
- Open-source code for transparent modding
|
||||||
|
- Very permissive license (ISC/BSD)
|
||||||
|
- The code doesn't rely on others work, so nobody can shut it down :-)
|
||||||
|
|
||||||
Run the engine and when in-game download the needed content, or optionally merge your own HL + CS 1.5 installation.
|
## Installing
|
||||||
|
To run it, all you need is [FTEQW](https://www.fteqw.org), [FreeHL](https://www.frag-net.com/pkgs/package_valve.pk3), and [the latest release .pk3 file](https://www.frag-net.com/pkgs/package_cstrike.pk3), which you save into `Half-Life/valve/` and `Half-Life/cstrike/` respectively. That's about it. You can install updates through the **Configuration > Updates** menu from here on out.
|
||||||
|
|
||||||
### Notes
|
### Disclaimer
|
||||||
|
Please **do not** file bugs if you see missing/broken content **while not** using the original Half-Life and Counter-Strike 1.5 data.
|
||||||
*You'd think this disclaimer may be unnecessary but here we go:*
|
|
||||||
|
|
||||||
**This project is designed for the CS 1.5 data files.**
|
|
||||||
|
|
||||||
You will have a bad time if you use it with later or earlier versions.
|
|
||||||
|
|
||||||
You won't be able to connect to most people their servers. Content may be missing.
|
|
||||||
|
|
||||||
This is designed for CS 1.5 and the Half-Life CD data files **ONLY**.
|
|
||||||
**If you want to play and later version of CS, please do it on Steam.**
|
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
Here's the quick and dirty instructions for those unfamilar:
|
Here's the quick and dirty instructions for those unfamilar:
|
||||||
|
|
||||||
First of all, make sure you've got Nuclide cloned.
|
```
|
||||||
|
$ git clone https://code.idtech.space/vera/nuclide Nuclide-SDK
|
||||||
|
$ cd Nuclide-SDK
|
||||||
|
$ ./build_engine.sh # (only required if you don't have an up-to-date FTEQW & FTEQCC in your PATH)
|
||||||
|
$ git clone https://code.idtech.space/fn/valve valve
|
||||||
|
$ git clone https://code.idtech.space/fn/cstrike cstrike
|
||||||
|
$ SKIP_UPDATE=1 SKIP_RADIANT=1 ./build_game.sh valve
|
||||||
|
$ SKIP_UPDATE=1 SKIP_RADIANT=1 ./build_game.sh cstrike
|
||||||
|
```
|
||||||
|
|
||||||
> git clone https://github.com/veravisions/nuclide
|
You can also issue `make` inside `valve/src/` and `cstrike/src`, but it won't build an `entities.def` file for use in Radiant (level editor family).
|
||||||
|
|
||||||
Then, **inside** of the cloned repo, you'll clone FreeHL.
|
|
||||||
|
|
||||||
> git clone https://github.com/eukara/freehl valve
|
|
||||||
|
|
||||||
Then, in the same directory (Nuclide's) you will clone this repo.
|
|
||||||
|
|
||||||
> git clone https://github.com/eukara/freecs cstrike
|
|
||||||
|
|
||||||
Run
|
|
||||||
> ./build_game.sh valve
|
|
||||||
|
|
||||||
First, so we have a usable menu.
|
|
||||||
|
|
||||||
then either run Nuclide's `./build_game.sh cstrike` shell script, or issue `make` inside
|
|
||||||
./cstrike/src for whenever you need to recompile FreeCS.
|
|
||||||
|
|
||||||
** !! You need to also provide data-files !! **
|
** !! You need to also provide data-files !! **
|
||||||
|
|
||||||
There's separate scripts inside FreeHL's cloned valve/ directory and FreeCS's cstrike/ directory
|
This should be self explanatory.
|
||||||
for grabbing/moving the data files from various install media.
|
Half-Life and Counter-Strike are owned by Valve and protected under copyright.
|
||||||
|
|
||||||
The archive.org scripts for Half-Life will download content from the various demo builds of Half-Life, and can use yt-dlp for grabbing the music. You should be able to get everything required to play off the Internet.
|
|
||||||
|
|
||||||
## Community
|
## Community
|
||||||
|
|
||||||
|
@ -93,10 +71,19 @@ and other such things. It's bridged with the Matrix room of the same name!
|
||||||
### Others
|
### Others
|
||||||
We've had people ask in the oddest of places for help, please don't do that.
|
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
|
||||||
|
- CYBERDEViL for his work on making Bots fascinated with Bomb Defusal
|
||||||
|
- mikota for his work on refining the bullet spread code
|
||||||
|
- 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
|
## License
|
||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2016-2022 Marco Cawthorne <marco@icculus.org>
|
Copyright (c) 2016-2024 Marco Cawthorne <marco@icculus.org>
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software for any
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
|
|
||||||
class CSGameRules:CGameRules
|
class CSGameRules:CGameRules
|
||||||
{
|
{
|
||||||
virtual void PlayerConnect(NSClientPlayer);
|
|
||||||
virtual void PlayerDisconnect(NSClientPlayer);
|
|
||||||
virtual void PlayerKill(NSClientPlayer);
|
virtual void PlayerKill(NSClientPlayer);
|
||||||
virtual void PlayerPreFrame(NSClientPlayer);
|
virtual void PlayerPreFrame(NSClientPlayer);
|
||||||
virtual void PlayerDeath(NSClientPlayer);
|
virtual void PlayerDeath(NSClientPlayer);
|
||||||
|
|
|
@ -175,27 +175,6 @@ CSGameRules::LevelNewParms(void)
|
||||||
parm64 = FL_CLIENT;
|
parm64 = FL_CLIENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CSGameRules::PlayerConnect(NSClientPlayer pl)
|
|
||||||
{
|
|
||||||
if (Plugin_PlayerConnect(pl) == FALSE)
|
|
||||||
bprint(PRINT_HIGH, sprintf("%s connected\n", pl.netname));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CSGameRules::PlayerDisconnect(NSClientPlayer pl)
|
|
||||||
{
|
|
||||||
bprint(PRINT_HIGH, sprintf("%s disconnected\n", pl.netname));
|
|
||||||
|
|
||||||
/* Make this unusable */
|
|
||||||
pl.solid = SOLID_NOT;
|
|
||||||
pl.movetype = MOVETYPE_NONE;
|
|
||||||
pl.modelindex = 0;
|
|
||||||
pl.health = 0;
|
|
||||||
pl.takedamage = 0;
|
|
||||||
pl.SendFlags = PLAYER_MODELINDEX;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CSGameRules::PlayerKill(NSClientPlayer pl)
|
CSGameRules::PlayerKill(NSClientPlayer pl)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,7 +36,7 @@ CSMultiplayerRules::PlayerDisconnect(NSClientPlayer pl)
|
||||||
if (health > 0)
|
if (health > 0)
|
||||||
PlayerDeath(pl);
|
PlayerDeath(pl);
|
||||||
|
|
||||||
NSGameRules::PlayerDisconnect(pl);
|
super::PlayerDisconnect(pl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -44,8 +44,42 @@ CSMultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
{
|
{
|
||||||
player targ = (player)g_dmg_eTarget;
|
player targ = (player)g_dmg_eTarget;
|
||||||
player attk = (player)g_dmg_eAttacker;
|
player attk = (player)g_dmg_eAttacker;
|
||||||
|
NSRenderableEntity newCorpse;
|
||||||
|
float deathAnimation;
|
||||||
|
|
||||||
FX_Corpse_Spawn(targ, ANIM_DEATH1);
|
/* TODO: death anims based on hit-regions */
|
||||||
|
if (targ.flags & FL_CROUCHING) {
|
||||||
|
deathAnimation = ANIM_CROUCH_DIE;
|
||||||
|
} else {
|
||||||
|
switch (g_dmg_iHitBody) {
|
||||||
|
case BODY_HEAD:
|
||||||
|
deathAnimation = ANIM_DIE_HEAD;
|
||||||
|
break;
|
||||||
|
case BODY_STOMACH:
|
||||||
|
deathAnimation = ANIM_DIE_GUT;
|
||||||
|
break;
|
||||||
|
case BODY_ARMLEFT:
|
||||||
|
deathAnimation = ANIM_DIE_LEFT;
|
||||||
|
break;
|
||||||
|
case BODY_ARMRIGHT:
|
||||||
|
deathAnimation = ANIM_DIE_RIGHT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
bool isFacing = targ.IsFacingPosition(g_dmg_vecLocation);
|
||||||
|
deathAnimation = ANIM_DEATH1;
|
||||||
|
|
||||||
|
if (isFacing == false)
|
||||||
|
deathAnimation = ANIM_DIE_FORWARD;
|
||||||
|
else
|
||||||
|
deathAnimation = ANIM_DIE_BACK;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newCorpse = FX_Corpse_Spawn(targ, deathAnimation);
|
||||||
|
|
||||||
|
targ.SpectatorDeathcam(newCorpse, attk, 3.0f);
|
||||||
|
|
||||||
/* obituary networking */
|
/* obituary networking */
|
||||||
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
|
||||||
|
@ -108,6 +142,8 @@ CSMultiplayerRules::PlayerDeath(NSClientPlayer pl)
|
||||||
targ.Death();
|
targ.Death();
|
||||||
targ.gflags &= ~GF_FLASHLIGHT;
|
targ.gflags &= ~GF_FLASHLIGHT;
|
||||||
|
|
||||||
|
targ.StartSoundDef("Player.Death", CHAN_AUTO, true);
|
||||||
|
|
||||||
/* gamerule stuff */
|
/* gamerule stuff */
|
||||||
targ.MakeTempSpectator();
|
targ.MakeTempSpectator();
|
||||||
forceinfokey(targ, "*dead", "1");
|
forceinfokey(targ, "*dead", "1");
|
||||||
|
|
|
@ -226,7 +226,6 @@ player::Physics_InputPostMove(void)
|
||||||
UpdatePlayerAnimation(input_timelength);
|
UpdatePlayerAnimation(input_timelength);
|
||||||
|
|
||||||
RemoveFlags(FL_FROZEN);
|
RemoveFlags(FL_FROZEN);
|
||||||
ProcessInput();
|
|
||||||
|
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
if (g_cs_gamestate == GAME_FREEZE) {
|
if (g_cs_gamestate == GAME_FREEZE) {
|
||||||
|
@ -234,9 +233,14 @@ player::Physics_InputPostMove(void)
|
||||||
if (getstati(STAT_GAMESTATE) == GAME_FREEZE) {
|
if (getstati(STAT_GAMESTATE) == GAME_FREEZE) {
|
||||||
#endif
|
#endif
|
||||||
flags |= FL_FROZEN;
|
flags |= FL_FROZEN;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (input_buttons & INPUT_BUTTON0) {
|
||||||
|
w_attack_next = (w_attack_next > 0.1) ? w_attack_next : 0.1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
ProcessInput();
|
||||||
|
}
|
||||||
|
|
||||||
void Animation_PlayerUpdate(player);
|
void Animation_PlayerUpdate(player);
|
||||||
void Animation_TimerUpdate(player, float);
|
void Animation_TimerUpdate(player, float);
|
||||||
|
|
Loading…
Reference in New Issue