diff --git a/doc/contributing b/doc/contributing index 86491981..045a9277 100644 --- a/doc/contributing +++ b/doc/contributing @@ -13,3 +13,5 @@ Unless other games benefit from this, keep it seperate to one of the game sub-directories. That's about it. + +Join us on #freecs at irc.freenode.org diff --git a/doc/faq b/doc/faq index 94bb334f..3b9e79a0 100644 --- a/doc/faq +++ b/doc/faq @@ -1,4 +1,4 @@ -NUCLIDE SOURCE TREE FAQ +NUCLIDE FREQUENTLY ASKED QUESTIONS Q: Why does this project exist? A: I wanted a free variant of the best version of Counter-Strike in 2016 as @@ -22,6 +22,8 @@ A: It depends. If you've got crashes etc. to report that are really bad If a crash to console happens, it's most likely my bug. If the whole engine comes crashing down, it's FTEQW's fault. Not mine. +FREECS SPECIFIC: + Q: It doesn't work with my Half-Life/Counter-Strike version. A: This is designed for the disc version of Half-Life, released before Steam. Supporting both is a bit annoying right now. I might add support for the @@ -29,9 +31,6 @@ A: This is designed for the disc version of Half-Life, released before Steam. work, the backend is constantly changing still and I can't afford to support all these things at once. -Q: I don't like how you're doing [insert thing here]! -A: Too bad! - Q: Why Counter-Strike 1.5? Not any earlier/later version? A: The best and last free to distribute version, no shield, no gambling. @@ -50,13 +49,29 @@ A: Other mods. They do kinda keep the codebase in check too, since there's a lot of shared code between them and they do help keep specifics into their own source tree. -Q: Make a wiki/discord/youtube/twitter/facebook etc. and spend time on - maintaining that, instead of working on the project, to build 'hype'. -A: I'm sure you are the first one to suggest such an idea... No thanks. +Q: [insert thing here] isn't 100% exact as in the original 1.5. +A: Sometimes bugs get fixed, sometimes very minor details get streamlined in + order to get more work done in other areas. FreeCS will most likely never + be done in that accuracy aspect, but it'll get better with time. + Feel free to contribute when it comes to low-hanging fruit like tweaking + variables! Trust me, plenty of people come and go and they seem to be really + distressed when a weapon damage is off by few hitpoints. I know. -Q: X#sh3D? Why not use that instead of FTE QuakeWorld? -A: There are enough GPL violators around, I do not need to contribute to that - cesspool. 'From scratch' my a$$. +Q: Why do this when you can just run a VM? +A: FreeCS isn't just making CS more portable. It also fixes bugs. It optimises + the netcode greatly. It's got much better lag compensation and client-side + player and weapon prediction than CS ever did. Yes, even the Steam version. + +Q: I still don't get it - why not play CS on Steam? +A: This is clearly not intended for you, then! + +Q: Will you make Nuclide's supported games available on Google Play? +A: No. If you can manually copy over the content (that I legally cannot and will + not ever distribute with the project) onto your internal phone/tablet memory + then you can also install FTEQW's official .apk - which may I remind you is + a completely different project entirely. + +DEVELOPMENT: Q: Is FTEQW a GoldSrc replacement? A: No. It is not aiming to be anything like that. FTE has been around for @@ -65,17 +80,11 @@ A: No. It is not aiming to be anything like that. FTE has been around for You can easily make very modern games with it too. It's not limited like GoldSrc and Source in terms of rendering as it's fully accessible. -Q: [insert thing here] isn't 100% exact as in the original 1.5. -A: Sometimes bugs get fixed, sometimes very minor details get streamlined in - order to get more work done in other areas. FreeCS will most likely never - be done in that accuracy aspect, but it'll get better with time. - Feel free to contribute when it comes to low-hanging fruit like tweaking - variables! +Q: X#sh3D? Why not use that instead of FTE QuakeWorld? +A: There are enough GPL violators around, I do not need to contribute to that + cesspool. 'From scratch' my a$$. Ironically, that project took code from + FTEQW going all the way back to the late 2000s. Do not support it. -Q: Why do this when you can just run a VM? -A: FreeCS isn't just making CS more portable. It also fixes bugs. It optimises - the netcode greatly. It's got much better lag compensation and client-side - player and weapon prediction than CS ever did. Yes, even the Steam version. - -Q: I still don't get it - why not play CS on Steam? -A: This is clearly not intended for you, then! +Q: Make a wiki/discord/youtube/twitter/facebook etc. and spend time on + maintaining that, instead of working on the project, to build 'hype'. +A: I'm sure you are the first one to suggest such an idea... No thanks. diff --git a/doc/history b/doc/history index 74f4af5f..cb6558a2 100644 --- a/doc/history +++ b/doc/history @@ -46,3 +46,8 @@ a work environment similar to GoldSrc for the original Quake engine. In April of 2020, the weapons were rewritten to be fully client-side predicted. This brought the Counter-Strike component on par with the advances of the other games that Nuclide supports. + +So the meaning and scope of Nuclide has changed, mainly to make work easier +as at one point TW and FreeCS were two seperate code-trees. Now they're unified +into one. I'd like to consider Nuclide to be FTE's reference SDK for game-logic, +like 'Source SDK Base' is to 'Source Engine'. diff --git a/doc/release-readme b/doc/release-readme index 898062b3..83b7b9ef 100644 --- a/doc/release-readme +++ b/doc/release-readme @@ -21,7 +21,6 @@ Contact #fte at irc.quakenet.org If you crash to console, contact #freecs at irc.freenode.net or irc.frag-net.com - Notes ======================================= diff --git a/src/menu-fn/m_internetgames.cpp b/src/menu-fn/m_internetgames.cpp index 05357c9c..81629bb5 100644 --- a/src/menu-fn/m_internetgames.cpp +++ b/src/menu-fn/m_internetgames.cpp @@ -14,6 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +var int g_inetrefresh = FALSE; + CWidget fn_inet; CMainButton inet_btnJoin; CMainButton inet_btnCreate; @@ -34,6 +36,9 @@ CListBox inet_lbServers_Players; CListBox inet_lbServers_Addresses; CScrollbar inet_sbServers; +CDialog inet_dgRefresh; +CMainButton inet_btnRefDone; + /* Button Callbacks */ void inet_btnjoin(void) @@ -80,11 +85,24 @@ inet_btndone_start(void) void inet_btnrefresh(void) { + g_inetrefresh = TRUE; +} + +void +inet_refreshframe(void) +{ + static float refreshtime; int count = 0; int added = 0; Master_RefreshCache(); - count = gethostcachevalue(SLIST_HOSTCACHETOTALCOUNT); + + /* only rebuild every half a frame */ + if (refreshtime > time) + return; + + count = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT); + refreshtime = time + 0.5f; inet_lbServers_Name.Clear(); inet_lbServers_Ping.Clear(); @@ -116,13 +134,19 @@ inet_btnrefresh(void) inet_lbServers_Game.AddEntry(gethostcachestring(srv_fldGame, i)); inet_lbServers_Players.AddEntry(players); inet_lbServers_Addresses.AddEntry(address); - print(sprintf("Adding %s to the Internet server list\n", address)); + dprint(sprintf("Adding %s to the Internet server list\n", address)); added++; } - print(sprintf("Added %i Internet servers.\n", added)); + dprint(sprintf("Added %i Internet servers.\n", added)); inet_sbServers.SetMax(added); } +void +inet_refreshfinish(void) +{ + g_inetrefresh = FALSE; +} + void inet_lb_clicked(int val) { @@ -246,6 +270,14 @@ menu_internetgames_init(void) inet_btnDone.SetExecute(inet_btndone_start); inet_btnDone.SetPos(30,396); Widget_Add(fn_inet, inet_btnDone); + + inet_dgRefresh = spawn(CDialog); + inet_btnRefDone = spawn(CMainButton); + inet_btnRefDone.SetImage(BTN_DONE); + inet_btnRefDone.SetPos(233,291); + inet_btnRefDone.SetLength(68); + inet_btnRefDone.SetExecute(inet_refreshfinish); + Widget_Add(inet_dgRefresh, inet_btnRefDone); } void @@ -267,10 +299,26 @@ menu_internetgames_draw(void) 1.0f, 0, font_arial); WLabel_Static(552, 128, m_reslbl[IDS_SERVER_PLAYERS], 10, 10, [1,1,1], 1.0f, 0, font_arial); + + if (!g_inetrefresh) + return; + + inet_refreshframe(); + inet_dgRefresh.Draw(); + Widget_Draw(inet_dgRefresh); + WField_Static(162, 180, "Refreshing server list...", 320, 260, + col_prompt_text, 1.0f, 2, font_label_p); + WField_Static(162, 220, sprintf("Listing %i applicable servers\n", + Master_GetInternetServers()), 320, 260, + col_prompt_title, 1.0f, 2, font_label_p); } void menu_internetgames_input(float evtype, float scanx, float chary, float devid) { - Widget_Input(fn_inet, evtype, scanx, chary, devid); + if (!g_inetrefresh) + Widget_Input(fn_inet, evtype, scanx, chary, devid); + else { + Widget_Input(inet_dgRefresh, evtype, scanx, chary, devid); + } } diff --git a/src/menu-fn/master.cpp b/src/menu-fn/master.cpp index 73faca7f..600141e5 100644 --- a/src/menu-fn/master.cpp +++ b/src/menu-fn/master.cpp @@ -14,6 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +int Server_IsLan(string address); + #define MASTER_DNS "master.frag-net.com" #define MASTER_PORT 27950 @@ -29,14 +31,14 @@ string Master_Resolve(void) { string out = netaddress_resolve(MASTER_DNS,MASTER_PORT); - print("Resolving master at "); - print(MASTER_DNS); - print(":"); - print(ftos(MASTER_PORT)); - print("...\n"); + dprint("Resolving master at "); + dprint(MASTER_DNS); + dprint(":"); + dprint(ftos(MASTER_PORT)); + dprint("...\n"); if (!out) { - print("Failed to resolve address.\n"); + dprint("Failed to resolve address.\n"); } return out; @@ -48,15 +50,37 @@ Master_GetTotalServers(void) int a = gethostcachevalue(SLIST_HOSTCACHETOTALCOUNT); if (a) { - print(sprintf("Master reports a total of %i servers.\n", a)); + dprint(sprintf("Master reports a total of %i servers.\n", a)); } return gethostcachevalue(SLIST_HOSTCACHETOTALCOUNT); } +int +Master_GetInternetServers(void) +{ + int count = 0; + int tcount = 0; + + count = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT); + + for (int i = 0; i < count; i++) { + string address; + address = gethostcachestring(srv_fldAdress, i); + + /* skip LAN */ + if (!address || Server_IsLan(address)) { + continue; + } + tcount++; + } + + return tcount; +} + void Master_RefreshCache(void) { - print("Refreshing host cache...\n"); + dprint("Refreshing host cache...\n"); resethostcachemasks(); sethostcachemaskstring(0, gethostcacheindexforkey("gamedir"), cvar_string("game"), SLIST_TEST_EQUAL); sethostcachesort(gethostcacheindexforkey("ping"), FALSE); @@ -65,14 +89,14 @@ Master_RefreshCache(void) int a = gethostcachevalue(SLIST_HOSTCACHETOTALCOUNT); if (a) { - print(sprintf("Master reports a total of %i servers.\n", a)); + dprint(sprintf("Master reports a total of %i servers.\n", a)); } } void Master_UpdateCache(void) { - print("Updating host cache...\n"); + dprint("Updating host cache...\n"); resethostcachemasks(); sethostcachemaskstring(0, gethostcacheindexforkey("gamedir"), cvar_string("game"), SLIST_TEST_EQUAL); sethostcachesort(gethostcacheindexforkey("ping"), FALSE); @@ -81,7 +105,7 @@ Master_UpdateCache(void) int a = gethostcachevalue(SLIST_HOSTCACHETOTALCOUNT); if (a) { - print(sprintf("Master reports a total of %i servers.\n", a)); + dprint(sprintf("Master reports a total of %i servers.\n", a)); } } diff --git a/src/menu-fn/music.cpp b/src/menu-fn/music.cpp index c068df91..a882b4a9 100644 --- a/src/menu-fn/music.cpp +++ b/src/menu-fn/music.cpp @@ -100,6 +100,9 @@ Music_ParseLoop(string parm) void Music_MenuStart(void) { + if (g_active) + return; + string tinfo = cvar_string("gameinfo_menutrack"); print(tinfo); print("\n"); diff --git a/src/shared/valve/fx_breakmodel.c b/src/shared/valve/fx_breakmodel.c index 3e3f6442..4f80f193 100644 --- a/src/shared/valve/fx_breakmodel.c +++ b/src/shared/valve/fx_breakmodel.c @@ -155,7 +155,7 @@ FX_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float fStyle) eGib.nextthink = time + 10; if ((fStyle == GSMATERIAL_GLASS) || (fStyle == GSMATERIAL_GLASS_UNBREAKABLE)) { - eGib.effects = EF_ADDITIVE; + eGib.alpha = 0.5f; } eGib.drawmask = MASK_ENGINE; diff --git a/valve/data.pk3dir/default.cfg b/valve/data.pk3dir/default.cfg index 7f960506..cf03b758 100755 --- a/valve/data.pk3dir/default.cfg +++ b/valve/data.pk3dir/default.cfg @@ -34,6 +34,8 @@ bind "y" "messagemode" bind "u" "messagemode2" bind "t" "impulse 201" bind "f" "impulse 100" +bind "f1" "vote yes" +bind "f2" "vote no" // Game Variables seta "hostname" "FreeHL Server"