diff --git a/Source/FLHook/FLHook.cpp b/Source/FLHook/FLHook.cpp index 0c3a10b22..6596425c7 100644 --- a/Source/FLHook/FLHook.cpp +++ b/Source/FLHook/FLHook.cpp @@ -670,8 +670,6 @@ void ProcessEvent(wstring wscText, ...) wscText = wszBuf; - CALL_PLUGINS_V(PLUGIN_ProcessEvent_BEFORE, , (wstring &wscText), (wscText)); - foreach(lstSockets, SOCKET_CONNECTION*, i) { if ((*i)->csock.bEventMode) diff --git a/Source/FLHook/HkCbIClientImpl.cpp b/Source/FLHook/HkCbIClientImpl.cpp index 06b4a7c30..5f148e012 100644 --- a/Source/FLHook/HkCbIClientImpl.cpp +++ b/Source/FLHook/HkCbIClientImpl.cpp @@ -330,6 +330,8 @@ bool HkIClientImpl::Send_FLPACKET_SERVER_CHARACTERINFO(uint iClientID, FLPACKET_ ISERVER_LOG(); ISERVER_LOGARG_UI(iClientID); + ClientInfo[iClientID].iCharMenuEnterTime = time(0); + CALL_CLIENT_METHOD(Send_FLPACKET_SERVER_CHARACTERINFO(iClientID, pDunno)); return reinterpret_cast(vRet); } @@ -1111,7 +1113,7 @@ bool HkIClientImpl::Startup(uint iDunno, uint iDunno2) bi.scBasename = szBaseName; bi.iBaseID = CreateID(szBaseName); - lstBases.push_back(bi); + lstBases[bi.iBaseID] = bi; pub::System::LoadSystem(base->iSystemID); base = Universe::GetNextBase(); diff --git a/Source/FLHook/HkCbIServerImpl.cpp b/Source/FLHook/HkCbIServerImpl.cpp index 6c0cbc608..a19b4b573 100644 --- a/Source/FLHook/HkCbIServerImpl.cpp +++ b/Source/FLHook/HkCbIServerImpl.cpp @@ -458,6 +458,8 @@ namespace HkIServerImpl CHECK_FOR_DISCONNECT + ClientInfo[iClientID].iCharMenuEnterTime = 0; + CALL_PLUGINS_V(PLUGIN_HkIServerImpl_CharacterSelect, __stdcall, (struct CHARACTER_ID const & cId, unsigned int iClientID), (cId, iClientID)); wstring wscCharBefore; @@ -482,36 +484,17 @@ namespace HkIServerImpl if (set_bUserCmdHelp) PrintUserCmdText(iClientID, L"To get a list of available commands, type \"/help\" in chat."); - // anti-cheat check - list lstCargo; - int iHold; - HkEnumCargo(ARG_CLIENTID(iClientID), lstCargo, iHold); - foreach(lstCargo, CARGO_INFO, it) - { - if ((*it).iCount < 0) - { - HkAddCheaterLog(wscCharname, L"Negative good-count, likely to have cheated in the past"); - - wchar_t wszBuf[256]; - swprintf(wszBuf, L"Possible cheating detected (%s)", wscCharname.c_str()); - HkMsgU(wszBuf); - HkBan(ARG_CLIENTID(iClientID), true); - HkKick(ARG_CLIENTID(iClientID)); - return; - } - } - // event CAccount *acc = Players.FindAccountFromClientID(iClientID); wstring wscDir; HkGetAccountDirName(acc, wscDir); - HKPLAYERINFO pi; - HkGetPlayerInfo(ARG_CLIENTID(iClientID), pi, false); + wstring playerIP; + HkGetPlayerIP(iClientID, playerIP); ProcessEvent(L"login char=%s accountdirname=%s id=%d ip=%s", wscCharname.c_str(), wscDir.c_str(), iClientID, - pi.wscIP.c_str()); + playerIP.c_str()); } } CATCH_HOOK({}) @@ -704,19 +687,12 @@ namespace HkIServerImpl EXECUTE_SERVER_CALL(Server.TerminateTrade(iClientID, iAccepted)); - TRY_HOOK { - if (iAccepted) - { // save both chars to prevent cheating in case of server crash - HkSaveChar(ARG_CLIENTID(iClientID)); - if (ClientInfo[iClientID].iTradePartner) - HkSaveChar(ARG_CLIENTID(ClientInfo[iClientID].iTradePartner)); - } if (ClientInfo[iClientID].iTradePartner) ClientInfo[ClientInfo[iClientID].iTradePartner].iTradePartner = 0; ClientInfo[iClientID].iTradePartner = 0; - } CATCH_HOOK({}) + CALL_PLUGINS_V(PLUGIN_HkIServerImpl_TerminateTrade_AFTER, __stdcall, (unsigned int iClientID, int iAccepted), (iClientID, iAccepted)); } @@ -1017,50 +993,8 @@ namespace HkIServerImpl return; } - CALL_PLUGINS_V(PLUGIN_HkIServerImpl_Login, __stdcall, (struct SLoginInfo const &li, unsigned int iClientID), (li, iClientID)); - - - // check for ip ban - wstring wscIP; - HkGetPlayerIP(iClientID, wscIP); - - foreach(set_lstBans, wstring, itb) - { - if (Wildcard::wildcardfit(wstos(*itb).c_str(), wstos(wscIP).c_str())) - { - HkAddKickLog(iClientID, L"IP ban(%s matches %s)", wscIP.c_str(), (*itb).c_str()); - if (set_bBanAccountOnMatch) - HkBan(ARG_CLIENTID(iClientID), true); - HkKick(ARG_CLIENTID(iClientID)); - } - } - - // count players - struct PlayerData *pPD = 0; - uint iPlayers = 0; - while (pPD = Players.traverse_active(pPD)) - iPlayers++; - - if (iPlayers > (Players.GetMaxPlayerCount() - set_iReservedSlots)) - { // check if player has a reserved slot - CAccount *acc = Players.FindAccountFromClientID(iClientID); - wstring wscDir; - HkGetAccountDirName(acc, wscDir); - string scUserFile = scAcctPath + wstos(wscDir) + "\\flhookuser.ini"; - - bool bReserved = IniGetB(scUserFile, "Settings", "ReservedSlot", false); - if (!bReserved) - { - HkKick(acc); - return; - } - } - LoadUserSettings(iClientID); - // log - if (set_bLogConnects) - HkAddConnectLog(iClientID, wscIP); } CATCH_HOOK({ CAccount *acc = Players.FindAccountFromClientID(iClientID); @@ -1070,7 +1004,7 @@ namespace HkIServerImpl } }) - CALL_PLUGINS_V(PLUGIN_HkIServerImpl_Login_AFTER, __stdcall, (struct SLoginInfo const &li, unsigned int iClientID), (li, iClientID)); + CALL_PLUGINS_V(PLUGIN_HkIServerImpl_Login, __stdcall, (struct SLoginInfo const& li, unsigned int iClientID), (li, iClientID)); } /************************************************************************************************************** diff --git a/Source/FLHook/HkDataBaseMarket.cpp b/Source/FLHook/HkDataBaseMarket.cpp index 383be322d..c4ad4ad3c 100644 --- a/Source/FLHook/HkDataBaseMarket.cpp +++ b/Source/FLHook/HkDataBaseMarket.cpp @@ -19,19 +19,13 @@ bool HkLoadBaseMarket() continue; const char *szBaseName = ini.get_value_string(); - BASE_INFO *biBase = 0; - foreach(lstBases, BASE_INFO, it) + const auto& baseIter = lstBases.find(CreateID(szBaseName)); + if (baseIter == lstBases.end()) { - const char *szBN = it->scBasename.c_str(); - if (!ToLower(it->scBasename).compare(ToLower(szBaseName))) - { - biBase = &(*it); - break; - } + continue; } - if (!biBase) - continue; // base not found + BASE_INFO* biBase = &baseIter->second; ini.read_value(); diff --git a/Source/FLHook/HkFuncTools.cpp b/Source/FLHook/HkFuncTools.cpp index b9137b333..1fe061ff0 100644 --- a/Source/FLHook/HkFuncTools.cpp +++ b/Source/FLHook/HkFuncTools.cpp @@ -18,7 +18,7 @@ uint HkGetClientIdFromAccount(CAccount *acc) /////////////////////////////////////////////////////////////////////////////////////////////////////////////// -uint HkGetClientIdFromPD(struct PlayerData *pPD) +inline uint HkGetClientIdFromPD(struct PlayerData *pPD) { return pPD->iOnlineID; } @@ -300,7 +300,7 @@ wstring HkGetPlayerSystem(uint iClientID) { uint iSystemID; pub::Player::GetSystem(iClientID, iSystemID); - char szSystemname[1024] = ""; + char szSystemname[64] = ""; pub::GetSystemNickname(szSystemname, sizeof(szSystemname), iSystemID); return stows(szSystemname); } diff --git a/Source/FLHook/HkInit.cpp b/Source/FLHook/HkInit.cpp index 7ba48f54d..49c2b9a06 100644 --- a/Source/FLHook/HkInit.cpp +++ b/Source/FLHook/HkInit.cpp @@ -155,7 +155,7 @@ char *g_FLServerDataPtr; _GetShipInspect GetShipInspect; -list lstBases; +unordered_map lstBases; char szRepFreeFixOld[5]; diff --git a/Source/FLHook/HkTimers.cpp b/Source/FLHook/HkTimers.cpp index 03b8dbea3..1cbb0d852 100644 --- a/Source/FLHook/HkTimers.cpp +++ b/Source/FLHook/HkTimers.cpp @@ -49,6 +49,8 @@ void HkTimerCheckKick() TRY_HOOK { // for all players struct PlayerData *pPD = 0; + mstime msTime = timeInMS(); + time_t currTime = time(0); while (pPD = Players.traverse_active(pPD)) { uint iClientID = HkGetClientIdFromPD(pPD); @@ -57,7 +59,7 @@ void HkTimerCheckKick() if (ClientInfo[iClientID].tmKickTime) { - if (timeInMS() >= ClientInfo[iClientID].tmKickTime) + if (msTime >= ClientInfo[iClientID].tmKickTime) { HkKick(ARG_CLIENTID(iClientID)); // kick time expired ClientInfo[iClientID].tmKickTime = 0; @@ -65,35 +67,25 @@ void HkTimerCheckKick() continue; // player will be kicked anyway } - if (set_iAntiBaseIdle) + if (set_iAntiBaseIdle && ClientInfo[iClientID].iBaseEnterTime) { // anti base-idle check - uint iBaseID; - pub::Player::GetBase(iClientID, iBaseID); - if (iBaseID && ClientInfo[iClientID].iBaseEnterTime) + if ((currTime - ClientInfo[iClientID].iBaseEnterTime) >= set_iAntiBaseIdle) { - if ((time(0) - ClientInfo[iClientID].iBaseEnterTime) >= set_iAntiBaseIdle) - { - HkAddKickLog(iClientID, L"Base idling"); - HkMsgAndKick(iClientID, L"Base idling", set_iKickMsgPeriod); - ClientInfo[iClientID].iBaseEnterTime = 0; - } + HkAddKickLog(iClientID, L"Base idling"); + HkMsgAndKick(iClientID, L"Base idling", set_iKickMsgPeriod); + ClientInfo[iClientID].iBaseEnterTime = 0; } + continue; } if (set_iAntiCharMenuIdle) { // anti charmenu-idle check - if (HkIsInCharSelectMenu(iClientID)) { - if (!ClientInfo[iClientID].iCharMenuEnterTime) - ClientInfo[iClientID].iCharMenuEnterTime = (uint)time(0); - else if ((time(0) - ClientInfo[iClientID].iCharMenuEnterTime) >= set_iAntiCharMenuIdle) { - HkAddKickLog(iClientID, L"Charmenu idling"); - HkKick(ARG_CLIENTID(iClientID)); - ClientInfo[iClientID].iCharMenuEnterTime = 0; - continue; - } - } - else + if (ClientInfo[iClientID].iCharMenuEnterTime + && (currTime - ClientInfo[iClientID].iCharMenuEnterTime) >= set_iAntiCharMenuIdle) { + HkAddKickLog(iClientID, L"Charmenu idling"); + HkKick(ARG_CLIENTID(iClientID)); ClientInfo[iClientID].iCharMenuEnterTime = 0; + } } } @@ -106,21 +98,21 @@ Check if NPC spawns should be disabled void HkTimerNPCAndF1Check() { - //CALL_PLUGINS_V(PLUGIN_HkTimerNPCAndF1Check, , (), ()); - + TRY_HOOK { - struct PlayerData *pPD = 0; + struct PlayerData *pPD = nullptr; + mstime currTime = timeInMS(); while (pPD = Players.traverse_active(pPD)) { uint iClientID = HkGetClientIdFromPD(pPD); if (iClientID < 1 || iClientID > MAX_CLIENT_ID) continue; - if (ClientInfo[iClientID].tmF1Time && (timeInMS() >= ClientInfo[iClientID].tmF1Time)) { // f1 + if (ClientInfo[iClientID].tmF1Time && (currTime >= ClientInfo[iClientID].tmF1Time)) { // f1 Server.CharacterInfoReq(iClientID, false); ClientInfo[iClientID].tmF1Time = 0; } - else if (ClientInfo[iClientID].tmF1TimeDisconnect && (timeInMS() >= ClientInfo[iClientID].tmF1TimeDisconnect)) { + else if (ClientInfo[iClientID].tmF1TimeDisconnect && (currTime >= ClientInfo[iClientID].tmF1TimeDisconnect)) { ulong lArray[64] = { 0 }; lArray[26] = iClientID; __asm diff --git a/Source/FLHook/Hook.h b/Source/FLHook/Hook.h index 1f8c124d3..6e4332b32 100644 --- a/Source/FLHook/Hook.h +++ b/Source/FLHook/Hook.h @@ -9,6 +9,7 @@ #include "flcodec.h" #include +#include /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // defines @@ -848,7 +849,7 @@ namespace HkIEngine void HkTimerCheckKick(); void HkTimerNPCAndF1Check(); -extern EXPORT list lstBases; +extern EXPORT unordered_map lstBases; // namespaces namespace HkIServerImpl diff --git a/Source/FLHookPluginSDK/headers/FLCoreCommon.h b/Source/FLHookPluginSDK/headers/FLCoreCommon.h index 7e68828c5..2416f1ed9 100644 --- a/Source/FLHookPluginSDK/headers/FLCoreCommon.h +++ b/Source/FLHookPluginSDK/headers/FLCoreCommon.h @@ -54,6 +54,30 @@ #define OBJ_ASTEROID (1 << 29) +enum EquipmentClass : uint +{ + None = 0, + LightEquip = 1 << 0, + AttachedFx = 1 << 1, // contrails + Mine = 1 << 5, + CM = 1 << 6, + Gun = 1 << 7, + Shield = 1 << 8, + ShieldGenerator = 1 << 9, + Thruster = 1 << 10, + CargoPod = 1 << 11, + CloakingDevice = 1 << 12, + Cargo = 1 << 16, // commodities, ammo + Engine = 1 << 17, + Power = 1 << 18, + Scanner = 1 << 19, + TractorBeam = 1 << 20, + RepairDroid = 1 << 21, + InternalFX = 1 << 22, + TradeLaneEquip = 1 << 23, + Armor = 1 << 24, +}; + struct IMPORT CacheString { void clear(void); diff --git a/Source/FLHookPluginSDK/headers/FLHook.h b/Source/FLHookPluginSDK/headers/FLHook.h index e3aae7dcd..7f41f97cc 100644 --- a/Source/FLHookPluginSDK/headers/FLHook.h +++ b/Source/FLHookPluginSDK/headers/FLHook.h @@ -26,6 +26,7 @@ #include #include #include +#include using namespace std; @@ -819,7 +820,7 @@ extern IMPORT bool set_bLogUserCmds; extern IMPORT bool set_bPerfTimer; -extern IMPORT list lstBases; +extern IMPORT unordered_map lstBases; extern IMPORT CDPClientProxy **g_cClientProxyArray; extern IMPORT void *pClient;