Fix game crashing on NetworkingInit on Windows. Also add a 32-bit Windows build.

Also stubbed out InitSingleplayer in menu.cpp cuz this client doesn't want to work with servers correctly.
This commit is contained in:
milkwx3
2026-06-15 15:36:39 +03:00
parent 9b9e554c89
commit 0fc1cfb0aa
18 changed files with 159 additions and 77 deletions
+3 -1
View File
@@ -33,7 +33,7 @@ jobs:
rm raylib -r
rm yaml-cpp -r
wget https://github.com/lsalzman/enet/archive/refs/heads/master.zip
wget https://github.com/zpl-c/enet/archive/refs/heads/master.zip
unzip master.zip
mv enet-master enet
rm master.zip
@@ -64,6 +64,7 @@ jobs:
sh ${{ gitea.workspace }}/compile.sh
zip -r release-linux.zip OUTPUT-Linux || true
zip -r release-w64.zip OUTPUT-w64 || true
zip -r release-w32.zip OUTPUT-w32 || true
- name: Upload artifacts
uses: actions/upload-artifact@v3
@@ -72,3 +73,4 @@ jobs:
path: |
release-linux.zip
release-w64.zip
release-w32.zip
+2 -1
View File
@@ -7,4 +7,5 @@ android
__UTILS__
snapshots
OUTPUT-Linux
OUTPUT-w64
OUTPUT-w64
OUTPUT-w32
+11
View File
@@ -0,0 +1,11 @@
#ifdef WIN32 // FUCK WINDOWS
#include "external/fix_win32_compatibility.h"
#undef PlaySound
#endif
#include <enet/enet.h>
#ifdef WIN32 // FUCK WINDOWS 2
#undef PlaySound
#undef Sound
#endif
+3 -25
View File
@@ -1,27 +1,5 @@
#/usr/bin/bash
./makeheaders/makeheaders -h src/helpers/vars.hpp src/helpers/chunks.cpp src/helpers/debug.cpp src/helpers/entities.cpp src/helpers/input.cpp src/helpers/menu.cpp src/helpers/mesher.cpp src/helpers/networking.cpp src/helpers/utils.cpp src/helpers/inlines.hpp src/helpers/inventory.cpp src/helpers/locale.cpp src/helpers/recipes.cpp src/helpers/particles.cpp src/helpers/player.cpp src/helpers/multisound.cpp src/helpers/svlib.cpp -v > src/helpers/common.hpp
rm -r build
echo Building Linux...
cmake -B build -DUNIX=ON -DUNIX=true
cd build
make -j12
cd ..
mkdir OUTPUT-Linux
cp build/src/RCRAFT OUTPUT-Linux
cp -r data/resources OUTPUT-Linux
mkdir OUTPUT-Linux/user
mkdir OUTPUT-Linux/user/worlds
rm -r build
echo Building Windows...
cmake -DCMAKE_TOOLCHAIN_FILE=toolchains/mingw-w64.cmake -DWIN32=ON -DWIN32=true -B build
cd build
make -j12
cd ..
mkdir OUTPUT-w64
cp build/src/RCRAFT.exe OUTPUT-w64
cp -r data/resources OUTPUT-w64
mkdir OUTPUT-w64/user
mkdir OUTPUT-w64/user/worlds
sh compile_linux.sh
sh compile_windows_64.sh
sh compile_windows.sh
+17
View File
@@ -0,0 +1,17 @@
#/usr/bin/bash
./makeheaders/makeheaders -h src/helpers/vars.hpp src/helpers/chunks.cpp src/helpers/debug.cpp src/helpers/entities.cpp src/helpers/input.cpp src/helpers/menu.cpp src/helpers/mesher.cpp src/helpers/networking.cpp src/helpers/utils.cpp src/helpers/inlines.hpp src/helpers/inventory.cpp src/helpers/locale.cpp src/helpers/recipes.cpp src/helpers/particles.cpp src/helpers/player.cpp src/helpers/multisound.cpp src/helpers/svlib.cpp -v > tmp.hpp
cat additions.hpp tmp.hpp > src/helpers/common.hpp
rm tmp.hpp
echo Building x86-64 Linux...
rm -rf build
cmake -B build -DUNIX=ON -DUNIX=true
cd build
make -j12
cd ..
mkdir OUTPUT-Linux
cp build/src/RCRAFT OUTPUT-Linux/CubeGame
cp -r data/resources OUTPUT-Linux
mkdir OUTPUT-Linux/user
mkdir OUTPUT-Linux/user/worlds
+17
View File
@@ -0,0 +1,17 @@
#/usr/bin/bash
./makeheaders/makeheaders -h src/helpers/vars.hpp src/helpers/chunks.cpp src/helpers/debug.cpp src/helpers/entities.cpp src/helpers/input.cpp src/helpers/menu.cpp src/helpers/mesher.cpp src/helpers/networking.cpp src/helpers/utils.cpp src/helpers/inlines.hpp src/helpers/inventory.cpp src/helpers/locale.cpp src/helpers/recipes.cpp src/helpers/particles.cpp src/helpers/player.cpp src/helpers/multisound.cpp src/helpers/svlib.cpp -v > tmp.hpp
cat additions.hpp tmp.hpp > src/helpers/common.hpp
rm tmp.hpp
echo Building i686 Windows...
rm -rf build
cmake -DCMAKE_TOOLCHAIN_FILE=toolchains/mingw-w32.cmake -DWIN32=ON -DWIN32=true -B build
cd build
make -j12
cd ..
mkdir OUTPUT-w32
cp build/src/RCRAFT.exe OUTPUT-w32/CubeGame.exe
cp -r data/resources OUTPUT-w32
mkdir OUTPUT-w32/user
mkdir OUTPUT-w32/user/worlds
+17
View File
@@ -0,0 +1,17 @@
#/usr/bin/bash
./makeheaders/makeheaders -h src/helpers/vars.hpp src/helpers/chunks.cpp src/helpers/debug.cpp src/helpers/entities.cpp src/helpers/input.cpp src/helpers/menu.cpp src/helpers/mesher.cpp src/helpers/networking.cpp src/helpers/utils.cpp src/helpers/inlines.hpp src/helpers/inventory.cpp src/helpers/locale.cpp src/helpers/recipes.cpp src/helpers/particles.cpp src/helpers/player.cpp src/helpers/multisound.cpp src/helpers/svlib.cpp -v > tmp.hpp
cat additions.hpp tmp.hpp > src/helpers/common.hpp
rm tmp.hpp
echo Building x86-64 Windows...
rm -rf build
cmake -DCMAKE_TOOLCHAIN_FILE=toolchains/mingw-w64.cmake -DWIN32=ON -DWIN32=true -B build
cd build
make -j12
cd ..
mkdir OUTPUT-w64
cp build/src/RCRAFT.exe OUTPUT-w64/CubeGame.exe
cp -r data/resources OUTPUT-w64
mkdir OUTPUT-w64/user
mkdir OUTPUT-w64/user/worlds
+12 -8
View File
@@ -2,24 +2,28 @@ cmake_minimum_required(VERSION 3.23)
project(RCRAFT)
add_subdirectory(helpers)
#add_subdirectory(dedicated_server)
set(YAML_BUILD_SHARED_LIBS OFF)
set(YAML_MSVC_SHARED_RT OFF)
set(OPENGL_VERSION 4.3)
set(OPENGL_VERSION 1.1)
add_subdirectory(libraries/raylib)
add_subdirectory(libraries/enet)
add_subdirectory(libraries/yaml-cpp)
add_subdirectory(libraries/Lua)
if (WIN32)
add_compile_definitions(WIN32)
add_compile_options(-DWIN32)
link_libraries(ws2_32)
endif()
execute_process(COMMAND date +v.%yw%W OUTPUT_VARIABLE BUILD_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
add_compile_definitions(GAME_VERSION="${BUILD_DATE}")
add_executable(RCRAFT rcraft.cpp)
if (WIN32)
add_compile_definitions(WIN32)
add_compile_options(-DWIN32)
target_link_libraries(RCRAFT INTERFACE winmm ws2_32)
endif()
add_compile_options(-Wno-narrowing)
target_link_directories(RCRAFT PRIVATE ${CMAKE_SOURCE_DIR}/build/src/libraries/enet/)
target_include_directories(RCRAFT PRIVATE
libraries/enet/include/.
libraries/yaml-cpp/include/.
@@ -28,8 +32,8 @@ target_include_directories(RCRAFT PRIVATE
)
target_link_libraries(RCRAFT PRIVATE
raylib
enet
helpers
enet
yaml-cpp
lua_static
)
+7 -1
View File
@@ -18,6 +18,12 @@ add_library(helpers STATIC
svlib.cpp
)
if (WIN32)
add_compile_definitions(WIN32)
add_compile_options(-DWIN32)
target_link_libraries(helpers INTERFACE winmm ws2_32)
endif()
execute_process(COMMAND date +v.%yw%W OUTPUT_VARIABLE BUILD_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
add_compile_definitions(GAME_VERSION="${BUILD_DATE}")
@@ -36,4 +42,4 @@ target_sources(helpers
FILE_SET headers TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES common.hpp
)
target_link_libraries(helpers PRIVATE raylib yaml-cpp lua_static)
target_link_libraries(helpers PRIVATE raylib yaml-cpp lua_static enet)
+10 -5
View File
@@ -1,9 +1,16 @@
#if defined(WIN32)
#include "external/fix_win32_compatibility.h"
#ifdef WIN32 // FUCK WINDOWS
#include "external/fix_win32_compatibility.h"
#undef PlaySound
#endif
#include <enet/enet.h>
#ifdef WIN32 // FUCK WINDOWS 2
#undef PlaySound
#undef Sound
#endif
#include "glfw_keycodes_to_string.h"
#include "../PerlinNoise.hpp"
#include <enet/enet.h>
#include "raylib.h"
#include "raymath.h"
#include <stdint.h>
@@ -371,7 +378,6 @@ extern int currentlySelected;
extern GameState state;
extern Texture2D cubemap;
int TryConnect(const char *hostname);
void InitSingleplayer();
void GameModeCleanup();
void DrawBackground();
void InitMenu();
@@ -610,7 +616,6 @@ void SavePlayerData();
bool LoadPlayerData();
void MS_PlaySound(Sound src,float pitch,float volume,Vector3 position);
void MS_Update(float dt,Camera camera);
void StartInternalServer(bool&started);
void ServerNetworkUpdate();
void StopInternalServer();
#define INTERFACE 0
+2 -2
View File
@@ -29,7 +29,7 @@ static int MakeUIPOI(int x, int y) {
std::unordered_set<uint32_t> ui_pois;
int TryConnect(const char* hostname);
void InitSingleplayer();
//void InitSingleplayer();
void GameModeCleanup();
static int mouseX = -1;
@@ -503,7 +503,7 @@ void DrawWorldSelect() {
}
if (Button(LocaleGet("create_world").c_str(), GetScreenWidth()/2+196-128, GetScreenHeight()-48, 128, 0)) {
UIResetMousePos();
InitSingleplayer();
//InitSingleplayer();
return;
}
if (Button(LocaleGet("create_world").c_str(), GetScreenWidth()/2+196-128, GetScreenHeight()-48-48, 128, 0)) {
+1
View File
@@ -9,6 +9,7 @@
#ifndef SERVER
#ifndef LEGACY_GL
MeshData GenerateChunkMesh(ChunkRenderData chunkRenderData, Chunk chunk, int chunkWorldX, int chunkWorldY, uint8_t sideMask)
{
MeshData out = {0};
+3 -3
View File
@@ -1,7 +1,7 @@
#include <cstdio>
#include "common.hpp"
#include <cstring>
#include <iostream>
int NetworkingStart()
{
@@ -10,7 +10,7 @@ int NetworkingStart()
fprintf (stderr, "An error occurred while initializing ENet.\n");
return EXIT_FAILURE;
}
atexit(enet_deinitialize);
return 0;
}
ENetHost* StartServer() {
@@ -57,7 +57,7 @@ ENetHost* StartClient() {
void SendPacket(ENetPeer* peer, void* data, int len)
{
ENetPacket* packet = enet_packet_create(data, len, ENET_PACKET_FLAG_UNSEQUENCED);
std::cout << (packet == NULL) << std::endl;
int c = enet_peer_send(peer, 0, packet);
if(c!=0) {
printf("Failed sending packet! ");
+1
View File
@@ -50,6 +50,7 @@ void LoadRecipes() {
{
Recipe _recipe;
const std::string path = dir_entry.path().u8string();
std::cout << "loading " << path << std::endl;
YAML::Node recipe = YAML::LoadFile(path);
_recipe.requiredStation = recipe["station"].as<std::string>();
for (auto s : recipe["inputs"]) {
+12 -9
View File
@@ -8,6 +8,7 @@
#include <memory>
#include <filesystem>
#include <lua.hpp>
#include <atomic>
static std::list<NetPlayer> players;
static Chunk world[MAX_WORLD_AREA];
@@ -163,6 +164,9 @@ static int PeerToPlayerID(ENetPeer* peer) {
return -1;
}
static bool CompareAddress(NetPlayer plr, ENetPeer* peer) {
return plr.addr == peer->address.host && plr.port == (int)(peer->address.port);
}
static void ParseData(ENetPacket* packet, ENetPeer* peer) {
int len = packet->dataLength;
unsigned char data[len];
@@ -191,7 +195,7 @@ static void ParseData(ENetPacket* packet, ENetPeer* peer) {
response[0] = NET_ARG_ECHOMOVE;
for (NetPlayer &plr : players)
{
if(plr.addr == peer->address.host && plr.port == peer->address.port) {
if(CompareAddress(plr, peer)) {
float x = DeserializeFloat(data[1], data[2]);
float y = DeserializeFloat(data[3], data[4]);
float z = DeserializeFloat(data[5], data[6]);
@@ -211,7 +215,7 @@ static void ParseData(ENetPacket* packet, ENetPeer* peer) {
response[0] = NET_ARG_ECHOYAW;
for (NetPlayer &plr : players)
{
if(plr.addr == peer->address.host && plr.port == peer->address.port) {
if(CompareAddress(plr, peer)) {
response[1] = plr.id;
plr.yaw = data[1];
response[2] = plr.yaw;
@@ -226,7 +230,7 @@ static void ParseData(ENetPacket* packet, ENetPeer* peer) {
{
unsigned char responseP[9];
responseP[0] = NET_ARG_PLRREG;
if(plr.addr != peer->address.host || plr.port != peer->address.port) {
if(!CompareAddress(plr, peer)) {
SerializeFloat2Data(plr.x, responseP, 2);
SerializeFloat2Data(plr.y, responseP, 4);
SerializeFloat2Data(plr.z, responseP, 6);
@@ -240,7 +244,7 @@ static void ParseData(ENetPacket* packet, ENetPeer* peer) {
response[0] = NET_ARG_BLOCK;
for (NetPlayer &plr : players)
{
if(plr.addr == peer->address.host || plr.port == peer->address.port) {
if(CompareAddress(plr, peer)) {
unsigned char responseB[6];
responseB[0] = NET_ARG_BLOCK;
responseB[1] = plr.id;
@@ -268,7 +272,7 @@ static int FirstFreeID(const std::list<NetPlayer>& players) {
return id;
}
static bool serverStarted = false;
void StartInternalServer(bool& started) {
void StartInternalServer(std::atomic_bool& started) {
int worldType = 0;
InitWorldgen(worldType);
std::cout << "Building chunks..." << std::endl;
@@ -290,7 +294,7 @@ void StartInternalServer(bool& started) {
void ServerNetworkUpdate() {
if(serverStarted) {
ENetEvent event;
while(enet_host_service (server, &event, 1) > 0)
while(enet_host_service (server, &event, 0) > 0)
{
switch (event.type)
{
@@ -308,7 +312,7 @@ void ServerNetworkUpdate() {
NetPlayer netPlayer;
netPlayer.id = id;
netPlayer.addr = event.peer->address.host;
netPlayer.port = event.peer->address.port;
netPlayer.port = (int)(event.peer->address.port);
netPlayer.peer = event.peer;
players.push_back(netPlayer);
@@ -316,7 +320,6 @@ void ServerNetworkUpdate() {
response[1] = netPlayer.id;
BroadcastPacketR(server, response, sizeof(response));
}
// notify plugins
CallPluginOnConnect(id);
break;
@@ -329,7 +332,7 @@ void ServerNetworkUpdate() {
printf ("%s disconnected.\n", event.peer -> data);
event.peer -> data = NULL;
for (auto it = players.begin(); it != players.end(); ++it) {
if (it->addr == event.peer->address.host && it->port == event.peer->address.port) {
if (CompareAddress(*it, event.peer)) {
char responseD[2];
responseD[0] = NET_ARG_PLRDCN;
responseD[1] = it->id;
+3 -6
View File
@@ -1,18 +1,15 @@
#if INTERFACE
#ifdef WIN32
#include "external/fix_win32_compatibility.h"
#endif
#ifdef Escape
#undef Escape
#endif
#include "glfw_keycodes_to_string.h"
#include "../PerlinNoise.hpp"
#include <enet/enet.h>
#ifdef PlaySound
#undef PlaySound
#ifdef WIN32
#include "external/fix_win32_compatibility.h"
#endif
#include "raylib.h"
#include "raymath.h"
#include <stdint.h>
+24 -16
View File
@@ -16,6 +16,7 @@
#include <climits>
#include <queue>
#include <thread>
#include <atomic>
#define MAX_RAY_DISTANCE 8.0f
struct MessageData {
std::string message;
@@ -450,7 +451,7 @@ void SetBlockNetwork(Chunk world[], int bx, int by, int bz, int t) {
data[2] = (uint8_t)by;
data[3] = (uint8_t)bz;
data[4] = (uint8_t)t;
SendPacketR(peer, data, 5);
SendPacketR(peer, data, sizeof(data));
}
else {
SetBlock(world, bx, by, bz, t);
@@ -481,7 +482,7 @@ static void TickAvailableBlocks() {
}
}
}
static bool serverStarted;
std::atomic_bool serverStarted;
int TryConnect(const char* hostname) {
client = StartClient();
@@ -506,16 +507,14 @@ int TryConnect(const char* hostname) {
"No available peers for initiating an ENet connection.\n");
return NET_ERROR_NOTFOUND;
}
printf("Found a host\n");
while (!serverStarted)
if (enet_host_service (client, & event, 5000) > 0 &&
event.type == ENET_EVENT_TYPE_CONNECT)
{
if(!online) serverStarted = true;
}
if (enet_host_service (client, & event, 10000) && event.type == ENET_EVENT_TYPE_CONNECT){
puts ("Connection succeeded.");
char data[1];
data[0] = NET_ARG_REQWORLD;
SendPacketR(peer, data, 1); // Tell the server to send all chunks
SendPacketR(peer, data, 1);
online = true;
state = GAME_STATE_LOADING;
return 0;
@@ -529,22 +528,26 @@ int TryConnect(const char* hostname) {
return -1;
}
std::thread serverThread;
void ServerThread(bool& started) {
//std::thread serverThread;
std::atomic_bool stop_server = false;
void StartInternalServer(std::atomic_bool& started);
/*void ServerThread(std::atomic_bool& started) {
StartInternalServer(started);
stop_server = false;
while(true) {
if (stop_server)
return;
ServerNetworkUpdate();
}
}
void InitSingleplayer() {
}*/
/*void InitSingleplayer() {
online = true;
serverThread = std::thread(ServerThread, std::ref(serverStarted));
int result = TryConnect("localhost");
if(result == NET_ERROR_FAILED) {
state = GAME_STATE_MAINMENU;
}
}
}*/
std::vector<MessageData> messages;
bool survival = false;
bool chatOpen = false;
@@ -1400,10 +1403,14 @@ void NetworkUpdate() {
void GameModeCleanupFull() {
if(online) {
enet_host_destroy(client);
online = false;
}
stop_server = true;
//serverThread.join();
for (int idx = 0; idx < MAX_WORLD_AREA; idx++)
{
if(loadedChunks[idx]) {
@@ -1432,6 +1439,7 @@ extern void InitMenu();
int main(void)
{
SetTraceLogLevel(LOG_WARNING);
NetworkingStart();
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
InitWindow(WIDTH, HEIGHT, GAME_NAME);
InitWorldgen(0);
@@ -1595,7 +1603,7 @@ int main(void)
}
}
enet_deinitialize();
GameModeCleanupFull();
UnloadTexture(terrain);
+14
View File
@@ -0,0 +1,14 @@
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
set(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_C_FLAGS "-static-libgcc -static-libstdc++ -g -O0 -fno-omit-frame-pointer ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++ -g -O0 -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}")