diff --git a/Makefile b/Makefile index 8566ed9..58a3b8b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CXX=clang++ # -w suppresses all warnings (the part that's commented out helps me find memory leaks, it ruins performance though!) -CXXFLAGS=-std=c++17 -O3 -DPROTOCOL_VERSION=$(PROTOCOL_VERSION) #-g3 -fsanitize=address +CXXFLAGS=-Wall -std=c++17 -O3 -DPROTOCOL_VERSION=$(PROTOCOL_VERSION) #-g3 -fsanitize=address LDFLAGS=-lpthread # specifies the name of our exectuable SERVER=bin/fusion @@ -11,7 +11,7 @@ PROTOCOL_VERSION?=104 # Windows-specific WIN_CXX=x86_64-w64-mingw32-g++ -WIN_CXXFLAGS=-std=c++17 -O3 -DPROTOCOL_VERSION=$(PROTOCOL_VERSION) #-g3 -fsanitize=address +WIN_CXXFLAGS=-Wall -std=c++17 -O3 -DPROTOCOL_VERSION=$(PROTOCOL_VERSION) #-g3 -fsanitize=address WIN_LDFLAGS=-static -lws2_32 -lwsock32 WIN_SERVER=bin/winfusion.exe diff --git a/config.ini b/config.ini index 5586a25..c63fe78 100644 --- a/config.ini +++ b/config.ini @@ -1,5 +1,9 @@ -# should the server print every packet it receives? -verbose=false +# verbosity level +# 0 = mostly silence +# 1 = debug prints and unknown packets +# 2 = print all packets except LIVE_CHECK and movement +# 3 = print all packets +verbosity=1 # Login Server configuration [login] diff --git a/src/CNLoginServer.cpp b/src/CNLoginServer.cpp index c9edcbe..5e62ea4 100644 --- a/src/CNLoginServer.cpp +++ b/src/CNLoginServer.cpp @@ -17,8 +17,7 @@ CNLoginServer::CNLoginServer(uint16_t p) { } void CNLoginServer::handlePacket(CNSocket* sock, CNPacketData* data) { - if (settings::VERBOSE) - std::cout << "OpenFusion: received " << Defines::p2str(CL2LS, data->type) << " (" << data->type << ")" << std::endl; + printPacket(data, CL2LS); switch (data->type) { case P_CL2LS_REQ_LOGIN: { @@ -27,7 +26,6 @@ void CNLoginServer::handlePacket(CNSocket* sock, CNPacketData* data) { sP_CL2LS_REQ_LOGIN* login = (sP_CL2LS_REQ_LOGIN*)data->buf; INITSTRUCT(sP_LS2CL_REP_LOGIN_SUCC, resp); - uint64_t cachedKey = sock->getEKey(); // so we can still send the resp packet with the correct key int charCount = 2; // send 4 randomly generated characters for now DEBUGLOG( @@ -281,7 +279,8 @@ void CNLoginServer::handlePacket(CNSocket* sock, CNPacketData* data) { break; } default: - std::cerr << "OpenFusion: LOGIN UNIMPLM ERR. PacketType: " << Defines::p2str(CL2LS, data->type) << " (" << data->type << ")" << std::endl; + if (settings::VERBOSITY) + std::cerr << "OpenFusion: LOGIN UNIMPLM ERR. PacketType: " << Defines::p2str(CL2LS, data->type) << " (" << data->type << ")" << std::endl; break; } } diff --git a/src/CNLoginServer.hpp b/src/CNLoginServer.hpp index e694588..a2fae91 100644 --- a/src/CNLoginServer.hpp +++ b/src/CNLoginServer.hpp @@ -1,5 +1,4 @@ -#ifndef _CNLS_HPP -#define _CNLS_HPP +#pragma once #include "CNProtocol.hpp" #include "Defines.hpp" @@ -24,5 +23,3 @@ public: void newConnection(CNSocket* cns); void killConnection(CNSocket* cns); }; - -#endif diff --git a/src/CNProtocol.cpp b/src/CNProtocol.cpp index e9e38e5..ac6b16a 100644 --- a/src/CNProtocol.cpp +++ b/src/CNProtocol.cpp @@ -63,7 +63,7 @@ int CNSocketEncryption::decryptData(uint8_t* buffer, uint8_t* key, int size) { // ========================================================[[ CNPacketData ]]======================================================== -CNPacketData::CNPacketData(void* b, uint32_t t, int l): buf(b), type(t), size(l) {} +CNPacketData::CNPacketData(void* b, uint32_t t, int l): buf(b), size(l), type(t) {} // ========================================================[[ CNSocket ]]======================================================== @@ -361,6 +361,28 @@ void CNServer::kill() { connections.clear(); } +void CNServer::printPacket(CNPacketData *data, int type) { + if (settings::VERBOSITY < 2) + return; + + if (settings::VERBOSITY < 3) switch (data->type) { + case P_CL2LS_REP_LIVE_CHECK: + case P_CL2FE_REP_LIVE_CHECK: + case P_CL2FE_REQ_PC_MOVE: + case P_CL2FE_REQ_PC_JUMP: + case P_CL2FE_REQ_PC_SLOPE: + case P_CL2FE_REQ_PC_MOVEPLATFORM: + case P_CL2FE_REQ_PC_MOVETRANSPORTATION: + case P_CL2FE_REQ_PC_ZIPLINE: + case P_CL2FE_REQ_PC_JUMPPAD: + case P_CL2FE_REQ_PC_LAUNCHER: + case P_CL2FE_REQ_PC_STOP: + return; + } + + std::cout << "OpenFusion: received " << Defines::p2str(type, data->type) << " (" << data->type << ")" << std::endl; +} + void CNServer::newConnection(CNSocket* cns) {} // stubbed void CNServer::killConnection(CNSocket* cns) {} // stubbed void CNServer::onTimer() {} // stubbed diff --git a/src/CNProtocol.hpp b/src/CNProtocol.hpp index 3913a75..654bd81 100644 --- a/src/CNProtocol.hpp +++ b/src/CNProtocol.hpp @@ -1,8 +1,7 @@ -#ifndef _CNP_HPP -#define _CNP_HPP +#pragma once #define MAX_PACKETSIZE 8192 -#define DEBUGLOG(x) x +#define DEBUGLOG(x) if (settings::VERBOSITY) {x}; #include #include @@ -39,6 +38,9 @@ #include #include +#include "Defines.hpp" +#include "settings.hpp" + #if defined(__MINGW32__) && !defined(_GLIBCXX_HAS_GTHREADS) #include "mingw/mingw.mutex.h" #else @@ -148,9 +150,8 @@ public: void start(); void kill(); + static void printPacket(CNPacketData *data, int type); virtual void newConnection(CNSocket* cns); virtual void killConnection(CNSocket* cns); virtual void onTimer(); // called every 2 seconds }; - -#endif \ No newline at end of file diff --git a/src/CNShardServer.cpp b/src/CNShardServer.cpp index 9a202ba..accd53a 100644 --- a/src/CNShardServer.cpp +++ b/src/CNShardServer.cpp @@ -18,13 +18,11 @@ CNShardServer::CNShardServer(uint16_t p) { } void CNShardServer::handlePacket(CNSocket* sock, CNPacketData* data) { - if (settings::VERBOSE) - std::cout << "OpenFusion: received " << Defines::p2str(CL2FE, data->type) << " (" << data->type << ")" << std::endl; - + printPacket(data, CL2FE); if (ShardPackets.find(data->type) != ShardPackets.end()) ShardPackets[data->type](sock, data); - else + else if (settings::VERBOSITY) std::cerr << "OpenFusion: SHARD UNIMPLM ERR. PacketType: " << Defines::p2str(CL2FE, data->type) << " (" << data->type << ")" << std::endl; } diff --git a/src/CNShardServer.hpp b/src/CNShardServer.hpp index e9d9b56..4d5ca31 100644 --- a/src/CNShardServer.hpp +++ b/src/CNShardServer.hpp @@ -1,5 +1,4 @@ -#ifndef _CNSS_HPP -#define _CNSS_HPP +#pragma once #include "CNProtocol.hpp" #include "Defines.hpp" @@ -21,5 +20,3 @@ public: void killConnection(CNSocket* cns); void onTimer(); }; - -#endif diff --git a/src/CNShared.hpp b/src/CNShared.hpp index 5e0d240..f852191 100644 --- a/src/CNShared.hpp +++ b/src/CNShared.hpp @@ -3,8 +3,7 @@ There's some data shared between the Login Server and the Shard Server. Of course all of this needs to be thread-safe. No mucking about on this one! */ -#ifndef _CNSD_HPP -#define _CNSD_HPP +#pragma once #include #include @@ -19,5 +18,3 @@ namespace CNSharedData { Player getPlayer(int64_t sk); void erasePlayer(int64_t sk); } - -#endif \ No newline at end of file diff --git a/src/CNStructs.hpp b/src/CNStructs.hpp index 0b7de0b..584463a 100644 --- a/src/CNStructs.hpp +++ b/src/CNStructs.hpp @@ -2,8 +2,7 @@ CNStructs.hpp - defines some basic structs & useful methods for packets used by FusionFall based on the version defined */ -#ifndef _CNS_HPP -#define _CNS_HPP +#pragma once #ifdef _MSC_VER // codecvt_* is deprecated in C++17 and MSVC will throw an annoying warning because of that. @@ -45,5 +44,3 @@ uint64_t getTime(); #else #error Invalid PROTOCOL_VERSION #endif - -#endif diff --git a/src/ChatManager.hpp b/src/ChatManager.hpp index 241d47b..cfc827b 100644 --- a/src/ChatManager.hpp +++ b/src/ChatManager.hpp @@ -1,5 +1,4 @@ -#ifndef _CM_HPP -#define _CM_HPP +#pragma once #include "CNShardServer.hpp" @@ -10,5 +9,3 @@ namespace ChatManager { void emoteHandler(CNSocket* sock, CNPacketData* data); void menuChatHandler(CNSocket* sock, CNPacketData* data); } - -#endif diff --git a/src/ItemManager.hpp b/src/ItemManager.hpp index d6fc634..f87576b 100644 --- a/src/ItemManager.hpp +++ b/src/ItemManager.hpp @@ -1,5 +1,4 @@ -#ifndef _IM_HPP -#define _IM_HPP +#pragma once #include "CNShardServer.hpp" @@ -9,5 +8,3 @@ namespace ItemManager { void itemDeleteHandler(CNSocket* sock, CNPacketData* data); void itemGMGiveHandler(CNSocket* sock, CNPacketData* data); } - -#endif \ No newline at end of file diff --git a/src/NPCManager.hpp b/src/NPCManager.hpp index 8c3e369..b1897b1 100644 --- a/src/NPCManager.hpp +++ b/src/NPCManager.hpp @@ -1,5 +1,4 @@ -#ifndef _NPCMANAGER_HPP -#define _NPCMANAGER_HPP +#pragma once #include "CNProtocol.hpp" #include "PlayerManager.hpp" @@ -20,5 +19,3 @@ namespace NPCManager { void npcWarpManager(CNSocket* sock, CNPacketData* data); } - -#endif diff --git a/src/NanoManager.cpp b/src/NanoManager.cpp index 19c72cd..27c6ad9 100644 --- a/src/NanoManager.cpp +++ b/src/NanoManager.cpp @@ -93,14 +93,13 @@ void NanoManager::nanoSummonHandler(CNSocket* sock, CNPacketData* data) { sNano nano = plr.plr.Nanos[nanoId]; // Send to other players - for (CNSocket *s : PlayerManager::players[sock].viewable) { - INITSTRUCT(sP_FE2CL_NANO_ACTIVE, pkt); + INITSTRUCT(sP_FE2CL_NANO_ACTIVE, pkt1); - pkt.iPC_ID = plr.plr.iID; - pkt.Nano = nano; + pkt1.iPC_ID = plr.plr.iID; + pkt1.Nano = nano; - s->sendPacket((void*)&pkt, P_FE2CL_NANO_ACTIVE, sizeof(sP_FE2CL_NANO_ACTIVE)); - } + for (CNSocket *s : PlayerManager::players[sock].viewable) + s->sendPacket((void*)&pkt1, P_FE2CL_NANO_ACTIVE, sizeof(sP_FE2CL_NANO_ACTIVE)); // update player plr.plr.nano = nanoId; @@ -184,8 +183,8 @@ void NanoManager::setNanoSkill(CNSocket* sock, int16_t nanoId, int16_t skillId) std::cout << U16toU8(plr.PCStyle.szFirstName) << U16toU8(plr.PCStyle.szLastName) << " set skill id " << skillId << " for nano: " << nanoId << std::endl; ) - // Update the player - PlayerManager::updatePlayer(sock, plr); + // Update the player + PlayerManager::updatePlayer(sock, plr); } void NanoManager::resetNanoSkill(CNSocket* sock, int16_t nanoId) { diff --git a/src/NanoManager.hpp b/src/NanoManager.hpp index d1f2646..0a28956 100644 --- a/src/NanoManager.hpp +++ b/src/NanoManager.hpp @@ -1,5 +1,4 @@ -#ifndef _NM_HPP -#define _NM_HPP +#pragma once #include "CNShardServer.hpp" @@ -17,5 +16,3 @@ namespace NanoManager { void setNanoSkill(CNSocket* sock, int16_t nanoId, int16_t skillId); void resetNanoSkill(CNSocket* sock, int16_t nanoId); } - -#endif \ No newline at end of file diff --git a/src/PlayerManager.hpp b/src/PlayerManager.hpp index 10fac5b..ae8fcdb 100644 --- a/src/PlayerManager.hpp +++ b/src/PlayerManager.hpp @@ -1,5 +1,4 @@ -#ifndef _PM_HPP -#define _PM_HPP +#pragma once #include "Player.hpp" #include "CNProtocol.hpp" @@ -44,5 +43,3 @@ namespace PlayerManager { void heartbeatPlayer(CNSocket* sock, CNPacketData* data); void exitGame(CNSocket* sock, CNPacketData* data); } - -#endif diff --git a/src/settings.cpp b/src/settings.cpp index 4922f5d..efa5c09 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -3,7 +3,7 @@ #include "contrib/INIReader.hpp" // defaults :) -bool settings::VERBOSE = false; +int settings::VERBOSITY = 1; int settings::LOGINPORT = 8001; bool settings::LOGINRANDCHARACTERS = false; @@ -32,7 +32,7 @@ void settings::init() { return; } - VERBOSE = reader.GetBoolean("", "verbose", VERBOSE); + VERBOSITY = reader.GetInteger("", "verbosity", VERBOSITY); LOGINPORT = reader.GetInteger("login", "port", LOGINPORT); LOGINRANDCHARACTERS = reader.GetBoolean("login", "randomcharacters", LOGINRANDCHARACTERS); SHARDPORT = reader.GetInteger("shard", "port", SHARDPORT); diff --git a/src/settings.hpp b/src/settings.hpp index 6ab94aa..ef9e54c 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -1,8 +1,7 @@ -#ifndef _SETT_HPP -#define _SETT_HPP +#pragma once namespace settings { - extern bool VERBOSE; + extern int VERBOSITY; extern int LOGINPORT; extern bool LOGINRANDCHARACTERS; extern int SHARDPORT; @@ -17,5 +16,3 @@ namespace settings { void init(); } - -#endif