mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-25 18:47:35 +00:00
Compare commits
306 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e811e3975b | |||
| 68261e0308 | |||
| d03e8d05ec | |||
| 3f2815e30c | |||
| 91b01c2fcc | |||
| 179063c863 | |||
| 28eb80e27f | |||
| 0dbd0478c0 | |||
| 29c0c4801c | |||
| a8de7e9ffc | |||
| 7fca5a7a89 | |||
| ac5926bdfe | |||
| b16cf57510 | |||
| 851c842529 | |||
| 567c17cc9e | |||
| 0ee54f1117 | |||
| 39426789f4 | |||
| fa0196b987 | |||
| 44477a0d47 | |||
| 510ce16f0e | |||
| 52b8c0e078 | |||
| 3c7f7beb6d | |||
| ee7d7c6f24 | |||
| a66ef1b778 | |||
| b47597b813 | |||
| d6ff01d63c | |||
| fcb769e353 | |||
| 815c3dc73f | |||
| efe7092995 | |||
| 12ddd30f67 | |||
| 879ddb208b | |||
| 70dab7d920 | |||
| 2840e32853 | |||
| 320494c83d | |||
| e6fba5ba82 | |||
| 5255c236c3 | |||
| e5d4b35a32 | |||
| b4e65a8840 | |||
| ac78841e55 | |||
| 54914a970e | |||
| ea2a1651d5 | |||
| 5c6e95f921 | |||
| 555e21c3c7 | |||
| 0fdfe025cb | |||
| 930fda07c9 | |||
| 41dcd5bc29 | |||
| d7546e09ee | |||
| e9577db9c2 | |||
| cdc7b2a000 | |||
| a7084b4d6c | |||
| 64212176ec | |||
| 70eb226fea | |||
| c18d868d03 | |||
| 9002bfb9a0 | |||
| 26143750f3 | |||
| 3c11f8f26b | |||
| dcec112b91 | |||
| 7b0de551e1 | |||
| d41331d948 | |||
| 1e5d6b0e34 | |||
| f1a487f606 | |||
| fca9c1458b | |||
| 7b21e3be72 | |||
| 1b9647f57e | |||
| 2d1805c983 | |||
| 7185ff25be | |||
| 55c66022eb | |||
| 312100e1c6 | |||
| f51f6e00c4 | |||
| 9e13a2271c | |||
| b0fb8aa4be | |||
| b9a32185d7 | |||
| 0f880177e4 | |||
| 7683252896 | |||
| ca9a1de44c | |||
| 73a4e87379 | |||
| 3a31ad55fb | |||
| b19755a313 | |||
| 9a139a7604 | |||
| 373ff66240 | |||
| babd3949f6 | |||
| 3521472942 | |||
| 9ea71dd94f | |||
| 7a4cac84ac | |||
| c98c115cb6 | |||
| 4bdd8b2502 | |||
| ffcff4aea1 | |||
| 56b15f558c | |||
| 6ea9c9218d | |||
| 7a93966158 | |||
| 273cb928bf | |||
| 7735639e57 | |||
| 23c524812d | |||
| c6ca89907c | |||
| 87a75c6100 | |||
| f6100ed834 | |||
| 21a9434f89 | |||
| ea6e239d58 | |||
| 4ee4992330 | |||
| 059ecdb50b | |||
| 0838d4507a | |||
| 5cda797531 | |||
| 308a21e0e2 | |||
| a0a92587b4 | |||
| 8e49ab9179 | |||
| 90c7fab452 | |||
| a4b985cd96 | |||
| d7dff7d7a6 | |||
| 37b7a49faf | |||
| 05d7c12d38 | |||
| f983d19e01 | |||
| 4a0749f811 | |||
| e2fd78b510 | |||
| 7560b6b0a7 | |||
| 824b101831 | |||
| e1c2657b11 | |||
| d3588d2c95 | |||
| c5c945f0c3 | |||
| 022713996a | |||
| d2c7f23ec9 | |||
| 232d1e2ca8 | |||
| 401e897019 | |||
| 61f7009378 | |||
| 43b91b5938 | |||
| e2f25d1c92 | |||
| 56490400ca | |||
| b15cb08f54 | |||
| 9b015a2975 | |||
| b09a3840eb | |||
| 495510a02e | |||
| ea606ef80d | |||
| 27493c3d75 | |||
| cc07d511a5 | |||
| 5b3ec4fb7c | |||
| 18da8fe44d | |||
| 211248b50e | |||
| 969f0c535e | |||
| a7ce66856b | |||
| 3b42f295d6 | |||
| b8febdd440 | |||
| f8795bcd72 | |||
| 53301289f5 | |||
| 51896050ed | |||
| 81ca7a1bfd | |||
| 91c817d9dd | |||
| 88b9f96b91 | |||
| b2d5ad6904 | |||
| 20f086dc37 | |||
| 6fa93f243f | |||
| 15e31d1c03 | |||
| a787a7ce72 | |||
| 989d132423 | |||
| 757fc01b78 | |||
| 353d7cede0 | |||
| fb0add070b | |||
| 96b42ed86f | |||
| 2dde4dce12 | |||
| c7ff207017 | |||
| 23820a369e | |||
| 24d4eaf65d | |||
| e0b05e573e | |||
| e2b9efaf49 | |||
| 349eb371c6 | |||
| afe3ba40cf | |||
| 5e618a1ca4 | |||
| d011332647 | |||
| bc73e9c4e3 | |||
| e609ec1df6 | |||
| 2073ca8d38 | |||
| a6f2c1be8a | |||
| 18e9714273 | |||
| fa18991917 | |||
| b0b342a020 | |||
| 8e604fd3db | |||
| abaad22eb4 | |||
| ac040b5197 | |||
| 9b1a18d9a3 | |||
| a20c7735e8 | |||
| c94822a2a1 | |||
| 2124b63982 | |||
| 886c7bf634 | |||
| 56825e9ed0 | |||
| 925ba2199e | |||
| fd8650b8a0 | |||
| 549455b3df | |||
| f90a5b5b71 | |||
| 5c76297e5f | |||
| cabf8631d4 | |||
| 6ae8fbc0e4 | |||
| f32a277643 | |||
| 09df77b56e | |||
| f5e58e0125 | |||
| 660ab53476 | |||
| 5c9f2c0d50 | |||
| d036afee5b | |||
| 4ab7786828 | |||
| 981cabe857 | |||
| 8eef122cec | |||
| 1dc1655891 | |||
| 0bc942f4d5 | |||
| 9fbf9abd47 | |||
| b8170df498 | |||
| d76a8bd34a | |||
| 021faf68b3 | |||
| 7c264ad097 | |||
| 810fdf3cca | |||
| c301b30c3a | |||
| 735b4181fa | |||
| a14fecaf78 | |||
| e12b06a9ad | |||
| 9a82875ad4 | |||
| 0b0ee921a5 | |||
| 7109a40637 | |||
| 0a805feeec | |||
| 9fdb6862f8 | |||
| e53ae5f6d5 | |||
| 0ad1044b2e | |||
| 64c53fe37b | |||
| faa93c3739 | |||
| 0e6272e6d8 | |||
| c363261d00 | |||
| a2500ff814 | |||
| 2af6e8cd16 | |||
| eb1e88b38c | |||
| c81549a441 | |||
| adf42c8750 | |||
| 2ee8e17ac0 | |||
| f7469412f1 | |||
| 55a72c86cf | |||
| a80eb397d5 | |||
| 7926362ab5 | |||
| 7af51ff346 | |||
| c8ca362eba | |||
| 4964c17abb | |||
| 0c6eee6d81 | |||
| 950f00fae6 | |||
| d8628170b5 | |||
| 68338dace1 | |||
| af1f87a00f | |||
| 9a47e79e8e | |||
| aceaba0fb0 | |||
| e0887d81aa | |||
| ff9e4e0780 | |||
| 6a4f61d3a3 | |||
| c8da17c664 | |||
| 7c34a89ec5 | |||
| da4cddf1ef | |||
| 9262c0895f | |||
| b5405c35e2 | |||
| 0137a271cc | |||
| 5d8af58e57 | |||
| c054cb3dd0 | |||
| 8640a89323 | |||
| ea72975e69 | |||
| 7237c1f54c | |||
| 92ed7e694f | |||
| ffe24cdfaa | |||
| 04dfe4512f | |||
| a95205905e | |||
| 55347aeab6 | |||
| 945db17cb8 | |||
| e48d59b07b | |||
| aff4d53d7e | |||
| 5bb604248f | |||
| 7e63135a3d | |||
| 3092286604 | |||
| d42ff6ce19 | |||
| 26f965e251 | |||
| 34a4b2ab37 | |||
| 9c1159837a | |||
| 147c96970c | |||
| e7e1b46b36 | |||
| 299dc525d0 | |||
| 5a69f41f4d | |||
| c31b2b65c1 | |||
| 8937c5be86 | |||
| 54883b0795 | |||
| 39a77a855e | |||
| 4c10d4dd2f | |||
| f32048808a | |||
| 86c8b11102 | |||
| 8c425ff9d8 | |||
| 9eaa98675b | |||
| 6f13d0cfbc | |||
| 543ef3fb32 | |||
| 3e9c2a06a3 | |||
| 0115b18e67 | |||
| ef9498b03a | |||
| 8eb7d0aaa8 | |||
| 12bde7434a | |||
| 23dbd00d40 | |||
| f8bae86082 | |||
| acecff23f4 | |||
| 7ce6f4de0d | |||
| 78b2385785 | |||
| d4dbf0042e | |||
| 0d16361a40 | |||
| 70543c2b8a | |||
| a5ad05f274 | |||
| 53d6e4000c | |||
| a192e726d4 | |||
| 886fe5cc31 | |||
| c734708809 | |||
| 1c0f35a945 | |||
| 06a3873c9b | |||
| 7a2be102aa |
+27
-19
@@ -79,11 +79,21 @@ IF(MSVC)
|
||||
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
||||
ENDIF(${flag_var} MATCHES "/MD")
|
||||
ENDFOREACH(flag_var)
|
||||
|
||||
ADD_DEFINITIONS(-DNOMINMAX)
|
||||
ELSE(MSVC)
|
||||
#Normally set by perl but we don't use the perl flags anymore so we set it.
|
||||
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
|
||||
ENDIF(MSVC)
|
||||
|
||||
#FreeBSD support
|
||||
IF(UNIX)
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
||||
ADD_DEFINITIONS(-DFREEBSD)
|
||||
SET(FREEBSD TRUE)
|
||||
ENDIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
||||
ENDIF(UNIX)
|
||||
|
||||
#use stdint.h types if they exist for this platform (we have to guess otherwise)
|
||||
CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
|
||||
IF(HAVE_STDINT_H)
|
||||
@@ -112,23 +122,19 @@ OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
|
||||
OPTION(EQEMU_BUILD_LOGIN "Build the login server." OFF)
|
||||
OPTION(EQEMU_BUILD_AZONE "Build azone utility." OFF)
|
||||
OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
|
||||
OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
|
||||
|
||||
IF(UNIX)
|
||||
#Whether to build cleanipc or not (probably a good idea if you build server)
|
||||
OPTION(EQEMU_BUILD_CLEANIPC "Build cleanipc." ON)
|
||||
|
||||
#Use C++11 stuff, support for this is still it infancy
|
||||
OPTION(EQEMU_CPP_ELEVEN "Enable C++11 extentions in g++" OFF)
|
||||
IF(EQEMU_CPP_ELEVEN)
|
||||
#C++11 stuff
|
||||
IF(NOT MSVC)
|
||||
ADD_DEFINITIONS(-std=c++0x)
|
||||
ENDIF(EQEMU_CPP_ELEVEN)
|
||||
ENDIF(UNIX)
|
||||
ENDIF(NOT MSVC)
|
||||
|
||||
#Various definitions
|
||||
ADD_DEFINITIONS(-DEMBPERL)
|
||||
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
||||
IF(EQEMU_BUILD_PERL)
|
||||
ADD_DEFINITIONS(-DEMBPERL)
|
||||
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
||||
ENDIF(EQEMU_BUILD_PERL)
|
||||
ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL})
|
||||
ADD_DEFINITIONS(-DSHAREMEM)
|
||||
ADD_DEFINITIONS(-DINVERSEXY)
|
||||
ADD_DEFINITIONS(-DFIELD_ITEMS)
|
||||
ADD_DEFINITIONS(-DMAP_DIR="./Maps")
|
||||
@@ -136,14 +142,17 @@ ADD_DEFINITIONS(-DMAP_DIR="./Maps")
|
||||
#Find everything we need
|
||||
FIND_PACKAGE(ZLIB REQUIRED)
|
||||
FIND_PACKAGE(MySQL REQUIRED)
|
||||
FIND_PACKAGE(PerlLibs REQUIRED)
|
||||
INCLUDE_DIRECTORIES("${ZLIB_INCLUDE_DIRS}" "${PERL_INCLUDE_PATH}" "${MySQL_INCLUDE_DIR}")
|
||||
IF(EQEMU_BUILD_PERL)
|
||||
FIND_PACKAGE(PerlLibs REQUIRED)
|
||||
INCLUDE_DIRECTORIES("${PERL_INCLUDE_PATH}")
|
||||
ENDIF(EQEMU_BUILD_PERL)
|
||||
INCLUDE_DIRECTORIES("${ZLIB_INCLUDE_DIRS}" "${MySQL_INCLUDE_DIR}")
|
||||
|
||||
IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS)
|
||||
ADD_SUBDIRECTORY(common)
|
||||
ENDIF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS)
|
||||
IF(EQEMU_BUILD_SERVER)
|
||||
ADD_SUBDIRECTORY(EMuShareMem)
|
||||
ADD_SUBDIRECTORY(shared_memory)
|
||||
ADD_SUBDIRECTORY(world)
|
||||
ADD_SUBDIRECTORY(zone)
|
||||
ADD_SUBDIRECTORY(ucs)
|
||||
@@ -154,11 +163,10 @@ IF(EQEMU_BUILD_LOGIN)
|
||||
ADD_SUBDIRECTORY(loginserver)
|
||||
ENDIF(EQEMU_BUILD_LOGIN)
|
||||
|
||||
IF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
|
||||
IF(EQEMU_BUILD_AZONE)
|
||||
ADD_SUBDIRECTORY(utils)
|
||||
ENDIF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
|
||||
ENDIF(EQEMU_BUILD_AZONE)
|
||||
|
||||
IF(EQEMU_BUILD_TESTS)
|
||||
# Testing framework not quite ready for prime time.
|
||||
# ADD_SUBDIRECTORY(tests)
|
||||
ADD_SUBDIRECTORY(tests)
|
||||
ENDIF(EQEMU_BUILD_TESTS)
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||
|
||||
SET(sharedmem_src
|
||||
DLLMain.cpp
|
||||
Doors.cpp
|
||||
Items.cpp
|
||||
Loot.cpp
|
||||
MMF.cpp
|
||||
MMFMutex.cpp
|
||||
NPCFactionLists.cpp
|
||||
Opcodes.cpp
|
||||
SkillCaps.cpp
|
||||
Spells.cpp
|
||||
)
|
||||
|
||||
SET(sharedmem_headers
|
||||
Doors.h
|
||||
Items.h
|
||||
Loot.h
|
||||
MMF.h
|
||||
MMFMutex.h
|
||||
NPCFactionLists.h
|
||||
Opcodes.h
|
||||
SkillCaps.h
|
||||
Spells.h
|
||||
)
|
||||
|
||||
SET(EQEMU_MAX_ITEMS 300000 CACHE STRING "Maxium number of items to load into memory. Make sure this is bigger than the total number of items in the server database")
|
||||
SET(EQEMU_MAX_DOORS 30000 CACHE STRING "Maxium number of doors to load into memory. Make sure this is bigger than the total number of doors in the server database")
|
||||
SET(EQEMU_MAX_FACTIONLIST_IDS 50000 CACHE STRING "Maxium number of FactionList IDs to load into memory. Make sure this is bigger than the total number of FactionList IDs in the server database")
|
||||
|
||||
ADD_DEFINITIONS(-DMMF_EQMAX_ITEMS=${EQEMU_MAX_ITEMS})
|
||||
ADD_DEFINITIONS(-DMMF_MAX_Door_ID=${EQEMU_MAX_DOORS})
|
||||
ADD_DEFINITIONS(-DMMF_MAX_NPCFactionList_ID=${EQEMU_MAX_FACTIONLIST_IDS})
|
||||
|
||||
ADD_LIBRARY(EMuShareMem SHARED ${sharedmem_src} ${sharedmem_headers})
|
||||
TARGET_LINK_LIBRARIES(EMuShareMem Common)
|
||||
|
||||
IF(UNIX)
|
||||
TARGET_LINK_LIBRARIES(EMuShareMem "dl")
|
||||
TARGET_LINK_LIBRARIES(EMuShareMem "m")
|
||||
TARGET_LINK_LIBRARIES(EMuShareMem "rt")
|
||||
TARGET_LINK_LIBRARIES(EMuShareMem "pthread")
|
||||
ENDIF(UNIX)
|
||||
|
||||
SET(LIBRARY_OUTPUT_PATH ../Bin)
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
EMuShareMem.dll
|
||||
by Quagmire
|
||||
Released under GPL
|
||||
|
||||
This DLL's purpose it to hold a single shared copy of items, npctypes, spells, and other
|
||||
stuff that's normally cached in memory, thus allowing all processes on the server to share
|
||||
one copy of the data, greatly reducing the amount of RAM used.
|
||||
*/
|
||||
#ifdef _WINDOWS
|
||||
|
||||
#include <windows.h>
|
||||
void CloseMemShare();
|
||||
|
||||
BOOL WINAPI DllMain(
|
||||
HINSTANCE hinstDLL, // handle to DLL module
|
||||
DWORD fdwReason, // reason for calling function
|
||||
LPVOID lpReserved ) // reserved
|
||||
{
|
||||
// Perform actions based on the reason for calling.
|
||||
switch( fdwReason )
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH: {
|
||||
break;
|
||||
}
|
||||
case DLL_THREAD_DETACH: {
|
||||
break;
|
||||
}
|
||||
case DLL_PROCESS_DETACH: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRUE; // Successful DLL_PROCESS_ATTACH.
|
||||
}
|
||||
|
||||
#endif //WIN32
|
||||
@@ -1,136 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "Doors.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF DoorsMMF;
|
||||
const MMFDoors_Struct* MMFDoorsData = 0;
|
||||
MMFDoors_Struct* MMFDoorsData_Writable = 0;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
extern "C" __declspec(dllexport) const Door* GetDoor(uint32 id) {
|
||||
return pGetDoor(id);
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) bool AddDoor(uint32 id, const Door* door) {
|
||||
return pAddDoor(id, door);
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) bool DLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID) {
|
||||
return pDLLLoadDoors(cbDBLoadDoors, iDoorstructSize, iDoorsCount, iMaxDoorID);
|
||||
};
|
||||
#else
|
||||
extern "C" const Door* GetDoor(uint32 id) {
|
||||
return pGetDoor(id);
|
||||
};
|
||||
|
||||
extern "C" bool AddDoor(uint32 id, const Door* door) {
|
||||
return pAddDoor(id, door);
|
||||
};
|
||||
|
||||
extern "C" bool DLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID) {
|
||||
return pDLLLoadDoors(cbDBLoadDoors, iDoorstructSize, iDoorsCount, iMaxDoorID);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
bool pAddDoor(uint32 id, const Door* door) {
|
||||
if (!MMFDoorsData_Writable)
|
||||
return false;
|
||||
if (id > MMF_MAX_Door_ID || MMFDoorsData_Writable->NextFreeIndex >= MMFDoorsData_Writable->DoorCount)
|
||||
return false;
|
||||
if (MMFDoorsData_Writable->DoorIndex[id] != 0xFFFFFFFF)
|
||||
return false;
|
||||
|
||||
MMFDoorsData_Writable->DoorIndex[id] = MMFDoorsData_Writable->NextFreeIndex++;
|
||||
memcpy(&MMFDoorsData_Writable->Doors[MMFDoorsData_Writable->DoorIndex[id]], door, sizeof(Door));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pDLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID) {
|
||||
if (iDoorstructSize != sizeof(Door)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadDoors: iDoorstructSize != sizeof(Door)" << endl;
|
||||
cout << "Door struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (*iMaxDoorID > MMF_MAX_Door_ID) {
|
||||
cout << "Error: EMuShareMem: pDLLLoadDoors: iMaxDoorID > MMF_MAX_Door_ID" << endl;
|
||||
cout << "You need to increase the define in Doors.h." << endl;
|
||||
return false;
|
||||
}
|
||||
uint32 tmpMemSize = sizeof(MMFDoors_Struct) + 256 + (sizeof(Door) * (*iDoorsCount));
|
||||
if (DoorsMMF.Open("EQEMuDoors", tmpMemSize)) {
|
||||
if (DoorsMMF.CanWrite()) {
|
||||
MMFDoorsData_Writable = (MMFDoors_Struct*) DoorsMMF.GetWriteableHandle();
|
||||
if (!MMFDoorsData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadDoors: !MMFDoorsData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(MMFDoorsData_Writable, 0, tmpMemSize);
|
||||
for(int i=0; i<MMF_MAX_Door_ID; i++)
|
||||
MMFDoorsData_Writable->DoorIndex[i] = 0xFFFFFFFF;
|
||||
MMFDoorsData_Writable->MaxDoorID = *iMaxDoorID;
|
||||
MMFDoorsData_Writable->DoorCount = *iDoorsCount;
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cbDBLoadDoors(*iDoorsCount, *iMaxDoorID)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadDoors: !cbDBLoadDoors" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFDoorsData_Writable = 0;
|
||||
DoorsMMF.SetLoaded();
|
||||
MMFDoorsData = (const MMFDoors_Struct*) DoorsMMF.GetHandle();
|
||||
if (!MMFDoorsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadDoors: !MMFDoorsData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (!DoorsMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!DoorsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(10);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!DoorsMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadDoors: !DoorsMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFDoorsData = (const MMFDoors_Struct*) DoorsMMF.GetHandle();
|
||||
if (!MMFDoorsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadDoors: !MMFDoorsData (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
*iMaxDoorID = MMFDoorsData->MaxDoorID;
|
||||
*iDoorsCount = MMFDoorsData->DoorCount;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading Doors: Doors.cpp: pDLLLoadDoors: ret == 0" << endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const Door* pGetDoor(uint32 id) {
|
||||
if (MMFDoorsData == 0 || (!DoorsMMF.IsLoaded()) || id > MMF_MAX_Door_ID || MMFDoorsData->DoorIndex[id] == 0xFFFFFFFF)
|
||||
return 0;
|
||||
return &MMFDoorsData->Doors[MMFDoorsData->DoorIndex[id]];
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../zone/zonedump.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
// MMF_MAX_Door_ID: Make sure this is bigger than the highest Door ID#
|
||||
#ifndef MMF_MAX_Door_ID
|
||||
#define MMF_MAX_Door_ID 30000
|
||||
#endif
|
||||
// MMF_MAX_Door_MEM: Maxium number of Doors to load into memory. Make sure this is bigger
|
||||
// than the total number of Doors in the server's database!
|
||||
|
||||
struct MMFDoors_Struct {
|
||||
uint32 MaxDoorID;
|
||||
uint32 NextFreeIndex;
|
||||
uint32 DoorCount;
|
||||
uint32 DoorIndex[MMF_MAX_Door_ID+1];
|
||||
Door Doors[0];
|
||||
};
|
||||
|
||||
bool pDLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID);
|
||||
bool pAddDoor(uint32 id, const Door* door);
|
||||
const Door* pGetDoor(uint32 id);
|
||||
@@ -1,152 +0,0 @@
|
||||
/*
|
||||
Note: Do NOT change this to load items on an as-needed basis. Since this memory is
|
||||
accessed from multiple threads, you'd need mutex's all over the place if it was
|
||||
ever to be modified/updated/added to. The overhead of the mutexes would be alot more
|
||||
in the long run than the delay in loading.
|
||||
|
||||
-Quagmire
|
||||
*/
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "Items.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF ItemsMMF;
|
||||
const MMFItems_Struct* MMFItemsData = 0;
|
||||
MMFItems_Struct* MMFItemsData_Writable = 0;
|
||||
|
||||
DLLFUNC bool AddItem(uint32 id, const Item_Struct* item) {
|
||||
if (!MMFItemsData_Writable) {
|
||||
return false;
|
||||
}
|
||||
if (id > MMF_EQMAX_ITEMS || MMFItemsData_Writable->NextFreeIndex >= MMFItemsData_Writable->ItemCount) {
|
||||
return false;
|
||||
}
|
||||
if (MMFItemsData_Writable->ItemIndex[id] != 0xFFFF) {
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 nextid = MMFItemsData_Writable->NextFreeIndex++;
|
||||
MMFItemsData_Writable->ItemIndex[id] = nextid;
|
||||
memcpy(&MMFItemsData_Writable->Items[nextid], item, sizeof(Item_Struct));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DLLFUNC bool DLLLoadItems(CALLBACK_DBLoadItems cbDBLoadItems, uint32 iItemStructSize, int32* iItemCount, uint32* iMaxItemID) {
|
||||
if (iItemStructSize != sizeof(Item_Struct)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: iItemStructSize != sizeof(Item_Struct)" << endl;
|
||||
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (*iMaxItemID > MMF_EQMAX_ITEMS) {
|
||||
cout << "Error: EMuShareMem: pDLLLoadItems: iMaxItemID > MMF_EQMAX_ITEMS" << endl;
|
||||
cout << "You need to increase the define in Items.h." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFItemsData_Writable = 0;
|
||||
//Allocate the shared memory for the item structures
|
||||
uint32 tmpMemSize = sizeof(MMFItems_Struct) + 256 + (sizeof(Item_Struct) * (*iItemCount));
|
||||
//cout << tmpMemSize << endl;
|
||||
if (ItemsMMF.Open("EQEMuItems", tmpMemSize)) {
|
||||
if (ItemsMMF.CanWrite()) {
|
||||
MMFItemsData_Writable = (MMFItems_Struct*) ItemsMMF.GetWriteableHandle();
|
||||
if (!MMFItemsData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: !MMFItemsData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(MMFItemsData_Writable, 0, tmpMemSize);
|
||||
for(int i=0; i<MMF_EQMAX_ITEMS; i++)
|
||||
MMFItemsData_Writable->ItemIndex[i] = 0xFFFF;
|
||||
MMFItemsData_Writable->MaxItemID = *iMaxItemID;
|
||||
MMFItemsData_Writable->ItemCount = *iItemCount;
|
||||
//the writable handle has been created, do the load below after we have the
|
||||
//serialization handle as well.
|
||||
} else {
|
||||
if (!ItemsMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!ItemsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(10);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!ItemsMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: !ItemsMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFItemsData = (const MMFItems_Struct*) ItemsMMF.GetHandle();
|
||||
if (!MMFItemsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: !MMFItemsData (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
*iMaxItemID = MMFItemsData->MaxItemID;
|
||||
*iItemCount = MMFItemsData->ItemCount;
|
||||
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
cout << "Error Loading Items: Items.cpp: pDLLLoadItems: Open() == false" << endl;
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cbDBLoadItems(*iItemCount, *iMaxItemID)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: !cbDBLoadItems" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cbDBLoadItems(*iItemCount, *iMaxItemID)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: !cbDBLoadItems" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//Now, Disable the write handle and get the read handle.
|
||||
//do this for both item struct and serialization data
|
||||
|
||||
MMFItemsData_Writable = 0;
|
||||
ItemsMMF.SetLoaded();
|
||||
MMFItemsData = (const MMFItems_Struct*) ItemsMMF.GetHandle();
|
||||
if (!MMFItemsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadItems: !MMFItemsData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
DLLFUNC const Item_Struct* GetItem(uint32 id) {
|
||||
if (MMFItemsData == 0 || (!ItemsMMF.IsLoaded()) || id > MMF_EQMAX_ITEMS || MMFItemsData->ItemIndex[id] == 0xFFFF)
|
||||
return 0;
|
||||
return &MMFItemsData->Items[MMFItemsData->ItemIndex[id]];
|
||||
}
|
||||
|
||||
DLLFUNC const Item_Struct* IterateItems(uint32* NextIndex) {
|
||||
if (MMFItemsData == 0 || (!ItemsMMF.IsLoaded()) || (*NextIndex) > MMF_EQMAX_ITEMS)
|
||||
return 0;
|
||||
do {
|
||||
if (MMFItemsData->ItemIndex[*NextIndex] != 0xFFFF)
|
||||
return &MMFItemsData->Items[MMFItemsData->ItemIndex[(*NextIndex)++]];
|
||||
} while (++(*NextIndex) < MMF_EQMAX_ITEMS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../common/eq_packet_structs.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
// MMF_EQMAX_ITEMS: Make sure this is bigger than the highest item ID#
|
||||
#ifndef MMF_EQMAX_ITEMS
|
||||
#define MMF_EQMAX_ITEMS 300000
|
||||
#endif
|
||||
// MMF_MEMMAX_ITEMS: Maxium number of items to load into memory. Make sure this is bigger
|
||||
// than the total number of items in the server's database!
|
||||
|
||||
struct MMFItems_Struct {
|
||||
uint32 MaxItemID;
|
||||
uint32 NextFreeIndex;
|
||||
uint32 ItemCount;
|
||||
uint32 ItemIndex[MMF_EQMAX_ITEMS+1];
|
||||
Item_Struct Items[0];
|
||||
};
|
||||
|
||||
//#define MMF_MAX_ITEMS_MEMSIZE sizeof(MMFItems_Struct) + 256
|
||||
|
||||
|
||||
|
||||
@@ -1,214 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "Loot.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF LootMMF;
|
||||
const MMFLoot_Struct* MMFLootData = 0;
|
||||
MMFLoot_Struct* MMFLootData_Writable = 0;
|
||||
uint32* LootTable;
|
||||
uint32* LootDrop;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define exportfunc extern "C" __declspec(dllexport)
|
||||
#else
|
||||
#define exportfunc extern "C"
|
||||
#endif
|
||||
|
||||
exportfunc const LootTable_Struct* GetLootTable(uint32 id) {
|
||||
return pGetLootTable(id);
|
||||
};
|
||||
exportfunc const LootDrop_Struct* GetLootDrop(uint32 id) {
|
||||
return pGetLootDrop(id);
|
||||
};
|
||||
|
||||
exportfunc bool AddLootTable(uint32 id, const LootTable_Struct* lts) {
|
||||
return pAddLootTable(id, lts);
|
||||
};
|
||||
exportfunc bool AddLootDrop(uint32 id, const LootDrop_Struct* lds) {
|
||||
return pAddLootDrop(id, lds);
|
||||
};
|
||||
|
||||
exportfunc bool DLLLoadLoot(CALLBACK_DBLoadLoot cbDBLoadLoot,
|
||||
uint32 iLootTableStructsize, uint32 iLootTableCount, uint32 iMaxLootTable,
|
||||
uint32 iLootTableEntryStructsize, uint32 iLootTableEntryCount,
|
||||
uint32 iLootDropStructsize, uint32 iLootDropCount, uint32 iMaxLootDrop,
|
||||
uint32 iLootDropEntryStructsize, uint32 iLootDropEntryCount
|
||||
) {
|
||||
return pDLLLoadLoot(cbDBLoadLoot,
|
||||
iLootTableStructsize, iLootTableCount, iMaxLootTable,
|
||||
iLootTableEntryStructsize, iLootTableEntryCount,
|
||||
iLootDropStructsize, iLootDropCount, iMaxLootDrop,
|
||||
iLootDropEntryStructsize, iLootDropEntryCount);
|
||||
};
|
||||
|
||||
|
||||
bool pAddLootTable(uint32 id, const LootTable_Struct* lts) {
|
||||
if (!MMFLootData_Writable)
|
||||
return false;
|
||||
if (id > MMFLootData_Writable->MaxLootTableID)
|
||||
return false;
|
||||
if (!LootTable || LootTable[id] != 0)
|
||||
return false;
|
||||
|
||||
uint32 tmp = sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * lts->NumEntries);
|
||||
if (MMFLootData_Writable->dataindex + tmp >= MMFLootData_Writable->datamax)
|
||||
return false;
|
||||
LootTable[id] = MMFLootData_Writable->dataindex;
|
||||
memcpy(&MMFLootData_Writable->data[MMFLootData_Writable->dataindex], lts, tmp);
|
||||
MMFLootData_Writable->dataindex += tmp;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pAddLootDrop(uint32 id, const LootDrop_Struct* lds) {
|
||||
if (!MMFLootData_Writable)
|
||||
return false;
|
||||
if (id > MMFLootData_Writable->MaxLootDropID)
|
||||
return false;
|
||||
if (!LootDrop || LootDrop[id] != 0)
|
||||
return false;
|
||||
|
||||
uint32 tmp = sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * lds->NumEntries);
|
||||
if (MMFLootData_Writable->dataindex + tmp >= MMFLootData_Writable->datamax)
|
||||
return false;
|
||||
LootDrop[id] = MMFLootData_Writable->dataindex;
|
||||
memcpy(&MMFLootData_Writable->data[MMFLootData_Writable->dataindex], lds, tmp);
|
||||
MMFLootData_Writable->dataindex += tmp;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pDLLLoadLoot(CALLBACK_DBLoadLoot cbDBLoadLoot,
|
||||
uint32 iLootTableStructsize, uint32 iLootTableCount, uint32 iMaxLootTable,
|
||||
uint32 iLootTableEntryStructsize, uint32 iLootTableEntryCount,
|
||||
uint32 iLootDropStructsize, uint32 iLootDropCount, uint32 iMaxLootDrop,
|
||||
uint32 iLootDropEntryStructsize, uint32 iLootDropEntryCount
|
||||
) {
|
||||
#if 0
|
||||
cout << "iLootTableCount: " << iLootTableCount << endl;
|
||||
cout << "iMaxLootTable: " << iMaxLootTable << endl;
|
||||
cout << "iLootTableEntryCount: " << iLootTableEntryCount << endl;
|
||||
cout << "iLootDropCount: " << iLootDropCount << endl;
|
||||
cout << "iMaxLootDrop: " << iMaxLootDrop << endl;
|
||||
cout << "iLootDropEntryCount: " << iLootDropEntryCount << endl;
|
||||
#endif
|
||||
if (iLootTableStructsize != sizeof(LootTable_Struct)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: iLootTableStructsize != sizeof(LootTable_Struct)" << endl;
|
||||
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (iLootTableEntryStructsize != sizeof(LootTableEntries_Struct)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: iLootTableEntryStructsize != sizeof(LootTableEntries_Struct)" << endl;
|
||||
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (iLootDropStructsize != sizeof(LootDrop_Struct)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: iLootDropStructsize != sizeof(LootDrop_Struct)" << endl;
|
||||
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (iLootDropEntryStructsize != sizeof(LootDropEntries_Struct)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: iLootDropEntryStructsize != sizeof(LootDropEntries_Struct)" << endl;
|
||||
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 tmpMemSize = sizeof(MMFLoot_Struct) + 256
|
||||
+ (sizeof(uint32) * (iMaxLootTable+1))
|
||||
+ (sizeof(LootTable_Struct) * iLootTableCount) + (sizeof(LootTableEntries_Struct) * iLootTableEntryCount)
|
||||
+ (sizeof(uint32) * (iMaxLootDrop+1))
|
||||
+ (sizeof(LootDrop_Struct) * iLootDropCount) + (sizeof(LootDropEntries_Struct) * iLootDropEntryCount)
|
||||
;
|
||||
if (LootMMF.Open("EQEMuLoot", tmpMemSize)) {
|
||||
if (LootMMF.CanWrite()) {
|
||||
MMFLootData_Writable = (MMFLoot_Struct*) LootMMF.GetWriteableHandle();
|
||||
if (!MMFLootData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: !MMFLootData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(MMFLootData_Writable, 0, tmpMemSize);
|
||||
MMFLootData_Writable->LootTableCount = iLootTableCount;
|
||||
MMFLootData_Writable->MaxLootTableID = iMaxLootTable;
|
||||
MMFLootData_Writable->LootDropCount = iLootDropCount;
|
||||
MMFLootData_Writable->MaxLootDropID = iMaxLootDrop;
|
||||
MMFLootData_Writable->datamax = tmpMemSize - sizeof(MMFLoot_Struct);
|
||||
|
||||
MMFLootData_Writable->dataindex = 0;
|
||||
MMFLootData_Writable->LootTableOffset = MMFLootData_Writable->dataindex;
|
||||
MMFLootData_Writable->dataindex += (sizeof(uint32) * (iMaxLootTable+1));
|
||||
MMFLootData_Writable->LootDropOffset = MMFLootData_Writable->dataindex;
|
||||
MMFLootData_Writable->dataindex += (sizeof(uint32) * (iMaxLootDrop+1));
|
||||
|
||||
LootTable = (uint32*) &MMFLootData_Writable->data[MMFLootData_Writable->LootTableOffset];
|
||||
LootDrop = (uint32*) &MMFLootData_Writable->data[MMFLootData_Writable->LootDropOffset];
|
||||
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cbDBLoadLoot()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: !cbDBLoadLoot" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFLootData_Writable = 0;
|
||||
LootMMF.SetLoaded();
|
||||
}
|
||||
else {
|
||||
if (!LootMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!LootMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(10);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!LootMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: !LootMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading Loot: Loot.cpp: pDLLLoadLoot: Open() == false" << endl;
|
||||
return false;
|
||||
}
|
||||
MMFLootData = (const MMFLoot_Struct*) LootMMF.GetHandle();
|
||||
if (!MMFLootData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: !MMFLootData" << endl;
|
||||
MMFLootData = 0;
|
||||
return false;
|
||||
}
|
||||
if (MMFLootData->LootTableCount != iLootTableCount
|
||||
|| MMFLootData->MaxLootTableID != iMaxLootTable
|
||||
|| MMFLootData->LootDropCount != iLootDropCount
|
||||
|| MMFLootData->MaxLootDropID != iMaxLootDrop) {
|
||||
cout << "Error: EMuShareMem: DLLLoadLoot: Count/Max mismatch" << endl;
|
||||
MMFLootData = 0;
|
||||
return false;
|
||||
}
|
||||
LootTable = (uint32*) &MMFLootData->data[MMFLootData->LootTableOffset];
|
||||
LootDrop = (uint32*) &MMFLootData->data[MMFLootData->LootDropOffset];
|
||||
return true;
|
||||
};
|
||||
|
||||
const LootTable_Struct* pGetLootTable(uint32 id) {
|
||||
if (MMFLootData == 0 || !LootMMF.IsLoaded())
|
||||
return 0;
|
||||
if (id > MMFLootData->MaxLootTableID || LootTable[id] == 0)
|
||||
return 0;
|
||||
return (LootTable_Struct*) &MMFLootData->data[LootTable[id]];
|
||||
}
|
||||
|
||||
const LootDrop_Struct* pGetLootDrop(uint32 id) {
|
||||
if (MMFLootData == 0 || !LootMMF.IsLoaded())
|
||||
return 0;
|
||||
if (id > MMFLootData->MaxLootDropID || LootDrop[id] == 0)
|
||||
return 0;
|
||||
return (LootDrop_Struct*) &MMFLootData->data[LootDrop[id]];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../common/eq_packet_structs.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
#pragma pack(1)
|
||||
struct MMFLoot_Struct {
|
||||
bool Loaded;
|
||||
uint32 MaxLootTableID;
|
||||
uint32 LootTableCount;
|
||||
uint32 LootTableOffset;
|
||||
uint32 MaxLootDropID;
|
||||
uint32 LootDropCount;
|
||||
uint32 LootDropOffset;
|
||||
uint32 datamax;
|
||||
uint32 dataindex;
|
||||
uint8 data[0];
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
bool pDLLLoadLoot(CALLBACK_DBLoadLoot cbDBLoadLoot,
|
||||
uint32 iLootTableStructsize, uint32 iLootTableCount, uint32 iMaxLootTable,
|
||||
uint32 iLootTableEntryStructsize, uint32 iLootTableEntryCount,
|
||||
uint32 iLootDropStructsize, uint32 iLootDropCount, uint32 iMaxLootDrop,
|
||||
uint32 iLootDropEntryStructsize, uint32 iLootDropEntryCount
|
||||
);
|
||||
bool pAddLootTable(uint32 id, const LootTable_Struct* lts);
|
||||
bool pAddLootDrop(uint32, const LootDrop_Struct* lds);
|
||||
const LootTable_Struct* pGetLootTable(uint32 id);
|
||||
const LootDrop_Struct* pGetLootDrop(uint32 id);
|
||||
@@ -1,353 +0,0 @@
|
||||
// start mingw
|
||||
#ifdef __MINGW32__
|
||||
#define __try
|
||||
#define __finally
|
||||
#endif
|
||||
// end mingw
|
||||
|
||||
#include "MMF.h"
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#ifdef _WINDOWS
|
||||
#define snprintf _snprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
#else
|
||||
#include "MMFMutex.h"
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
MMF::MMF() {
|
||||
SharedMemory = 0;
|
||||
pCanWrite = false;
|
||||
#ifdef _WINDOWS
|
||||
hMapObject = NULL;
|
||||
lpvMem = 0;
|
||||
#else
|
||||
lpvMem = 0;
|
||||
pMMFMutex = 0;
|
||||
m_alloc = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
MMF::~MMF() {
|
||||
Close();
|
||||
}
|
||||
|
||||
bool MMF::Open(const char* iName, uint32 iSize) {
|
||||
if (iSize < 1) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: iSize < 1" << endl;
|
||||
return false;
|
||||
}
|
||||
if (strlen(iName) < 2) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: strlen(iName) < 2" << endl;
|
||||
return false;
|
||||
}
|
||||
char MMFname[200];
|
||||
memset(MMFname, 0, sizeof(MMFname));
|
||||
snprintf(MMFname, sizeof(MMFname), "memfilemap_%s", iName);
|
||||
uint32 tmpSize = sizeof(MMF_Struct) + iSize;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
char MMFMutexName[200];
|
||||
memset(MMFMutexName, 0, sizeof(MMFMutexName));
|
||||
snprintf(MMFMutexName, sizeof(MMFMutexName), "MutexToProtectOpenMMF_%s", iName);
|
||||
|
||||
HANDLE hMutex;
|
||||
hMutex = CreateMutex(
|
||||
NULL, // no security attributes
|
||||
FALSE, // initially not owned
|
||||
MMFMutexName); // name of mutex
|
||||
|
||||
if (hMutex == NULL) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: hMutex == Null" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
DWORD dwWaitResult;
|
||||
// Request ownership of mutex.
|
||||
dwWaitResult = WaitForSingleObject(
|
||||
hMutex, // handle to mutex
|
||||
2000L); // two-second time-out interval
|
||||
|
||||
if (dwWaitResult != WAIT_OBJECT_0) {
|
||||
// Mutex not aquired, crap out
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: dwWaitResult != WAIT_OBJECT_0" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Finally, ready to rock.
|
||||
bool fInit = false;
|
||||
__try {
|
||||
hMapObject = CreateFileMapping(
|
||||
INVALID_HANDLE_VALUE, // use paging file
|
||||
NULL, // default security attributes
|
||||
PAGE_READWRITE, // read/write access
|
||||
0, // size: high 32-bits
|
||||
tmpSize, // size: low 32-bits
|
||||
MMFname); // name of map object
|
||||
if (hMapObject == NULL) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: hMapObject == Null" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// The first process to attach initializes memory.
|
||||
|
||||
fInit = (bool) (GetLastError() != ERROR_ALREADY_EXISTS);
|
||||
|
||||
// Get a pointer to the file-mapped shared memory.
|
||||
|
||||
lpvMem = MapViewOfFile(
|
||||
hMapObject, // object to map view of
|
||||
FILE_MAP_WRITE, // read/write access
|
||||
0, // high offset: map from
|
||||
0, // low offset: beginning
|
||||
0); // default: map entire file
|
||||
if (lpvMem == NULL) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: lpvMem == Null" << endl;
|
||||
Close();
|
||||
return false;
|
||||
}
|
||||
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
// Initialize memory if this is the first process.
|
||||
if (fInit) {
|
||||
memset(lpvMem, 0, sizeof(MMF_Struct));
|
||||
pCanWrite = true;
|
||||
SharedMemory->Loaded = false;
|
||||
SharedMemory->datasize = iSize;
|
||||
}
|
||||
else {
|
||||
pCanWrite = false;
|
||||
if (SharedMemory->datasize != iSize) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: SharedMemory->datasize != iSize" << endl;
|
||||
Close();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} // end of try block
|
||||
|
||||
__finally {
|
||||
// Clean up the Mutex stuff
|
||||
if (!ReleaseMutex(hMutex)) {
|
||||
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: !ReleaseMutex(hMutex)" << endl;
|
||||
Close();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
CloseHandle(hMutex);
|
||||
|
||||
return true;
|
||||
#else //else, NOT WINDOWS
|
||||
int load_share;
|
||||
//int max_share = 7;
|
||||
key_t share_key;
|
||||
switch (MMFname[16]) {
|
||||
case 'I': load_share = 0; break;
|
||||
case 'N': load_share = 1; break;
|
||||
case 'D': load_share = 2; break;
|
||||
case 'S': load_share = 3; break;
|
||||
case 'F': load_share = 4; break;
|
||||
case 'L': load_share = 5; break;
|
||||
case 'M': load_share = 6; break;
|
||||
case 'O': load_share = 7; break;
|
||||
case 'Z': load_share = 8; break;
|
||||
case 'K': load_share = 9; break;
|
||||
#ifdef CATCH_CRASH
|
||||
default:
|
||||
cerr<<"Failed to load shared memory segment="<<MMFname<<" ("<<MMFname[16]<<")"<<endl;
|
||||
// malloc some memory here or something fancy
|
||||
return false; // and make this return true
|
||||
break;
|
||||
#else
|
||||
default: cerr<<"FATAL="<<(char)MMFname[16]<<endl; return false; break;
|
||||
#endif
|
||||
}
|
||||
switch (load_share) {
|
||||
// Item
|
||||
case 0: share_key = ftok(".", 'I'); break;
|
||||
// Npctype
|
||||
case 1: share_key = ftok(".", 'N'); break;
|
||||
// Door
|
||||
case 2: share_key = ftok(".", 'D'); break;
|
||||
// Spell
|
||||
case 3: share_key = ftok(".", 'S'); break;
|
||||
// Faction
|
||||
case 4: share_key = ftok(".", 'F'); break;
|
||||
// Loot
|
||||
case 5: share_key = ftok(".", 'L'); break;
|
||||
// ??
|
||||
case 6: share_key = ftok(".", 'M'); break;
|
||||
// Opcodes
|
||||
case 7: share_key = ftok(".", 'O'); break;
|
||||
// Item Serialization
|
||||
case 8: share_key = ftok(".", 'Z'); break;
|
||||
// Skills
|
||||
case 9: share_key = ftok(".", 'K'); break;
|
||||
// ERROR Fatal
|
||||
default: cerr<<"Opps!"<<endl; share_key = 0xFF; break;
|
||||
}
|
||||
pMMFMutex = new MMFMutex(share_key);
|
||||
if (!pMMFMutex){
|
||||
assert(false);
|
||||
}
|
||||
//if (!tmpSize) {
|
||||
int share_id = shmget(share_key, tmpSize, IPC_CREAT|IPC_EXCL|SHM_R|SHM_W);
|
||||
if ( share_id <= 0) {
|
||||
share_id = shmget(share_key, tmpSize, IPC_CREAT|IPC_NOWAIT);
|
||||
if (share_id <= 0) {
|
||||
shmid_ds mem_size;
|
||||
share_id = shmget(share_key, 1, IPC_CREAT|IPC_NOWAIT|SHM_R|SHM_W);
|
||||
if(share_id == -1) {
|
||||
cerr << "failed to get 0-length shared mem: " << strerror(errno) << endl;
|
||||
}
|
||||
if ((lpvMem = shmat(share_id, NULL,SHM_RDONLY)) == (void *)-1) {
|
||||
cerr << "shmat failed! " << strerror(errno) << endl;
|
||||
}
|
||||
if( (shmctl(share_id, IPC_STAT, &mem_size)) == 0){
|
||||
if (mem_size.shm_segsz != int(tmpSize)){ //comparison between signed and unsigned integer expressions
|
||||
cout<<"[Warning] requested shared memory of size:"<<tmpSize<<" but that Key is already in use with size:"<< mem_size.shm_segsz<<endl;
|
||||
shmid_ds mem_users;
|
||||
if( (shmctl(share_id, IPC_STAT, &mem_users)) == 0 && mem_users.shm_nattch == 1){
|
||||
cout<<"[Warning] Attempting resize"<<endl;
|
||||
shmctl(share_id, IPC_RMID, 0);
|
||||
shmdt(lpvMem);
|
||||
if ((share_id = shmget(share_key, tmpSize, IPC_CREAT|IPC_EXCL|SHM_R|SHM_W)) <= 0) {
|
||||
// Failed proceed on malloc
|
||||
cerr<<"[Error] Failed to resize" << strerror(errno) <<endl;
|
||||
}
|
||||
else{
|
||||
cerr<<"[Error] Resize successful." << endl;
|
||||
// Success
|
||||
lpvMem = shmat(share_id, NULL, SHM_R|SHM_W);
|
||||
memset(lpvMem, 0, sizeof(MMF_Struct));
|
||||
pCanWrite = true;
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
SharedMemory->Loaded = false;
|
||||
SharedMemory->datasize = iSize;
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else{
|
||||
cout<<"[Warning] Resize not possible"<<endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Can not attatch to shared memory we'll malloc it here
|
||||
if ((lpvMem == 0 || lpvMem == (void *)-1) && (lpvMem = malloc(tmpSize))) {
|
||||
cout<<"[Warning] Could not attach to shared memory proceeding on isolated memory (share_id <= 0)"<<endl;
|
||||
// Success!
|
||||
m_alloc = true;
|
||||
memset(lpvMem, 0, sizeof(MMF_Struct));
|
||||
pCanWrite = true;
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
SharedMemory->datasize = iSize;
|
||||
SharedMemory->Loaded = false;
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
return true;
|
||||
} else if (!lpvMem){
|
||||
//LogFile->write(EQEMuLog::Error, "Could not connect to shared memory and allocation of isolated memory failed.");
|
||||
cout<<"Could not connect to shared memory and allocation of isolated memory failed."<<endl;
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
exit(1);
|
||||
}
|
||||
pCanWrite = false;
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
if (SharedMemory->datasize != iSize) {
|
||||
cerr<<"SharedMemory->datasize("<<SharedMemory->datasize<<") != iSize("<<iSize<<"), We can rebuild him faster better STRONGER!"<<endl;
|
||||
cerr<<"Or not.. restart all servers on this machine"<<endl;
|
||||
shmctl(share_id, IPC_RMID, 0);
|
||||
pMMFMutex->Release(this);
|
||||
exit(1);
|
||||
}
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
return true;
|
||||
}
|
||||
shmid_ds mem_users;
|
||||
if ((shmctl(share_id, IPC_STAT, &mem_users)) != 0) {
|
||||
if ((lpvMem = malloc(tmpSize))) {
|
||||
// Success!
|
||||
cout<<"[Warning] Could not attach to shared memory proceeding on isolated memory"<<endl;
|
||||
m_alloc = true;
|
||||
memset(lpvMem, 0, sizeof(MMF_Struct));
|
||||
pCanWrite = true;
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
SharedMemory->datasize = iSize;
|
||||
SharedMemory->Loaded = false;
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
return true;
|
||||
} else {
|
||||
//LogFile->write(EQEMuLog::Error, "Could not connect to shared memory and allocation of isolated memory failed.");
|
||||
cout<<"Could not connect to shared memory and allocation of isolated memory failed."<<endl;
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
lpvMem = shmat(share_id, NULL,SHM_RDONLY);
|
||||
pCanWrite = false;
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
//cerr << "lpvMem=" << (int)lpvMem << endl;
|
||||
if (lpvMem==(void *)-1 || SharedMemory->datasize != iSize) {
|
||||
cerr<<"SharedMemory->datasize("<<SharedMemory->datasize<<") != iSize("<<iSize<<"), or "<<((void *)lpvMem)<<"==-1, We can rebuild him faster better STRONGER!"<<endl;
|
||||
cerr<<"Or not.. restart all servers on this machine"<<endl;
|
||||
shmctl(share_id, IPC_RMID, 0);
|
||||
pMMFMutex->Release(this);
|
||||
exit(1);
|
||||
}
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
return true;
|
||||
}
|
||||
lpvMem = shmat(share_id, NULL, SHM_R|SHM_W);
|
||||
memset(lpvMem, 0, sizeof(MMF_Struct));
|
||||
pCanWrite = true;
|
||||
SharedMemory = (MMF_Struct*) lpvMem;
|
||||
SharedMemory->Loaded = false;
|
||||
SharedMemory->datasize = iSize;
|
||||
//}
|
||||
pMMFMutex->Release(this);
|
||||
delete pMMFMutex;
|
||||
return true;
|
||||
|
||||
#endif //end NOT WINDOWS
|
||||
}
|
||||
|
||||
void MMF::Close() {
|
||||
SharedMemory = 0;
|
||||
pCanWrite = false;
|
||||
#ifdef _WINDOWS
|
||||
if (lpvMem) {
|
||||
// Unmap shared memory from the process's address space.
|
||||
UnmapViewOfFile(lpvMem);
|
||||
lpvMem = 0;
|
||||
}
|
||||
if (hMapObject) {
|
||||
// Close the process's handle to the file-mapping object.
|
||||
CloseHandle(hMapObject);
|
||||
hMapObject = NULL;
|
||||
}
|
||||
#else
|
||||
if (lpvMem) {
|
||||
if (m_alloc == true)
|
||||
free(lpvMem);
|
||||
else
|
||||
if (shmdt(lpvMem) == -1)
|
||||
//LogFile->write(EQEMuLog::Error, "Warning something odd happened freeing shared memory");
|
||||
cout<<"Warning something odd happened freeing shared memory"<<endl;
|
||||
lpvMem = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
#ifndef MMF_H
|
||||
#define MMF_H
|
||||
#include "../common/types.h"
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
//#include "MMFMutex.h"
|
||||
class MMFMutex;
|
||||
#endif
|
||||
|
||||
class MMF {
|
||||
public:
|
||||
struct MMF_Struct {
|
||||
bool Loaded;
|
||||
uint32 datasize;
|
||||
uint8 data[0];
|
||||
};
|
||||
|
||||
MMF();
|
||||
virtual ~MMF();
|
||||
|
||||
bool Open(const char* iName, uint32 iSize);
|
||||
void Close();
|
||||
const void* GetHandle() { if (IsLoaded()) { return SharedMemory->data; } return 0; }
|
||||
void* GetWriteableHandle() { if (!IsLoaded() && CanWrite()) { return SharedMemory->data; } return 0; }
|
||||
|
||||
inline bool IsOpen() { return (bool) (SharedMemory != 0); }
|
||||
inline bool IsLoaded() { if (SharedMemory) { return SharedMemory->Loaded; } return false; }
|
||||
bool SetLoaded() { if (SharedMemory && CanWrite()) { SharedMemory->Loaded = true; return true; } return false; }
|
||||
inline bool CanWrite() { if (SharedMemory) { return pCanWrite; } return false; }
|
||||
|
||||
#ifndef WIN32
|
||||
bool m_alloc;
|
||||
#endif
|
||||
private:
|
||||
bool pCanWrite;
|
||||
MMF_Struct* SharedMemory;
|
||||
#ifdef _WINDOWS
|
||||
HANDLE hMapObject;
|
||||
LPVOID lpvMem;
|
||||
#else
|
||||
void* lpvMem;
|
||||
MMFMutex* pMMFMutex;
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
@@ -1,126 +0,0 @@
|
||||
#include "MMFMutex.h"
|
||||
|
||||
#ifndef WIN32
|
||||
|
||||
MMFMutex::MMFMutex( int key )
|
||||
{
|
||||
m_key = key;
|
||||
|
||||
if( m_key == 0 )
|
||||
{
|
||||
// initialize POSIX semaphore
|
||||
sem_init( &m_semaphore, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// currently, this thread does not own the semaphore
|
||||
m_owner = 0;
|
||||
m_recursive_count = 0;
|
||||
|
||||
// try to get an existing semaphore. the access permissions are "full access for everyone"
|
||||
m_id = semget(m_key, 1, 0x1b6);
|
||||
if( m_id == -1 )
|
||||
{
|
||||
// it doesn't exist yet, try to create a new one
|
||||
m_id = semget(m_key, 1, IPC_CREAT | 0x1b6);
|
||||
if( m_id != -1 )
|
||||
{
|
||||
// initialize it to 1
|
||||
semun data;
|
||||
data.val = 1;
|
||||
semctl(m_id, 0, SETVAL, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MMFMutex::~MMFMutex()
|
||||
{
|
||||
if( m_key == 0 )
|
||||
{
|
||||
sem_destroy(&m_semaphore);
|
||||
}
|
||||
else
|
||||
{
|
||||
semctl(m_id, 0, IPC_RMID, 0);
|
||||
}
|
||||
}
|
||||
|
||||
bool MMFMutex::Lock( uint32 dwTimeout )
|
||||
{
|
||||
if( m_owner == pthread_self() )
|
||||
{
|
||||
m_recursive_count++;
|
||||
return true;
|
||||
}
|
||||
bool bUseTimeout = (dwTimeout != 0);
|
||||
while(true) {
|
||||
bool bGotSemaphore = false;
|
||||
if( m_key == 0 )
|
||||
{
|
||||
bGotSemaphore = (sem_trywait(&m_semaphore) == 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct sembuf operations[1];
|
||||
operations[0].sem_num = 0;
|
||||
operations[0].sem_op = -1;
|
||||
operations[0].sem_flg = SEM_UNDO|IPC_NOWAIT;
|
||||
bGotSemaphore = (semop(m_id, operations, 1) >= 0);
|
||||
}
|
||||
if( bGotSemaphore )
|
||||
{
|
||||
m_owner = pthread_self();
|
||||
m_recursive_count = 1;
|
||||
return true;
|
||||
}
|
||||
sleep(1);
|
||||
if( bUseTimeout )
|
||||
{
|
||||
if( dwTimeout > 1000 )
|
||||
dwTimeout -= 1000;
|
||||
else
|
||||
dwTimeout = 0;
|
||||
|
||||
if( dwTimeout == 0 )
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
void MMFMutex::Release(const MMF* pMMF)
|
||||
{
|
||||
if( m_owner != pthread_self() && pMMF->m_alloc != true )
|
||||
{
|
||||
//We're supposed to explode here with an assert
|
||||
//assert(false);
|
||||
}
|
||||
else if ( pMMF->m_alloc == true ){
|
||||
// Just do it nothing is useing but us
|
||||
return;
|
||||
}
|
||||
else if( m_recursive_count > 1 )
|
||||
{
|
||||
m_recursive_count--;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( m_key == 0 )
|
||||
{
|
||||
sem_post(&m_semaphore);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
struct sembuf operations[1];
|
||||
operations[0].sem_num = 0;
|
||||
operations[0].sem_op = 1;
|
||||
operations[0].sem_flg = SEM_UNDO;
|
||||
semop(m_id, operations, 1);
|
||||
}
|
||||
m_recursive_count = 0;
|
||||
m_owner = 0;
|
||||
}
|
||||
}
|
||||
#endif //!WIN32
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#ifndef MMFMUTEX_H
|
||||
#define MMFMUTEX_H
|
||||
#ifndef WIN32
|
||||
#include <sys/types.h> // moved before sys/shm.h for freeBSD
|
||||
#include <sys/shm.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/sem.h>
|
||||
#include <semaphore.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include "../common/types.h"
|
||||
|
||||
#include "MMF.h"
|
||||
|
||||
// the manuals say you have to define this struct your self.
|
||||
#if !defined FREEBSD || defined __NetBSD__ // for BSDs
|
||||
union semun
|
||||
{
|
||||
int val;
|
||||
struct semid_ds* buf;
|
||||
unsigned short int *array;
|
||||
struct seminfo *__buf;
|
||||
};
|
||||
#endif // for freeBSD
|
||||
|
||||
class MMFMutex
|
||||
{
|
||||
public:
|
||||
MMFMutex(int iIndex);
|
||||
virtual ~MMFMutex();
|
||||
bool Lock( uint32 dwTimeout = 0 );
|
||||
void Release(const MMF*);
|
||||
|
||||
protected:
|
||||
int m_id;
|
||||
key_t m_key;
|
||||
pthread_t m_owner;
|
||||
sem_t m_semaphore;
|
||||
int m_recursive_count;
|
||||
};
|
||||
#endif //!WIN32
|
||||
#endif
|
||||
@@ -1,178 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "NPCFactionLists.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF NPCFactionListsMMF;
|
||||
const MMFNPCFactionLists_Struct* MMFNPCFactionListsData = 0;
|
||||
MMFNPCFactionLists_Struct* MMFNPCFactionListsData_Writable = 0;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
extern "C" __declspec(dllexport) const NPCFactionList* GetNPCFactionList(uint32 id) {
|
||||
return pGetNPCFactionList(id);
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) bool AddNPCFactionList(uint32 id, const NPCFactionList* nfl) {
|
||||
return pAddNPCFactionList(id, nfl);
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) bool DLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListsCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions) {
|
||||
return pDLLLoadNPCFactionLists(cbDBLoadNPCFactionLists, iNPCFactionListStructSize, iNPCFactionListsCount, iMaxNPCFactionListID, iMaxNPCFactions);
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) bool SetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp) {
|
||||
return pSetNPCFaction(id, factionid, factionvalue, factionnpcvalue, factiontemp);
|
||||
}
|
||||
#else
|
||||
extern "C" const NPCFactionList* GetNPCFactionList(uint32 id) {
|
||||
return pGetNPCFactionList(id);
|
||||
};
|
||||
|
||||
extern "C" bool AddNPCFactionList(uint32 id, const NPCFactionList* nfl) {
|
||||
return pAddNPCFactionList(id, nfl);
|
||||
};
|
||||
|
||||
extern "C" bool DLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListsCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions) {
|
||||
return pDLLLoadNPCFactionLists(cbDBLoadNPCFactionLists, iNPCFactionListStructSize, iNPCFactionListsCount, iMaxNPCFactionListID, iMaxNPCFactions);
|
||||
};
|
||||
|
||||
extern "C" bool SetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp) {
|
||||
return pSetNPCFaction(id, factionid, factionvalue, factionnpcvalue, factiontemp);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool pAddNPCFactionList(uint32 id, const NPCFactionList* nfl) {
|
||||
if (!MMFNPCFactionListsData_Writable){
|
||||
if (EQDEBUG>=1) cout<<"[Debug] !MMFNPCFactionListsData_Writable"<<endl;
|
||||
return false;
|
||||
}
|
||||
if (id > MMF_MAX_NPCFactionList_ID || MMFNPCFactionListsData_Writable->NextFreeIndex >= MMFNPCFactionListsData_Writable->NPCFactionListCount){
|
||||
if (EQDEBUG>=1) cout<<"[Debug] id > MMF_MAX_NPCFactionList_ID || MMFNPCFactionListsData_Writable->NextFreeIndex >= MMFNPCFactionListsData_Writable->NPCFactionListCount"<<endl;
|
||||
return false;
|
||||
}
|
||||
if (MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] != 0xFFFFFFFF){
|
||||
if (EQDEBUG>=1) cout<<"[Debug] MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] != 0xFFFFFFFF"<<endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] = MMFNPCFactionListsData_Writable->NextFreeIndex++;
|
||||
memcpy(&MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]], nfl, sizeof(NPCFactionList));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pSetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp) {
|
||||
if (!MMFNPCFactionListsData_Writable) {
|
||||
if(EQDEBUG>=1) cout<<"[Debug] !MMFNPCFactionListsData_Writable"<<endl;
|
||||
return false;
|
||||
}
|
||||
if (id > MMF_MAX_NPCFactionList_ID) {
|
||||
if(EQDEBUG>=1) cout<<"[Debug] id > MMF_MAX_NPCFactionList_ID"<<endl;
|
||||
return false;
|
||||
}
|
||||
if (MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] == 0xFFFFFFFF) {
|
||||
if(EQDEBUG>=1) cout<<"[Debug] MMFNPCFactionListsData_Writable->NPCFactionListIndex[id="<<id<<"] == 0xFFFFFFFF"<<endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i=0; i<MAX_NPC_FACTIONS; i++) {
|
||||
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factionid[i] = factionid[i];
|
||||
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factionvalue[i] = factionvalue[i];
|
||||
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factionnpcvalue[i] = factionnpcvalue[i];
|
||||
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factiontemp[i] = factiontemp[i];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pDLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListsCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions) {
|
||||
if (iNPCFactionListStructSize != sizeof(NPCFactionList)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: iNPCFactionListStructSize != sizeof(NPCFactionList)" << endl;
|
||||
cout << "NPCFactionList struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (iMaxNPCFactions != MAX_NPC_FACTIONS) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: iMaxNPCFactions != MAX_NPC_FACTIONS" << endl;
|
||||
cout << "NPCFactionList struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (*iMaxNPCFactionListID > MMF_MAX_NPCFactionList_ID) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: iMaxNPCFactions > MMF_MAX_NPCFactionList_ID" << endl;
|
||||
cout << "You need to increase the define in NPCFactionList.h." << endl;
|
||||
return false;
|
||||
}
|
||||
uint32 tmpMemSize = sizeof(MMFNPCFactionLists_Struct) + 256 + (sizeof(NPCFactionList) * (*iNPCFactionListsCount));
|
||||
if (NPCFactionListsMMF.Open("EQEMuFactionLists", tmpMemSize)) {
|
||||
// MMFNPCFactionListsData = (const MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetHandle();
|
||||
if (NPCFactionListsMMF.CanWrite()) {
|
||||
MMFNPCFactionListsData_Writable = (MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetWriteableHandle();
|
||||
if (!MMFNPCFactionListsData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !MMFNPCFactionListsData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(MMFNPCFactionListsData_Writable, 0, tmpMemSize);
|
||||
for(int i=0; i<MMF_MAX_NPCFactionList_ID; i++)
|
||||
MMFNPCFactionListsData_Writable->NPCFactionListIndex[i] = 0xFFFFFFFF;
|
||||
MMFNPCFactionListsData_Writable->MaxNPCFactionListID = *iMaxNPCFactionListID;
|
||||
MMFNPCFactionListsData_Writable->NPCFactionListCount = *iNPCFactionListsCount;
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cbDBLoadNPCFactionLists(MMFNPCFactionListsData_Writable->NPCFactionListCount, MMFNPCFactionListsData_Writable->MaxNPCFactionListID)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !cbDBLoadNPCFactionLists" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFNPCFactionListsData_Writable = 0;
|
||||
NPCFactionListsMMF.SetLoaded();
|
||||
MMFNPCFactionListsData = (const MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetHandle();
|
||||
if (!MMFNPCFactionListsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !MMFNPCFactionListsData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (!NPCFactionListsMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!NPCFactionListsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(100);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!NPCFactionListsMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !NPCFactionListsMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFNPCFactionListsData = (const MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetHandle();
|
||||
if (!MMFNPCFactionListsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !MMFNPCFactionListsData (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
*iMaxNPCFactionListID = MMFNPCFactionListsData->MaxNPCFactionListID;
|
||||
*iNPCFactionListsCount = MMFNPCFactionListsData->NPCFactionListCount;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading NPCFactionLists: NPCFactionLists.cpp: pDLLLoadNPCFactionLists: Open() == false" << endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const NPCFactionList* pGetNPCFactionList(uint32 id) {
|
||||
if (MMFNPCFactionListsData == 0 || (!NPCFactionListsMMF.IsLoaded()) || id > MMF_MAX_NPCFactionList_ID || MMFNPCFactionListsData->NPCFactionListIndex[id] == 0xFFFFFFFF)
|
||||
return 0;
|
||||
return &MMFNPCFactionListsData->NPCFactionLists[MMFNPCFactionListsData->NPCFactionListIndex[id]];
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../zone/features.h"
|
||||
#include "../zone/faction.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
// MMF_MAX_NPCFactionList_ID: Make sure this is bigger than the highest NPCFactionList ID#
|
||||
#ifndef MMF_MAX_NPCFactionList_ID
|
||||
#define MMF_MAX_NPCFactionList_ID 50000
|
||||
#endif
|
||||
|
||||
struct MMFNPCFactionLists_Struct {
|
||||
uint32 MaxNPCFactionListID;
|
||||
uint32 NextFreeIndex;
|
||||
uint32 NPCFactionListCount;
|
||||
uint32 NPCFactionListIndex[MMF_MAX_NPCFactionList_ID+1];
|
||||
NPCFactionList NPCFactionLists[0];
|
||||
};
|
||||
|
||||
bool pDLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions);
|
||||
bool pAddNPCFactionList(uint32 id, const NPCFactionList* nfl);
|
||||
bool pSetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp);
|
||||
const NPCFactionList* pGetNPCFactionList(uint32 id);
|
||||
@@ -1,137 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "NPCTypes.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF NPCTypesMMF;
|
||||
const MMFNPCTypes_Struct* MMFNPCTypesData = 0;
|
||||
MMFNPCTypes_Struct* MMFNPCTypesData_Writable = 0;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
extern "C" __declspec(dllexport) const NPCType* GetNPCType(uint32 id) {
|
||||
return pGetNPCType(id);
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) bool AddNPCType(uint32 id, const NPCType* npctype) {
|
||||
return pAddNPCType(id, npctype);
|
||||
};
|
||||
|
||||
/*extern "C" __declspec(dllexport) bool DLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID) {
|
||||
return pDLLLoadNPCTypes(cbDBLoadNPCTypes, iNPCTypeStructSize, iNPCTypesCount, iMaxNPCTypeID);
|
||||
};*/
|
||||
|
||||
#else
|
||||
extern "C" const NPCType* GetNPCType(uint32 id) {
|
||||
return pGetNPCType(id);
|
||||
};
|
||||
|
||||
extern "C" bool AddNPCType(uint32 id, const NPCType* npctype) {
|
||||
return pAddNPCType(id, npctype);
|
||||
};
|
||||
|
||||
extern "C" bool DLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID) {
|
||||
return pDLLLoadNPCTypes(cbDBLoadNPCTypes, iNPCTypeStructSize, iNPCTypesCount, iMaxNPCTypeID);
|
||||
};
|
||||
#endif
|
||||
|
||||
bool pAddNPCType(uint32 id, const NPCType* npctype) {
|
||||
if (!MMFNPCTypesData_Writable)
|
||||
return false;
|
||||
if (id > MMF_MAX_NPCTYPE_ID || MMFNPCTypesData_Writable->NextFreeIndex >= MMFNPCTypesData_Writable->NPCTypeCount)
|
||||
return false;
|
||||
if (MMFNPCTypesData_Writable->NPCTypeIndex[id] != 0xFFFFFFFF)
|
||||
return false;
|
||||
|
||||
MMFNPCTypesData_Writable->NPCTypeIndex[id] = MMFNPCTypesData_Writable->NextFreeIndex++;
|
||||
memcpy(&MMFNPCTypesData_Writable->NPCTypes[MMFNPCTypesData_Writable->NPCTypeIndex[id]], npctype, sizeof(NPCType));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*bool pDLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID) {
|
||||
if (iNPCTypeStructSize != sizeof(NPCType)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCTypes: iNPCTypeStructSize != sizeof(NPCType)" << endl;
|
||||
cout << "NPCType struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
if (*iMaxNPCTypeID > MMF_MAX_NPCTYPE_ID) {
|
||||
cout << "Error: EMuShareMem: pDLLLoadNPCTypes: iMaxNPCTypeID > MMF_MAX_NPCTYPE_ID" << endl;
|
||||
cout << "You need to increase the define in NPCTypes.h." << endl;
|
||||
return false;
|
||||
}
|
||||
uint32 tmpMemSize = sizeof(MMFNPCTypes_Struct) + 256 + (sizeof(NPCType) * (*iNPCTypesCount));
|
||||
if (NPCTypesMMF.Open("EQEMuNPCTypes", tmpMemSize)) {
|
||||
// MMFNPCTypesData = (const MMFNPCTypes_Struct*) NPCTypesMMF.GetHandle();
|
||||
if (NPCTypesMMF.CanWrite()) {
|
||||
MMFNPCTypesData_Writable = (MMFNPCTypes_Struct*) NPCTypesMMF.GetWriteableHandle();
|
||||
if (!MMFNPCTypesData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !MMFNPCTypesData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(MMFNPCTypesData_Writable, 0, tmpMemSize);
|
||||
for(int i=0; i<MMF_MAX_NPCTYPE_ID; i++)
|
||||
MMFNPCTypesData_Writable->NPCTypeIndex[i] = 0xFFFFFFFF;
|
||||
MMFNPCTypesData_Writable->MaxNPCTypeID = *iMaxNPCTypeID;
|
||||
MMFNPCTypesData_Writable->NPCTypeCount = *iNPCTypesCount;
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cbDBLoadNPCTypes(MMFNPCTypesData_Writable->NPCTypeCount, MMFNPCTypesData_Writable->MaxNPCTypeID)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !cbDBLoadNPCTypes" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFNPCTypesData_Writable = 0;
|
||||
NPCTypesMMF.SetLoaded();
|
||||
MMFNPCTypesData = (const MMFNPCTypes_Struct*) NPCTypesMMF.GetHandle();
|
||||
if (!MMFNPCTypesData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !MMFNPCTypesData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (!NPCTypesMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!NPCTypesMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(100);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!NPCTypesMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !NPCTypesMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFNPCTypesData = (const MMFNPCTypes_Struct*) NPCTypesMMF.GetHandle();
|
||||
if (!MMFNPCTypesData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !MMFNPCTypesData (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
*iMaxNPCTypeID = MMFNPCTypesData->MaxNPCTypeID;
|
||||
*iNPCTypesCount = MMFNPCTypesData->NPCTypeCount;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading NPCTypes: NPCTypes.cpp: pDLLLoadNPCTypes: Open() == false" << endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
};*/
|
||||
|
||||
const NPCType* pGetNPCType(uint32 id) {
|
||||
if (MMFNPCTypesData == 0 || (!NPCTypesMMF.IsLoaded()) || id > MMF_MAX_NPCTYPE_ID || MMFNPCTypesData->NPCTypeIndex[id] == 0xFFFFFFFF)
|
||||
return 0;
|
||||
return &MMFNPCTypesData->NPCTypes[MMFNPCTypesData->NPCTypeIndex[id]];
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../zone/zonedump.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
// MMF_MAX_NPCTYPE_ID: Make sure this is bigger than the highest NPCType ID#
|
||||
#define MMF_MAX_NPCTYPE_ID 400000
|
||||
|
||||
struct MMFNPCTypes_Struct {
|
||||
uint32 MaxNPCTypeID;
|
||||
uint32 NextFreeIndex;
|
||||
uint32 NPCTypeCount;
|
||||
uint32 NPCTypeIndex[MMF_MAX_NPCTYPE_ID+1];
|
||||
NPCType NPCTypes[0];
|
||||
};
|
||||
|
||||
//bool pDLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID);
|
||||
bool pAddNPCType(uint32 id, const NPCType* npctype);
|
||||
const NPCType* pGetNPCType(uint32 id);
|
||||
@@ -1,140 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "Opcodes.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF OpcodesMMF;
|
||||
const MMFOpcodes_Struct* MMFOpcodesData = 0;
|
||||
MMFOpcodes_Struct* MMFOpcodesData_Writable = 0;
|
||||
const uint16 *MMFOpcodesData_emu_to_eq = NULL;
|
||||
uint16 *MMFOpcodesData_emu_to_eq_write = NULL;
|
||||
|
||||
//we choose to store all opcodes as 16 bits, so if they are a different
|
||||
//size in emu, they are gunna get casted to 16 bits... prolly will never
|
||||
//be a problem, but I figured it was noteworthy
|
||||
|
||||
|
||||
DLLFUNC uint16 GetEQOpcode(uint16 emu_op) {
|
||||
if (MMFOpcodesData == 0 || (!OpcodesMMF.IsLoaded()) || emu_op >= MMFOpcodesData->EmuOpcodeCount )
|
||||
return 0;
|
||||
return MMFOpcodesData_emu_to_eq[emu_op];
|
||||
}
|
||||
|
||||
DLLFUNC uint16 GetEmuOpcode(uint16 eq_op) {
|
||||
if (MMFOpcodesData == 0 || (!OpcodesMMF.IsLoaded()) || eq_op >= MMFOpcodesData->EQOpcodeCount )
|
||||
return 0;
|
||||
return MMFOpcodesData->eq_to_emu[eq_op];
|
||||
}
|
||||
|
||||
DLLFUNC bool SetOpcodePair(uint16 emu_op, uint16 eq_op) {
|
||||
if (!MMFOpcodesData_Writable || !MMFOpcodesData_emu_to_eq_write)
|
||||
return false;
|
||||
if (emu_op >= MMFOpcodesData_Writable->EmuOpcodeCount || eq_op >= MMFOpcodesData_Writable->EQOpcodeCount)
|
||||
return false;
|
||||
|
||||
MMFOpcodesData_emu_to_eq_write[emu_op] = eq_op;
|
||||
MMFOpcodesData_Writable->eq_to_emu[eq_op] = emu_op;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DLLFUNC void ClearEQOpcodes() {
|
||||
if (!MMFOpcodesData_Writable)
|
||||
return;
|
||||
|
||||
memset(MMFOpcodesData_Writable->eq_to_emu, 0, sizeof(uint16)*MMFOpcodesData->EQOpcodeCount);
|
||||
|
||||
}
|
||||
|
||||
DLLFUNC bool DLLLoadOpcodes(CALLBACK_DBLoadOpcodes cb, uint32 opsize, uint32 eq_count, uint32 emu_count, const char *filename) {
|
||||
if(opsize != sizeof(uint16)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadOpcodes: opsize != sizeof(uint16)" << endl;
|
||||
cout << "Opcode size has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
uint32 tmpMemSize = sizeof(MMFOpcodes_Struct) + opsize * (eq_count+emu_count);
|
||||
if (OpcodesMMF.Open("EQEMuOpcodes", tmpMemSize)) {
|
||||
if (OpcodesMMF.CanWrite()) {
|
||||
MMFOpcodesData_Writable = (MMFOpcodes_Struct*) OpcodesMMF.GetWriteableHandle();
|
||||
if (!MMFOpcodesData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadOpcodes: !MMFOpcodesData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
//emu_to_eq is right after eq_to_emu
|
||||
MMFOpcodesData_emu_to_eq = MMFOpcodesData_Writable->eq_to_emu + eq_count;
|
||||
MMFOpcodesData_emu_to_eq_write = MMFOpcodesData_Writable->eq_to_emu + eq_count;
|
||||
|
||||
//we need to memset the eq opcodes
|
||||
memset(MMFOpcodesData_Writable->eq_to_emu, 0, sizeof(uint16)*eq_count);
|
||||
|
||||
MMFOpcodesData_Writable->EQOpcodeCount = eq_count;
|
||||
MMFOpcodesData_Writable->EmuOpcodeCount = emu_count;
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cb(filename)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadOpcodes: !cbDBLoadOpcodes" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
//we dont disable the write handle here, so we can reload them
|
||||
//MMFOpcodesData_Writable = 0;
|
||||
|
||||
OpcodesMMF.SetLoaded();
|
||||
MMFOpcodesData = (const MMFOpcodes_Struct*) OpcodesMMF.GetHandle();
|
||||
if (!MMFOpcodesData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadOpcodes: !MMFOpcodesData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
if (!OpcodesMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!OpcodesMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(10);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!OpcodesMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadOpcodes: !OpcodesMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFOpcodesData = (const MMFOpcodes_Struct*) OpcodesMMF.GetHandle();
|
||||
if (!MMFOpcodesData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadOpcodes: !MMFOpcodesData (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
//emu_to_eq is right after eq_to_emu
|
||||
MMFOpcodesData_emu_to_eq = MMFOpcodesData->eq_to_emu + MMFOpcodesData->EQOpcodeCount;
|
||||
|
||||
//cheat a little so we can retain writeable handles for reloading
|
||||
MMFOpcodesData_Writable = const_cast<MMFOpcodes_Struct*>(MMFOpcodesData);
|
||||
MMFOpcodesData_emu_to_eq_write = MMFOpcodesData_Writable->eq_to_emu + eq_count;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading Opcodes: Opcodes.cpp: pDLLLoadOpcodes: ret == 0, size = " << tmpMemSize << endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
struct MMFOpcodes_Struct {
|
||||
uint32 EQOpcodeCount;
|
||||
uint32 EmuOpcodeCount;
|
||||
uint16 eq_to_emu[0];
|
||||
//uint16 emu_to_eq[0]; //logical, not really here... EQOpcodeCount indexes in
|
||||
};
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "SkillCaps.h"
|
||||
#include "../common/timer.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF SkillCapsMMF;
|
||||
const MMFSkillCaps_Struct* MMFSkillCapsData = 0;
|
||||
MMFSkillCaps_Struct* MMFSkillCapsData_Writable = 0;
|
||||
|
||||
|
||||
DLLFUNC uint16 GetSkillCap(uint8 Class_, uint8 Skill, uint8 Level) {
|
||||
if (MMFSkillCapsData == 0 || (!SkillCapsMMF.IsLoaded()))
|
||||
return 0;
|
||||
if (Class_ >= MMFSkillCapsData->ClassCount || Skill >= MMFSkillCapsData->SkillCount || Level >= MMFSkillCapsData->LevelCount)
|
||||
return(0);
|
||||
|
||||
uint32 index =
|
||||
(((Class_ * MMFSkillCapsData->SkillCount) + Skill) * MMFSkillCapsData->LevelCount)
|
||||
+ Level;
|
||||
|
||||
return MMFSkillCapsData->caps[index];
|
||||
}
|
||||
|
||||
DLLFUNC bool SetSkillCap(uint8 Class_, uint8 Skill, uint8 Level, uint16 cap) {
|
||||
if (!MMFSkillCapsData_Writable)
|
||||
return false;
|
||||
if (Class_ >= MMFSkillCapsData_Writable->ClassCount || Skill >= MMFSkillCapsData_Writable->SkillCount || Level >= MMFSkillCapsData_Writable->LevelCount)
|
||||
return false;
|
||||
|
||||
uint32 index =
|
||||
(((Class_ * MMFSkillCapsData_Writable->SkillCount) + Skill) * MMFSkillCapsData_Writable->LevelCount)
|
||||
+ Level;
|
||||
|
||||
MMFSkillCapsData_Writable->caps[index] = cap;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DLLFUNC uint8 GetTrainLevel(uint8 Class_, uint8 Skill, uint8 Level){
|
||||
if (MMFSkillCapsData == 0 || (!SkillCapsMMF.IsLoaded()))
|
||||
return 0;
|
||||
if (Class_ >= MMFSkillCapsData->ClassCount || Skill >= MMFSkillCapsData->SkillCount || Level >= MMFSkillCapsData->LevelCount)
|
||||
return(0);
|
||||
|
||||
uint32 index = (((Class_ * MMFSkillCapsData->SkillCount) + Skill) * MMFSkillCapsData->LevelCount);
|
||||
|
||||
for(int x = 0; x < Level; x++){
|
||||
if(MMFSkillCapsData->caps[index + x]){
|
||||
return (x);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
DLLFUNC void ClearSkillCaps() {
|
||||
if (!MMFSkillCapsData_Writable)
|
||||
return;
|
||||
|
||||
memset(MMFSkillCapsData_Writable->caps, 0,
|
||||
sizeof(uint16)*(MMFSkillCapsData->ClassCount*MMFSkillCapsData->SkillCount*MMFSkillCapsData->LevelCount));
|
||||
|
||||
}
|
||||
|
||||
DLLFUNC bool LoadSkillCaps(CALLBACK_DBLoadSkillCaps cb, uint32 opsize, uint8 ClassCount, uint8 SkillCount, uint8 LevelCount) {
|
||||
if(opsize != sizeof(uint16)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSkillCaps: opsize != sizeof(uint16)" << endl;
|
||||
cout << "SkillCap size has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
uint32 tmpMemSize = sizeof(MMFSkillCaps_Struct) + opsize * (ClassCount*SkillCount*LevelCount);
|
||||
if (SkillCapsMMF.Open("EQEMuKSkillCaps", tmpMemSize)) {
|
||||
if (SkillCapsMMF.CanWrite()) {
|
||||
MMFSkillCapsData_Writable = (MMFSkillCaps_Struct*) SkillCapsMMF.GetWriteableHandle();
|
||||
if (!MMFSkillCapsData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !MMFSkillCapsData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
//we need to memset the eq SkillCaps
|
||||
memset(MMFSkillCapsData_Writable->caps, 0, sizeof(uint16)*(ClassCount*SkillCount*LevelCount));
|
||||
|
||||
MMFSkillCapsData_Writable->ClassCount = ClassCount;
|
||||
MMFSkillCapsData_Writable->SkillCount = SkillCount;
|
||||
MMFSkillCapsData_Writable->LevelCount = LevelCount;
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (!cb()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !cbDBLoadSkillCaps" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
MMFSkillCapsData_Writable = 0;
|
||||
|
||||
SkillCapsMMF.SetLoaded();
|
||||
MMFSkillCapsData = (const MMFSkillCaps_Struct*) SkillCapsMMF.GetHandle();
|
||||
if (!MMFSkillCapsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !MMFSkillCapsData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
if (!SkillCapsMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!SkillCapsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(10);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!SkillCapsMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !SkillCapsMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFSkillCapsData = (const MMFSkillCaps_Struct*) SkillCapsMMF.GetHandle();
|
||||
if (!MMFSkillCapsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !MMFSkillCapsData (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading SkillCaps: SkillCaps.cpp: pDLLLoadSkillCaps: ret == 0, size = " << tmpMemSize << endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#include "../common/types.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
struct MMFSkillCaps_Struct {
|
||||
uint8 ClassCount;
|
||||
uint8 SkillCount;
|
||||
uint8 LevelCount;
|
||||
uint16 caps[0];
|
||||
};
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
#include "../common/debug.h"
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
|
||||
#include <memory.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "Spells.h"
|
||||
#include "../common/timer.h"
|
||||
//#include "../zone/masterentity.h"
|
||||
#include "MMF.h"
|
||||
|
||||
MMF SpellsMMF;
|
||||
const MMFSpells_Struct* MMFSpellsData = 0;
|
||||
MMFSpells_Struct* MMFSpellsData_Writable = 0;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
extern "C" __declspec(dllexport) bool DLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size) {
|
||||
return pDLLLoadSPDat(cbFileLoadSPDat, oSpellsPointer, oSPDAT_RECORDS, iSPDat_Struct_Size);
|
||||
};
|
||||
#else
|
||||
extern "C" bool DLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size) {
|
||||
return pDLLLoadSPDat(cbFileLoadSPDat, oSpellsPointer, oSPDAT_RECORDS, iSPDat_Struct_Size);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
bool pDLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size) {
|
||||
if (iSPDat_Struct_Size != sizeof(SPDat_Spell_Struct)) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSPDat: iSPDat_Struct_Size != sizeof(SPDat_Spell_Struct)" << endl;
|
||||
cout << "SPDat_Spell_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 tmpMemSize = sizeof(MMFSpells_Struct) + 256 + (sizeof(SPDat_Spell_Struct) * (*oSPDAT_RECORDS));
|
||||
if (SpellsMMF.Open("EQEMuSpells", tmpMemSize)) {
|
||||
if (SpellsMMF.CanWrite()) {
|
||||
MMFSpellsData_Writable = (MMFSpells_Struct*) SpellsMMF.GetWriteableHandle();
|
||||
if (!MMFSpellsData_Writable) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSPDat: !MMFSpellsData_Writable" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(MMFSpellsData_Writable, 0, tmpMemSize);
|
||||
MMFSpellsData_Writable->SPDAT_RECORDS = *oSPDAT_RECORDS;
|
||||
// use a callback so the DB functions are done in the main exe
|
||||
// this way the DLL doesnt have to open a connection to mysql
|
||||
if (MMFSpellsData_Writable->SPDAT_RECORDS > 0) {
|
||||
cbFileLoadSPDat(&MMFSpellsData_Writable->spells[0], MMFSpellsData_Writable->SPDAT_RECORDS-1);
|
||||
*oSpellsPointer = &MMFSpellsData_Writable->spells[0];
|
||||
}
|
||||
else
|
||||
*oSpellsPointer = 0;
|
||||
|
||||
MMFSpellsData_Writable = 0;
|
||||
SpellsMMF.SetLoaded();
|
||||
MMFSpellsData = (const MMFSpells_Struct*) SpellsMMF.GetHandle();
|
||||
if (!MMFSpellsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSPDat: !MMFSpellsData (CanWrite=true)" << endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (!SpellsMMF.IsLoaded()) {
|
||||
Timer::SetCurrentTime();
|
||||
uint32 starttime = Timer::GetCurrentTime();
|
||||
while ((!SpellsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
|
||||
Sleep(100);
|
||||
Timer::SetCurrentTime();
|
||||
}
|
||||
if (!SpellsMMF.IsLoaded()) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSPDat: !SpellsMMF.IsLoaded() (timeout)" << endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
MMFSpellsData = (const MMFSpells_Struct*) SpellsMMF.GetHandle();
|
||||
if (!MMFSpellsData) {
|
||||
cout << "Error: EMuShareMem: DLLLoadSPDat: !SpellsMMF (CanWrite=false)" << endl;
|
||||
return false;
|
||||
}
|
||||
*oSPDAT_RECORDS = MMFSpellsData->SPDAT_RECORDS;
|
||||
if (MMFSpellsData->SPDAT_RECORDS > 0)
|
||||
*oSpellsPointer = &MMFSpellsData->spells[0];
|
||||
else
|
||||
*oSpellsPointer = 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout << "Error Loading SPDat: Spells.cpp: pDLLLoadSPDat: Open() == false" << endl;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#ifndef MEMSHARE_SPELLS_H
|
||||
#define MEMSHARE_SPELLS_H
|
||||
|
||||
#include "../common/types.h"
|
||||
#include "../zone/spdat.h"
|
||||
#include "../common/EMuShareMem.h"
|
||||
|
||||
struct MMFSpells_Struct {
|
||||
uint32 SPDAT_RECORDS; // maxspellid + 1, size of array
|
||||
SPDat_Spell_Struct spells[0];
|
||||
};
|
||||
|
||||
bool pDLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size);
|
||||
|
||||
#endif
|
||||
|
||||
+3
-1
@@ -1,4 +1,4 @@
|
||||
The server code and utilities are released under GPL.
|
||||
The server code and utilities are released under GPLv3.
|
||||
|
||||
We also include some small libraries for convienence that may be under different licensing:
|
||||
|
||||
@@ -8,3 +8,5 @@ StackWalker - New BSD License
|
||||
ZLib - ZLib License
|
||||
MySQL - GPL
|
||||
Perl - GPL / ActiveState (under the assumption that this is a free project).
|
||||
CPPUnit - GLP
|
||||
StringUtilities - Apache
|
||||
@@ -1,2 +1,5 @@
|
||||
EQEmu - Custom Game Implementation for EverQuest
|
||||
|
||||
TODO: A less useless readme file.
|
||||
|
||||
Dependencies can be obtained at http://eqemu.github.com/
|
||||
|
||||
+152
@@ -1,5 +1,157 @@
|
||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||
-------------------------------------------------------
|
||||
== 06/16/2013 ==
|
||||
Secrets: Fixed an issue with RoF items and Req/Rec level above 100 appearing yellow. Recommended to enable the #iteminfo command for items that have a req/rec above 100 to display proper information regarding the info.
|
||||
|
||||
== 06/15/2013 ==
|
||||
KLS: (image) Potentially could bypass some spell checks by passing a specially crafted spell slot. This has been addressed.
|
||||
|
||||
== 06/12/2013 ==
|
||||
KLS: Merge Hateborne's hp cap stuff
|
||||
KLS: We haven't updated changelog in a while but there's been:
|
||||
-Some string stuff
|
||||
-A lot of fixes to things like caps.
|
||||
-More work on custom mod stuff (including examples)
|
||||
-Fix for login not bailing out if it cant connect to a db
|
||||
-Quite a few warning changes.
|
||||
|
||||
== 05/09/2013 ==
|
||||
Uleat: (Updated: 06/12/2013) Fixed a few observed bot issues and an beneficial AE casting bug:
|
||||
Added missing Bot primary weapon proc call (secondary and ranged already exist)
|
||||
Added Bard Bot instrumentation bonuses
|
||||
Added checks to avoid AE Buff casting on enemy mobs
|
||||
Fixed a few typos in 'Vah Shir'-related code
|
||||
(Please post any discrepancies as bugs)
|
||||
|
||||
== 05/05/2013 ==
|
||||
Tabasco: Added EVENT_ITEM_TICK for interactive item quest scripts. (See https://github.com/josheb/quests_dc/blob/master/items/12204.pl)
|
||||
Added simple account flags. Would this work better as an additional qglobal category?
|
||||
Added SendMessage to EQW, useful for using CURL to broadcast to the server.
|
||||
Added WorldShutDown to EQW for timed world shutdowns, also updated console worldshutdown command to optionally use timed behavior.
|
||||
Added numerous modding hooks and mod_functions.cpp for easy custom formulas or future lua integration.
|
||||
Added various rules for monk AC bonus weight, archery bonuses, kick/bash stuns and mob stun levels.
|
||||
required SQL: 2013_05_05_Account_Flags.sql
|
||||
required SQL: 2013_05_05_Item_Tick.sql
|
||||
|
||||
== 04/28/2013 ==
|
||||
PiB: Implement CRC16 using CRC32.
|
||||
|
||||
== 04/27/2013 ==
|
||||
PiB: Verify OP_Ack size & fix crash in BasePacket::build_raw_header_dump due to uninitialised timestamp.
|
||||
Derision: Verify minimum size of OP_Packet, OP_Fragment and OP_OutOfOrderAck.
|
||||
|
||||
== 04/24/2013 ==
|
||||
Bad_Captain: Fixed a couple of merc stat issues.
|
||||
Bad_Captain: Removed unneeded bot pet AI.
|
||||
Bad_Captain: Fixed a few bot aggro issues. (Uleat)
|
||||
|
||||
== 04/20/2013 ==
|
||||
JJ: Fixed rare case where heals from buffs could go negative.
|
||||
|
||||
== 04/12/2013 ==
|
||||
Derision: Moved entity_list.Clear() prior to destruction of Perl objects in zone shutdown as I was seeing a segfault due to attempts to call EVENT_HATE_LIST as mobs were being destroyed.
|
||||
|
||||
== 04/09/2013 ==
|
||||
demonstar55: Realized I was an idiot, changed salvage script to be better
|
||||
optional SQL: 2013_04_09_SalvageCleanOld.sql - run if ran old script
|
||||
|
||||
== 04/08/2013 ==
|
||||
demonstar55: Implemented Salvage AA
|
||||
required SQL: 2013_04_08_Salvage.sql
|
||||
script: generate_salvage.py - will generate the entries for some exceptions for salvage returns.
|
||||
|
||||
== 04/04/2013 ==
|
||||
demonstar55: Implemented SE_ForageAdditionalItems as a bonus
|
||||
required SQL: 2013_04_04_NaturesBounty.sql
|
||||
|
||||
== 04/03/2013 ==
|
||||
demonstar55: Overloaded Mob::Say_StringID with the option to provide a message type
|
||||
demonstar55: Switched rest of the Pet Messages to MT_PetResponse (Leader commands intentionally left the old way)
|
||||
|
||||
== 04/2/2013 ==
|
||||
Bad_Captain: Fixed Merc lack of use of heal over time spells (causing excessive healing).
|
||||
Bad_Captain: Fixed pet mitigation/AC issues.
|
||||
|
||||
== 04/01/2013 ==
|
||||
demonstar55: AA reuse timers now start when you hit the button and are reset upon failure
|
||||
demonstar55: Instant Cast bard AAs can now be used while singing a song
|
||||
|
||||
== 03/30/2013 ==
|
||||
demonstar55: Fixed most of the pet talking, all use StringIDs now. Pet now informs you when it taunts.
|
||||
|
||||
== 03/23/2013 ==
|
||||
demonstar55: Fix issues with escape not always working and fixed SE_FadingMemories to have the message since the message isn't part of the spell data.
|
||||
Escape now uses just the spell and not the AA Actoin
|
||||
Fading Memories now only uses the AA Action to eat mana
|
||||
|
||||
== 03/21/2013 ==
|
||||
Bad_Captain: Fixed merc buffing bugs.
|
||||
Bad_Captain: Added checks before dismissing merc to prevent possible bugged mercs.
|
||||
Bad_Captain: Merged in Secret's merc memory leak fixes.
|
||||
|
||||
== 03/20/2013 ==
|
||||
demonstar55: Fixed stacking issues with SE_Limit* (ex. Unholy Aura Discipline and Aura of Reverence)
|
||||
|
||||
== 03/18/2013 ==
|
||||
Bad_Captain: Fixed zone crash due to merc focus effects & tribute.
|
||||
Bad_Captain: Fixed merc aggro issues when client in melee range & spell recast timers.
|
||||
Bad_Captain: Added melee DPS spells/disciplines & support.
|
||||
|
||||
== 03/17/2013 ==
|
||||
Secrets: Fixed that pesky merc memleak.
|
||||
Secrets: Bit of code cleanup regarding mercs.
|
||||
|
||||
== 03/15/2013 ==
|
||||
Derision: RoF: Added ENCODE for Resurrect_struct (Accepting a rez should now work).
|
||||
Derision: Fixed a couple of memory leaks in Rez code.
|
||||
|
||||
== 03/14/2013 ==
|
||||
JJ: (NatedogEZ) Fix for hate list random never selecting last member of hate list.
|
||||
Bad_Captain: Fixed Merc spell recast timers.
|
||||
Bad_Captain: Changed how Mercs add mobs to their hate lists (should prevent IsEngaged() issues).
|
||||
Bad_Captain: Initial Caster DPS Merc spell casting AI, including initial Merc stance implementation.
|
||||
Bad_Captain: Mercs now suspend when their owner dies to prevent them being bugged (until it can be fixed).
|
||||
|
||||
OPTIONAL SQL: 2013_03_14_Merc_Spells.sql
|
||||
|
||||
== 03/09/2013 ==
|
||||
Zaela_S: Stop mobs aggroing on dead players when using RespawnFromHover.
|
||||
Derision: Removed _log message from zone/CatchSignal on Linux as it can deadlock on shutdown if another signal is received while the _log call is being processed.
|
||||
Derision: Added some error logging into ZoneDatabase::NPCSpawnDB for #npcspawn create.
|
||||
|
||||
== 03/07/2013 ==
|
||||
af4t: Melee tomes with names beginning "Skill:" (e.g. RNG Warder's Wrath, etc) can be memorized now, by hand-in-to-guildmaster or right-click-from-inventory.
|
||||
|
||||
== 03/02/2013 ==
|
||||
af4t: Stop NPCs aggroing each other with buffs/beneficial spells.
|
||||
|
||||
== 03/2/2013 ==
|
||||
Bad_Captain: Fixed Merc depop bug.
|
||||
Bad_Captain: Added merc rest regen.
|
||||
Bad_Captain: Fixed merc group spell casting bug where mercs would continue to try to cast group buffs on pets of caster who didn't have Pet Affinity AA.
|
||||
|
||||
|
||||
== 03/1/2013 ==
|
||||
Bad_Captain: Fixed Merc duplicate save bug.
|
||||
Bad_Captain: Focus items, spell_scale and heal_scale now work implemented and new merc equipment (with focus items).
|
||||
Bad_Captain: Added checks during merc hire, unsuspend, & timer update for states where a merc can't be hired, unsuspended, or can't be retained due to insufficient funds, no room in group, in raid, invalid merc data, etc, and give appropriate feedback.
|
||||
Bad_Captain: Added rules for charging of merc purchase and upkeep costs.
|
||||
|
||||
REQUIRED SQL: 2013_03_1_Merc_Rules_and_Equipment.sql
|
||||
|
||||
== 02/27/2013 ==
|
||||
KLS: Changed how shared memory works:
|
||||
Instead of System V/windows pagefile shared memory we now have shared memory that's backed by the filesystem.
|
||||
What that means is basically instead of EMuSharedMem(shared library) we now have shared_memory(executable), shared memory will be persistent between runs until you delete or reload it using the shared_memory executable.
|
||||
|
||||
STEPS FOR PEOPLE WHO CAN'T BE BOTHERED TO FIGURE IT OUT:
|
||||
1) Create a directory in the place you run world/zone named shared and make sure files can write there.
|
||||
2) Run the shared_memory executable from the same place you run world/zone (it's basically doing the loading we would do on startup so will take a moment).
|
||||
3) Run world/zone/whatever
|
||||
|
||||
== 02/25/2013 ==
|
||||
af4t: Add Touch of the Wicked AA redux to SK Improved Harm Touch and Leech Touch.
|
||||
|
||||
== 02/22/2013 ==
|
||||
demonstar55: Mobs will now be removed from XTargets when they get back to their way point, should be last instance of XTarget mobs not clearing when they are not aggroed anymore
|
||||
|
||||
|
||||
@@ -82,4 +82,3 @@ MARK_AS_ADVANCED(
|
||||
MySQL_LIBRARY_RELEASE
|
||||
MySQL_INCLUDE_DIR
|
||||
)
|
||||
|
||||
+5
-25
@@ -24,10 +24,11 @@
|
||||
|
||||
BasePacket::BasePacket(const unsigned char *buf, uint32 len)
|
||||
{
|
||||
this->pBuffer=NULL;
|
||||
this->pBuffer=nullptr;
|
||||
this->size=0;
|
||||
this->_wpos = 0;
|
||||
this->_rpos = 0;
|
||||
this->timestamp.tv_sec = 0;
|
||||
if (len>0) {
|
||||
this->size=len;
|
||||
pBuffer= new unsigned char[len];
|
||||
@@ -43,7 +44,7 @@ BasePacket::~BasePacket()
|
||||
{
|
||||
if (pBuffer)
|
||||
delete[] pBuffer;
|
||||
pBuffer=NULL;
|
||||
pBuffer=nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +56,7 @@ void BasePacket::build_raw_header_dump(char *buffer, uint16 seq) const
|
||||
buffer += sprintf(buffer, "%s.%06lu ",temp,timestamp.tv_usec);
|
||||
}
|
||||
if (src_ip) {
|
||||
string sIP,dIP;;
|
||||
std::string sIP,dIP;;
|
||||
sIP=long2ip(src_ip);
|
||||
dIP=long2ip(dst_ip);
|
||||
buffer += sprintf(buffer, "[%s:%d->%s:%d]\n",sIP.c_str(),src_port,dIP.c_str(),dst_port);
|
||||
@@ -79,7 +80,7 @@ void BasePacket::build_header_dump(char *buffer) const
|
||||
void BasePacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
|
||||
{
|
||||
if (src_ip) {
|
||||
string sIP,dIP;;
|
||||
std::string sIP,dIP;;
|
||||
sIP=long2ip(src_ip);
|
||||
dIP=long2ip(dst_ip);
|
||||
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
|
||||
@@ -123,24 +124,3 @@ void DumpPacketBin(const BasePacket* app) {
|
||||
DumpPacketBin(app->pBuffer, app->size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+1
-3
@@ -79,7 +79,7 @@ public:
|
||||
|
||||
protected:
|
||||
virtual ~BasePacket();
|
||||
BasePacket() { pBuffer=NULL; size=0; _wpos = 0; _rpos = 0; }
|
||||
BasePacket() { pBuffer=nullptr; size=0; _wpos = 0; _rpos = 0; }
|
||||
BasePacket(const unsigned char *buf, const uint32 len);
|
||||
};
|
||||
|
||||
@@ -89,5 +89,3 @@ extern void DumpPacketBin(const BasePacket* app);
|
||||
|
||||
#endif /*BASEPACKET_H_*/
|
||||
|
||||
|
||||
|
||||
|
||||
+16
-8
@@ -10,14 +10,13 @@ SET(common_sources
|
||||
database.cpp
|
||||
dbasync.cpp
|
||||
dbcore.cpp
|
||||
DBMemLeak.cpp
|
||||
debug.cpp
|
||||
emu_opcodes.cpp
|
||||
EMuShareMem.cpp
|
||||
EmuTCPConnection.cpp
|
||||
EmuTCPServer.cpp
|
||||
EQDB.cpp
|
||||
EQDBRes.cpp
|
||||
eqemu_exception.cpp
|
||||
EQEmuConfig.cpp
|
||||
EQEMuError.cpp
|
||||
EQPacket.cpp
|
||||
@@ -27,12 +26,15 @@ SET(common_sources
|
||||
EQStreamProxy.cpp
|
||||
eqtime.cpp
|
||||
extprofile.cpp
|
||||
faction.cpp
|
||||
guild_base.cpp
|
||||
guilds.cpp
|
||||
ipc_mutex.cpp
|
||||
Item.cpp
|
||||
logsys.cpp
|
||||
logsys_eqemu.cpp
|
||||
md5.cpp
|
||||
memory_mapped_file.cpp
|
||||
misc.cpp
|
||||
MiscFunctions.cpp
|
||||
moremath.cpp
|
||||
@@ -51,7 +53,8 @@ SET(common_sources
|
||||
rulesys.cpp
|
||||
serverinfo.cpp
|
||||
shareddb.cpp
|
||||
SharedLibrary.cpp
|
||||
spdat.cpp
|
||||
StringUtil.cpp
|
||||
StructStrategy.cpp
|
||||
TCPConnection.cpp
|
||||
TCPServer.cpp
|
||||
@@ -99,19 +102,17 @@ SET(common_headers
|
||||
database.h
|
||||
dbasync.h
|
||||
dbcore.h
|
||||
DBMemLeak.h
|
||||
debug.h
|
||||
deity.h
|
||||
emu_opcodes.h
|
||||
emu_oplist.h
|
||||
EMuShareMem.h
|
||||
EmuTCPConnection.h
|
||||
EmuTCPServer.h
|
||||
eq_constants.h
|
||||
eq_opcodes.h
|
||||
eq_packet_structs.h
|
||||
EQDB.h
|
||||
EQDBRes.h
|
||||
eqemu_exception.h
|
||||
EQEmuConfig.h
|
||||
EQEmuConfig_elements.h
|
||||
EQEMuError.h
|
||||
@@ -126,8 +127,13 @@ SET(common_headers
|
||||
eqtime.h
|
||||
errmsg.h
|
||||
extprofile.h
|
||||
faction.h
|
||||
features.h
|
||||
fixed_memory_hash_set.h
|
||||
fixed_memory_variable_hash_set.h
|
||||
guild_base.h
|
||||
guilds.h
|
||||
ipc_mutex.h
|
||||
Item.h
|
||||
item_fieldlist.h
|
||||
item_struct.h
|
||||
@@ -135,8 +141,10 @@ SET(common_headers
|
||||
linked_list.h
|
||||
logsys.h
|
||||
logtypes.h
|
||||
loottable.h
|
||||
mail_oplist.h
|
||||
md5.h
|
||||
memory_mapped_file.h
|
||||
misc.h
|
||||
MiscFunctions.h
|
||||
moremath.h
|
||||
@@ -159,8 +167,9 @@ SET(common_headers
|
||||
serverinfo.h
|
||||
servertalk.h
|
||||
shareddb.h
|
||||
SharedLibrary.h
|
||||
skills.h
|
||||
spdat.h
|
||||
StringUtil.h
|
||||
StructStrategy.h
|
||||
TCPBasicServer.h
|
||||
TCPConnection.h
|
||||
@@ -304,7 +313,6 @@ INCLUDE_DIRECTORIES(Patches SocketLib StackWalker TinyXML)
|
||||
|
||||
ADD_LIBRARY(Common ${common_sources} ${common_headers})
|
||||
|
||||
|
||||
IF(UNIX)
|
||||
ADD_DEFINITIONS(-fPIC)
|
||||
SET_SOURCE_FILES_PROPERTIES("patches/SoD.cpp" "patches/SoF.cpp" "patches/RoF.cpp" "patches/Underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||
|
||||
+11
-342
@@ -1,346 +1,15 @@
|
||||
#include <stdio.h>
|
||||
#include "crc32.h"
|
||||
|
||||
unsigned long IntArray[]={
|
||||
0x00000000,
|
||||
0x77073096,
|
||||
0xEE0E612C,
|
||||
0x990951BA,
|
||||
0x076DC419,
|
||||
0x706AF48F,
|
||||
0xE963A535,
|
||||
0x9E6495A3,
|
||||
0x0EDB8832,
|
||||
0x79DCB8A4,
|
||||
0xE0D5E91E,
|
||||
0x97D2D988,
|
||||
0x09B64C2B,
|
||||
0x7EB17CBD,
|
||||
0xE7B82D07,
|
||||
0x90BF1D91,
|
||||
0x1DB71064,
|
||||
0x6AB020F2,
|
||||
0xF3B97148,
|
||||
0x84BE41DE,
|
||||
0x1ADAD47D,
|
||||
0x6DDDE4EB,
|
||||
0xF4D4B551,
|
||||
0x83D385C7,
|
||||
0x136C9856,
|
||||
0x646BA8C0,
|
||||
0xFD62F97A,
|
||||
0x8A65C9EC,
|
||||
0x14015C4F,
|
||||
0x63066CD9,
|
||||
0xFA0F3D63,
|
||||
0x8D080DF5,
|
||||
0x3B6E20C8,
|
||||
0x4C69105E,
|
||||
0xD56041E4,
|
||||
0xA2677172,
|
||||
0x3C03E4D1,
|
||||
0x4B04D447,
|
||||
0xD20D85FD,
|
||||
0xA50AB56B,
|
||||
0x35B5A8FA,
|
||||
0x42B2986C,
|
||||
0xDBBBC9D6,
|
||||
0xACBCF940,
|
||||
0x32D86CE3,
|
||||
0x45DF5C75,
|
||||
0xDCD60DCF,
|
||||
0xABD13D59,
|
||||
0x26D930AC,
|
||||
0x51DE003A,
|
||||
0xC8D75180,
|
||||
0xBFD06116,
|
||||
0x21B4F4B5,
|
||||
0x56B3C423,
|
||||
0xCFBA9599,
|
||||
0xB8BDA50F,
|
||||
0x2802B89E,
|
||||
0x5F058808,
|
||||
0xC60CD9B2,
|
||||
0xB10BE924,
|
||||
0x2F6F7C87,
|
||||
0x58684C11,
|
||||
0xC1611DAB,
|
||||
0xB6662D3D,
|
||||
0x76DC4190,
|
||||
0x01DB7106,
|
||||
0x98D220BC,
|
||||
0xEFD5102A,
|
||||
0x71B18589,
|
||||
0x06B6B51F,
|
||||
0x9FBFE4A5,
|
||||
0xE8B8D433,
|
||||
0x7807C9A2,
|
||||
0x0F00F934,
|
||||
0x9609A88E,
|
||||
0xE10E9818,
|
||||
0x7F6A0DBB,
|
||||
0x086D3D2D,
|
||||
0x91646C97,
|
||||
0xE6635C01,
|
||||
0x6B6B51F4,
|
||||
0x1C6C6162,
|
||||
0x856530D8,
|
||||
0xF262004E,
|
||||
0x6C0695ED,
|
||||
0x1B01A57B,
|
||||
0x8208F4C1,
|
||||
0xF50FC457,
|
||||
0x65B0D9C6,
|
||||
0x12B7E950,
|
||||
0x8BBEB8EA,
|
||||
0xFCB9887C,
|
||||
0x62DD1DDF,
|
||||
0x15DA2D49,
|
||||
0x8CD37CF3,
|
||||
0xFBD44C65,
|
||||
0x4DB26158,
|
||||
0x3AB551CE,
|
||||
0xA3BC0074,
|
||||
0xD4BB30E2,
|
||||
0x4ADFA541,
|
||||
0x3DD895D7,
|
||||
0xA4D1C46D,
|
||||
0xD3D6F4FB,
|
||||
0x4369E96A,
|
||||
0x346ED9FC,
|
||||
0xAD678846,
|
||||
0xDA60B8D0,
|
||||
0x44042D73,
|
||||
0x33031DE5,
|
||||
0xAA0A4C5F,
|
||||
0xDD0D7CC9,
|
||||
0x5005713C,
|
||||
0x270241AA,
|
||||
0xBE0B1010,
|
||||
0xC90C2086,
|
||||
0x5768B525,
|
||||
0x206F85B3,
|
||||
0xB966D409,
|
||||
0xCE61E49F,
|
||||
0x5EDEF90E,
|
||||
0x29D9C998,
|
||||
0xB0D09822,
|
||||
0xC7D7A8B4,
|
||||
0x59B33D17,
|
||||
0x2EB40D81,
|
||||
0xB7BD5C3B,
|
||||
0xC0BA6CAD,
|
||||
0xEDB88320,
|
||||
0x9ABFB3B6,
|
||||
0x03B6E20C,
|
||||
0x74B1D29A,
|
||||
0xEAD54739,
|
||||
0x9DD277AF,
|
||||
0x04DB2615,
|
||||
0x73DC1683,
|
||||
0xE3630B12,
|
||||
0x94643B84,
|
||||
0x0D6D6A3E,
|
||||
0x7A6A5AA8,
|
||||
0xE40ECF0B,
|
||||
0x9309FF9D,
|
||||
0x0A00AE27,
|
||||
0x7D079EB1,
|
||||
0xF00F9344,
|
||||
0x8708A3D2,
|
||||
0x1E01F268,
|
||||
0x6906C2FE,
|
||||
0xF762575D,
|
||||
0x806567CB,
|
||||
0x196C3671,
|
||||
0x6E6B06E7,
|
||||
0xFED41B76,
|
||||
0x89D32BE0,
|
||||
0x10DA7A5A,
|
||||
0x67DD4ACC,
|
||||
0xF9B9DF6F,
|
||||
0x8EBEEFF9,
|
||||
0x17B7BE43,
|
||||
0x60B08ED5,
|
||||
0xD6D6A3E8,
|
||||
0xA1D1937E,
|
||||
0x38D8C2C4,
|
||||
0x4FDFF252,
|
||||
0xD1BB67F1,
|
||||
0xA6BC5767,
|
||||
0x3FB506DD,
|
||||
0x48B2364B,
|
||||
0xD80D2BDA,
|
||||
0xAF0A1B4C,
|
||||
0x36034AF6,
|
||||
0x41047A60,
|
||||
0xDF60EFC3,
|
||||
0xA867DF55,
|
||||
0x316E8EEF,
|
||||
0x4669BE79,
|
||||
0xCB61B38C,
|
||||
0xBC66831A,
|
||||
0x256FD2A0,
|
||||
0x5268E236,
|
||||
0xCC0C7795,
|
||||
0xBB0B4703,
|
||||
0x220216B9,
|
||||
0x5505262F,
|
||||
0xC5BA3BBE,
|
||||
0xB2BD0B28,
|
||||
0x2BB45A92,
|
||||
0x5CB36A04,
|
||||
0xC2D7FFA7,
|
||||
0xB5D0CF31,
|
||||
0x2CD99E8B,
|
||||
0x5BDEAE1D,
|
||||
0x9B64C2B0,
|
||||
0xEC63F226,
|
||||
0x756AA39C,
|
||||
0x026D930A,
|
||||
0x9C0906A9,
|
||||
0xEB0E363F,
|
||||
0x72076785,
|
||||
0x05005713,
|
||||
0x95BF4A82,
|
||||
0xE2B87A14,
|
||||
0x7BB12BAE,
|
||||
0x0CB61B38,
|
||||
0x92D28E9B,
|
||||
0xE5D5BE0D,
|
||||
0x7CDCEFB7,
|
||||
0x0BDBDF21,
|
||||
0x86D3D2D4,
|
||||
0xF1D4E242,
|
||||
0x68DDB3F8,
|
||||
0x1FDA836E,
|
||||
0x81BE16CD,
|
||||
0xF6B9265B,
|
||||
0x6FB077E1,
|
||||
0x18B74777,
|
||||
0x88085AE6,
|
||||
0xFF0F6A70,
|
||||
0x66063BCA,
|
||||
0x11010B5C,
|
||||
0x8F659EFF,
|
||||
0xF862AE69,
|
||||
0x616BFFD3,
|
||||
0x166CCF45,
|
||||
0xA00AE278,
|
||||
0xD70DD2EE,
|
||||
0x4E048354,
|
||||
0x3903B3C2,
|
||||
0xA7672661,
|
||||
0xD06016F7,
|
||||
0x4969474D,
|
||||
0x3E6E77DB,
|
||||
0xAED16A4A,
|
||||
0xD9D65ADC,
|
||||
0x40DF0B66,
|
||||
0x37D83BF0,
|
||||
0xA9BCAE53,
|
||||
0xDEBB9EC5,
|
||||
0x47B2CF7F,
|
||||
0x30B5FFE9,
|
||||
0xBDBDF21C,
|
||||
0xCABAC28A,
|
||||
0x53B39330,
|
||||
0x24B4A3A6,
|
||||
0xBAD03605,
|
||||
0xCDD70693,
|
||||
0x54DE5729,
|
||||
0x23D967BF,
|
||||
0xB3667A2E,
|
||||
0xC4614AB8,
|
||||
0x5D681B02,
|
||||
0x2A6F2B94,
|
||||
0xB40BBE37,
|
||||
0xC30C8EA1,
|
||||
0x5A05DF1B,
|
||||
0x2D02EF8D,
|
||||
};
|
||||
|
||||
unsigned long CRC16(const unsigned char *buf, int size, int key)
|
||||
uint16 CRC16(const unsigned char *buf, int size, int key)
|
||||
{
|
||||
|
||||
//printf("CRC16() key=%d\n",key);
|
||||
/*
|
||||
sub_0_10020760 proc near ; CODE XREF: sub_0_10008620+AEp
|
||||
; sub_0_10022A90+14Fp ...
|
||||
|
||||
arg_0 = dword ptr 4
|
||||
arg_4 = dword ptr 8
|
||||
arg_8 = dword ptr 0Ch
|
||||
*/
|
||||
|
||||
//int *pecx = buf;
|
||||
unsigned long ecx = key; //mov ecx, [esp+arg_8]
|
||||
unsigned long eax = ecx; //mov eax, ecx
|
||||
unsigned long edi;
|
||||
/* int ecx = key; //mov ecx, [esp+arg_8]
|
||||
int eax = ecx; //mov eax, ecx
|
||||
int edi;
|
||||
*/
|
||||
eax = ~ eax; //not eax
|
||||
eax&=0xFF; //and eax, 0FFh
|
||||
eax=IntArray[eax]; //mov eax, dword_0_10115D38[eax*4] IntArray
|
||||
eax ^= 0x00FFFFFF; //xor eax, 0FFFFFFh
|
||||
int edx = ecx; //mov edx, ecx
|
||||
edx = edx >> 8; //sar edx, 8
|
||||
edx = edx ^ eax; //xor edx, eax
|
||||
eax = eax >> 8; //sar eax, 8
|
||||
edx &= 0xFF; //and edx, 0FFh
|
||||
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
|
||||
//push esi
|
||||
eax ^= IntArray[edx]; //xor eax, dword_0_10115D38[edx*4]
|
||||
edx = ecx; //mov edx, ecx
|
||||
edx = edx >> 0x10; //sar edx, 10h
|
||||
edx ^= eax; //xor edx, eax
|
||||
eax = eax >> 8; //sar eax, 8
|
||||
edx &= 0xFF; //and edx, 0FFh
|
||||
int esi = IntArray[edx]; //mov esi, dword_0_10115D38[edx*4]
|
||||
edx = size; //mov edx, [esp+4+arg_4]
|
||||
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
|
||||
eax ^= esi; //xor eax, esi
|
||||
ecx = ecx >> 0x18; //sar ecx, 18h
|
||||
ecx ^= eax; //xor ecx, eax
|
||||
ecx &= 0xFF; //and ecx, 0FFh
|
||||
esi = IntArray[ecx]; //mov esi, dword_0_10115D38[ecx*4]
|
||||
/*ecx = (int) buf; not used */ //mov ecx, [esp+4+arg_0]
|
||||
eax = eax >> 8; //sar eax, 8
|
||||
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
|
||||
eax ^= esi; //xor eax, esi
|
||||
/* int* esi = ecx+edx //??*///lea esi, [ecx+edx]
|
||||
for(int x = 0; x < size; x++)
|
||||
{ //eax is the crc, ecx is the current part of the buffer
|
||||
int edx = 0; //xor edx, edx
|
||||
edx = buf[x] & 0x00FF; //mov dl, [ecx]
|
||||
|
||||
/*if(pos > size) //cmp ecx, esi
|
||||
return ~eax; //jnb short loc_0_10020803
|
||||
*/
|
||||
//push edi
|
||||
|
||||
//loc_0_100207E0: ; CODE XREF: sub_0_10020760+A0j
|
||||
//LOOP
|
||||
edx ^= eax; //xor edx, eax
|
||||
eax = eax >> 8; //sar eax, 8
|
||||
edx &= 0xFF; //and edx, 0FFh
|
||||
edi = IntArray[edx]; //mov edi, dword_0_10115D38[edx*4]
|
||||
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
|
||||
eax ^= edi; //xor eax, edi
|
||||
//inc ecx
|
||||
//cmp ecx, esi
|
||||
// jb short loc_0_100207E0
|
||||
//pop edi
|
||||
}
|
||||
|
||||
return ~eax;
|
||||
// This is computed as the lowest 16 bits of an Ethernet CRC32 checksum
|
||||
// where the key is prepended to the data in little endian order.
|
||||
uint8 keyBuf[] = {(uint8)((key >> 0) & 0xff),
|
||||
(uint8)((key >> 8) & 0xff),
|
||||
(uint8)((key >> 16) & 0xff),
|
||||
(uint8)((key >> 24) & 0xff)};
|
||||
uint32 crc = CRC32::Update(keyBuf, sizeof(uint32));
|
||||
crc = CRC32::Update(buf, size, crc);
|
||||
return CRC32::Finish(crc) & 0xffff;
|
||||
}
|
||||
|
||||
/*loc_0_10020803: ; CODE XREF: sub_0_10020760+7Dj
|
||||
not eax
|
||||
pop esi
|
||||
retn
|
||||
sub_0_10020760 endp
|
||||
|
||||
*/
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
#ifndef _CRC16_H
|
||||
#define _CRC16_H
|
||||
#include "types.h"
|
||||
|
||||
unsigned long CRC16(const unsigned char *buf, int size, int key);
|
||||
uint16 CRC16(const unsigned char *buf, int size, int key);
|
||||
|
||||
#endif
|
||||
|
||||
+54
-59
@@ -20,54 +20,46 @@
|
||||
#include "Condition.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
|
||||
|
||||
Condition::Condition()
|
||||
{
|
||||
m_events[SignalEvent] = CreateEvent (NULL, // security
|
||||
Condition::Condition()
|
||||
{
|
||||
m_events[SignalEvent] = CreateEvent (nullptr, // security
|
||||
FALSE, // is auto-reset event?
|
||||
FALSE, // is signaled initially?
|
||||
NULL); // name
|
||||
m_events[BroadcastEvent] = CreateEvent (NULL, // security
|
||||
nullptr); // name
|
||||
m_events[BroadcastEvent] = CreateEvent (nullptr, // security
|
||||
TRUE, // is auto-reset event?
|
||||
FALSE, // is signaled initially?
|
||||
NULL); // name
|
||||
nullptr); // name
|
||||
m_waiters = 0;
|
||||
InitializeCriticalSection(&CSMutex);
|
||||
}
|
||||
}
|
||||
|
||||
Condition::~Condition()
|
||||
{
|
||||
Condition::~Condition()
|
||||
{
|
||||
DeleteCriticalSection(&CSMutex);
|
||||
CloseHandle(m_events[SignalEvent]);
|
||||
CloseHandle(m_events[BroadcastEvent]);
|
||||
}
|
||||
}
|
||||
|
||||
void Condition::Signal()
|
||||
{
|
||||
void Condition::Signal()
|
||||
{
|
||||
EnterCriticalSection(&CSMutex);
|
||||
if(m_waiters > 0)
|
||||
SetEvent(m_events[SignalEvent]);
|
||||
LeaveCriticalSection(&CSMutex);
|
||||
}
|
||||
}
|
||||
|
||||
void Condition::SignalAll()
|
||||
{
|
||||
void Condition::SignalAll()
|
||||
{
|
||||
EnterCriticalSection(&CSMutex);
|
||||
if(m_waiters > 0)
|
||||
SetEvent(m_events[BroadcastEvent]);
|
||||
LeaveCriticalSection(&CSMutex);
|
||||
}
|
||||
}
|
||||
|
||||
void Condition::Wait()
|
||||
{
|
||||
void Condition::Wait()
|
||||
{
|
||||
EnterCriticalSection(&CSMutex);
|
||||
|
||||
m_waiters++;
|
||||
@@ -85,51 +77,53 @@ void Condition::Wait()
|
||||
ResetEvent(m_events[BroadcastEvent]);
|
||||
|
||||
LeaveCriticalSection(&CSMutex);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#else //!WIN32
|
||||
Condition::Condition()
|
||||
{
|
||||
pthread_cond_init(&cond,nullptr);
|
||||
pthread_mutex_init(&mutex,nullptr);
|
||||
}
|
||||
|
||||
Condition::Condition()
|
||||
{
|
||||
pthread_cond_init(&cond,NULL);
|
||||
pthread_mutex_init(&mutex,NULL);
|
||||
}
|
||||
|
||||
void Condition::Signal()
|
||||
{
|
||||
void Condition::Signal()
|
||||
{
|
||||
pthread_mutex_lock(&mutex);
|
||||
pthread_cond_signal(&cond);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
}
|
||||
|
||||
void Condition::SignalAll()
|
||||
{
|
||||
void Condition::SignalAll()
|
||||
{
|
||||
pthread_mutex_lock(&mutex);
|
||||
pthread_cond_broadcast(&cond);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
}
|
||||
|
||||
void Condition::Wait()
|
||||
{
|
||||
void Condition::Wait()
|
||||
{
|
||||
pthread_mutex_lock(&mutex);
|
||||
pthread_cond_wait(&cond,&mutex);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
I commented this specifically because I think it might be very
|
||||
difficult to write a windows counterpart to it, so I would like
|
||||
to discourage its use until we can confirm that it can be reasonably
|
||||
implemented on windows.
|
||||
/*
|
||||
I commented this specifically because I think it might be very
|
||||
difficult to write a windows counterpart to it, so I would like
|
||||
to discourage its use until we can confirm that it can be reasonably
|
||||
implemented on windows.
|
||||
|
||||
bool Condition::TimedWait(unsigned long usec)
|
||||
{
|
||||
struct timeval now;
|
||||
struct timespec timeout;
|
||||
int retcode=0;
|
||||
bool Condition::TimedWait(unsigned long usec)
|
||||
{
|
||||
struct timeval now;
|
||||
struct timespec timeout;
|
||||
int retcode=0;
|
||||
pthread_mutex_lock(&mutex);
|
||||
gettimeofday(&now,NULL);
|
||||
gettimeofday(&now,nullptr);
|
||||
now.tv_usec+=usec;
|
||||
timeout.tv_sec = now.tv_sec + (now.tv_usec/1000000);
|
||||
timeout.tv_nsec = (now.tv_usec%1000000) *1000;
|
||||
@@ -139,15 +133,16 @@ int retcode=0;
|
||||
pthread_mutex_unlock(&mutex);
|
||||
|
||||
return retcode!=ETIMEDOUT;
|
||||
}
|
||||
*/
|
||||
}
|
||||
*/
|
||||
|
||||
Condition::~Condition()
|
||||
{
|
||||
Condition::~Condition()
|
||||
{
|
||||
pthread_mutex_lock(&mutex);
|
||||
pthread_cond_destroy(&cond);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
pthread_mutex_destroy(&mutex);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
#ifdef _EQDEBUG
|
||||
#include "../common/debug.h"
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "../common/Mutex.h"
|
||||
#include "DBMemLeak.h"
|
||||
|
||||
#include <crtdbg.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define snprintf _snprintf
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
#endif
|
||||
|
||||
DBMemLeak dbmemleak;
|
||||
LinkedList<DBMemLeakStruct*>* list = 0;
|
||||
Mutex MDBMemLeak;
|
||||
|
||||
DBMemLeak::DBMemLeak() {
|
||||
list = new LinkedList<DBMemLeakStruct*>;
|
||||
}
|
||||
|
||||
DBMemLeak::~DBMemLeak() {
|
||||
LinkedListIterator<DBMemLeakStruct*> iterator(*list);
|
||||
iterator.Reset();
|
||||
while (iterator.MoreElements()) {
|
||||
char tmp[200];
|
||||
snprintf(tmp, sizeof(tmp) - 3, "DB Mem Leak: Block=%6d, Query=%s", iterator.GetData()->memblock, iterator.GetData()->query);
|
||||
snprintf(tmp, sizeof(tmp), "%s\n", tmp);
|
||||
OutputDebugString(tmp);
|
||||
iterator.Advance();
|
||||
}
|
||||
safe_delete(list);
|
||||
}
|
||||
|
||||
void DBMemLeak::Alloc(const void* result, const char* query) {
|
||||
LockMutex lock(&MDBMemLeak);
|
||||
long requestNumber;
|
||||
uint8* tmp2 = new uint8;
|
||||
_CrtIsMemoryBlock( tmp2, 1, &requestNumber, 0, 0 );
|
||||
safe_delete(tmp2);
|
||||
DBMemLeakStruct* tmp = (DBMemLeakStruct*) new uchar[sizeof(DBMemLeakStruct) + strlen(query) + 1];
|
||||
tmp->result = result;
|
||||
tmp->memblock = requestNumber;
|
||||
strcpy(tmp->query, query);
|
||||
list->Append(tmp);
|
||||
}
|
||||
|
||||
void DBMemLeak::Free(const void* result) {
|
||||
LockMutex lock(&MDBMemLeak);
|
||||
LinkedListIterator<DBMemLeakStruct*> iterator(*list);
|
||||
iterator.Reset();
|
||||
while (iterator.MoreElements()) {
|
||||
if (result == iterator.GetData()->result)
|
||||
iterator.RemoveCurrent();
|
||||
else
|
||||
iterator.Advance();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,25 +0,0 @@
|
||||
#ifdef _EQDEBUG
|
||||
#ifndef DBMemLeak_H
|
||||
#define DBMemLeak_H
|
||||
#include "../common/types.h"
|
||||
#include "../common/linked_list.h"
|
||||
|
||||
#define mysql_free_result(r) { DBMemLeak::Free(r); mysql_free_result(r); }
|
||||
|
||||
struct DBMemLeakStruct {
|
||||
const void* result;
|
||||
uint32 memblock;
|
||||
char query[0];
|
||||
};
|
||||
|
||||
class DBMemLeak {
|
||||
public:
|
||||
DBMemLeak();
|
||||
~DBMemLeak();
|
||||
|
||||
static void Alloc(const void* result, const char* query);
|
||||
static void Free(const void* result);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,300 +0,0 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "../common/debug.h"
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "../common/types.h"
|
||||
#include "EMuShareMem.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define snprintf _snprintf
|
||||
#if (_MSC_VER < 1500)
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
|
||||
#define EmuLibName "EMuShareMem"
|
||||
#else
|
||||
#define EmuLibName "libEMuShareMem.so"
|
||||
#endif
|
||||
|
||||
LoadEMuShareMemDLL EMuShareMemDLL;
|
||||
|
||||
#ifndef WIN32
|
||||
uint32 LoadEMuShareMemDLL::refCount = 0;
|
||||
#endif
|
||||
|
||||
LoadEMuShareMemDLL::LoadEMuShareMemDLL() {
|
||||
ClearFunc();
|
||||
#ifndef WIN32
|
||||
refCountU();
|
||||
#endif
|
||||
}
|
||||
|
||||
LoadEMuShareMemDLL::~LoadEMuShareMemDLL() {
|
||||
#ifndef WIN32
|
||||
if (refCountD() <= 0) {
|
||||
#endif
|
||||
Unload();
|
||||
#ifndef WIN32
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool LoadEMuShareMemDLL::Load() {
|
||||
if(loaded)
|
||||
return(true);
|
||||
|
||||
if(!SharedLibrary::Load(EmuLibName))
|
||||
return(false);
|
||||
|
||||
if (Loaded()) {
|
||||
Items.GetItem = (DLLFUNC_GetItem) GetSym("GetItem");
|
||||
Items.IterateItems = (DLLFUNC_IterateItems) GetSym("IterateItems");
|
||||
Items.cbAddItem = (DLLFUNC_AddItem) GetSym("AddItem");
|
||||
Items.DLLLoadItems = (DLLFUNC_DLLLoadItems) GetSym("DLLLoadItems");
|
||||
Doors.GetDoor = (DLLFUNC_GetDoor) GetSym("GetDoor");
|
||||
Doors.cbAddDoor = (DLLFUNC_AddDoor) GetSym("AddDoor");
|
||||
Doors.DLLLoadDoors = (DLLFUNC_DLLLoadDoors) GetSym("DLLLoadDoors");
|
||||
Spells.DLLLoadSPDat = (DLLFUNC_DLLLoadSPDat) GetSym("DLLLoadSPDat");
|
||||
NPCFactionList.DLLLoadNPCFactionLists = (DLLFUNC_DLLLoadNPCFactionLists) GetSym("DLLLoadNPCFactionLists");
|
||||
NPCFactionList.GetNPCFactionList = (DLLFUNC_GetNPCFactionList) GetSym("GetNPCFactionList");
|
||||
NPCFactionList.cbAddNPCFactionList = (DLLFUNC_AddNPCFactionList) GetSym("AddNPCFactionList");
|
||||
NPCFactionList.cbSetFaction = (DLLFUNC_SetFaction) GetSym("SetNPCFaction");
|
||||
Loot.DLLLoadLoot = (DLLFUNC_DLLLoadLoot) GetSym("DLLLoadLoot");
|
||||
Loot.cbAddLootTable = (DLLFUNC_AddLootTable) GetSym("AddLootTable");
|
||||
Loot.cbAddLootDrop = (DLLFUNC_AddLootDrop) GetSym("AddLootDrop");
|
||||
Loot.GetLootTable = (DLLFUNC_GetLootTable) GetSym("GetLootTable");
|
||||
Loot.GetLootDrop = (DLLFUNC_GetLootDrop) GetSym("GetLootDrop");
|
||||
Opcodes.GetEQOpcode = (DLLFUNC_GetEQOpcode) GetSym("GetEQOpcode");
|
||||
Opcodes.GetEmuOpcode = (DLLFUNC_GetEmuOpcode) GetSym("GetEmuOpcode");
|
||||
Opcodes.SetOpcodePair = (DLLFUNC_SetOpcodePair) GetSym("SetOpcodePair");
|
||||
Opcodes.DLLLoadOpcodes = (DLLFUNC_DLLLoadOpcodes) GetSym("DLLLoadOpcodes");
|
||||
Opcodes.ClearEQOpcodes = (DLLFUNC_ClearEQOpcodes) GetSym("ClearEQOpcodes");
|
||||
SkillCaps.LoadSkillCaps = (DLLFUNC_DLLLoadSkillCaps) GetSym("LoadSkillCaps");
|
||||
SkillCaps.GetSkillCap = (DLLFUNC_GetSkillCap) GetSym("GetSkillCap");
|
||||
SkillCaps.SetSkillCap = (DLLFUNC_SetSkillCap) GetSym("SetSkillCap");
|
||||
SkillCaps.ClearSkillCaps = (DLLFUNC_ClearSkillCaps) GetSym("ClearSkillCaps");
|
||||
SkillCaps.GetTrainLevel = (DLLFUNC_GetTrainLevel) GetSym("GetTrainLevel");
|
||||
if(Items.GetItem == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.GetItem");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Items.IterateItems == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.IterateItems");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Items.cbAddItem == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.cbAddItem");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Items.DLLLoadItems == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.DLLLoadItems");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Doors.GetDoor == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Doors.GetDoor");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Doors.cbAddDoor == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Doors.cbAddDoor");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Doors.DLLLoadDoors == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Doors.DLLLoadDoors");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Spells.DLLLoadSPDat == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Spells.DLLLoadSPDat");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(NPCFactionList.DLLLoadNPCFactionLists == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.DLLLoadNPCFactionLists");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(NPCFactionList.GetNPCFactionList == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.GetNPCFactionList");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(NPCFactionList.cbAddNPCFactionList == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.cbAddNPCFactionList");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(NPCFactionList.cbSetFaction == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.cbSetFaction");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Loot.DLLLoadLoot == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.DLLLoadLoot");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Loot.cbAddLootTable == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.cbAddLootTable");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Loot.cbAddLootDrop == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.cbAddLootDrop");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Loot.GetLootTable == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.GetLootTable");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Loot.GetLootDrop == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.GetLootDrop");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Opcodes.GetEQOpcode == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.GetEQOpcode");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Opcodes.GetEmuOpcode == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.GetEmuOpcode");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Opcodes.SetOpcodePair == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.SetOpcodePair");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Opcodes.DLLLoadOpcodes == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.DLLLoadOpcodes");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(Opcodes.ClearEQOpcodes == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.ClearEQOpcodes");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(SkillCaps.LoadSkillCaps == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.LoadSkillCaps");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(SkillCaps.GetSkillCap == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.GetSkillCap");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(SkillCaps.SetSkillCap == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.SetSkillCap");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(SkillCaps.ClearSkillCaps == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.ClearSkillCaps");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(SkillCaps.GetTrainLevel == NULL) {
|
||||
Unload();
|
||||
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.GetTrainLevel");
|
||||
return(false);
|
||||
}
|
||||
|
||||
LogFile->write(EQEMuLog::Status, "%s loaded", EmuLibName);
|
||||
loaded = true;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
LogFile->write(EQEMuLog::Error, "%s was not loaded, but did not report an error.", EmuLibName);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LoadEMuShareMemDLL::Unload() {
|
||||
ClearFunc();
|
||||
SharedLibrary::Unload();
|
||||
}
|
||||
|
||||
void LoadEMuShareMemDLL::ClearFunc() {
|
||||
Items.GetItem = 0;
|
||||
Items.IterateItems = 0;
|
||||
Items.cbAddItem = 0;
|
||||
Items.DLLLoadItems = 0;
|
||||
Doors.GetDoor = 0;
|
||||
Doors.cbAddDoor = 0;
|
||||
Doors.DLLLoadDoors = 0;
|
||||
NPCFactionList.DLLLoadNPCFactionLists = 0;
|
||||
NPCFactionList.GetNPCFactionList = 0;
|
||||
NPCFactionList.cbAddNPCFactionList = 0;
|
||||
NPCFactionList.cbSetFaction = 0;
|
||||
Loot.DLLLoadLoot = 0;
|
||||
Loot.cbAddLootTable = 0;
|
||||
Loot.cbAddLootDrop = 0;
|
||||
Loot.GetLootTable = 0;
|
||||
Loot.GetLootDrop = 0;
|
||||
Opcodes.GetEQOpcode = NULL;
|
||||
Opcodes.GetEmuOpcode = NULL;
|
||||
Opcodes.SetOpcodePair = NULL;
|
||||
Opcodes.DLLLoadOpcodes = NULL;
|
||||
Opcodes.ClearEQOpcodes = NULL;
|
||||
SkillCaps.LoadSkillCaps = NULL;
|
||||
SkillCaps.GetSkillCap = NULL;
|
||||
SkillCaps.SetSkillCap = NULL;
|
||||
SkillCaps.ClearSkillCaps = NULL;
|
||||
SkillCaps.GetTrainLevel = NULL;
|
||||
loaded = false;
|
||||
}
|
||||
@@ -1,187 +0,0 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef EMuShareMem_H
|
||||
#define EMuShareMem_H
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include "../common/unix.h"
|
||||
#endif
|
||||
#include "../common/eq_packet_structs.h"
|
||||
#include "../zone/zonedump.h"
|
||||
#include "../zone/loottable.h"
|
||||
#include "SharedLibrary.h"
|
||||
|
||||
////////////
|
||||
// Items //
|
||||
///////////
|
||||
typedef bool(*CALLBACK_DBLoadItems)(int32, uint32);
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadItems)(const CALLBACK_DBLoadItems, uint32, int32*, uint32*);
|
||||
typedef const Item_Struct*(*DLLFUNC_GetItem)(uint32);
|
||||
typedef const Item_Struct*(*DLLFUNC_IterateItems)(uint32*);
|
||||
typedef bool(*DLLFUNC_AddItem)(uint32, const Item_Struct*);
|
||||
|
||||
struct ItemsDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadItems DLLLoadItems;
|
||||
DLLFUNC_GetItem GetItem;
|
||||
DLLFUNC_IterateItems IterateItems;
|
||||
DLLFUNC_AddItem cbAddItem;
|
||||
};
|
||||
/*
|
||||
typedef bool(*CALLBACK_DBLoadNPCTypes)(int32, uint32);
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadNPCTypes)(const CALLBACK_DBLoadNPCTypes, uint32, int32*, uint32*);
|
||||
typedef const NPCType*(*DLLFUNC_GetNPCType)(uint32);
|
||||
typedef bool(*DLLFUNC_AddNPCType)(uint32, const NPCType*);
|
||||
struct NPCTypesDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadNPCTypes DLLLoadNPCTypes;
|
||||
DLLFUNC_GetNPCType GetNPCType;
|
||||
DLLFUNC_AddNPCType cbAddNPCType;
|
||||
};
|
||||
*/
|
||||
|
||||
|
||||
////////////
|
||||
// Doors ///
|
||||
////////////
|
||||
typedef bool(*CALLBACK_DBLoadDoors)(int32, uint32);
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadDoors)(const CALLBACK_DBLoadDoors, uint32, int32*, uint32*);
|
||||
typedef const Door*(*DLLFUNC_GetDoor)(uint32);
|
||||
typedef bool(*DLLFUNC_AddDoor)(uint32, const Door*);
|
||||
struct DoorsDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadDoors DLLLoadDoors;
|
||||
DLLFUNC_GetDoor GetDoor;
|
||||
DLLFUNC_AddDoor cbAddDoor;
|
||||
};
|
||||
|
||||
////////////
|
||||
// Spells //
|
||||
////////////
|
||||
typedef bool(*CALLBACK_FileLoadSPDat)(void*, int32);
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadSPDat)(const CALLBACK_FileLoadSPDat, const void**, int32*, uint32);
|
||||
struct SpellsDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadSPDat DLLLoadSPDat;
|
||||
};
|
||||
|
||||
//////////////
|
||||
// Factions //
|
||||
//////////////
|
||||
|
||||
typedef bool(*CALLBACK_DBLoadNPCFactionLists)(int32, uint32);
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadNPCFactionLists)(const CALLBACK_DBLoadNPCFactionLists, uint32, int32*, uint32*, uint8);
|
||||
typedef const NPCFactionList*(*DLLFUNC_GetNPCFactionList)(uint32);
|
||||
typedef bool(*DLLFUNC_AddNPCFactionList)(uint32, const NPCFactionList*);
|
||||
typedef bool(*DLLFUNC_SetFaction)(uint32, uint32*, int32*, int8*, uint8*);
|
||||
struct NPCFactionListDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadNPCFactionLists DLLLoadNPCFactionLists;
|
||||
DLLFUNC_GetNPCFactionList GetNPCFactionList;
|
||||
DLLFUNC_AddNPCFactionList cbAddNPCFactionList;
|
||||
DLLFUNC_SetFaction cbSetFaction;
|
||||
};
|
||||
|
||||
////////////
|
||||
// Loot //
|
||||
///////////
|
||||
|
||||
typedef bool(*CALLBACK_DBLoadLoot)();
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadLoot)(const CALLBACK_DBLoadLoot, uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32);
|
||||
typedef bool(*DLLFUNC_AddLootTable)(uint32, const LootTable_Struct*);
|
||||
typedef bool(*DLLFUNC_AddLootDrop)(uint32, const LootDrop_Struct*);
|
||||
typedef const LootTable_Struct*(*DLLFUNC_GetLootTable)(uint32);
|
||||
typedef const LootDrop_Struct*(*DLLFUNC_GetLootDrop)(uint32);
|
||||
struct LootDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadLoot DLLLoadLoot;
|
||||
DLLFUNC_AddLootTable cbAddLootTable;
|
||||
DLLFUNC_AddLootDrop cbAddLootDrop;
|
||||
DLLFUNC_GetLootTable GetLootTable;
|
||||
DLLFUNC_GetLootDrop GetLootDrop;
|
||||
};
|
||||
|
||||
/////////////
|
||||
// Opcodes //
|
||||
/////////////
|
||||
|
||||
typedef bool(*CALLBACK_DBLoadOpcodes)(const char *filename);
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadOpcodes)(const CALLBACK_DBLoadOpcodes, uint32 opsize, uint32 eq_count, uint32 emu_count, const char *filename);
|
||||
typedef uint16 (*DLLFUNC_GetEQOpcode)(uint16 emu_op);
|
||||
typedef uint16 (*DLLFUNC_GetEmuOpcode)(uint16 eq_op);
|
||||
typedef void (*DLLFUNC_ClearEQOpcodes)();
|
||||
typedef bool(*DLLFUNC_SetOpcodePair)(uint16 emu_op, uint16 eq_op);
|
||||
struct OpcodeDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadOpcodes DLLLoadOpcodes;
|
||||
DLLFUNC_GetEQOpcode GetEQOpcode;
|
||||
DLLFUNC_GetEmuOpcode GetEmuOpcode;
|
||||
DLLFUNC_SetOpcodePair SetOpcodePair;
|
||||
DLLFUNC_ClearEQOpcodes ClearEQOpcodes;
|
||||
};
|
||||
|
||||
////////////////
|
||||
// Skill Caps //
|
||||
////////////////
|
||||
|
||||
typedef bool(*CALLBACK_DBLoadSkillCaps)();
|
||||
|
||||
typedef bool(*DLLFUNC_DLLLoadSkillCaps)(const CALLBACK_DBLoadSkillCaps, uint32 opsize, uint8 ClassCount, uint8 SkillCount, uint8 LevelCount);
|
||||
typedef uint16 (*DLLFUNC_GetSkillCap)(uint8 Class_, uint8 Skill, uint8 Level);
|
||||
typedef void (*DLLFUNC_ClearSkillCaps)();
|
||||
typedef bool(*DLLFUNC_SetSkillCap)(uint8 Class_, uint8 Skill, uint8 Level, uint16 cap);
|
||||
typedef uint8 (*DLLFUNC_GetTrainLevel)(uint8 Class_, uint8 Skill, uint8 Level);
|
||||
struct SkillCapDLLFunc_Struct {
|
||||
DLLFUNC_DLLLoadSkillCaps LoadSkillCaps;
|
||||
DLLFUNC_GetSkillCap GetSkillCap;
|
||||
DLLFUNC_SetSkillCap SetSkillCap;
|
||||
DLLFUNC_ClearSkillCaps ClearSkillCaps;
|
||||
DLLFUNC_GetTrainLevel GetTrainLevel;
|
||||
};
|
||||
|
||||
|
||||
class LoadEMuShareMemDLL : public SharedLibrary {
|
||||
public:
|
||||
LoadEMuShareMemDLL();
|
||||
~LoadEMuShareMemDLL();
|
||||
|
||||
bool Load();
|
||||
void Unload();
|
||||
|
||||
ItemsDLLFunc_Struct Items;
|
||||
//NPCTypesDLLFunc_Struct NPCTypes;
|
||||
DoorsDLLFunc_Struct Doors;
|
||||
SpellsDLLFunc_Struct Spells;
|
||||
NPCFactionListDLLFunc_Struct NPCFactionList;
|
||||
LootDLLFunc_Struct Loot;
|
||||
OpcodeDLLFunc_Struct Opcodes;
|
||||
SkillCapDLLFunc_Struct SkillCaps;
|
||||
private:
|
||||
void ClearFunc();
|
||||
|
||||
bool loaded;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#else
|
||||
static uint32 refCount;
|
||||
static uint32 refCountU() { return ++refCount; };
|
||||
static uint32 refCountD() { return --refCount; };
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
+2
-5
@@ -53,11 +53,11 @@ EQDBRes * EQDB::query(Const_char *q) {
|
||||
return new EQDBRes(r);
|
||||
} else {
|
||||
//no result, give them back a 'true but empty' result set
|
||||
return(new EQDBRes(NULL));
|
||||
return(new EQDBRes(nullptr));
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//NOT THREAD SAFE!
|
||||
@@ -73,6 +73,3 @@ Const_char *EQDB::escape_string(Const_char *from) {
|
||||
return(m_escapeBuffer.c_str());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ public:
|
||||
//END PERL EXPORT
|
||||
|
||||
private:
|
||||
string m_escapeBuffer;
|
||||
std::string m_escapeBuffer;
|
||||
static EQDB s_EQDB;
|
||||
MYSQL *mysql_ref;
|
||||
};
|
||||
|
||||
+8
-7
@@ -19,9 +19,9 @@
|
||||
#include "EQDBRes.h"
|
||||
#include <mysql.h>
|
||||
|
||||
vector<string> EQDBRes::fetch_row_array() {
|
||||
vector<string> array;
|
||||
if(res == NULL)
|
||||
std::vector<std::string> EQDBRes::fetch_row_array() {
|
||||
std::vector<std::string> array;
|
||||
if(res == nullptr)
|
||||
return(array);
|
||||
|
||||
int count=mysql_num_fields(res);
|
||||
@@ -32,16 +32,16 @@ vector<string> EQDBRes::fetch_row_array() {
|
||||
return array;
|
||||
}
|
||||
|
||||
map<string,string> EQDBRes::fetch_row_hash() {
|
||||
map<string,string> rowhash;
|
||||
if(res == NULL)
|
||||
std::map<std::string,std::string> EQDBRes::fetch_row_hash() {
|
||||
std::map<std::string,std::string> rowhash;
|
||||
if(res == nullptr)
|
||||
return(rowhash);
|
||||
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_ROW row;
|
||||
unsigned long num_fields,i;
|
||||
|
||||
if (res && (num_fields=mysql_num_fields(res)) && (row = mysql_fetch_row(res))!=NULL && (fields = mysql_fetch_fields(res))!=NULL) {
|
||||
if (res && (num_fields=mysql_num_fields(res)) && (row = mysql_fetch_row(res))!=nullptr && (fields = mysql_fetch_fields(res))!=nullptr) {
|
||||
for(i=0;i<num_fields;i++) {
|
||||
rowhash[fields[i].name]=(row[i] ? row[i] : "");
|
||||
}
|
||||
@@ -49,3 +49,4 @@ map<string,string> EQDBRes::fetch_row_hash() {
|
||||
|
||||
return rowhash;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -35,9 +35,9 @@ public:
|
||||
unsigned long num_rows() { return (res) ? mysql_num_rows(res) : 0; }
|
||||
unsigned long num_fields() { return (res) ? mysql_num_fields(res) : 0; }
|
||||
void DESTROY() { }
|
||||
void finish() { if (res) mysql_free_result(res); res=NULL; };
|
||||
vector<string> fetch_row_array();
|
||||
map<string,string> fetch_row_hash();
|
||||
void finish() { if (res) mysql_free_result(res); res=nullptr; };
|
||||
std::vector<std::string> fetch_row_array();
|
||||
std::map<std::string,std::string> fetch_row_hash();
|
||||
unsigned long * fetch_lengths() { return (res) ? mysql_fetch_lengths(res) : 0; }
|
||||
//END PERL EXPORT
|
||||
|
||||
|
||||
+47
-71
@@ -21,8 +21,8 @@
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
string EQEmuConfig::ConfigFile = "eqemu_config.xml";
|
||||
EQEmuConfig *EQEmuConfig::_config = NULL;
|
||||
std::string EQEmuConfig::ConfigFile = "eqemu_config.xml";
|
||||
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
||||
|
||||
void EQEmuConfig::do_world(TiXmlElement *ele) {
|
||||
const char *text;
|
||||
@@ -100,12 +100,12 @@ void EQEmuConfig::do_world(TiXmlElement *ele) {
|
||||
|
||||
// Check for locked
|
||||
sub_ele = ele->FirstChildElement("locked");
|
||||
if (sub_ele != NULL)
|
||||
if (sub_ele != nullptr)
|
||||
Locked=true;
|
||||
|
||||
// Get the <tcp> element
|
||||
sub_ele = ele->FirstChildElement("tcp");
|
||||
if(sub_ele != NULL) {
|
||||
if(sub_ele != nullptr) {
|
||||
|
||||
text = sub_ele->Attribute("ip");
|
||||
if (text)
|
||||
@@ -123,7 +123,7 @@ void EQEmuConfig::do_world(TiXmlElement *ele) {
|
||||
|
||||
// Get the <http> element
|
||||
sub_ele = ele->FirstChildElement("http");
|
||||
if(sub_ele != NULL) {
|
||||
if(sub_ele != nullptr) {
|
||||
|
||||
// text = sub_ele->Attribute("ip");
|
||||
// if (text)
|
||||
@@ -228,7 +228,7 @@ void EQEmuConfig::do_zones(TiXmlElement *ele) {
|
||||
|
||||
// Get the <ports> element
|
||||
sub_ele = ele->FirstChildElement("ports");
|
||||
if(sub_ele != NULL) {
|
||||
if(sub_ele != nullptr) {
|
||||
|
||||
text = sub_ele->Attribute("low");
|
||||
if (text)
|
||||
@@ -296,7 +296,7 @@ void EQEmuConfig::do_launcher(TiXmlElement *ele) {
|
||||
|
||||
// Get the <timers> element
|
||||
sub_ele = ele->FirstChildElement("timers");
|
||||
if(sub_ele != NULL) {
|
||||
if(sub_ele != nullptr) {
|
||||
text = sub_ele->Attribute("restart");
|
||||
if (text)
|
||||
RestartWait = atoi(text);
|
||||
@@ -315,7 +315,7 @@ void EQEmuConfig::do_launcher(TiXmlElement *ele) {
|
||||
}
|
||||
}
|
||||
|
||||
string EQEmuConfig::GetByName(const string &var_name) const {
|
||||
std::string EQEmuConfig::GetByName(const std::string &var_name) const {
|
||||
if(var_name == "ShortName")
|
||||
return(ShortName);
|
||||
if(var_name == "LongName")
|
||||
@@ -405,68 +405,44 @@ string EQEmuConfig::GetByName(const string &var_name) const {
|
||||
|
||||
void EQEmuConfig::Dump() const
|
||||
{
|
||||
cout << "ShortName = " << ShortName << endl;
|
||||
cout << "LongName = " << LongName << endl;
|
||||
cout << "WorldAddress = " << WorldAddress << endl;
|
||||
cout << "LoginHost = " << LoginHost << endl;
|
||||
cout << "LoginAccount = " << LoginAccount << endl;
|
||||
cout << "LoginPassword = " << LoginPassword << endl;
|
||||
cout << "LoginPort = " << LoginPort << endl;
|
||||
cout << "Locked = " << Locked << endl;
|
||||
cout << "WorldTCPPort = " << WorldTCPPort << endl;
|
||||
cout << "WorldIP = " << WorldIP << endl;
|
||||
cout << "TelnetEnabled = " << TelnetEnabled << endl;
|
||||
cout << "WorldHTTPPort = " << WorldHTTPPort << endl;
|
||||
cout << "WorldHTTPMimeFile = " << WorldHTTPMimeFile << endl;
|
||||
cout << "WorldHTTPEnabled = " << WorldHTTPEnabled << endl;
|
||||
cout << "ChatHost = " << ChatHost << endl;
|
||||
cout << "ChatPort = " << ChatPort << endl;
|
||||
cout << "MailHost = " << MailHost << endl;
|
||||
cout << "MailPort = " << MailPort << endl;
|
||||
cout << "DatabaseHost = " << DatabaseHost << endl;
|
||||
cout << "DatabaseUsername = " << DatabaseUsername << endl;
|
||||
cout << "DatabasePassword = " << DatabasePassword << endl;
|
||||
cout << "DatabaseDB = " << DatabaseDB << endl;
|
||||
cout << "DatabasePort = " << DatabasePort << endl;
|
||||
cout << "QSDatabaseHost = " << QSDatabaseHost << endl;
|
||||
cout << "QSDatabaseUsername = " << QSDatabaseUsername << endl;
|
||||
cout << "QSDatabasePassword = " << QSDatabasePassword << endl;
|
||||
cout << "QSDatabaseDB = " << QSDatabaseDB << endl;
|
||||
cout << "QSDatabasePort = " << QSDatabasePort << endl;
|
||||
cout << "SpellsFile = " << SpellsFile << endl;
|
||||
cout << "OpCodesFile = " << OpCodesFile << endl;
|
||||
cout << "EQTimeFile = " << EQTimeFile << endl;
|
||||
cout << "LogSettingsFile = " << LogSettingsFile << endl;
|
||||
cout << "MapDir = " << MapDir << endl;
|
||||
cout << "QuestDir = " << QuestDir << endl;
|
||||
cout << "PluginDir = " << PluginDir << endl;
|
||||
cout << "ZonePortLow = " << ZonePortLow << endl;
|
||||
cout << "ZonePortHigh = " << ZonePortHigh << endl;
|
||||
cout << "DefaultStatus = " << (int)DefaultStatus << endl;
|
||||
// cout << "DynamicCount = " << DynamicCount << endl;
|
||||
std::cout << "ShortName = " << ShortName << std::endl;
|
||||
std::cout << "LongName = " << LongName << std::endl;
|
||||
std::cout << "WorldAddress = " << WorldAddress << std::endl;
|
||||
std::cout << "LoginHost = " << LoginHost << std::endl;
|
||||
std::cout << "LoginAccount = " << LoginAccount << std::endl;
|
||||
std::cout << "LoginPassword = " << LoginPassword << std::endl;
|
||||
std::cout << "LoginPort = " << LoginPort << std::endl;
|
||||
std::cout << "Locked = " << Locked << std::endl;
|
||||
std::cout << "WorldTCPPort = " << WorldTCPPort << std::endl;
|
||||
std::cout << "WorldIP = " << WorldIP << std::endl;
|
||||
std::cout << "TelnetEnabled = " << TelnetEnabled << std::endl;
|
||||
std::cout << "WorldHTTPPort = " << WorldHTTPPort << std::endl;
|
||||
std::cout << "WorldHTTPMimeFile = " << WorldHTTPMimeFile << std::endl;
|
||||
std::cout << "WorldHTTPEnabled = " << WorldHTTPEnabled << std::endl;
|
||||
std::cout << "ChatHost = " << ChatHost << std::endl;
|
||||
std::cout << "ChatPort = " << ChatPort << std::endl;
|
||||
std::cout << "MailHost = " << MailHost << std::endl;
|
||||
std::cout << "MailPort = " << MailPort << std::endl;
|
||||
std::cout << "DatabaseHost = " << DatabaseHost << std::endl;
|
||||
std::cout << "DatabaseUsername = " << DatabaseUsername << std::endl;
|
||||
std::cout << "DatabasePassword = " << DatabasePassword << std::endl;
|
||||
std::cout << "DatabaseDB = " << DatabaseDB << std::endl;
|
||||
std::cout << "DatabasePort = " << DatabasePort << std::endl;
|
||||
std::cout << "QSDatabaseHost = " << QSDatabaseHost << std::endl;
|
||||
std::cout << "QSDatabaseUsername = " << QSDatabaseUsername << std::endl;
|
||||
std::cout << "QSDatabasePassword = " << QSDatabasePassword << std::endl;
|
||||
std::cout << "QSDatabaseDB = " << QSDatabaseDB << std::endl;
|
||||
std::cout << "QSDatabasePort = " << QSDatabasePort << std::endl;
|
||||
std::cout << "SpellsFile = " << SpellsFile << std::endl;
|
||||
std::cout << "OpCodesFile = " << OpCodesFile << std::endl;
|
||||
std::cout << "EQTimeFile = " << EQTimeFile << std::endl;
|
||||
std::cout << "LogSettingsFile = " << LogSettingsFile << std::endl;
|
||||
std::cout << "MapDir = " << MapDir << std::endl;
|
||||
std::cout << "QuestDir = " << QuestDir << std::endl;
|
||||
std::cout << "PluginDir = " << PluginDir << std::endl;
|
||||
std::cout << "ZonePortLow = " << ZonePortLow << std::endl;
|
||||
std::cout << "ZonePortHigh = " << ZonePortHigh << std::endl;
|
||||
std::cout << "DefaultStatus = " << (int)DefaultStatus << std::endl;
|
||||
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+38
-38
@@ -22,74 +22,74 @@
|
||||
#include "linked_list.h"
|
||||
|
||||
struct LoginConfig {
|
||||
string LoginHost;
|
||||
string LoginAccount;
|
||||
string LoginPassword;
|
||||
std::string LoginHost;
|
||||
std::string LoginAccount;
|
||||
std::string LoginPassword;
|
||||
uint16 LoginPort;
|
||||
};
|
||||
|
||||
class EQEmuConfig : public XMLParser {
|
||||
public:
|
||||
virtual string GetByName(const string &var_name) const;
|
||||
virtual std::string GetByName(const std::string &var_name) const;
|
||||
|
||||
// From <world/>
|
||||
string ShortName;
|
||||
string LongName;
|
||||
string WorldAddress;
|
||||
string LocalAddress;
|
||||
string LoginHost;
|
||||
string LoginAccount;
|
||||
string LoginPassword;
|
||||
std::string ShortName;
|
||||
std::string LongName;
|
||||
std::string WorldAddress;
|
||||
std::string LocalAddress;
|
||||
std::string LoginHost;
|
||||
std::string LoginAccount;
|
||||
std::string LoginPassword;
|
||||
uint16 LoginPort;
|
||||
uint32 LoginCount;
|
||||
LinkedList<LoginConfig*> loginlist;
|
||||
bool Locked;
|
||||
uint16 WorldTCPPort;
|
||||
string WorldIP;
|
||||
std::string WorldIP;
|
||||
bool TelnetEnabled;
|
||||
int32 MaxClients;
|
||||
bool WorldHTTPEnabled;
|
||||
uint16 WorldHTTPPort;
|
||||
string WorldHTTPMimeFile;
|
||||
string SharedKey;
|
||||
std::string WorldHTTPMimeFile;
|
||||
std::string SharedKey;
|
||||
|
||||
// From <chatserver/>
|
||||
string ChatHost;
|
||||
std::string ChatHost;
|
||||
uint16 ChatPort;
|
||||
|
||||
// From <mailserver/>
|
||||
string MailHost;
|
||||
std::string MailHost;
|
||||
uint16 MailPort;
|
||||
|
||||
// From <database/>
|
||||
string DatabaseHost;
|
||||
string DatabaseUsername;
|
||||
string DatabasePassword;
|
||||
string DatabaseDB;
|
||||
std::string DatabaseHost;
|
||||
std::string DatabaseUsername;
|
||||
std::string DatabasePassword;
|
||||
std::string DatabaseDB;
|
||||
uint16 DatabasePort;
|
||||
|
||||
// From <qsdatabase> // QueryServ
|
||||
string QSDatabaseHost;
|
||||
string QSDatabaseUsername;
|
||||
string QSDatabasePassword;
|
||||
string QSDatabaseDB;
|
||||
std::string QSDatabaseHost;
|
||||
std::string QSDatabaseUsername;
|
||||
std::string QSDatabasePassword;
|
||||
std::string QSDatabaseDB;
|
||||
uint16 QSDatabasePort;
|
||||
|
||||
// From <files/>
|
||||
string SpellsFile;
|
||||
string OpCodesFile;
|
||||
string EQTimeFile;
|
||||
string LogSettingsFile;
|
||||
std::string SpellsFile;
|
||||
std::string OpCodesFile;
|
||||
std::string EQTimeFile;
|
||||
std::string LogSettingsFile;
|
||||
|
||||
// From <directories/>
|
||||
string MapDir;
|
||||
string QuestDir;
|
||||
string PluginDir;
|
||||
std::string MapDir;
|
||||
std::string QuestDir;
|
||||
std::string PluginDir;
|
||||
|
||||
// From <launcher/>
|
||||
string LogPrefix;
|
||||
string LogSuffix;
|
||||
string ZoneExe;
|
||||
std::string LogPrefix;
|
||||
std::string LogSuffix;
|
||||
std::string ZoneExe;
|
||||
uint32 RestartWait;
|
||||
uint32 TerminateWait;
|
||||
uint32 InitialBootWait;
|
||||
@@ -108,7 +108,7 @@ protected:
|
||||
|
||||
static EQEmuConfig *_config;
|
||||
|
||||
static string ConfigFile;
|
||||
static std::string ConfigFile;
|
||||
|
||||
#define ELEMENT(name) \
|
||||
void do_##name(TiXmlElement *ele);
|
||||
@@ -204,17 +204,17 @@ public:
|
||||
|
||||
// Produce a const singleton
|
||||
static const EQEmuConfig *get() {
|
||||
if (_config == NULL)
|
||||
if (_config == nullptr)
|
||||
LoadConfig();
|
||||
return(_config);
|
||||
}
|
||||
|
||||
// Allow the use to set the conf file to be used.
|
||||
static void SetConfigFile(string file) { EQEmuConfig::ConfigFile = file; }
|
||||
static void SetConfigFile(std::string file) { EQEmuConfig::ConfigFile = file; }
|
||||
|
||||
// Load the config
|
||||
static bool LoadConfig() {
|
||||
if (_config != NULL)
|
||||
if (_config != nullptr)
|
||||
delete _config;
|
||||
_config=new EQEmuConfig;
|
||||
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
#include "../common/crc32.h"
|
||||
#include "../common/eq_packet_structs.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define EQN_DEBUG 0
|
||||
#define EQN_DEBUG_Error 0
|
||||
#define EQN_DEBUG_Packet 0
|
||||
@@ -230,19 +228,19 @@ void EQStreamServer::Process() {
|
||||
}
|
||||
}
|
||||
|
||||
map <string, EQStream*>::iterator connection;
|
||||
std::map <std::string, EQStream*>::iterator connection;
|
||||
for (connection = connection_list.begin( ); connection != connection_list.end( );)
|
||||
{
|
||||
if(!connection->second)
|
||||
{
|
||||
map <string, EQStream*>::iterator tmp=connection;
|
||||
std::map <std::string, EQStream*>::iterator tmp=connection;
|
||||
connection++;
|
||||
connection_list.erase(tmp);
|
||||
continue;
|
||||
}
|
||||
EQStream* eqs_data = connection->second;
|
||||
if (eqs_data->IsFree() && (!eqs_data->CheckNetActive())) {
|
||||
map <string, EQStream*>::iterator tmp=connection;
|
||||
std::map <std::string, EQStream*>::iterator tmp=connection;
|
||||
connection++;
|
||||
safe_delete(eqs_data);
|
||||
connection_list.erase(tmp);
|
||||
@@ -277,7 +275,7 @@ void EQStreamServer::RecvData(uchar* data, uint32 size, uint32 irIP, uint16 irPo
|
||||
sprintf(temp,"%lu:%u",(unsigned long)irIP,irPort);
|
||||
cout << "Data from " << temp << endl;
|
||||
EQStream* tmp = NULL;
|
||||
map <string, EQStream*>::iterator connection;
|
||||
std::map <std::string, EQStream*>::iterator connection;
|
||||
if ((connection=connection_list.find(temp))!=connection_list.end())
|
||||
tmp=connection->second;
|
||||
if(tmp != NULL && tmp->GetrPort() == irPort)
|
||||
|
||||
+2
-3
@@ -30,7 +30,6 @@
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
|
||||
#include "../common/types.h"
|
||||
#include "../common/timer.h"
|
||||
@@ -114,8 +113,8 @@ private:
|
||||
Mutex MNewQueue;
|
||||
Mutex MOpen;
|
||||
|
||||
map<string,EQStream*> connection_list;
|
||||
queue<EQStream *> NewQueue;
|
||||
std::map<std::string,EQStream*> connection_list;
|
||||
std::queue<EQStream *> NewQueue;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+8
-10
@@ -32,8 +32,6 @@
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
using namespace std;
|
||||
|
||||
EQPacket::EQPacket(EmuOpcode op, const unsigned char *buf, uint32 len)
|
||||
: BasePacket(buf, len),
|
||||
emu_opcode(op)
|
||||
@@ -61,7 +59,7 @@ void EQPacket::build_header_dump(char *buffer) const {
|
||||
void EQPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
|
||||
{
|
||||
if (src_ip) {
|
||||
string sIP,dIP;;
|
||||
std::string sIP,dIP;;
|
||||
sIP=long2ip(src_ip);
|
||||
dIP=long2ip(dst_ip);
|
||||
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
|
||||
@@ -95,7 +93,7 @@ void EQProtocolPacket::build_header_dump(char *buffer) const
|
||||
void EQProtocolPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
|
||||
{
|
||||
if (src_ip) {
|
||||
string sIP,dIP;;
|
||||
std::string sIP,dIP;;
|
||||
sIP=long2ip(src_ip);
|
||||
dIP=long2ip(dst_ip);
|
||||
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
|
||||
@@ -137,7 +135,7 @@ void EQApplicationPacket::build_header_dump(char *buffer) const
|
||||
void EQApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
|
||||
{
|
||||
if (src_ip) {
|
||||
string sIP,dIP;;
|
||||
std::string sIP,dIP;;
|
||||
sIP=long2ip(src_ip);
|
||||
dIP=long2ip(dst_ip);
|
||||
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
|
||||
@@ -183,7 +181,7 @@ void EQRawApplicationPacket::build_header_dump(char *buffer) const
|
||||
void EQRawApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
|
||||
{
|
||||
if (src_ip) {
|
||||
string sIP,dIP;;
|
||||
std::string sIP,dIP;;
|
||||
sIP=long2ip(src_ip);
|
||||
dIP=long2ip(dst_ip);
|
||||
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
|
||||
@@ -248,7 +246,7 @@ uint32 offset;
|
||||
memcpy(pBuffer,buf+offset,len-offset);
|
||||
size=len-offset;
|
||||
} else {
|
||||
pBuffer=NULL;
|
||||
pBuffer=nullptr;
|
||||
size=0;
|
||||
}
|
||||
OpMgr=&RawOpcodeManager;
|
||||
@@ -294,7 +292,7 @@ get running again... but might be a good thing some day.
|
||||
bool EQApplicationPacket::combine(const EQApplicationPacket *rhs)
|
||||
{
|
||||
uint32 newsize=0, offset=0;
|
||||
unsigned char *tmpbuffer=NULL;
|
||||
unsigned char *tmpbuffer=nullptr;
|
||||
|
||||
if (opcode!=OP_AppCombined) {
|
||||
newsize=app_opcode_size+size+(size>254?3:1)+app_opcode_size+rhs->size+(rhs->size>254?3:1);
|
||||
@@ -502,8 +500,8 @@ EQRawApplicationPacket::EQRawApplicationPacket(const unsigned char *buf, const u
|
||||
|
||||
void DumpPacket(const EQApplicationPacket* app, bool iShowInfo) {
|
||||
if (iShowInfo) {
|
||||
cout << "Dumping Applayer: 0x" << hex << setfill('0') << setw(4) << app->GetOpcode() << dec;
|
||||
cout << " size:" << app->size << endl;
|
||||
std::cout << "Dumping Applayer: 0x" << std::hex << std::setfill('0') << std::setw(4) << app->GetOpcode() << std::dec;
|
||||
std::cout << " size:" << app->size << std::endl;
|
||||
}
|
||||
DumpPacketHex(app->pBuffer, app->size);
|
||||
// DumpPacketAscii(app->pBuffer, app->size);
|
||||
|
||||
+4
-6
@@ -30,8 +30,6 @@
|
||||
#include "emu_opcodes.h"
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
class EQStream;
|
||||
class EQStreamPair;
|
||||
|
||||
@@ -58,7 +56,7 @@ protected:
|
||||
|
||||
EQPacket(EmuOpcode opcode, const unsigned char *buf, const uint32 len);
|
||||
// EQPacket(const EQPacket &p) { }
|
||||
EQPacket() { emu_opcode=OP_Unknown; pBuffer=NULL; size=0; }
|
||||
EQPacket() { emu_opcode=OP_Unknown; pBuffer=nullptr; size=0; }
|
||||
|
||||
};
|
||||
|
||||
@@ -102,11 +100,11 @@ class EQApplicationPacket : public EQPacket {
|
||||
// friend class EQProtocolPacket;
|
||||
friend class EQStream;
|
||||
public:
|
||||
EQApplicationPacket() : EQPacket(OP_Unknown,NULL,0)
|
||||
EQApplicationPacket() : EQPacket(OP_Unknown,nullptr,0)
|
||||
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
|
||||
EQApplicationPacket(const EmuOpcode op) : EQPacket(op,NULL,0)
|
||||
EQApplicationPacket(const EmuOpcode op) : EQPacket(op,nullptr,0)
|
||||
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
|
||||
EQApplicationPacket(const EmuOpcode op, const uint32 len) : EQPacket(op,NULL,len)
|
||||
EQApplicationPacket(const EmuOpcode op, const uint32 len) : EQPacket(op,nullptr,len)
|
||||
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
|
||||
EQApplicationPacket(const EmuOpcode op, const unsigned char *buf, const uint32 len) : EQPacket(op,buf,len)
|
||||
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
|
||||
|
||||
+89
-67
@@ -15,16 +15,32 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "debug.h"
|
||||
#include "EQPacket.h"
|
||||
#include "EQStream.h"
|
||||
#include "misc.h"
|
||||
#include "Mutex.h"
|
||||
#include "op_codes.h"
|
||||
#include "CRC16.h"
|
||||
|
||||
#include <string>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
#include <algorithm>
|
||||
|
||||
#if defined(ZONE) || defined(WORLD)
|
||||
#define RETRANSMITS
|
||||
#endif
|
||||
#ifdef RETRANSMITS
|
||||
#include "rulesys.h"
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <time.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/time.h>
|
||||
@@ -33,20 +49,6 @@
|
||||
#include <fcntl.h>
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#include "EQPacket.h"
|
||||
#include "EQStream.h"
|
||||
//#include "EQStreamFactory.h"
|
||||
#include "misc.h"
|
||||
#include "Mutex.h"
|
||||
#include "op_codes.h"
|
||||
#include "CRC16.h"
|
||||
|
||||
#if defined(ZONE) || defined(WORLD)
|
||||
#define RETRANSMITS
|
||||
#endif
|
||||
#ifdef RETRANSMITS
|
||||
#include "rulesys.h"
|
||||
#endif
|
||||
|
||||
//for logsys
|
||||
#define _L "%s:%d: "
|
||||
@@ -65,7 +67,7 @@ void EQStream::init() {
|
||||
LastAckSent=-1;
|
||||
MaxSends=5;
|
||||
LastPacket=0;
|
||||
oversize_buffer=NULL;
|
||||
oversize_buffer=nullptr;
|
||||
oversize_length=0;
|
||||
oversize_offset=0;
|
||||
RateThreshold=RATEBASE/250;
|
||||
@@ -77,7 +79,7 @@ void EQStream::init() {
|
||||
retransmittimer = Timer::GetCurrentTime();
|
||||
retransmittimeout = 500 * RuleR(EQStream, RetransmitTimeoutMult); //use 500ms as base before we have connection stats
|
||||
#endif
|
||||
OpMgr = NULL;
|
||||
OpMgr = nullptr;
|
||||
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||
_log(NET__ERROR, _L "init Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||
}
|
||||
@@ -88,7 +90,7 @@ if(NextSequencedSend > SequencedQueue.size()) {
|
||||
|
||||
EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
|
||||
{
|
||||
EQRawApplicationPacket *ap=NULL;
|
||||
EQRawApplicationPacket *ap=nullptr;
|
||||
_log(NET__APP_CREATE, _L "Creating new application packet, length %d" __L, p->size);
|
||||
_raw(NET__APP_CREATE_HEX, 0xFFFF, p);
|
||||
ap = p->MakeAppPacket();
|
||||
@@ -97,7 +99,7 @@ EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
|
||||
|
||||
EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf, uint32 len)
|
||||
{
|
||||
EQRawApplicationPacket *ap=NULL;
|
||||
EQRawApplicationPacket *ap=nullptr;
|
||||
_log(NET__APP_CREATE, _L "Creating new application packet, length %d" __L, len);
|
||||
_hex(NET__APP_CREATE_HEX, buf, len);
|
||||
ap = new EQRawApplicationPacket(buf, len);
|
||||
@@ -117,7 +119,7 @@ EQProtocolPacket *EQStream::MakeProtocolPacket(const unsigned char *buf, uint32
|
||||
void EQStream::ProcessPacket(EQProtocolPacket *p)
|
||||
{
|
||||
uint32 processed=0,subpacket_length=0;
|
||||
if (p == NULL)
|
||||
if (p == nullptr)
|
||||
return;
|
||||
// Raw Application packet
|
||||
if (p->opcode > 0xff) {
|
||||
@@ -153,7 +155,7 @@ uint32 processed=0,subpacket_length=0;
|
||||
case OP_AppCombined: {
|
||||
processed=0;
|
||||
while(processed<p->size) {
|
||||
EQRawApplicationPacket *ap=NULL;
|
||||
EQRawApplicationPacket *ap=nullptr;
|
||||
if ((subpacket_length=(unsigned char)*(p->pBuffer+processed))!=0xff) {
|
||||
_log(NET__NET_CREATE, _L "Extracting combined app packet of length %d, short len" __L, subpacket_length);
|
||||
ap=MakeApplicationPacket(p->pBuffer+processed+1,subpacket_length);
|
||||
@@ -173,6 +175,11 @@ uint32 processed=0,subpacket_length=0;
|
||||
break;
|
||||
|
||||
case OP_Packet: {
|
||||
if(!p->pBuffer || (p->Size() < 4))
|
||||
{
|
||||
_log(NET__ERROR, _L "Received OP_Packet that was of malformed size" __L);
|
||||
break;
|
||||
}
|
||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||
SeqOrder check=CompareSequence(NextInSeq,seq);
|
||||
if (check == SeqFuture) {
|
||||
@@ -218,6 +225,11 @@ uint32 processed=0,subpacket_length=0;
|
||||
break;
|
||||
|
||||
case OP_Fragment: {
|
||||
if(!p->pBuffer || (p->Size() < 4))
|
||||
{
|
||||
_log(NET__ERROR, _L "Received OP_Fragment that was of malformed size" __L);
|
||||
break;
|
||||
}
|
||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||
SeqOrder check=CompareSequence(NextInSeq,seq);
|
||||
if (check == SeqFuture) {
|
||||
@@ -263,7 +275,7 @@ uint32 processed=0,subpacket_length=0;
|
||||
}
|
||||
}
|
||||
delete[] oversize_buffer;
|
||||
oversize_buffer=NULL;
|
||||
oversize_buffer=nullptr;
|
||||
oversize_offset=0;
|
||||
}
|
||||
} else {
|
||||
@@ -284,6 +296,11 @@ uint32 processed=0,subpacket_length=0;
|
||||
}
|
||||
break;
|
||||
case OP_Ack: {
|
||||
if(!p->pBuffer || (p->Size() < 4))
|
||||
{
|
||||
_log(NET__ERROR, _L "Received OP_Ack that was of malformed size" __L);
|
||||
break;
|
||||
}
|
||||
#ifndef COLLECTOR
|
||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||
AckPackets(seq);
|
||||
@@ -383,6 +400,11 @@ uint32 processed=0,subpacket_length=0;
|
||||
}
|
||||
break;
|
||||
case OP_OutOfOrderAck: {
|
||||
if(!p->pBuffer || (p->Size() < 4))
|
||||
{
|
||||
_log(NET__ERROR, _L "Received OP_OutOfOrderAck that was of malformed size" __L);
|
||||
break;
|
||||
}
|
||||
#ifndef COLLECTOR
|
||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||
MOutboundQueue.lock();
|
||||
@@ -404,7 +426,7 @@ if(NextSequencedSend > SequencedQueue.size()) {
|
||||
uint16 index = seq - SequencedBase;
|
||||
_log(NET__NET_TRACE, _L " OP_OutOfOrderAck marking packet acked in queue (queue index = %d, queue size = %d)." __L, index, sqsize);
|
||||
if (index < sqsize) {
|
||||
deque<EQProtocolPacket *>::iterator sitr;
|
||||
std::deque<EQProtocolPacket *>::iterator sitr;
|
||||
sitr = SequencedQueue.begin();
|
||||
sitr += index;
|
||||
(*sitr)->acked = true;
|
||||
@@ -480,24 +502,24 @@ if(NextSequencedSend > SequencedQueue.size()) {
|
||||
|
||||
void EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req)
|
||||
{
|
||||
if(p == NULL)
|
||||
if(p == nullptr)
|
||||
return;
|
||||
|
||||
EQApplicationPacket *newp = p->Copy();
|
||||
|
||||
if (newp != NULL)
|
||||
if (newp != nullptr)
|
||||
FastQueuePacket(&newp, ack_req);
|
||||
}
|
||||
|
||||
void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req)
|
||||
{
|
||||
EQApplicationPacket *pack=*p;
|
||||
*p = NULL; //clear caller's pointer.. effectively takes ownership
|
||||
*p = nullptr; //clear caller's pointer.. effectively takes ownership
|
||||
|
||||
if(pack == NULL)
|
||||
if(pack == nullptr)
|
||||
return;
|
||||
|
||||
if(OpMgr == NULL || *OpMgr == NULL) {
|
||||
if(OpMgr == nullptr || *OpMgr == nullptr) {
|
||||
_log(NET__DEBUG, _L "Packet enqueued into a stream with no opcode manager, dropping." __L);
|
||||
delete pack;
|
||||
return;
|
||||
@@ -537,7 +559,7 @@ uint32 length;
|
||||
unsigned char *tmpbuff=new unsigned char[p->size+3];
|
||||
length=p->serialize(opcode, tmpbuff);
|
||||
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_Fragment,NULL,MaxLen-4);
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_Fragment,nullptr,MaxLen-4);
|
||||
*(uint32 *)(out->pBuffer+2)=htonl(p->Size());
|
||||
used=MaxLen-10;
|
||||
memcpy(out->pBuffer+6,tmpbuff,used);
|
||||
@@ -546,8 +568,8 @@ uint32 length;
|
||||
|
||||
|
||||
while (used<length) {
|
||||
out=new EQProtocolPacket(OP_Fragment,NULL,MaxLen-4);
|
||||
chunksize=min(length-used,MaxLen-6);
|
||||
out=new EQProtocolPacket(OP_Fragment,nullptr,MaxLen-4);
|
||||
chunksize=std::min(length-used,MaxLen-6);
|
||||
memcpy(out->pBuffer+2,tmpbuff+used,chunksize);
|
||||
out->size=chunksize+2;
|
||||
SequencedPush(out);
|
||||
@@ -626,9 +648,9 @@ uint16 Seq=htons(seq);
|
||||
|
||||
void EQStream::Write(int eq_fd)
|
||||
{
|
||||
queue<EQProtocolPacket *> ReadyToSend;
|
||||
std::queue<EQProtocolPacket *> ReadyToSend;
|
||||
bool SeqEmpty=false,NonSeqEmpty=false;
|
||||
deque<EQProtocolPacket *>::iterator sitr;
|
||||
std::deque<EQProtocolPacket *>::iterator sitr;
|
||||
|
||||
// Check our rate to make sure we can send more
|
||||
MRate.lock();
|
||||
@@ -649,7 +671,7 @@ deque<EQProtocolPacket *>::iterator sitr;
|
||||
MOutboundQueue.lock();
|
||||
|
||||
// Place to hold the base packet t combine into
|
||||
EQProtocolPacket *p=NULL;
|
||||
EQProtocolPacket *p=nullptr;
|
||||
|
||||
#ifdef RETRANSMITS
|
||||
// if we have a timeout defined and we have not received an ack recently enough, retransmit from beginning of queue
|
||||
@@ -682,7 +704,7 @@ deque<EQProtocolPacket *>::iterator sitr;
|
||||
_log(NET__NET_COMBINE, _L "Combined packet full at len %d, next non-seq packet is len %d" __L, p->size, (NonSequencedQueue.front())->size);
|
||||
ReadyToSend.push(p);
|
||||
BytesWritten+=p->size;
|
||||
p=NULL;
|
||||
p=nullptr;
|
||||
|
||||
if (BytesWritten > threshold) {
|
||||
// Sent enough this round, lets stop to be fair
|
||||
@@ -741,7 +763,7 @@ continue;
|
||||
_log(NET__NET_COMBINE, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send, (*sitr)->size);
|
||||
ReadyToSend.push(p);
|
||||
BytesWritten+=p->size;
|
||||
p=NULL;
|
||||
p=nullptr;
|
||||
|
||||
if (BytesWritten > threshold) {
|
||||
// Sent enough this round, lets stop to be fair
|
||||
@@ -844,7 +866,7 @@ EQProtocolPacket *EQStream::Read(int eq_fd, sockaddr_in *from)
|
||||
{
|
||||
int socklen;
|
||||
int length=0;
|
||||
EQProtocolPacket *p=NULL;
|
||||
EQProtocolPacket *p=nullptr;
|
||||
char temp[15];
|
||||
|
||||
socklen=sizeof(sockaddr);
|
||||
@@ -873,7 +895,7 @@ char temp[15];
|
||||
|
||||
void EQStream::SendSessionResponse()
|
||||
{
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,NULL,sizeof(SessionResponse));
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,nullptr,sizeof(SessionResponse));
|
||||
SessionResponse *Response=(SessionResponse *)out->pBuffer;
|
||||
Response->Session=htonl(Session);
|
||||
Response->MaxLength=htonl(MaxLen);
|
||||
@@ -895,10 +917,10 @@ EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,NULL,sizeof(Sessio
|
||||
|
||||
void EQStream::SendSessionRequest()
|
||||
{
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,NULL,sizeof(SessionRequest));
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,nullptr,sizeof(SessionRequest));
|
||||
SessionRequest *Request=(SessionRequest *)out->pBuffer;
|
||||
memset(Request,0,sizeof(SessionRequest));
|
||||
Request->Session=htonl(time(NULL));
|
||||
Request->Session=htonl(time(nullptr));
|
||||
Request->MaxLength=htonl(512);
|
||||
|
||||
_log(NET__NET_TRACE, _L "Sending OP_SessionRequest: session %lu, maxlen=%d" __L, (unsigned long)ntohl(Request->Session), ntohl(Request->MaxLength));
|
||||
@@ -911,7 +933,7 @@ void EQStream::_SendDisconnect()
|
||||
if(GetState() == CLOSED)
|
||||
return;
|
||||
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionDisconnect,NULL,sizeof(uint32));
|
||||
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionDisconnect,nullptr,sizeof(uint32));
|
||||
*(uint32 *)out->pBuffer=htonl(Session);
|
||||
NonSequencedPush(out);
|
||||
|
||||
@@ -927,11 +949,11 @@ void EQStream::InboundQueuePush(EQRawApplicationPacket *p)
|
||||
|
||||
EQApplicationPacket *EQStream::PopPacket()
|
||||
{
|
||||
EQRawApplicationPacket *p=NULL;
|
||||
EQRawApplicationPacket *p=nullptr;
|
||||
|
||||
MInboundQueue.lock();
|
||||
if (InboundQueue.size()) {
|
||||
vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
|
||||
std::vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
|
||||
p=*itr;
|
||||
InboundQueue.erase(itr);
|
||||
}
|
||||
@@ -939,7 +961,7 @@ EQRawApplicationPacket *p=NULL;
|
||||
|
||||
//resolve the opcode if we can.
|
||||
if(p) {
|
||||
if(OpMgr != NULL && *OpMgr != NULL) {
|
||||
if(OpMgr != nullptr && *OpMgr != nullptr) {
|
||||
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
|
||||
#if EQDEBUG >= 4
|
||||
if(emu_op == OP_Unknown) {
|
||||
@@ -955,11 +977,11 @@ EQRawApplicationPacket *p=NULL;
|
||||
|
||||
EQRawApplicationPacket *EQStream::PopRawPacket()
|
||||
{
|
||||
EQRawApplicationPacket *p=NULL;
|
||||
EQRawApplicationPacket *p=nullptr;
|
||||
|
||||
MInboundQueue.lock();
|
||||
if (InboundQueue.size()) {
|
||||
vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
|
||||
std::vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
|
||||
p=*itr;
|
||||
InboundQueue.erase(itr);
|
||||
}
|
||||
@@ -967,7 +989,7 @@ EQRawApplicationPacket *p=NULL;
|
||||
|
||||
//resolve the opcode if we can.
|
||||
if(p) {
|
||||
if(OpMgr != NULL && *OpMgr != NULL) {
|
||||
if(OpMgr != nullptr && *OpMgr != nullptr) {
|
||||
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
|
||||
#if EQDEBUG >= 4
|
||||
if(emu_op == OP_Unknown) {
|
||||
@@ -983,11 +1005,11 @@ EQRawApplicationPacket *p=NULL;
|
||||
|
||||
EQRawApplicationPacket *EQStream::PeekPacket()
|
||||
{
|
||||
EQRawApplicationPacket *p=NULL;
|
||||
EQRawApplicationPacket *p=nullptr;
|
||||
|
||||
MInboundQueue.lock();
|
||||
if (InboundQueue.size()) {
|
||||
vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
|
||||
std::vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
|
||||
p=*itr;
|
||||
}
|
||||
MInboundQueue.unlock();
|
||||
@@ -997,13 +1019,13 @@ EQRawApplicationPacket *p=NULL;
|
||||
|
||||
void EQStream::InboundQueueClear()
|
||||
{
|
||||
EQApplicationPacket *p=NULL;
|
||||
EQApplicationPacket *p=nullptr;
|
||||
|
||||
_log(NET__APP_TRACE, _L "Clearing inbound queue" __L);
|
||||
|
||||
MInboundQueue.lock();
|
||||
if (!InboundQueue.empty()) {
|
||||
vector<EQRawApplicationPacket *>::iterator itr;
|
||||
std::vector<EQRawApplicationPacket *>::iterator itr;
|
||||
for(itr=InboundQueue.begin();itr!=InboundQueue.end();itr++) {
|
||||
p=*itr;
|
||||
delete p;
|
||||
@@ -1040,7 +1062,7 @@ bool flag;
|
||||
|
||||
void EQStream::OutboundQueueClear()
|
||||
{
|
||||
EQProtocolPacket *p=NULL;
|
||||
EQProtocolPacket *p=nullptr;
|
||||
|
||||
_log(NET__APP_TRACE, _L "Clearing outbound queue" __L);
|
||||
|
||||
@@ -1050,7 +1072,7 @@ EQProtocolPacket *p=NULL;
|
||||
NonSequencedQueue.pop();
|
||||
}
|
||||
if(!SequencedQueue.empty()) {
|
||||
deque<EQProtocolPacket *>::iterator itr;
|
||||
std::deque<EQProtocolPacket *>::iterator itr;
|
||||
for(itr=SequencedQueue.begin();itr!=SequencedQueue.end();itr++) {
|
||||
p=*itr;
|
||||
delete p;
|
||||
@@ -1070,12 +1092,12 @@ if(NextSequencedSend > SequencedQueue.size()) {
|
||||
|
||||
void EQStream::PacketQueueClear()
|
||||
{
|
||||
EQProtocolPacket *p=NULL;
|
||||
EQProtocolPacket *p=nullptr;
|
||||
|
||||
_log(NET__APP_TRACE, _L "Clearing future packet queue" __L);
|
||||
|
||||
if(!PacketQueue.empty()) {
|
||||
map<unsigned short,EQProtocolPacket *>::iterator itr;
|
||||
std::map<unsigned short,EQProtocolPacket *>::iterator itr;
|
||||
for(itr=PacketQueue.begin();itr!=PacketQueue.end();itr++) {
|
||||
p=itr->second;
|
||||
delete p;
|
||||
@@ -1129,7 +1151,7 @@ long EQStream::GetLastAckSent()
|
||||
|
||||
void EQStream::AckPackets(uint16 seq)
|
||||
{
|
||||
deque<EQProtocolPacket *>::iterator itr, tmp;
|
||||
std::deque<EQProtocolPacket *>::iterator itr, tmp;
|
||||
|
||||
MOutboundQueue.lock();
|
||||
//do a bit of sanity checking.
|
||||
@@ -1203,8 +1225,8 @@ void EQStream::ProcessQueue()
|
||||
return;
|
||||
}
|
||||
|
||||
EQProtocolPacket *qp=NULL;
|
||||
while((qp=RemoveQueue(NextInSeq))!=NULL) {
|
||||
EQProtocolPacket *qp=nullptr;
|
||||
while((qp=RemoveQueue(NextInSeq))!=nullptr) {
|
||||
_log(NET__DEBUG, _L "Processing Queued Packet: Seq=%d" __L, NextInSeq);
|
||||
ProcessPacket(qp);
|
||||
delete qp;
|
||||
@@ -1214,8 +1236,8 @@ void EQStream::ProcessQueue()
|
||||
|
||||
EQProtocolPacket *EQStream::RemoveQueue(uint16 seq)
|
||||
{
|
||||
map<unsigned short,EQProtocolPacket *>::iterator itr;
|
||||
EQProtocolPacket *qp=NULL;
|
||||
std::map<unsigned short,EQProtocolPacket *>::iterator itr;
|
||||
EQProtocolPacket *qp=nullptr;
|
||||
if ((itr=PacketQueue.find(seq))!=PacketQueue.end()) {
|
||||
qp=itr->second;
|
||||
PacketQueue.erase(itr);
|
||||
@@ -1336,6 +1358,9 @@ void EQStream::CheckTimeout(uint32 now, uint32 timeout) {
|
||||
_log(NET__DEBUG, _L "Timeout expired in established state. Closing connection." __L);
|
||||
_SendDisconnect();
|
||||
SetState(DISCONNECTING);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1388,7 +1413,7 @@ void EQStream::Close() {
|
||||
//this could be expanded to check more than the fitst opcode if
|
||||
//we needed more complex matching
|
||||
EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
|
||||
EQRawApplicationPacket *p = NULL;
|
||||
EQRawApplicationPacket *p = nullptr;
|
||||
MatchState res = MatchNotReady;
|
||||
|
||||
MInboundQueue.lock();
|
||||
@@ -1399,10 +1424,10 @@ EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
|
||||
if(InboundQueue.size() > 1) {
|
||||
p = InboundQueue[1];
|
||||
} else {
|
||||
p = NULL;
|
||||
p = nullptr;
|
||||
}
|
||||
}
|
||||
if(p == NULL) {
|
||||
if(p == nullptr) {
|
||||
//first opcode is ignored, and nothing else remains... keep waiting
|
||||
} else if(p->opcode == sig->first_eq_opcode) {
|
||||
//opcode matches, check length..
|
||||
@@ -1428,6 +1453,3 @@ EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
|
||||
return(res);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+5
-7
@@ -18,8 +18,6 @@
|
||||
#include "../common/Condition.h"
|
||||
#include "../common/timer.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define FLAG_COMPRESSED 0x01
|
||||
#define FLAG_ENCODED 0x04
|
||||
|
||||
@@ -113,8 +111,8 @@ class EQStream : public EQStreamInterface {
|
||||
Mutex MAcks;
|
||||
|
||||
// Packets waiting to be sent (all protected by MOutboundQueue)
|
||||
queue<EQProtocolPacket *> NonSequencedQueue;
|
||||
deque<EQProtocolPacket *> SequencedQueue;
|
||||
std::queue<EQProtocolPacket *> NonSequencedQueue;
|
||||
std::deque<EQProtocolPacket *> SequencedQueue;
|
||||
uint16 NextOutSeq;
|
||||
uint16 SequencedBase; //the sequence number of SequencedQueue[0]
|
||||
long NextSequencedSend; //index into SequencedQueue
|
||||
@@ -124,8 +122,8 @@ class EQStream : public EQStreamInterface {
|
||||
unsigned char _tempBuffer[2048];
|
||||
|
||||
// Packets waiting to be processed
|
||||
vector<EQRawApplicationPacket *> InboundQueue;
|
||||
map<unsigned short,EQProtocolPacket *> PacketQueue; //not mutex protected, only accessed by caller of Process()
|
||||
std::vector<EQRawApplicationPacket *> InboundQueue;
|
||||
std::map<unsigned short,EQProtocolPacket *> PacketQueue; //not mutex protected, only accessed by caller of Process()
|
||||
Mutex MInboundQueue;
|
||||
|
||||
static uint16 MaxWindowSize;
|
||||
@@ -277,5 +275,5 @@ class EQStream : public EQStreamInterface {
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+15
-35
@@ -19,8 +19,6 @@
|
||||
#include "EQStream.h"
|
||||
#include "logsys.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs)
|
||||
{
|
||||
EQStreamFactory *fs=(EQStreamFactory *)eqfs;
|
||||
@@ -35,7 +33,7 @@ EQStreamFactory *fs=(EQStreamFactory *)eqfs;
|
||||
_log(COMMON__THREADS, "Ending EQStreamFactoryReaderLoop with thread ID %d", pthread_self());
|
||||
#endif
|
||||
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
|
||||
ThreadReturnType EQStreamFactoryWriterLoop(void *eqfs)
|
||||
@@ -52,7 +50,7 @@ ThreadReturnType EQStreamFactoryWriterLoop(void *eqfs)
|
||||
_log(COMMON__THREADS, "Ending EQStreamFactoryWriterLoop with thread ID %d", pthread_self());
|
||||
#endif
|
||||
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
|
||||
EQStreamFactory::EQStreamFactory(EQStreamType type, int port, uint32 timeout)
|
||||
@@ -112,15 +110,15 @@ struct sockaddr_in address;
|
||||
_beginthread(EQStreamFactoryReaderLoop,0, this);
|
||||
_beginthread(EQStreamFactoryWriterLoop,0, this);
|
||||
#else
|
||||
pthread_create(&t1,NULL,EQStreamFactoryReaderLoop,this);
|
||||
pthread_create(&t2,NULL,EQStreamFactoryWriterLoop,this);
|
||||
pthread_create(&t1,nullptr,EQStreamFactoryReaderLoop,this);
|
||||
pthread_create(&t2,nullptr,EQStreamFactoryWriterLoop,this);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
EQStream *EQStreamFactory::Pop()
|
||||
{
|
||||
EQStream *s=NULL;
|
||||
EQStream *s=nullptr;
|
||||
//cout << "Pop():Locking MNewStreams" << endl;
|
||||
MNewStreams.lock();
|
||||
if (NewStreams.size()) {
|
||||
@@ -146,7 +144,7 @@ void EQStreamFactory::Push(EQStream *s)
|
||||
void EQStreamFactory::ReaderLoop()
|
||||
{
|
||||
fd_set readset;
|
||||
map<string,EQStream *>::iterator stream_itr;
|
||||
std::map<std::string,EQStream *>::iterator stream_itr;
|
||||
int num;
|
||||
int length;
|
||||
unsigned char buffer[2048];
|
||||
@@ -167,7 +165,7 @@ timeval sleep_time;
|
||||
|
||||
sleep_time.tv_sec=30;
|
||||
sleep_time.tv_usec=0;
|
||||
if ((num=select(sock+1,&readset,NULL,NULL,&sleep_time))<0) {
|
||||
if ((num=select(sock+1,&readset,nullptr,nullptr,&sleep_time))<0) {
|
||||
// What do we wanna do?
|
||||
continue;
|
||||
} else if (num==0)
|
||||
@@ -204,7 +202,7 @@ timeval sleep_time;
|
||||
EQStream *curstream = stream_itr->second;
|
||||
//dont bother processing incoming packets for closed connections
|
||||
if(curstream->CheckClosed())
|
||||
curstream = NULL;
|
||||
curstream = nullptr;
|
||||
else
|
||||
curstream->PutInUse();
|
||||
MStreams.unlock(); //the in use flag prevents the stream from being deleted while we are using it.
|
||||
@@ -227,7 +225,7 @@ void EQStreamFactory::CheckTimeout()
|
||||
MStreams.lock();
|
||||
|
||||
unsigned long now=Timer::GetCurrentTime();
|
||||
map<string,EQStream *>::iterator stream_itr;
|
||||
std::map<std::string,EQStream *>::iterator stream_itr;
|
||||
|
||||
for(stream_itr=Streams.begin();stream_itr!=Streams.end();) {
|
||||
EQStream *s = stream_itr->second;
|
||||
@@ -243,7 +241,7 @@ void EQStreamFactory::CheckTimeout()
|
||||
} else {
|
||||
//everybody is done, we can delete it now
|
||||
//cout << "Removing connection" << endl;
|
||||
map<string,EQStream *>::iterator temp=stream_itr;
|
||||
std::map<std::string,EQStream *>::iterator temp=stream_itr;
|
||||
stream_itr++;
|
||||
//let whoever has the stream outside delete it
|
||||
delete temp->second;
|
||||
@@ -259,10 +257,10 @@ void EQStreamFactory::CheckTimeout()
|
||||
|
||||
void EQStreamFactory::WriterLoop()
|
||||
{
|
||||
map<string,EQStream *>::iterator stream_itr;
|
||||
std::map<std::string,EQStream *>::iterator stream_itr;
|
||||
bool havework=true;
|
||||
vector<EQStream *> wants_write;
|
||||
vector<EQStream *>::iterator cur,end;
|
||||
std::vector<EQStream *> wants_write;
|
||||
std::vector<EQStream *>::iterator cur,end;
|
||||
bool decay=false;
|
||||
uint32 stream_count;
|
||||
|
||||
@@ -293,8 +291,8 @@ Timer DecayTimer(20);
|
||||
stream_itr->second->Decay();
|
||||
|
||||
//bullshit checking, to see if this is really happening, GDB seems to think so...
|
||||
if(stream_itr->second == NULL) {
|
||||
fprintf(stderr, "ERROR: NULL Stream encountered in EQStreamFactory::WriterLoop for: %s", stream_itr->first.c_str());
|
||||
if(stream_itr->second == nullptr) {
|
||||
fprintf(stderr, "ERROR: nullptr Stream encountered in EQStreamFactory::WriterLoop for: %s", stream_itr->first.c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -314,7 +312,6 @@ Timer DecayTimer(20);
|
||||
(*cur)->ReleaseFromUse();
|
||||
}
|
||||
|
||||
|
||||
Sleep(10);
|
||||
|
||||
MStreams.lock();
|
||||
@@ -328,20 +325,3 @@ Timer DecayTimer(20);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -24,10 +24,10 @@ class EQStreamFactory : private Timeoutable {
|
||||
|
||||
EQStreamType StreamType;
|
||||
|
||||
queue<EQStream *> NewStreams;
|
||||
std::queue<EQStream *> NewStreams;
|
||||
Mutex MNewStreams;
|
||||
|
||||
map<string,EQStream *> Streams;
|
||||
std::map<std::string,EQStream *> Streams;
|
||||
Mutex MStreams;
|
||||
|
||||
virtual void CheckTimeout();
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
|
||||
#include "debug.h"
|
||||
#include "EQStreamIdent.h"
|
||||
#include "EQStreamProxy.h"
|
||||
#include "logsys.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
EQStreamIdentifier::~EQStreamIdentifier() {
|
||||
while(!m_identified.empty()) {
|
||||
m_identified.front()->ReleaseFromUse();
|
||||
m_identified.pop();
|
||||
}
|
||||
vector<Record *>::iterator cur, end;
|
||||
std::vector<Record *>::iterator cur, end;
|
||||
cur = m_streams.begin();
|
||||
end = m_streams.end();
|
||||
for(; cur != end; cur++) {
|
||||
@@ -19,7 +16,7 @@ EQStreamIdentifier::~EQStreamIdentifier() {
|
||||
r->stream->ReleaseFromUse();
|
||||
delete r;
|
||||
}
|
||||
vector<Patch *>::iterator curp, endp;
|
||||
std::vector<Patch *>::iterator curp, endp;
|
||||
curp = m_patches.begin();
|
||||
endp = m_patches.end();
|
||||
for(; curp != endp; curp++) {
|
||||
@@ -37,8 +34,8 @@ void EQStreamIdentifier::RegisterPatch(const EQStream::Signature &sig, const cha
|
||||
}
|
||||
|
||||
void EQStreamIdentifier::Process() {
|
||||
vector<Record *>::iterator cur;
|
||||
vector<Patch *>::iterator curp, endp;
|
||||
std::vector<Record *>::iterator cur;
|
||||
std::vector<Patch *>::iterator curp, endp;
|
||||
|
||||
//foreach pending stream.
|
||||
cur = m_streams.begin();
|
||||
@@ -146,12 +143,12 @@ void EQStreamIdentifier::Process() {
|
||||
|
||||
void EQStreamIdentifier::AddStream(EQStream *&eqs) {
|
||||
m_streams.push_back(new Record(eqs));
|
||||
eqs = NULL;
|
||||
eqs = nullptr;
|
||||
}
|
||||
|
||||
EQStreamInterface *EQStreamIdentifier::PopIdentified() {
|
||||
if(m_identified.empty())
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
EQStreamInterface *res = m_identified.front();
|
||||
m_identified.pop();
|
||||
return(res);
|
||||
@@ -163,37 +160,3 @@ EQStreamIdentifier::Record::Record(EQStream *s)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ This did not turn out nearly as nice as I hoped.
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
class EQStreamInfo {
|
||||
public:
|
||||
@@ -99,11 +98,11 @@ inline bool operator==(const EQStreamInfo &l, const EQStreamInfo &r) {
|
||||
return(l.src_ip == r.src_ip && l.src_port == r.src_port && l.dst_ip == r.dst_ip && l.dst_port == r.dst_port);
|
||||
}
|
||||
|
||||
//Forces the pointer T thing so we can return NULL
|
||||
//Forces the pointer T thing so we can return nullptr
|
||||
template <class T>
|
||||
class EQStreamLocator {
|
||||
protected:
|
||||
typedef typename map<const EQStreamInfo, T *>::iterator iterator;
|
||||
typedef typename std::map<const EQStreamInfo, T *>::iterator iterator;
|
||||
public:
|
||||
|
||||
void Clear() {
|
||||
@@ -157,7 +156,7 @@ public:
|
||||
//may not be a constant time operation in theory, and update our
|
||||
//stored copy only on insert or delete
|
||||
if(res == streams.end())
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
return(res->second);
|
||||
}
|
||||
|
||||
@@ -167,9 +166,7 @@ public:
|
||||
// inline iterator end() const { return(streams.end()); }
|
||||
|
||||
protected:
|
||||
map<const EQStreamInfo, T *> streams;
|
||||
std::map<const EQStreamInfo, T *> streams;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -10,7 +10,7 @@ EQStreamProxy::EQStreamProxy(EQStream *&stream, const StructStrategy *structs, O
|
||||
m_structs(structs),
|
||||
m_opcodes(opcodes)
|
||||
{
|
||||
stream = NULL; //take the stream.
|
||||
stream = nullptr; //take the stream.
|
||||
m_stream->SetOpcodeManager(m_opcodes);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ const EQClientVersion EQStreamProxy::ClientVersion() const
|
||||
}
|
||||
|
||||
void EQStreamProxy::QueuePacket(const EQApplicationPacket *p, bool ack_req) {
|
||||
if(p == NULL)
|
||||
if(p == nullptr)
|
||||
return;
|
||||
|
||||
EQApplicationPacket *newp = p->Copy();
|
||||
@@ -36,15 +36,15 @@ void EQStreamProxy::QueuePacket(const EQApplicationPacket *p, bool ack_req) {
|
||||
}
|
||||
|
||||
void EQStreamProxy::FastQueuePacket(EQApplicationPacket **p, bool ack_req) {
|
||||
if(p == NULL || *p == NULL)
|
||||
if(p == nullptr || *p == nullptr)
|
||||
return;
|
||||
m_structs->Encode(p, m_stream, ack_req);
|
||||
}
|
||||
|
||||
EQApplicationPacket *EQStreamProxy::PopPacket() {
|
||||
EQApplicationPacket *pack = m_stream->PopPacket();
|
||||
if(pack == NULL)
|
||||
return(NULL);
|
||||
if(pack == nullptr)
|
||||
return(nullptr);
|
||||
|
||||
//pass this packet through the struct strategy.
|
||||
m_structs->Decode(pack);
|
||||
|
||||
@@ -42,14 +42,5 @@ protected:
|
||||
OpcodeManager **const m_opcodes; //we do not own this object.
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*EQSTREAMPROXY_H_*/
|
||||
|
||||
|
||||
|
||||
+30
-67
@@ -17,40 +17,18 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* There are really two or three different objects shoe-hored into this
|
||||
* connection object. Sombody really needs to factor out the relay link
|
||||
* crap into its own subclass of this object, it will clean things up
|
||||
* tremendously.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
There are really two or three different objects shoe-hored into this
|
||||
connection object. Sombody really needs to factor out the relay link
|
||||
crap into its own subclass of this object, it will clean things up
|
||||
tremendously.
|
||||
*/
|
||||
|
||||
#include "../common/debug.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
|
||||
#include "EmuTCPConnection.h"
|
||||
#include "EmuTCPServer.h"
|
||||
@@ -76,7 +54,7 @@ EmuTCPConnection::EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, SOCKET in_s
|
||||
timeout_timer(SERVER_TIMEOUT * 2)
|
||||
{
|
||||
id = 0;
|
||||
Server = NULL;
|
||||
Server = nullptr;
|
||||
pOldFormat = iOldFormat;
|
||||
#ifdef MINILOGIN
|
||||
TCPMode = modePacket;
|
||||
@@ -113,7 +91,7 @@ EmuTCPConnection::EmuTCPConnection(bool iOldFormat, EmuTCPServer* iRelayServer,
|
||||
TCPMode = iMode;
|
||||
PacketMode = packetModeZone;
|
||||
#if TCPN_DEBUG_Memory >= 7
|
||||
cout << "Constructor #1 on outgoing TCP# " << GetID() << endl;
|
||||
std::cout << "Constructor #1 on outgoing TCP# " << GetID() << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -128,14 +106,12 @@ EmuTCPConnection::EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, EmuTCPConne
|
||||
RelayServer = true;
|
||||
RelayCount = 0;
|
||||
RemoteID = iRemoteID;
|
||||
if (!RemoteID)
|
||||
ThrowError("Error: TCPConnection: RemoteID == 0 on RelayLink constructor");
|
||||
pOldFormat = false;
|
||||
ConnectionType = Incomming;
|
||||
TCPMode = modePacket;
|
||||
PacketMode = packetModeZone;
|
||||
#if TCPN_DEBUG_Memory >= 7
|
||||
cout << "Constructor #3 on outgoing TCP# " << GetID() << endl;
|
||||
std::cout << "Constructor #3 on outgoing TCP# " << GetID() << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -143,7 +119,6 @@ EmuTCPConnection::~EmuTCPConnection() {
|
||||
//the queues free their content right now I believe.
|
||||
}
|
||||
|
||||
|
||||
EmuTCPNetPacket_Struct* EmuTCPConnection::MakePacket(ServerPacket* pack, uint32 iDestination) {
|
||||
int32 size = sizeof(EmuTCPNetPacket_Struct) + pack->size;
|
||||
if (pack->compressed) {
|
||||
@@ -196,7 +171,7 @@ bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Logging outgoing TCP OldPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
|
||||
std::cout << ": Logging outgoing TCP OldPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
|
||||
#if TCPN_LOG_PACKETS == 2
|
||||
if (pack->size >= 32)
|
||||
DumpPacket(pack->pBuffer, 32);
|
||||
@@ -223,7 +198,7 @@ bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Logging outgoing TCP packet. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
|
||||
std::cout << ": Logging outgoing TCP packet. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
|
||||
#if TCPN_LOG_PACKETS == 2
|
||||
if (pack->size >= 32)
|
||||
DumpPacket(pack->pBuffer, 32);
|
||||
@@ -262,10 +237,10 @@ bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Logging outgoing TCP NetPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << tnps->opcode << dec << ", size: " << setw(5) << setfill(' ') << tnps->size << " " << inet_ntoa(in) << ":" << GetrPort();
|
||||
std::cout << ": Logging outgoing TCP NetPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << tnps->opcode << dec << ", size: " << setw(5) << setfill(' ') << tnps->size << " " << inet_ntoa(in) << ":" << GetrPort();
|
||||
if (pOldFormat)
|
||||
cout << " (OldFormat)";
|
||||
cout << endl;
|
||||
std::cout << " (OldFormat)";
|
||||
std::cout << std::endl;
|
||||
#if TCPN_LOG_PACKETS == 2
|
||||
if (tnps->size >= 32)
|
||||
DumpPacket((uchar*) tnps, 32);
|
||||
@@ -284,7 +259,7 @@ bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) {
|
||||
ServerPacket* EmuTCPConnection::PopPacket() {
|
||||
ServerPacket* ret;
|
||||
if (!MOutQueueLock.trylock())
|
||||
return NULL;
|
||||
return nullptr;
|
||||
ret = OutQueue.pop();
|
||||
MOutQueueLock.unlock();
|
||||
return ret;
|
||||
@@ -307,7 +282,7 @@ bool EmuTCPConnection::LineOutQueuePush(char* line) {
|
||||
#if defined(GOTFRAGS) && 0
|
||||
if (strcmp(line, "**CRASHME**") == 0) {
|
||||
int i = 0;
|
||||
cout << (5 / i) << endl;
|
||||
std::cout << (5 / i) << std::endl;
|
||||
}
|
||||
#endif
|
||||
if(line[0] == '*') {
|
||||
@@ -475,15 +450,14 @@ void EmuTCPConnection::ClearBuffers() {
|
||||
timeout_timer.Start();
|
||||
}
|
||||
|
||||
|
||||
void EmuTCPConnection::SendNetErrorPacket(const char* reason) {
|
||||
#if TCPC_DEBUG >= 1
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
cout "NetError: '";
|
||||
std::cout "NetError: '";
|
||||
if (reason)
|
||||
cout << reason;
|
||||
cout << "': " << inet_ntoa(in) << ":" << GetPort() << endl;
|
||||
std::cout << reason;
|
||||
std::cout << "': " << inet_ntoa(in) << ":" << GetPort() << std::endl;
|
||||
#endif
|
||||
ServerPacket* pack = new ServerPacket(0);
|
||||
pack->size = 1;
|
||||
@@ -546,7 +520,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
|
||||
size = tnps->size;
|
||||
if (size >= MaxTCPReceiveBuffferSize) {
|
||||
#if TCPN_DEBUG_Memory >= 1
|
||||
cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << endl;
|
||||
std::cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << std::endl;
|
||||
DumpPacket(&recvbuf[base], 16);
|
||||
#endif
|
||||
if (errbuf)
|
||||
@@ -586,13 +560,13 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
|
||||
if (pack->opcode == 0) {
|
||||
if (pack->size) {
|
||||
#if TCPN_DEBUG >= 2
|
||||
cout << "Received TCP Network layer packet" << endl;
|
||||
std::cout << "Received TCP Network layer packet" << std::endl;
|
||||
#endif
|
||||
ProcessNetworkLayerPacket(pack);
|
||||
}
|
||||
#if TCPN_DEBUG >= 5
|
||||
else {
|
||||
cout << "Received TCP keepalive packet. (opcode=0)" << endl;
|
||||
std::cout << "Received TCP keepalive packet. (opcode=0)" << std::endl;
|
||||
}
|
||||
#endif
|
||||
// keepalive, no need to process
|
||||
@@ -604,7 +578,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Logging incoming TCP packet. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
|
||||
std::cout << ": Logging incoming TCP packet. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
|
||||
#if TCPN_LOG_PACKETS == 2
|
||||
if (pack->size >= 32)
|
||||
DumpPacket(pack->pBuffer, 32);
|
||||
@@ -620,7 +594,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
|
||||
EmuTCPConnection* con = Server->FindConnection(pack->destination);
|
||||
if (!con) {
|
||||
#if TCPN_DEBUG >= 1
|
||||
cout << "Error relaying packet: con = 0" << endl;
|
||||
std::cout << "Error relaying packet: con = 0" << std::endl;
|
||||
#endif
|
||||
safe_delete(pack);
|
||||
}
|
||||
@@ -659,7 +633,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) {
|
||||
memcpy(&size, &buffer[2], 2);
|
||||
if (size >= MaxTCPReceiveBuffferSize) {
|
||||
#if TCPN_DEBUG_Memory >= 1
|
||||
cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << endl;
|
||||
std::cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << std::endl;
|
||||
#endif
|
||||
if (errbuf)
|
||||
snprintf(errbuf, TCPConnection_ErrorBufferSize, "EmuTCPConnection::ProcessReceivedDataAsPackets(): size >= MaxTCPReceiveBuffferSize");
|
||||
@@ -689,7 +663,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Logging incoming TCP OldPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
|
||||
std::cout << ": Logging incoming TCP OldPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
|
||||
#if TCPN_LOG_PACKETS == 2
|
||||
if (pack->size >= 32)
|
||||
DumpPacket(pack->pBuffer, 32);
|
||||
@@ -750,7 +724,7 @@ void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) {
|
||||
#if TCPC_DEBUG >= 3
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
cout << "Switching to RelayServer mode: " << inet_ntoa(in) << ":" << GetPort() << endl;
|
||||
std::cout << "Switching to RelayServer mode: " << inet_ntoa(in) << ":" << GetPort() << std::endl;
|
||||
#endif
|
||||
RelayServer = true;
|
||||
break;
|
||||
@@ -798,10 +772,10 @@ void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) {
|
||||
#if TCPC_DEBUG >= 1
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
cout "Received NetError: '";
|
||||
std::cout "Received NetError: '";
|
||||
if (pack->size > 1)
|
||||
cout << (char*) data;
|
||||
cout << "': " << inet_ntoa(in) << ":" << GetPort() << endl;
|
||||
std::cout << (char*) data;
|
||||
std::cout << "': " << inet_ntoa(in) << ":" << GetPort() << std::endl;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@@ -820,7 +794,7 @@ bool EmuTCPConnection::SendData(bool &sent_something, char* errbuf) {
|
||||
SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
#if TCPN_DEBUG >= 5
|
||||
cout << "Sending TCP keepalive packet. (timeout=" << timeout_timer.GetRemainingTime() << " remaining)" << endl;
|
||||
std::cout << "Sending TCP keepalive packet. (timeout=" << timeout_timer.GetRemainingTime() << " remaining)" << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -844,14 +818,3 @@ bool EmuTCPConnection::RecvData(char* errbuf) {
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+3
-18
@@ -1,7 +1,3 @@
|
||||
|
||||
|
||||
|
||||
|
||||
#include "debug.h"
|
||||
#include "EmuTCPServer.h"
|
||||
#include "EmuTCPConnection.h"
|
||||
@@ -42,7 +38,7 @@ void EmuTCPServer::SendPacket(EmuTCPNetPacket_Struct** tnps) {
|
||||
MInQueue.lock();
|
||||
m_InQueue.push(*tnps);
|
||||
MInQueue.unlock();
|
||||
tnps = NULL;
|
||||
tnps = nullptr;
|
||||
}
|
||||
|
||||
void EmuTCPServer::CheckInQueue() {
|
||||
@@ -61,7 +57,7 @@ void EmuTCPServer::CheckInQueue() {
|
||||
}
|
||||
|
||||
EmuTCPNetPacket_Struct* EmuTCPServer::InQueuePop() {
|
||||
EmuTCPNetPacket_Struct* ret = NULL;
|
||||
EmuTCPNetPacket_Struct* ret = nullptr;
|
||||
MInQueue.lock();
|
||||
if(!m_InQueue.empty()) {
|
||||
ret = m_InQueue.front();
|
||||
@@ -80,17 +76,6 @@ EmuTCPConnection *EmuTCPServer::FindConnection(uint32 iID) {
|
||||
if ((*cur)->GetID() == iID)
|
||||
return *cur;
|
||||
}
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ public:
|
||||
EmuTCPConnection *FindConnection(uint32 iID);
|
||||
|
||||
//exposed for some crap we pull. Do not call from outside this object.
|
||||
TCPServer<EmuTCPConnection>::AddConnection;
|
||||
using TCPServer<EmuTCPConnection>::AddConnection;
|
||||
|
||||
protected:
|
||||
virtual void Process();
|
||||
|
||||
+94
-130
@@ -16,27 +16,19 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifdef _WINDOWS
|
||||
// VS6 doesn't like the length of STL generated names: disabling
|
||||
#pragma warning(disable:4786)
|
||||
// Quagmire: Dont know why the one in debug.h doesnt work, but it doesnt.
|
||||
#endif
|
||||
#include "../common/debug.h"
|
||||
/*#ifdef _CRTDBG_MAP_ALLOC
|
||||
#undef new
|
||||
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||
#endif
|
||||
*/
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include <limits.h>
|
||||
#include "debug.h"
|
||||
#include "StringUtil.h"
|
||||
#include "Item.h"
|
||||
#include "database.h"
|
||||
#include "misc.h"
|
||||
#include "races.h"
|
||||
#include "shareddb.h"
|
||||
#include "classes.h"
|
||||
using namespace std;
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
|
||||
int32 NextItemInstSerialNumber = 1;
|
||||
|
||||
@@ -102,7 +94,7 @@ ItemInstQueue::~ItemInstQueue() {
|
||||
}
|
||||
|
||||
Inventory::~Inventory() {
|
||||
map<int16, ItemInst*>::iterator cur,end;
|
||||
std::map<int16, ItemInst*>::iterator cur,end;
|
||||
|
||||
|
||||
cur = m_worn.begin();
|
||||
@@ -162,13 +154,13 @@ ItemInst::ItemInst(const ItemInst& copy)
|
||||
iter_contents it;
|
||||
for (it=copy.m_contents.begin(); it!=copy.m_contents.end(); it++) {
|
||||
ItemInst* inst_old = it->second;
|
||||
ItemInst* inst_new = NULL;
|
||||
ItemInst* inst_new = nullptr;
|
||||
|
||||
if (inst_old) {
|
||||
inst_new = inst_old->Clone();
|
||||
}
|
||||
|
||||
if (inst_new != NULL) {
|
||||
if (inst_new != nullptr) {
|
||||
m_contents[it->first] = inst_new;
|
||||
}
|
||||
}
|
||||
@@ -293,7 +285,7 @@ uint32 ItemInst::GetItemID(uint8 slot) const
|
||||
{
|
||||
const ItemInst *item;
|
||||
uint32 id=0;
|
||||
if ((item=GetItem(slot))!=NULL)
|
||||
if ((item=GetItem(slot))!=nullptr)
|
||||
id= item->GetItem()->ID;
|
||||
|
||||
return id;
|
||||
@@ -330,7 +322,7 @@ ItemInst* ItemInst::GetAugment(uint8 slot) const
|
||||
if (m_item->ItemClass == ItemClassCommon)
|
||||
return GetItem(slot);
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Remove augment from item and destroy it
|
||||
@@ -346,7 +338,7 @@ ItemInst* ItemInst::RemoveAugment(uint8 index)
|
||||
if (m_item->ItemClass == ItemClassCommon)
|
||||
return PopItem(index);
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Add an augment to the item
|
||||
@@ -377,7 +369,7 @@ ItemInst* ItemInst::GetItem(uint8 index) const
|
||||
return inst;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ItemInst::PutItem(uint8 index, const ItemInst& inst)
|
||||
@@ -472,7 +464,7 @@ ItemInst* ItemInst::PopItem(uint8 index)
|
||||
}
|
||||
|
||||
// Return pointer that needs to be deleted (or otherwise managed)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Put item onto back of queue
|
||||
@@ -491,7 +483,7 @@ void ItemInstQueue::push_front(ItemInst* inst)
|
||||
ItemInst* ItemInstQueue::pop()
|
||||
{
|
||||
if (m_list.size() == 0)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
ItemInst* inst = m_list.front();
|
||||
m_list.pop_front();
|
||||
@@ -501,14 +493,14 @@ ItemInst* ItemInstQueue::pop()
|
||||
// Look at item at front of queue
|
||||
ItemInst* ItemInstQueue::peek_front() const
|
||||
{
|
||||
return (m_list.size()==0) ? NULL : m_list.front();
|
||||
return (m_list.size()==0) ? nullptr : m_list.front();
|
||||
}
|
||||
|
||||
// Retrieve item at specified slot; returns false if item not found
|
||||
ItemInst* Inventory::GetItem(int16 slot_id) const
|
||||
{
|
||||
_CP(Inventory_GetItem);
|
||||
ItemInst* result = NULL;
|
||||
ItemInst* result = nullptr;
|
||||
|
||||
// Cursor
|
||||
if (slot_id == SLOT_CURSOR) {
|
||||
@@ -580,7 +572,7 @@ ItemInst* Inventory::GetItem(int16 slot_id) const
|
||||
|
||||
std::string ItemInst::GetCustomDataString() const {
|
||||
std::string ret_val;
|
||||
map<std::string, std::string>::const_iterator iter = m_custom_data.begin();
|
||||
std::map<std::string, std::string>::const_iterator iter = m_custom_data.begin();
|
||||
while(iter != m_custom_data.end()) {
|
||||
if(ret_val.length() > 0) {
|
||||
ret_val += "^";
|
||||
@@ -624,14 +616,14 @@ void ItemInst::SetCustomData(std::string identifier, bool value) {
|
||||
}
|
||||
|
||||
void ItemInst::DeleteCustomData(std::string identifier) {
|
||||
map<std::string, std::string>::iterator iter = m_custom_data.find(identifier);
|
||||
std::map<std::string, std::string>::iterator iter = m_custom_data.find(identifier);
|
||||
if(iter != m_custom_data.end()) {
|
||||
m_custom_data.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
std::string ItemInst::GetCustomData(std::string identifier) {
|
||||
map<std::string, std::string>::const_iterator iter = m_custom_data.find(identifier);
|
||||
std::map<std::string, std::string>::const_iterator iter = m_custom_data.find(identifier);
|
||||
if(iter != m_custom_data.end()) {
|
||||
return iter->second;
|
||||
}
|
||||
@@ -967,7 +959,7 @@ bool Inventory::CheckNoDrop(int16 slot_id) {
|
||||
if (!inst) return false;
|
||||
if (!inst->GetItem()->NoDrop) return true;
|
||||
if (inst->GetItem()->ItemClass == 1) {
|
||||
for (uint16 i=0; i<10; i++) {
|
||||
for (uint8 i = 0; i < 10; i++) {
|
||||
ItemInst* bagitem = GetItem(Inventory::CalcSlotId(slot_id, i));
|
||||
if (bagitem && !bagitem->GetItem()->NoDrop) return true;
|
||||
}
|
||||
@@ -979,7 +971,7 @@ bool Inventory::CheckNoDrop(int16 slot_id) {
|
||||
// Returns item pointer if full delete was successful
|
||||
ItemInst* Inventory::PopItem(int16 slot_id)
|
||||
{
|
||||
ItemInst* p = NULL;
|
||||
ItemInst* p = nullptr;
|
||||
|
||||
if (slot_id==SLOT_CURSOR) { // Cursor
|
||||
p = m_cursor.pop();
|
||||
@@ -1007,7 +999,7 @@ ItemInst* Inventory::PopItem(int16 slot_id)
|
||||
else {
|
||||
// Is slot inside bag?
|
||||
ItemInst* baginst = GetItem(Inventory::CalcSlotId(slot_id));
|
||||
if (baginst != NULL && baginst->IsType(ItemClassContainer)) {
|
||||
if (baginst != nullptr && baginst->IsType(ItemClassContainer)) {
|
||||
p = baginst->PopItem(Inventory::CalcBagIdx(slot_id));
|
||||
}
|
||||
}
|
||||
@@ -1060,107 +1052,79 @@ int16 Inventory::FindFreeSlot(bool for_bag, bool try_cursor, uint8 min_size, boo
|
||||
return SLOT_INVALID;
|
||||
}
|
||||
|
||||
void Inventory::dumpInventory() {
|
||||
void Inventory::dumpBagContents(ItemInst *inst, iter_inst *it) {
|
||||
iter_contents itb;
|
||||
|
||||
if (!inst || !inst->IsType(ItemClassContainer))
|
||||
return;
|
||||
|
||||
// Go through bag, if bag
|
||||
for (itb=inst->_begin(); itb!=inst->_end(); itb++) {
|
||||
ItemInst* baginst = itb->second;
|
||||
if(!baginst || !baginst->GetItem())
|
||||
continue;
|
||||
|
||||
std::string subSlot;
|
||||
StringFormat(subSlot," Slot %d: %s (%d)", Inventory::CalcSlotId((*it)->first, itb->first),
|
||||
baginst->GetItem()->Name, (baginst->GetCharges()<=0) ? 1 : baginst->GetCharges());
|
||||
std::cout << subSlot << std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Inventory::dumpItemCollection(const std::map<int16, ItemInst*> &collection) {
|
||||
iter_inst it;
|
||||
iter_contents itb;
|
||||
ItemInst* inst = NULL;
|
||||
ItemInst* inst = nullptr;
|
||||
|
||||
// Check item: After failed checks, check bag contents (if bag)
|
||||
printf("Worn items:\n");
|
||||
for (it=m_worn.begin(); it!=m_worn.end(); it++) {
|
||||
for (it=collection.begin(); it!=collection.end(); it++) {
|
||||
inst = it->second;
|
||||
it->first;
|
||||
if(!inst || !inst->GetItem())
|
||||
continue;
|
||||
|
||||
printf("Slot %d: %s (%d)\n", it->first, it->second->GetItem()->Name, (inst->GetCharges()<=0) ? 1 : inst->GetCharges());
|
||||
std::string slot;
|
||||
StringFormat(slot, "Slot %d: %s (%d)",it->first, it->second->GetItem()->Name, (inst->GetCharges()<=0) ? 1 : inst->GetCharges());
|
||||
std::cout << slot << std::endl;
|
||||
|
||||
// Go through bag, if bag
|
||||
if (inst && inst->IsType(ItemClassContainer)) {
|
||||
for (itb=inst->_begin(); itb!=inst->_end(); itb++) {
|
||||
ItemInst* baginst = itb->second;
|
||||
if(!baginst || !baginst->GetItem())
|
||||
continue;
|
||||
printf(" Slot %d: %s (%d)\n", Inventory::CalcSlotId(it->first, itb->first),
|
||||
baginst->GetItem()->Name, (baginst->GetCharges()<=0) ? 1 : baginst->GetCharges());
|
||||
}
|
||||
}
|
||||
dumpBagContents(inst, &it);
|
||||
}
|
||||
}
|
||||
|
||||
printf("Inventory items:\n");
|
||||
for (it=m_inv.begin(); it!=m_inv.end(); it++) {
|
||||
inst = it->second;
|
||||
it->first;
|
||||
if(!inst || !inst->GetItem())
|
||||
continue;
|
||||
void Inventory::dumpWornItems() {
|
||||
std::cout << "Worn items:" << std::endl;
|
||||
dumpItemCollection(m_worn);
|
||||
}
|
||||
|
||||
printf("Slot %d: %s (%d)\n", it->first, it->second->GetItem()->Name, (inst->GetCharges()<=0) ? 1 : inst->GetCharges());
|
||||
void Inventory::dumpInventory() {
|
||||
std::cout << "Inventory items:" << std::endl;
|
||||
dumpItemCollection(m_inv);
|
||||
}
|
||||
|
||||
// Go through bag, if bag
|
||||
if (inst && inst->IsType(ItemClassContainer)) {
|
||||
for (itb=inst->_begin(); itb!=inst->_end(); itb++) {
|
||||
ItemInst* baginst = itb->second;
|
||||
if(!baginst || !baginst->GetItem())
|
||||
continue;
|
||||
printf(" Slot %d: %s (%d)\n", Inventory::CalcSlotId(it->first, itb->first),
|
||||
baginst->GetItem()->Name, (baginst->GetCharges()<=0) ? 1 : baginst->GetCharges());
|
||||
void Inventory::dumpBankItems() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
std::cout << "Bank items:" << std::endl;
|
||||
dumpItemCollection(m_bank);
|
||||
}
|
||||
|
||||
printf("Bank items:\n");
|
||||
for (it=m_bank.begin(); it!=m_bank.end(); it++) {
|
||||
inst = it->second;
|
||||
it->first;
|
||||
if(!inst || !inst->GetItem())
|
||||
continue;
|
||||
void Inventory::dumpSharedBankItems() {
|
||||
|
||||
printf("Slot %d: %s (%d)\n", it->first, it->second->GetItem()->Name, (inst->GetCharges()<=0) ? 1 : inst->GetCharges());
|
||||
std::cout << "Shared Bank items:" << std::endl;
|
||||
dumpItemCollection(m_shbank);
|
||||
}
|
||||
|
||||
// Go through bag, if bag
|
||||
if (inst && inst->IsType(ItemClassContainer)) {
|
||||
void Inventory::dumpEntireInventory() {
|
||||
|
||||
for (itb=inst->_begin(); itb!=inst->_end(); itb++) {
|
||||
ItemInst* baginst = itb->second;
|
||||
if(!baginst || !baginst->GetItem())
|
||||
continue;
|
||||
printf(" Slot %d: %s (%d)\n", Inventory::CalcSlotId(it->first, itb->first),
|
||||
baginst->GetItem()->Name, (baginst->GetCharges()<=0) ? 1 : baginst->GetCharges());
|
||||
dumpWornItems();
|
||||
dumpInventory();
|
||||
dumpBankItems();
|
||||
dumpSharedBankItems();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("Shared Bank items:\n");
|
||||
for (it=m_shbank.begin(); it!=m_shbank.end(); it++) {
|
||||
inst = it->second;
|
||||
it->first;
|
||||
if(!inst || !inst->GetItem())
|
||||
continue;
|
||||
|
||||
printf("Slot %d: %s (%d)\n", it->first, it->second->GetItem()->Name, (inst->GetCharges()<=0) ? 1 : inst->GetCharges());
|
||||
|
||||
// Go through bag, if bag
|
||||
if (inst && inst->IsType(ItemClassContainer)) {
|
||||
|
||||
for (itb=inst->_begin(); itb!=inst->_end(); itb++) {
|
||||
ItemInst* baginst = itb->second;
|
||||
if(!baginst || !baginst->GetItem())
|
||||
continue;
|
||||
printf(" Slot %d: %s (%d)\n", Inventory::CalcSlotId(it->first, itb->first),
|
||||
baginst->GetItem()->Name, (baginst->GetCharges()<=0) ? 1 : baginst->GetCharges());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
// Internal Method: Retrieves item within an inventory bucket
|
||||
ItemInst* Inventory::_GetItem(const map<int16, ItemInst*>& bucket, int16 slot_id) const
|
||||
ItemInst* Inventory::_GetItem(const std::map<int16, ItemInst*>& bucket, int16 slot_id) const
|
||||
{
|
||||
iter_inst it = bucket.find(slot_id);
|
||||
if (it != bucket.end()) {
|
||||
@@ -1168,15 +1132,15 @@ ItemInst* Inventory::_GetItem(const map<int16, ItemInst*>& bucket, int16 slot_id
|
||||
}
|
||||
|
||||
// Not found!
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Internal Method: "put" item into bucket, without regard for what is currently in bucket
|
||||
// Assumes item has already been allocated
|
||||
int16 Inventory::_PutItem(int16 slot_id, ItemInst* inst)
|
||||
{
|
||||
// If putting a NULL into slot, we need to remove slot without memory delete
|
||||
if (inst == NULL) {
|
||||
// If putting a nullptr into slot, we need to remove slot without memory delete
|
||||
if (inst == nullptr) {
|
||||
//Why do we not delete the poped item here????
|
||||
PopItem(slot_id);
|
||||
return slot_id;
|
||||
@@ -1228,11 +1192,11 @@ int16 Inventory::_PutItem(int16 slot_id, ItemInst* inst)
|
||||
}
|
||||
|
||||
// Internal Method: Checks an inventory bucket for a particular item
|
||||
int16 Inventory::_HasItem(map<int16, ItemInst*>& bucket, uint32 item_id, uint8 quantity)
|
||||
int16 Inventory::_HasItem(std::map<int16, ItemInst*>& bucket, uint32 item_id, uint8 quantity)
|
||||
{
|
||||
iter_inst it;
|
||||
iter_contents itb;
|
||||
ItemInst* inst = NULL;
|
||||
ItemInst* inst = nullptr;
|
||||
uint8 quantity_found = 0;
|
||||
|
||||
// Check item: After failed checks, check bag contents (if bag)
|
||||
@@ -1318,11 +1282,11 @@ int16 Inventory::_HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity)
|
||||
}
|
||||
|
||||
// Internal Method: Checks an inventory bucket for a particular item
|
||||
int16 Inventory::_HasItemByUse(map<int16, ItemInst*>& bucket, uint8 use, uint8 quantity)
|
||||
int16 Inventory::_HasItemByUse(std::map<int16, ItemInst*>& bucket, uint8 use, uint8 quantity)
|
||||
{
|
||||
iter_inst it;
|
||||
iter_contents itb;
|
||||
ItemInst* inst = NULL;
|
||||
ItemInst* inst = nullptr;
|
||||
uint8 quantity_found = 0;
|
||||
|
||||
// Check item: After failed checks, check bag contents (if bag)
|
||||
@@ -1386,11 +1350,11 @@ int16 Inventory::_HasItemByUse(ItemInstQueue& iqueue, uint8 use, uint8 quantity)
|
||||
return SLOT_INVALID;
|
||||
}
|
||||
|
||||
int16 Inventory::_HasItemByLoreGroup(map<int16, ItemInst*>& bucket, uint32 loregroup)
|
||||
int16 Inventory::_HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32 loregroup)
|
||||
{
|
||||
iter_inst it;
|
||||
iter_contents itb;
|
||||
ItemInst* inst = NULL;
|
||||
ItemInst* inst = nullptr;
|
||||
|
||||
// Check item: After failed checks, check bag contents (if bag)
|
||||
for (it=bucket.begin(); it!=bucket.end(); it++) {
|
||||
@@ -1690,13 +1654,13 @@ EvoItemInst::EvoItemInst(const EvoItemInst ©) {
|
||||
iter_contents it;
|
||||
for (it=copy.m_contents.begin(); it!=copy.m_contents.end(); it++) {
|
||||
ItemInst* inst_old = it->second;
|
||||
ItemInst* inst_new = NULL;
|
||||
ItemInst* inst_new = nullptr;
|
||||
|
||||
if (inst_old) {
|
||||
inst_new = inst_old->Clone();
|
||||
}
|
||||
|
||||
if (inst_new != NULL) {
|
||||
if (inst_new != nullptr) {
|
||||
m_contents[it->first] = inst_new;
|
||||
}
|
||||
}
|
||||
@@ -1708,11 +1672,11 @@ EvoItemInst::EvoItemInst(const EvoItemInst ©) {
|
||||
m_exp = copy.m_exp;
|
||||
m_evolveLvl = copy.m_evolveLvl;
|
||||
m_activated = copy.m_activated;
|
||||
m_evolveInfo = NULL;
|
||||
m_evolveInfo = nullptr;
|
||||
if (copy.m_scaledItem)
|
||||
m_scaledItem = new Item_Struct(*copy.m_scaledItem);
|
||||
else
|
||||
m_scaledItem = NULL;
|
||||
m_scaledItem = nullptr;
|
||||
}
|
||||
|
||||
EvoItemInst::EvoItemInst(const ItemInst &basecopy) {
|
||||
@@ -1731,13 +1695,13 @@ EvoItemInst::EvoItemInst(const ItemInst &basecopy) {
|
||||
iter_contents it;
|
||||
for (it=copy->m_contents.begin(); it!=copy->m_contents.end(); it++) {
|
||||
ItemInst* inst_old = it->second;
|
||||
ItemInst* inst_new = NULL;
|
||||
ItemInst* inst_new = nullptr;
|
||||
|
||||
if (inst_old) {
|
||||
inst_new = inst_old->Clone();
|
||||
}
|
||||
|
||||
if (inst_new != NULL) {
|
||||
if (inst_new != nullptr) {
|
||||
m_contents[it->first] = inst_new;
|
||||
}
|
||||
}
|
||||
@@ -1750,8 +1714,8 @@ EvoItemInst::EvoItemInst(const ItemInst &basecopy) {
|
||||
m_exp = 0;
|
||||
m_evolveLvl = 0;
|
||||
m_activated = false;
|
||||
m_evolveInfo = NULL;
|
||||
m_scaledItem = NULL;
|
||||
m_evolveInfo = nullptr;
|
||||
m_scaledItem = nullptr;
|
||||
}
|
||||
|
||||
EvoItemInst::EvoItemInst(const Item_Struct* item, int16 charges) {
|
||||
@@ -1770,8 +1734,8 @@ EvoItemInst::EvoItemInst(const Item_Struct* item, int16 charges) {
|
||||
m_exp = 0;
|
||||
m_evolveLvl = 0;
|
||||
m_activated = false;
|
||||
m_evolveInfo = NULL;
|
||||
m_scaledItem = NULL;
|
||||
m_evolveInfo = nullptr;
|
||||
m_scaledItem = nullptr;
|
||||
}
|
||||
|
||||
EvoItemInst::~EvoItemInst() {
|
||||
|
||||
+29
-23
@@ -34,15 +34,14 @@ class EvolveInfo; // Stores information about an evolving item family
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <list>
|
||||
using namespace std;
|
||||
#include "../common/eq_packet_structs.h"
|
||||
#include "../common/eq_constants.h"
|
||||
#include "../common/item_struct.h"
|
||||
|
||||
// Helper typedefs
|
||||
typedef list<ItemInst*>::const_iterator iter_queue;
|
||||
typedef map<int16, ItemInst*>::const_iterator iter_inst;
|
||||
typedef map<uint8, ItemInst*>::const_iterator iter_contents;
|
||||
typedef std::list<ItemInst*>::const_iterator iter_queue;
|
||||
typedef std::map<int16, ItemInst*>::const_iterator iter_inst;
|
||||
typedef std::map<uint8, ItemInst*>::const_iterator iter_contents;
|
||||
|
||||
namespace ItemField {
|
||||
enum {
|
||||
@@ -120,7 +119,7 @@ protected:
|
||||
// Protected Members
|
||||
/////////////////////////
|
||||
|
||||
list<ItemInst*> m_list;
|
||||
std::list<ItemInst*> m_list;
|
||||
|
||||
};
|
||||
|
||||
@@ -196,7 +195,11 @@ public:
|
||||
// Test whether a given slot can support a container item
|
||||
static bool SupportsContainers(int16 slot_id);
|
||||
|
||||
void dumpEntireInventory();
|
||||
void dumpWornItems();
|
||||
void dumpInventory();
|
||||
void dumpBankItems();
|
||||
void dumpSharedBankItems();
|
||||
|
||||
void SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, std::string value);
|
||||
void SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, int value);
|
||||
@@ -208,27 +211,30 @@ protected:
|
||||
// Protected Methods
|
||||
///////////////////////////////
|
||||
|
||||
void dumpItemCollection(const std::map<int16, ItemInst*> &collection);
|
||||
void dumpBagContents(ItemInst *inst, iter_inst *it);
|
||||
|
||||
// Retrieves item within an inventory bucket
|
||||
ItemInst* _GetItem(const map<int16, ItemInst*>& bucket, int16 slot_id) const;
|
||||
ItemInst* _GetItem(const std::map<int16, ItemInst*>& bucket, int16 slot_id) const;
|
||||
|
||||
// Private "put" item into bucket, without regard for what is currently in bucket
|
||||
int16 _PutItem(int16 slot_id, ItemInst* inst);
|
||||
|
||||
// Checks an inventory bucket for a particular item
|
||||
int16 _HasItem(map<int16, ItemInst*>& bucket, uint32 item_id, uint8 quantity);
|
||||
int16 _HasItem(std::map<int16, ItemInst*>& bucket, uint32 item_id, uint8 quantity);
|
||||
int16 _HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity);
|
||||
int16 _HasItemByUse(map<int16, ItemInst*>& bucket, uint8 use, uint8 quantity);
|
||||
int16 _HasItemByUse(std::map<int16, ItemInst*>& bucket, uint8 use, uint8 quantity);
|
||||
int16 _HasItemByUse(ItemInstQueue& iqueue, uint8 use, uint8 quantity);
|
||||
int16 _HasItemByLoreGroup(map<int16, ItemInst*>& bucket, uint32 loregroup);
|
||||
int16 _HasItemByLoreGroup(std::map<int16, ItemInst*>& bucket, uint32 loregroup);
|
||||
int16 _HasItemByLoreGroup(ItemInstQueue& iqueue, uint32 loregroup);
|
||||
|
||||
|
||||
// Player inventory
|
||||
map<int16, ItemInst*> m_worn; // Items worn by character
|
||||
map<int16, ItemInst*> m_inv; // Items in character personal inventory
|
||||
map<int16, ItemInst*> m_bank; // Items in character bank
|
||||
map<int16, ItemInst*> m_shbank; // Items in character shared bank
|
||||
map<int16, ItemInst*> m_trade; // Items in a trade session
|
||||
std::map<int16, ItemInst*> m_worn; // Items worn by character
|
||||
std::map<int16, ItemInst*> m_inv; // Items in character personal inventory
|
||||
std::map<int16, ItemInst*> m_bank; // Items in character bank
|
||||
std::map<int16, ItemInst*> m_shbank; // Items in character shared bank
|
||||
std::map<int16, ItemInst*> m_trade; // Items in a trade session
|
||||
ItemInstQueue m_cursor; // Items on cursor: FIFO
|
||||
};
|
||||
|
||||
@@ -247,13 +253,13 @@ public:
|
||||
/////////////////////////
|
||||
|
||||
// Constructors/Destructor
|
||||
ItemInst(const Item_Struct* item = NULL, int16 charges = 0);
|
||||
ItemInst(const Item_Struct* item = nullptr, int16 charges = 0);
|
||||
|
||||
ItemInst(SharedDatabase *db, uint32 item_id, int16 charges = 0);
|
||||
|
||||
ItemInst(ItemUseType use_type) {
|
||||
m_use_type = use_type;
|
||||
m_item = NULL;
|
||||
m_item = nullptr;
|
||||
m_charges = 0;
|
||||
m_price = 0;
|
||||
m_instnodrop = false;
|
||||
@@ -300,7 +306,7 @@ public:
|
||||
uint8 FirstOpenSlot() const;
|
||||
uint8 GetTotalItemCount() const;
|
||||
bool IsNoneEmptyContainer();
|
||||
map<uint8, ItemInst*>* GetContents() { return &m_contents; }
|
||||
std::map<uint8, ItemInst*>* GetContents() { return &m_contents; }
|
||||
|
||||
//
|
||||
// Augments
|
||||
@@ -357,7 +363,7 @@ public:
|
||||
void DeleteCustomData(std::string identifier);
|
||||
|
||||
// Allows treatment of this object as though it were a pointer to m_item
|
||||
operator bool() const { return (m_item != NULL); }
|
||||
operator bool() const { return (m_item != nullptr); }
|
||||
|
||||
// Compare inner Item_Struct of two ItemInst objects
|
||||
bool operator==(const ItemInst& right) const { return (this->m_item == right.m_item); }
|
||||
@@ -371,7 +377,7 @@ public:
|
||||
virtual bool IsScaling() const { return false; }
|
||||
virtual bool IsEvolving() const { return false; }
|
||||
|
||||
string Serialize(int16 slot_id) const { InternalSerializedItem_Struct s; s.slot_id=slot_id; s.inst=(const void *)this; string ser; ser.assign((char *)&s,sizeof(InternalSerializedItem_Struct)); return ser; }
|
||||
std::string Serialize(int16 slot_id) const { InternalSerializedItem_Struct s; s.slot_id=slot_id; s.inst=(const void *)this; std::string ser; ser.assign((char *)&s,sizeof(InternalSerializedItem_Struct)); return ser; }
|
||||
inline int32 GetSerialNumber() const { return m_SerialNumber; }
|
||||
inline void SetSerialNumber(int32 id) { m_SerialNumber = id; }
|
||||
|
||||
@@ -399,8 +405,8 @@ protected:
|
||||
int32 m_SerialNumber; // Unique identifier for this instance of an item. Needed for Bazaar.
|
||||
//
|
||||
// Items inside of this item (augs or contents);
|
||||
map<uint8, ItemInst*> m_contents; // Zero-based index: min=0, max=9
|
||||
map<std::string, std::string> m_custom_data;
|
||||
std::map<uint8, ItemInst*> m_contents; // Zero-based index: min=0, max=9
|
||||
std::map<std::string, std::string> m_custom_data;
|
||||
};
|
||||
|
||||
class EvoItemInst: public ItemInst {
|
||||
@@ -408,7 +414,7 @@ public:
|
||||
// constructor and destructor
|
||||
EvoItemInst(const EvoItemInst& copy);
|
||||
EvoItemInst(const ItemInst& copy);
|
||||
EvoItemInst(const Item_Struct* item = NULL, int16 charges = 0);
|
||||
EvoItemInst(const Item_Struct* item = nullptr, int16 charges = 0);
|
||||
~EvoItemInst();
|
||||
|
||||
// accessors... a lot of these are for evolving items (not complete yet)
|
||||
@@ -424,7 +430,7 @@ public:
|
||||
EvoItemInst* Clone() const;
|
||||
const Item_Struct* GetItem() const;
|
||||
const Item_Struct* GetUnscaledItem() const;
|
||||
void Initialize(SharedDatabase *db = NULL);
|
||||
void Initialize(SharedDatabase *db = nullptr);
|
||||
void ScaleItem();
|
||||
bool EvolveOnAllKills() const;
|
||||
int8 GetMaxEvolveLvl() const;
|
||||
|
||||
+2
-3
@@ -644,8 +644,7 @@ uint8 MaxSkillTable(uint16 skillid, uint16 race, uint16 eqclass, uint16 level) {
|
||||
case MONK: case MONKGM:{
|
||||
// 1 252 252
|
||||
r_value = level*7; // This can't be right can it?
|
||||
break
|
||||
;
|
||||
break;
|
||||
}
|
||||
case WARRIOR: case WARRIORGM:
|
||||
case ROGUE: case ROGUEGM: {
|
||||
@@ -1894,7 +1893,7 @@ uint8 MaxSkillTable(uint16 skillid, uint16 race, uint16 eqclass, uint16 level) {
|
||||
break;
|
||||
}
|
||||
} // end switch (skillid)
|
||||
// NO skill may go over 252
|
||||
// NO skill may go over 252
|
||||
if (r_value > 252)
|
||||
r_value = 252;
|
||||
return r_value;
|
||||
|
||||
+9
-268
@@ -32,15 +32,10 @@
|
||||
#include "../common/timer.h"
|
||||
#include "../common/seperator.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
|
||||
#define snprintf _snprintf
|
||||
#if (_MSC_VER < 1500)
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
#else
|
||||
@@ -52,17 +47,13 @@ using namespace std;
|
||||
#ifdef FREEBSD //Timothy Whitman - January 7, 2003
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#ifndef va_copy
|
||||
#define va_copy(d,s) ((d) = (s))
|
||||
#endif
|
||||
|
||||
static bool WELLRNG_init = false;
|
||||
static int state_i = 0;
|
||||
static unsigned int STATE[R];
|
||||
@@ -86,207 +77,12 @@ void CoutTimestamp(bool ms) {
|
||||
struct timeval read_time;
|
||||
gettimeofday(&read_time,0);
|
||||
|
||||
cout << (gmt_t->tm_year + 1900) << "/" << setw(2) << setfill('0') << (gmt_t->tm_mon + 1) << "/" << setw(2) << setfill('0') << gmt_t->tm_mday << " " << setw(2) << setfill('0') << gmt_t->tm_hour << ":" << setw(2) << setfill('0') << gmt_t->tm_min << ":" << setw(2) << setfill('0') << gmt_t->tm_sec;
|
||||
std::cout << (gmt_t->tm_year + 1900) << "/" << std::setw(2) << std::setfill('0') << (gmt_t->tm_mon + 1) << "/" << std::setw(2) << std::setfill('0') << gmt_t->tm_mday << " " << std::setw(2) << std::setfill('0') << gmt_t->tm_hour << ":" << std::setw(2) << std::setfill('0') << gmt_t->tm_min << ":" << std::setw(2) << std::setfill('0') << gmt_t->tm_sec;
|
||||
if (ms)
|
||||
cout << "." << setw(3) << setfill('0') << (read_time.tv_usec / 1000);
|
||||
cout << " GMT";
|
||||
std::cout << "." << std::setw(3) << std::setfill('0') << (read_time.tv_usec / 1000);
|
||||
std::cout << " GMT";
|
||||
}
|
||||
|
||||
// normal strncpy doesnt put a null term on copied strings, this one does
|
||||
// ref: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecrt/htm/_wcecrt_strncpy_wcsncpy.asp
|
||||
char* strn0cpy(char* dest, const char* source, uint32 size) {
|
||||
if (!dest)
|
||||
return 0;
|
||||
if (size == 0 || source == 0) {
|
||||
dest[0] = 0;
|
||||
return dest;
|
||||
}
|
||||
strncpy(dest, source, size);
|
||||
dest[size - 1] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
// String N w/null Copy Truncated?
|
||||
// return value =true if entire string(source) fit, false if it was truncated
|
||||
bool strn0cpyt(char* dest, const char* source, uint32 size) {
|
||||
if (!dest)
|
||||
return 0;
|
||||
if (size == 0 || source == 0) {
|
||||
dest[0] = 0;
|
||||
return false;
|
||||
}
|
||||
strncpy(dest, source, size);
|
||||
dest[size - 1] = 0;
|
||||
return (bool) (source[strlen(dest)] == 0);
|
||||
}
|
||||
|
||||
const char *MakeUpperString(const char *source) {
|
||||
static char str[128];
|
||||
if (!source)
|
||||
return NULL;
|
||||
MakeUpperString(source, str);
|
||||
return str;
|
||||
}
|
||||
|
||||
void MakeUpperString(const char *source, char *target) {
|
||||
if (!source || !target) {
|
||||
*target=0;
|
||||
return;
|
||||
}
|
||||
while (*source)
|
||||
{
|
||||
*target = toupper(*source);
|
||||
target++;source++;
|
||||
}
|
||||
*target = 0;
|
||||
}
|
||||
|
||||
const char *MakeLowerString(const char *source) {
|
||||
static char str[128];
|
||||
if (!source)
|
||||
return NULL;
|
||||
MakeLowerString(source, str);
|
||||
return str;
|
||||
}
|
||||
|
||||
void MakeLowerString(const char *source, char *target) {
|
||||
if (!source || !target) {
|
||||
*target=0;
|
||||
return;
|
||||
}
|
||||
while (*source)
|
||||
{
|
||||
*target = tolower(*source);
|
||||
target++;source++;
|
||||
}
|
||||
*target = 0;
|
||||
}
|
||||
|
||||
int MakeAnyLenString(char** ret, const char* format, ...) {
|
||||
int buf_len = 128;
|
||||
int chars = -1;
|
||||
va_list argptr, tmpargptr;
|
||||
va_start(argptr, format);
|
||||
while (chars == -1 || chars >= buf_len) {
|
||||
safe_delete_array(*ret);
|
||||
if (chars == -1)
|
||||
buf_len *= 2;
|
||||
else
|
||||
buf_len = chars + 1;
|
||||
*ret = new char[buf_len];
|
||||
va_copy(tmpargptr, argptr);
|
||||
chars = vsnprintf(*ret, buf_len, format, tmpargptr);
|
||||
}
|
||||
va_end(argptr);
|
||||
return chars;
|
||||
}
|
||||
|
||||
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...) {
|
||||
if (*bufsize == 0)
|
||||
*bufsize = 256;
|
||||
if (*ret == 0)
|
||||
*strlen = 0;
|
||||
int chars = -1;
|
||||
char* oldret = 0;
|
||||
va_list argptr, tmpargptr;
|
||||
va_start(argptr, format);
|
||||
while (chars == -1 || chars >= (int32)(*bufsize-*strlen)) {
|
||||
if (chars == -1)
|
||||
*bufsize += 256;
|
||||
else
|
||||
*bufsize += chars + 25;
|
||||
oldret = *ret;
|
||||
*ret = new char[*bufsize];
|
||||
if (oldret) {
|
||||
if (*strlen)
|
||||
memcpy(*ret, oldret, *strlen);
|
||||
safe_delete_array(oldret);
|
||||
}
|
||||
va_copy(tmpargptr, argptr);
|
||||
chars = vsnprintf(&(*ret)[*strlen], (*bufsize-*strlen), format, tmpargptr);
|
||||
}
|
||||
va_end(argptr);
|
||||
*strlen += chars;
|
||||
return *strlen;
|
||||
}
|
||||
|
||||
uint32 hextoi(char* num) {
|
||||
int len = strlen(num);
|
||||
if (len < 3)
|
||||
return 0;
|
||||
|
||||
if (num[0] != '0' || (num[1] != 'x' && num[1] != 'X'))
|
||||
return 0;
|
||||
|
||||
uint32 ret = 0;
|
||||
int mul = 1;
|
||||
for (int i=len-1; i>=2; i--) {
|
||||
if (num[i] >= 'A' && num[i] <= 'F')
|
||||
ret += ((num[i] - 'A') + 10) * mul;
|
||||
else if (num[i] >= 'a' && num[i] <= 'f')
|
||||
ret += ((num[i] - 'a') + 10) * mul;
|
||||
else if (num[i] >= '0' && num[i] <= '9')
|
||||
ret += (num[i] - '0') * mul;
|
||||
else
|
||||
return 0;
|
||||
mul *= 16;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint64 hextoi64(char* num) {
|
||||
int len = strlen(num);
|
||||
if (len < 3)
|
||||
return 0;
|
||||
|
||||
if (num[0] != '0' || (num[1] != 'x' && num[1] != 'X'))
|
||||
return 0;
|
||||
|
||||
uint64 ret = 0;
|
||||
int mul = 1;
|
||||
for (int i=len-1; i>=2; i--) {
|
||||
if (num[i] >= 'A' && num[i] <= 'F')
|
||||
ret += ((num[i] - 'A') + 10) * mul;
|
||||
else if (num[i] >= 'a' && num[i] <= 'f')
|
||||
ret += ((num[i] - 'a') + 10) * mul;
|
||||
else if (num[i] >= '0' && num[i] <= '9')
|
||||
ret += (num[i] - '0') * mul;
|
||||
else
|
||||
return 0;
|
||||
mul *= 16;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool atobool(char* iBool) {
|
||||
if (!strcasecmp(iBool, "true"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "false"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "yes"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "no"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "on"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "off"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "enable"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "disable"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "enabled"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "disabled"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "y"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "n"))
|
||||
return false;
|
||||
if (atoi(iBool))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 filesize(FILE* fp) {
|
||||
#ifdef _WINDOWS
|
||||
@@ -316,12 +112,12 @@ uint32 ResolveIP(const char* hostname, char* errbuf) {
|
||||
}
|
||||
struct sockaddr_in server_sin;
|
||||
#ifdef _WINDOWS
|
||||
PHOSTENT phostent = NULL;
|
||||
PHOSTENT phostent = nullptr;
|
||||
#else
|
||||
struct hostent *phostent = NULL;
|
||||
struct hostent *phostent = nullptr;
|
||||
#endif
|
||||
server_sin.sin_family = AF_INET;
|
||||
if ((phostent = gethostbyname(hostname)) == NULL) {
|
||||
if ((phostent = gethostbyname(hostname)) == nullptr) {
|
||||
#ifdef _WINDOWS
|
||||
if (errbuf)
|
||||
snprintf(errbuf, ERRBUF_SIZE, "Unable to get the host name. Error: %i", WSAGetLastError());
|
||||
@@ -396,7 +192,7 @@ int MakeRandomInt(int low, int high)
|
||||
//return (rand()%(high-low+1) + (low));
|
||||
if(!WELLRNG_init) {
|
||||
WELLRNG_init = true;
|
||||
oneseed( rnd_hash( time(NULL), clock() ) );
|
||||
oneseed( rnd_hash( time(nullptr), clock() ) );
|
||||
WELLRNG19937 = case_1;
|
||||
}
|
||||
unsigned int randomnum = ((WELLRNG19937)());
|
||||
@@ -414,7 +210,7 @@ double MakeRandomFloat(double low, double high)
|
||||
//return (rand() / (double)RAND_MAX * (high - low) + low);
|
||||
if(!WELLRNG_init) {
|
||||
WELLRNG_init = true;
|
||||
oneseed( rnd_hash( time(NULL), clock() ) );
|
||||
oneseed( rnd_hash( time(nullptr), clock() ) );
|
||||
WELLRNG19937 = case_1;
|
||||
}
|
||||
return ((WELLRNG19937)() / (double)0xffffffffUL * (high - low) + low);
|
||||
@@ -549,40 +345,6 @@ static unsigned int case_6 (void){
|
||||
|
||||
// end WELL RNG code
|
||||
|
||||
// solar: removes the crap and turns the underscores into spaces.
|
||||
char *CleanMobName(const char *in, char *out)
|
||||
{
|
||||
unsigned i, j;
|
||||
|
||||
for(i = j = 0; i < strlen(in); i++)
|
||||
{
|
||||
// convert _ to space.. any other conversions like this? I *think* this
|
||||
// is the only non alpha char that's not stripped but converted.
|
||||
if(in[i] == '_')
|
||||
{
|
||||
out[j++] = ' ';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isalpha(in[i]) || (in[i] == '`')) // numbers, #, or any other crap just gets skipped
|
||||
out[j++] = in[i];
|
||||
}
|
||||
}
|
||||
out[j] = 0; // terimnate the string before returning it
|
||||
return out;
|
||||
}
|
||||
|
||||
const char *ConvertArray(int input, char *returnchar)
|
||||
{
|
||||
sprintf(returnchar, "%i" ,input);
|
||||
return returnchar;
|
||||
}
|
||||
|
||||
const char *ConvertArrayF(float input, char *returnchar)
|
||||
{
|
||||
sprintf(returnchar, "%0.2f", input);
|
||||
return returnchar;
|
||||
}
|
||||
|
||||
float EQ13toFloat(int d)
|
||||
{
|
||||
@@ -627,24 +389,3 @@ float EQHtoFloat(int d)
|
||||
{
|
||||
return(360.0f - float((d * 360) >> 11));
|
||||
}
|
||||
|
||||
void RemoveApostrophes(std::string &s)
|
||||
{
|
||||
for(unsigned int i = 0; i < s.length(); ++i)
|
||||
if(s[i] == '\'')
|
||||
s[i] = '_';
|
||||
}
|
||||
|
||||
char *RemoveApostrophes(const char *s)
|
||||
{
|
||||
char *NewString = new char[strlen(s) + 1];
|
||||
|
||||
strcpy(NewString, s);
|
||||
|
||||
for(unsigned int i = 0 ; i < strlen(NewString); ++i)
|
||||
if(NewString[i] == '\'')
|
||||
NewString[i] = '_';
|
||||
|
||||
return NewString;
|
||||
}
|
||||
|
||||
|
||||
+4
-31
@@ -34,7 +34,7 @@
|
||||
//
|
||||
#define VARSTRUCT_DECODE_TYPE(Type, Buffer) *(Type *)Buffer; Buffer += sizeof(Type);
|
||||
#define VARSTRUCT_DECODE_STRING(String, Buffer) strcpy(String, Buffer); Buffer += strlen(String)+1;
|
||||
#define VARSTRUCT_ENCODE_STRING(Buffer, String) { sprintf(Buffer, String); Buffer += strlen(String) + 1; }
|
||||
#define VARSTRUCT_ENCODE_STRING(Buffer, String) { sprintf(Buffer, "%s", String); Buffer += strlen(String) + 1; }
|
||||
#define VARSTRUCT_ENCODE_INTSTRING(Buffer, Number) { sprintf(Buffer, "%i", Number); Buffer += strlen(Buffer) + 1; }
|
||||
#define VARSTRUCT_ENCODE_TYPE(Type, Buffer, Value) { *(Type *)Buffer = Value; Buffer += sizeof(Type); }
|
||||
#define VARSTRUCT_SKIP_TYPE(Type, Buffer) Buffer += sizeof(Type);
|
||||
@@ -86,39 +86,14 @@
|
||||
|
||||
#define BITMASK 0x41180000
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// MakeUpperString
|
||||
// i : source - allocated null-terminated string
|
||||
// return: pointer to static buffer with the target string
|
||||
const char *MakeUpperString(const char *source);
|
||||
const char *MakeLowerString(const char *source);
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// MakeUpperString
|
||||
// i : source - allocated null-terminated string
|
||||
// io: target - allocated buffer, at least of size strlen(source)+1
|
||||
void MakeUpperString(const char *source, char *target);
|
||||
void MakeLowerString(const char *source, char *target);
|
||||
|
||||
|
||||
int MakeAnyLenString(char** ret, const char* format, ...);
|
||||
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...);
|
||||
uint32 hextoi(char* num);
|
||||
uint64 hextoi64(char* num);
|
||||
bool atobool(char* iBool);
|
||||
int32 filesize(FILE* fp);
|
||||
uint32 ResolveIP(const char* hostname, char* errbuf = 0);
|
||||
bool ParseAddress(const char* iAddress, uint32* oIP, uint16* oPort, char* errbuf = 0);
|
||||
void CoutTimestamp(bool ms = true);
|
||||
char* strn0cpy(char* dest, const char* source, uint32 size);
|
||||
// return value =true if entire string(source) fit, false if it was truncated
|
||||
bool strn0cpyt(char* dest, const char* source, uint32 size);
|
||||
int MakeRandomInt(int low, int high);
|
||||
double MakeRandomFloat(double low, double high);
|
||||
char *CleanMobName(const char *in, char *out);
|
||||
const char *ConvertArray(int input, char *returnchar);
|
||||
const char *ConvertArrayF(float input, char *returnchar);
|
||||
float EQ13toFloat(int d);
|
||||
float NewEQ13toFloat(int d);
|
||||
float EQ19toFloat(int d);
|
||||
@@ -127,8 +102,6 @@ int FloatToEQ13(float d);
|
||||
int NewFloatToEQ13(float d);
|
||||
int FloatToEQ19(float d);
|
||||
int FloatToEQH(float d);
|
||||
void RemoveApostrophes(std::string &s);
|
||||
char *RemoveApostrophes(const char *s);
|
||||
|
||||
|
||||
|
||||
@@ -149,7 +122,7 @@ public:
|
||||
AutoDelete(T** iVar, T* iSetTo = 0) {
|
||||
init(iVar, iSetTo);
|
||||
}
|
||||
AutoDelete() { pVar = NULL; }
|
||||
AutoDelete() { pVar = nullptr; }
|
||||
void init(T** iVar, T* iSetTo = 0)
|
||||
{
|
||||
pVar = iVar;
|
||||
@@ -157,11 +130,11 @@ public:
|
||||
*pVar = iSetTo;
|
||||
}
|
||||
~AutoDelete() {
|
||||
if(pVar != NULL)
|
||||
if(pVar != nullptr)
|
||||
safe_delete(*pVar);
|
||||
}
|
||||
void ReallyClearIt() {
|
||||
pVar = NULL;
|
||||
pVar = nullptr;
|
||||
}
|
||||
private:
|
||||
T** pVar;
|
||||
|
||||
+12
-22
@@ -19,7 +19,6 @@
|
||||
#include "../common/Mutex.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
#define DEBUG_MUTEX_CLASS 0
|
||||
#if DEBUG_MUTEX_CLASS >= 1
|
||||
@@ -43,7 +42,7 @@ bool IsTryLockSupported() {
|
||||
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
||||
if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) {
|
||||
#if DEBUG_MUTEX_CLASS >= 1
|
||||
cout << "Mutex::trylock() NOT supported" << endl;
|
||||
std::cout << "Mutex::trylock() NOT supported" << std::endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
@@ -52,13 +51,13 @@ bool IsTryLockSupported() {
|
||||
// Tests for Windows NT product family.
|
||||
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 4) {
|
||||
#if DEBUG_MUTEX_CLASS >= 1
|
||||
cout << "Mutex::trylock() SUPPORTED" << endl;
|
||||
std::cout << "Mutex::trylock() SUPPORTED" << std::endl;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
#if DEBUG_MUTEX_CLASS >= 1
|
||||
cout << "Mutex::trylock() NOT supported" << endl;
|
||||
std::cout << "Mutex::trylock() NOT supported" << std::endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
@@ -66,15 +65,16 @@ bool IsTryLockSupported() {
|
||||
#endif
|
||||
|
||||
Mutex::Mutex() {
|
||||
|
||||
#if DEBUG_MUTEX_CLASS >= 7
|
||||
cout << "Constructing Mutex" << endl;
|
||||
std::cout << "Constructing Mutex" << std::endl;
|
||||
#endif
|
||||
#ifdef _WINDOWS
|
||||
InitializeCriticalSection(&CSMutex);
|
||||
#else
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
#if defined(__CYGWIN__) || defined(__APPLE__)
|
||||
#if defined(__CYGWIN__) || defined(__APPLE__) || defined(FREEBSD)
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
#else
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
|
||||
@@ -86,7 +86,7 @@ Mutex::Mutex() {
|
||||
|
||||
Mutex::~Mutex() {
|
||||
#if DEBUG_MUTEX_CLASS >= 7
|
||||
cout << "Deconstructing Mutex" << endl;
|
||||
std::cout << "Deconstructing Mutex" << std::endl;
|
||||
#endif
|
||||
#ifdef _WINDOWS
|
||||
DeleteCriticalSection(&CSMutex);
|
||||
@@ -98,11 +98,11 @@ Mutex::~Mutex() {
|
||||
void Mutex::lock() {
|
||||
_CP(Mutex_lock);
|
||||
#if DEBUG_MUTEX_CLASS >= 9
|
||||
cout << "Locking Mutex" << endl;
|
||||
std::cout << "Locking Mutex" << std::endl;
|
||||
#endif
|
||||
#if DEBUG_MUTEX_CLASS >= 5
|
||||
if (!trylock()) {
|
||||
cout << "Locking Mutex: Having to wait" << endl;
|
||||
std::cout << "Locking Mutex: Having to wait" << std::endl;
|
||||
#ifdef _WINDOWS
|
||||
EnterCriticalSection(&CSMutex);
|
||||
#else
|
||||
@@ -120,7 +120,7 @@ void Mutex::lock() {
|
||||
|
||||
bool Mutex::trylock() {
|
||||
#if DEBUG_MUTEX_CLASS >= 9
|
||||
cout << "TryLocking Mutex" << endl;
|
||||
std::cout << "TryLocking Mutex" << std::endl;
|
||||
#endif
|
||||
#ifdef _WINDOWS
|
||||
#if(_WIN32_WINNT >= 0x0400)
|
||||
@@ -141,7 +141,7 @@ bool Mutex::trylock() {
|
||||
|
||||
void Mutex::unlock() {
|
||||
#if DEBUG_MUTEX_CLASS >= 9
|
||||
cout << "Unlocking Mutex" << endl;
|
||||
std::cout << "Unlocking Mutex" << std::endl;
|
||||
#endif
|
||||
#ifdef _WINDOWS
|
||||
LeaveCriticalSection(&CSMutex);
|
||||
@@ -187,7 +187,7 @@ MRMutex::MRMutex() {
|
||||
MRMutex::~MRMutex() {
|
||||
#ifdef _EQDEBUG
|
||||
if (wl || rl) {
|
||||
cout << "MRMutex::~MRMutex: poor cleanup detected: rl=" << rl << ", wl=" << wl << endl;
|
||||
std::cout << "MRMutex::~MRMutex: poor cleanup detected: rl=" << rl << ", wl=" << wl << std::endl;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -214,11 +214,6 @@ bool MRMutex::TryReadLock() {
|
||||
void MRMutex::UnReadLock() {
|
||||
MCounters.lock();
|
||||
rl--;
|
||||
#ifdef _EQDEBUG
|
||||
if (rl < 0) {
|
||||
ThrowError("rl < 0 in MRMutex::UnReadLock()");
|
||||
}
|
||||
#endif
|
||||
MCounters.unlock();
|
||||
}
|
||||
|
||||
@@ -261,11 +256,6 @@ bool MRMutex::TryWriteLock() {
|
||||
void MRMutex::UnWriteLock() {
|
||||
MCounters.lock();
|
||||
wl--;
|
||||
#ifdef _EQDEBUG
|
||||
if (wl < 0) {
|
||||
ThrowError("wl < 0 in MRMutex::UnWriteLock()");
|
||||
}
|
||||
#endif
|
||||
MCounters.unlock();
|
||||
}
|
||||
|
||||
|
||||
+32
-45
@@ -15,25 +15,27 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "debug.h"
|
||||
#include "ProcLauncher.h"
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
ProcLauncher ProcLauncher::s_launcher;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
@@ -51,10 +53,9 @@ ProcLauncher::ProcLauncher()
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void ProcLauncher::Process() {
|
||||
#ifdef _WINDOWS
|
||||
map<ProcRef, Spec *>::iterator cur, end, tmp;
|
||||
std::map<ProcRef, Spec *>::iterator cur, end, tmp;
|
||||
cur = m_running.begin();
|
||||
end = m_running.end();
|
||||
while(cur != end) {
|
||||
@@ -91,7 +92,7 @@ void ProcLauncher::Process() {
|
||||
break;
|
||||
} else {
|
||||
//one died...
|
||||
map<ProcRef, Spec *>::iterator ref;
|
||||
std::map<ProcRef, Spec *>::iterator ref;
|
||||
ref = m_running.find(died);
|
||||
if(ref == m_running.end()) {
|
||||
//unable to find this process in our list...
|
||||
@@ -107,7 +108,7 @@ void ProcLauncher::Process() {
|
||||
|
||||
void ProcLauncher::ProcessTerminated(std::map<ProcRef, Spec *>::iterator &it) {
|
||||
|
||||
if(it->second->handler != NULL)
|
||||
if(it->second->handler != nullptr)
|
||||
it->second->handler->OnTerminate(it->first, it->second);
|
||||
|
||||
#ifdef _WINDOWS
|
||||
@@ -121,7 +122,7 @@ void ProcLauncher::ProcessTerminated(std::map<ProcRef, Spec *>::iterator &it) {
|
||||
ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
//consume the pointer
|
||||
Spec *it = to_launch;
|
||||
to_launch = NULL;
|
||||
to_launch = nullptr;
|
||||
|
||||
#ifdef _WINDOWS
|
||||
STARTUPINFO siStartInfo;
|
||||
@@ -138,7 +139,7 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
siStartInfo.dwFlags = 0;
|
||||
|
||||
//handle output redirection.
|
||||
HANDLE logOut = NULL;
|
||||
HANDLE logOut = nullptr;
|
||||
BOOL inherit_handles = FALSE;
|
||||
if(it->logFile.length() > 0) {
|
||||
inherit_handles = TRUE;
|
||||
@@ -146,7 +147,7 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
SECURITY_ATTRIBUTES saAttr;
|
||||
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||
saAttr.bInheritHandle = TRUE; //we want this handle to be inherited by the child.
|
||||
saAttr.lpSecurityDescriptor = NULL;
|
||||
saAttr.lpSecurityDescriptor = nullptr;
|
||||
logOut = CreateFile(
|
||||
it->logFile.c_str(), //lpFileName
|
||||
FILE_WRITE_DATA, //dwDesiredAccess
|
||||
@@ -154,12 +155,12 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
&saAttr, //lpSecurityAttributes
|
||||
CREATE_ALWAYS, //dwCreationDisposition
|
||||
FILE_FLAG_NO_BUFFERING, //dwFlagsAndAttributes
|
||||
NULL ); //hTemplateFile
|
||||
nullptr ); //hTemplateFile
|
||||
|
||||
//configure the startup info to redirect output appropriately.
|
||||
siStartInfo.hStdError = logOut;
|
||||
siStartInfo.hStdOutput = logOut;
|
||||
siStartInfo.hStdInput = NULL;
|
||||
siStartInfo.hStdInput = nullptr;
|
||||
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
|
||||
}
|
||||
|
||||
@@ -168,8 +169,8 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
// Create the child process.
|
||||
|
||||
//glue together all the nice command line arguments
|
||||
string args(it->program);
|
||||
vector<string>::iterator cur, end;
|
||||
std::string args(it->program);
|
||||
std::vector<std::string>::iterator cur, end;
|
||||
cur = it->args.begin();
|
||||
end = it->args.end();
|
||||
for(; cur != end; cur++) {
|
||||
@@ -179,12 +180,12 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
|
||||
bFuncRetn = CreateProcess(it->program.c_str(),
|
||||
const_cast<char *>(args.c_str()), // command line
|
||||
NULL, // process security attributes
|
||||
NULL, // primary thread security attributes
|
||||
nullptr, // process security attributes
|
||||
nullptr, // primary thread security attributes
|
||||
inherit_handles, // handles are not inherited
|
||||
0, // creation flags (CREATE_NEW_PROCESS_GROUP maybe)
|
||||
NULL, // use parent's environment
|
||||
NULL, // use parent's current directory
|
||||
nullptr, // use parent's environment
|
||||
nullptr, // use parent's current directory
|
||||
&siStartInfo, // STARTUPINFO pointer
|
||||
&it->proc_info); // receives PROCESS_INFORMATION
|
||||
|
||||
@@ -197,7 +198,7 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
|
||||
//keep process handle open to get exit code
|
||||
CloseHandle(it->proc_info.hThread); //we dont need their thread handle
|
||||
if(logOut != NULL)
|
||||
if(logOut != nullptr)
|
||||
CloseHandle(logOut); //we dont want their output handle either.
|
||||
|
||||
ProcRef res = it->proc_info.dwProcessId;
|
||||
@@ -216,7 +217,7 @@ ProcLauncher::ProcRef ProcLauncher::Launch(Spec *&to_launch) {
|
||||
for(r = 1; r <= it->args.size(); r++) {
|
||||
argv[r] = const_cast<char *>(it->args[r-1].c_str());
|
||||
}
|
||||
argv[r] = NULL;
|
||||
argv[r] = nullptr;
|
||||
|
||||
ProcRef res = fork(); //cant use vfork since we are opening the log file.
|
||||
if(res == -1) {
|
||||
@@ -334,7 +335,7 @@ void ProcLauncher::HandleSigChild(int signum) {
|
||||
|
||||
|
||||
ProcLauncher::Spec::Spec() {
|
||||
handler = NULL;
|
||||
handler = nullptr;
|
||||
}
|
||||
|
||||
ProcLauncher::Spec::Spec(const Spec &other) {
|
||||
@@ -352,17 +353,3 @@ ProcLauncher::Spec &ProcLauncher::Spec::operator=(const Spec &other) {
|
||||
return(*this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+4
-35
@@ -65,25 +65,18 @@ public:
|
||||
virtual void OnTerminate(const ProcRef &ref, const Spec *spec) = 0;
|
||||
};
|
||||
|
||||
/*
|
||||
* The main launch method, call to start a new background process.
|
||||
*/
|
||||
/* The main launch method, call to start a new background process. */
|
||||
ProcRef Launch(Spec *&to_launch); //takes ownership of the pointer
|
||||
|
||||
/*
|
||||
* The terminate method
|
||||
*/
|
||||
/* The terminate method */
|
||||
bool Terminate(const ProcRef &proc, bool graceful = true);
|
||||
void TerminateAll(bool final = true);
|
||||
|
||||
/*
|
||||
* The main processing method. Call regularly to check for terminated
|
||||
* background processes.
|
||||
*/
|
||||
/* The main processing method. Call regularly to check for terminated background processes. */
|
||||
void Process();
|
||||
|
||||
protected:
|
||||
// std::vector<Spec *> m_specs;
|
||||
//std::vector<Spec *> m_specs;
|
||||
std::map<ProcRef, Spec *> m_running; //we own the pointers in this map
|
||||
|
||||
void ProcessTerminated(std::map<ProcRef, Spec *>::iterator &it);
|
||||
@@ -96,29 +89,5 @@ private:
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*PROCLAUNCHER_H_*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,117 +0,0 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "SharedLibrary.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define snprintf _snprintf
|
||||
#if (_MSC_VER < 1500)
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
|
||||
#define EmuLibName "EMuShareMem"
|
||||
#else
|
||||
#define EmuLibName "libEMuShareMem.so"
|
||||
|
||||
#include "../common/unix.h"
|
||||
#include <dlfcn.h>
|
||||
#define GetProcAddress(a,b) dlsym(a,b)
|
||||
#define LoadLibrary(a) dlopen(a, RTLD_NOW)
|
||||
#define FreeLibrary(a) dlclose(a)
|
||||
#define GetLastError() dlerror()
|
||||
#endif
|
||||
|
||||
SharedLibrary::SharedLibrary() {
|
||||
hDLL = NULL;
|
||||
}
|
||||
|
||||
SharedLibrary::~SharedLibrary() {
|
||||
Unload();
|
||||
}
|
||||
|
||||
bool SharedLibrary::Load(const char *name)
|
||||
{
|
||||
#ifdef _WINDOWS
|
||||
SetLastError(0);
|
||||
#endif
|
||||
|
||||
hDLL = LoadLibrary(name);
|
||||
|
||||
if(!hDLL) {
|
||||
const char *load_error = GetError();
|
||||
fprintf(stderr, "[Error] Load Shared Library '%s' failed. Error=%s\n", name, load_error?load_error:"Null Return, no error");
|
||||
return false;
|
||||
}
|
||||
#ifdef _WINDOWS
|
||||
else { SetLastError(0); } // Clear the win9x error
|
||||
#endif
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
void SharedLibrary::Unload() {
|
||||
if (hDLL != NULL) {
|
||||
FreeLibrary(hDLL);
|
||||
#ifndef WIN32
|
||||
const char* error;
|
||||
if ((error = GetError()) != NULL)
|
||||
fprintf(stderr, "FreeLibrary() error = %s", error);
|
||||
#endif
|
||||
hDLL = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void *SharedLibrary::GetSym(const char *name) {
|
||||
if (!Loaded())
|
||||
return(NULL);
|
||||
|
||||
void *r = GetProcAddress(hDLL, name);
|
||||
|
||||
if(GetError() != NULL)
|
||||
r = NULL;
|
||||
|
||||
return(r);
|
||||
}
|
||||
|
||||
bool SharedLibrary::GetSym(const char *name, void **sym)
|
||||
{
|
||||
bool result=false;
|
||||
if (Loaded()) {
|
||||
*sym = GetProcAddress(hDLL, name);
|
||||
result= (GetError() == NULL);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const char *SharedLibrary::GetError()
|
||||
{
|
||||
#ifdef _WINDOWS
|
||||
//not thread safe, dont care.
|
||||
static char ErrBuf[128];
|
||||
unsigned long err = GetLastError();
|
||||
if(err == 0)
|
||||
return(NULL);
|
||||
sprintf(ErrBuf, "Error #%lu", (unsigned long)err);
|
||||
return(ErrBuf);
|
||||
#else
|
||||
return GetLastError();
|
||||
#endif
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _SHAREDLIBRARY_H
|
||||
#define _SHAREDLIBRARY_H
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
class SharedLibrary {
|
||||
public:
|
||||
SharedLibrary();
|
||||
virtual ~SharedLibrary();
|
||||
|
||||
//two call styles for GetSym, one returns bool, other NULL for fail
|
||||
bool GetSym(const char *name, void **sym);
|
||||
void *GetSym(const char *name);
|
||||
|
||||
const char *GetError();
|
||||
|
||||
virtual bool Load(const char *file);
|
||||
virtual void Unload();
|
||||
|
||||
inline bool Loaded() { return (hDLL != 0); }
|
||||
|
||||
protected:
|
||||
#ifdef _WINDOWS
|
||||
HINSTANCE hDLL;
|
||||
#else
|
||||
void* hDLL;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -43,7 +43,7 @@ namespace SOCKETS_NAMESPACE {
|
||||
|
||||
|
||||
File::File()
|
||||
:m_fil(NULL)
|
||||
:m_fil(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ size_t File::fwrite(const char *ptr, size_t size, size_t nmemb)
|
||||
|
||||
char *File::fgets(char *s, int size)
|
||||
{
|
||||
return m_fil ? ::fgets(s, size, m_fil) : NULL;
|
||||
return m_fil ? ::fgets(s, size, m_fil) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -93,14 +93,14 @@ bool HttpdCookies::getvalue(const std::string& name,std::string& buffer) //char
|
||||
|
||||
void HttpdCookies::replacevalue(const std::string& name,const std::string& value)
|
||||
{
|
||||
COOKIE *c = NULL;
|
||||
COOKIE *c = nullptr;
|
||||
|
||||
for (cookie_v::iterator it = m_cookies.begin(); it != m_cookies.end(); it++)
|
||||
{
|
||||
c = *it;
|
||||
if (!strcasecmp(c -> name.c_str(),name.c_str()))
|
||||
break;
|
||||
c = NULL;
|
||||
c = nullptr;
|
||||
}
|
||||
|
||||
if (c)
|
||||
@@ -126,14 +126,14 @@ void HttpdCookies::replacevalue(const std::string& name,int i)
|
||||
|
||||
size_t HttpdCookies::getlength(const std::string& name)
|
||||
{
|
||||
COOKIE *c = NULL;
|
||||
COOKIE *c = nullptr;
|
||||
|
||||
for (cookie_v::iterator it = m_cookies.begin(); it != m_cookies.end(); it++)
|
||||
{
|
||||
c = *it;
|
||||
if (!strcasecmp(c -> name.c_str(),name.c_str()))
|
||||
break;
|
||||
c = NULL;
|
||||
c = nullptr;
|
||||
}
|
||||
return c ? c -> value.size() : 0;
|
||||
}
|
||||
@@ -223,7 +223,7 @@ void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const
|
||||
|
||||
const std::string& HttpdCookies::expiredatetime()
|
||||
{
|
||||
time_t t = time(NULL);
|
||||
time_t t = time(nullptr);
|
||||
struct tm * tp = gmtime(&t);
|
||||
const char *days[7] = {"Sunday", "Monday",
|
||||
"Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace SOCKETS_NAMESPACE {
|
||||
|
||||
HttpdForm::HttpdForm(IFile *infil) : raw(false)
|
||||
{
|
||||
CGI *cgi = NULL;
|
||||
CGI *cgi = nullptr;
|
||||
char *c_t = getenv("CONTENT_TYPE");
|
||||
char *c_l = getenv("CONTENT_LENGTH");
|
||||
size_t extra = 2;
|
||||
@@ -59,7 +59,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
|
||||
if (c_t && !strncmp(c_t, "multipart/form-data",19))
|
||||
{
|
||||
Parse pa(c_t,";=");
|
||||
char *tempcmp = NULL;
|
||||
char *tempcmp = nullptr;
|
||||
size_t tc = 0;
|
||||
size_t l = 0;
|
||||
std::string str = pa.getword();
|
||||
@@ -80,7 +80,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
|
||||
std::string content_type;
|
||||
std::string current_name;
|
||||
std::string current_filename;
|
||||
char slask[200];
|
||||
char slask[2000];
|
||||
infil -> fgets(slask, 200);
|
||||
while (!infil -> eof())
|
||||
{
|
||||
@@ -209,7 +209,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
|
||||
#else
|
||||
sprintf(fn,"/tmp/%s",current_filename.c_str());
|
||||
#endif
|
||||
if ((fil = fopen(fn, "wb")) != NULL)
|
||||
if ((fil = fopen(fn, "wb")) != nullptr)
|
||||
{
|
||||
infil -> fread(&c,1,1);
|
||||
while (!infil -> eof())
|
||||
@@ -353,7 +353,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
|
||||
|
||||
HttpdForm::HttpdForm(const std::string& buffer,size_t l) : raw(false)
|
||||
{
|
||||
CGI *cgi = NULL;
|
||||
CGI *cgi = nullptr;
|
||||
char slask[8888];
|
||||
char name[200];
|
||||
int i = 0;
|
||||
@@ -424,7 +424,7 @@ HttpdForm::HttpdForm(const std::string& buffer,size_t l) : raw(false)
|
||||
|
||||
HttpdForm::~HttpdForm()
|
||||
{
|
||||
CGI *cgi = NULL; //,*tmp;
|
||||
CGI *cgi = nullptr; //,*tmp;
|
||||
|
||||
for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); it++)
|
||||
{
|
||||
@@ -525,7 +525,7 @@ bool HttpdForm::getnext(std::string& n,std::string& v) //char *n,size_t len,char
|
||||
|
||||
int HttpdForm::getvalue(const std::string& n,std::string& v) //char *v,size_t len)
|
||||
{
|
||||
CGI *cgi = NULL;
|
||||
CGI *cgi = nullptr;
|
||||
int r = 0;
|
||||
|
||||
for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); it++)
|
||||
@@ -533,7 +533,7 @@ int HttpdForm::getvalue(const std::string& n,std::string& v) //char *v,size_t le
|
||||
cgi = *it;
|
||||
if (cgi -> name == n)
|
||||
break;
|
||||
cgi = NULL;
|
||||
cgi = nullptr;
|
||||
}
|
||||
if (cgi)
|
||||
{
|
||||
@@ -572,7 +572,7 @@ std::string HttpdForm::getvalue(const std::string& n)
|
||||
|
||||
size_t HttpdForm::getlength(const std::string& n)
|
||||
{
|
||||
CGI *cgi = NULL;
|
||||
CGI *cgi = nullptr;
|
||||
size_t l;
|
||||
|
||||
for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); it++)
|
||||
@@ -580,7 +580,7 @@ size_t HttpdForm::getlength(const std::string& n)
|
||||
cgi = *it;
|
||||
if (cgi -> name == n)
|
||||
break;
|
||||
cgi = NULL;
|
||||
cgi = nullptr;
|
||||
}
|
||||
l = cgi ? cgi -> value.size() : 0;
|
||||
if (cgi && !raw)
|
||||
|
||||
@@ -64,11 +64,11 @@ std::string HttpdSocket::m_start = "";
|
||||
HttpdSocket::HttpdSocket(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort)
|
||||
: HTTPSocket(ID,in_socket,irIP,irPort)
|
||||
,m_content_length(0)
|
||||
,m_file(NULL)
|
||||
,m_file(nullptr)
|
||||
,m_received(0)
|
||||
,m_request_id(++m_request_count)
|
||||
,m_cookies(NULL)
|
||||
,m_form(NULL)
|
||||
,m_cookies(nullptr)
|
||||
,m_form(nullptr)
|
||||
{
|
||||
m_http_date = datetime2httpdate(GetDate());
|
||||
if (!m_start.size())
|
||||
@@ -289,7 +289,7 @@ std::string HttpdSocket::datetime2httpdate(const std::string& dt)
|
||||
|
||||
std::string HttpdSocket::GetDate()
|
||||
{
|
||||
time_t t = time(NULL);
|
||||
time_t t = time(nullptr);
|
||||
struct tm* tp = localtime(&t);
|
||||
char slask[40];
|
||||
if (tp)
|
||||
@@ -315,16 +315,16 @@ void HttpdSocket::Reset()
|
||||
if (m_file)
|
||||
{
|
||||
delete m_file;
|
||||
m_file = NULL;
|
||||
m_file = nullptr;
|
||||
}
|
||||
m_received = 0;
|
||||
m_request_id = ++m_request_count;
|
||||
if (m_cookies)
|
||||
delete m_cookies;
|
||||
m_cookies = NULL;
|
||||
m_cookies = nullptr;
|
||||
if (m_form)
|
||||
delete m_form;
|
||||
m_form = NULL;
|
||||
m_form = nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -66,8 +66,8 @@ MemFile::MemFile(const std::string& path)
|
||||
:m_path(path)
|
||||
,m_temporary(false)
|
||||
,m_base(m_files[path])
|
||||
,m_current_read(NULL)
|
||||
,m_current_write(NULL)
|
||||
,m_current_read(nullptr)
|
||||
,m_current_write(nullptr)
|
||||
,m_read_ptr(0)
|
||||
,m_write_ptr(0)
|
||||
{
|
||||
|
||||
@@ -48,7 +48,7 @@ public:
|
||||
/** File block structure.
|
||||
\ingroup file */
|
||||
struct block_t {
|
||||
block_t() : next(NULL) {}
|
||||
block_t() : next(nullptr) {}
|
||||
struct block_t *next;
|
||||
char data[BLOCKSIZE];
|
||||
};
|
||||
|
||||
@@ -37,7 +37,7 @@ Mime::Mime(const std::string& filename) {
|
||||
|
||||
bool Mime::LoadMimeFile(const std::string& filename) {
|
||||
FILE *fil;
|
||||
if ((fil = fopen(filename.c_str(),"rt")) != NULL) {
|
||||
if ((fil = fopen(filename.c_str(),"rt")) != nullptr) {
|
||||
char * slask = new char[1000];
|
||||
fgets(slask,1000,fil);
|
||||
while (!feof(fil))
|
||||
|
||||
@@ -104,7 +104,7 @@ typedef struct _tagSTACKFRAME64 {
|
||||
ADDRESS64 AddrFrame; // frame pointer
|
||||
ADDRESS64 AddrStack; // stack pointer
|
||||
ADDRESS64 AddrBStore; // backing store pointer
|
||||
PVOID FuncTableEntry; // pointer to pdata/fpo or NULL
|
||||
PVOID FuncTableEntry; // pointer to pdata/fpo or nullptr
|
||||
DWORD64 Params[4]; // possible arguments to the function
|
||||
BOOL Far; // WOW far call
|
||||
BOOL Virtual; // is this a virtual frame?
|
||||
@@ -187,44 +187,44 @@ public:
|
||||
StackWalkerInternal(StackWalker *parent, HANDLE hProcess)
|
||||
{
|
||||
m_parent = parent;
|
||||
m_hDbhHelp = NULL;
|
||||
pSC = NULL;
|
||||
m_hDbhHelp = nullptr;
|
||||
pSC = nullptr;
|
||||
m_hProcess = hProcess;
|
||||
m_szSymPath = NULL;
|
||||
pSFTA = NULL;
|
||||
pSGLFA = NULL;
|
||||
pSGMB = NULL;
|
||||
pSGMI = NULL;
|
||||
pSGO = NULL;
|
||||
pSGSFA = NULL;
|
||||
pSI = NULL;
|
||||
pSLM = NULL;
|
||||
pSSO = NULL;
|
||||
pSW = NULL;
|
||||
pUDSN = NULL;
|
||||
pSGSP = NULL;
|
||||
m_szSymPath = nullptr;
|
||||
pSFTA = nullptr;
|
||||
pSGLFA = nullptr;
|
||||
pSGMB = nullptr;
|
||||
pSGMI = nullptr;
|
||||
pSGO = nullptr;
|
||||
pSGSFA = nullptr;
|
||||
pSI = nullptr;
|
||||
pSLM = nullptr;
|
||||
pSSO = nullptr;
|
||||
pSW = nullptr;
|
||||
pUDSN = nullptr;
|
||||
pSGSP = nullptr;
|
||||
}
|
||||
~StackWalkerInternal()
|
||||
{
|
||||
if (pSC != NULL)
|
||||
if (pSC != nullptr)
|
||||
pSC(m_hProcess); // SymCleanup
|
||||
if (m_hDbhHelp != NULL)
|
||||
if (m_hDbhHelp != nullptr)
|
||||
FreeLibrary(m_hDbhHelp);
|
||||
m_hDbhHelp = NULL;
|
||||
m_parent = NULL;
|
||||
if(m_szSymPath != NULL)
|
||||
m_hDbhHelp = nullptr;
|
||||
m_parent = nullptr;
|
||||
if(m_szSymPath != nullptr)
|
||||
free(m_szSymPath);
|
||||
m_szSymPath = NULL;
|
||||
m_szSymPath = nullptr;
|
||||
}
|
||||
BOOL Init(LPCSTR szSymPath)
|
||||
{
|
||||
if (m_parent == NULL)
|
||||
if (m_parent == nullptr)
|
||||
return FALSE;
|
||||
// Dynamically load the Entry-Points for dbghelp.dll:
|
||||
// First try to load the newsest one from
|
||||
TCHAR szTemp[4096];
|
||||
// But before wqe do this, we first check if the ".local" file exists
|
||||
if (GetModuleFileName(NULL, szTemp, 4096) > 0)
|
||||
if (GetModuleFileName(nullptr, szTemp, 4096) > 0)
|
||||
{
|
||||
_tcscat_s(szTemp, _T(".local"));
|
||||
if (GetFileAttributes(szTemp) == INVALID_FILE_ATTRIBUTES)
|
||||
@@ -240,7 +240,7 @@ public:
|
||||
}
|
||||
}
|
||||
// Still not found? Then try to load the 64-Bit version:
|
||||
if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) )
|
||||
if ( (m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) )
|
||||
{
|
||||
_tcscat_s(szTemp, _T("\\Debugging Tools for Windows 64-Bit\\dbghelp.dll"));
|
||||
if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)
|
||||
@@ -250,9 +250,9 @@ public:
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_hDbhHelp == NULL) // if not already loaded, try to load a default-one
|
||||
if (m_hDbhHelp == nullptr) // if not already loaded, try to load a default-one
|
||||
m_hDbhHelp = LoadLibrary( _T("dbghelp.dll") );
|
||||
if (m_hDbhHelp == NULL)
|
||||
if (m_hDbhHelp == nullptr)
|
||||
return FALSE;
|
||||
pSI = (tSI) GetProcAddress(m_hDbhHelp, "SymInitialize" );
|
||||
pSC = (tSC) GetProcAddress(m_hDbhHelp, "SymCleanup" );
|
||||
@@ -271,18 +271,18 @@ public:
|
||||
pSLM = (tSLM) GetProcAddress(m_hDbhHelp, "SymLoadModule64" );
|
||||
pSGSP =(tSGSP) GetProcAddress(m_hDbhHelp, "SymGetSearchPath" );
|
||||
|
||||
if ( pSC == NULL || pSFTA == NULL || pSGMB == NULL || pSGMI == NULL ||
|
||||
pSGO == NULL || pSGSFA == NULL || pSI == NULL || pSSO == NULL ||
|
||||
pSW == NULL || pUDSN == NULL || pSLM == NULL )
|
||||
if ( pSC == nullptr || pSFTA == nullptr || pSGMB == nullptr || pSGMI == nullptr ||
|
||||
pSGO == nullptr || pSGSFA == nullptr || pSI == nullptr || pSSO == nullptr ||
|
||||
pSW == nullptr || pUDSN == nullptr || pSLM == nullptr )
|
||||
{
|
||||
FreeLibrary(m_hDbhHelp);
|
||||
m_hDbhHelp = NULL;
|
||||
pSC = NULL;
|
||||
m_hDbhHelp = nullptr;
|
||||
pSC = nullptr;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// SymInitialize
|
||||
if (szSymPath != NULL)
|
||||
if (szSymPath != nullptr)
|
||||
m_szSymPath = _strdup(szSymPath);
|
||||
if (this->pSI(m_hProcess, m_szSymPath, FALSE) == FALSE)
|
||||
this->m_parent->OnDbgHelpErr("SymInitialize", GetLastError(), 0);
|
||||
@@ -295,7 +295,7 @@ public:
|
||||
symOptions = this->pSSO(symOptions);
|
||||
|
||||
char buf[StackWalker::STACKWALK_MAX_NAMELEN] = {0};
|
||||
if (this->pSGSP != NULL)
|
||||
if (this->pSGSP != nullptr)
|
||||
{
|
||||
if (this->pSGSP(m_hProcess, buf, StackWalker::STACKWALK_MAX_NAMELEN) == FALSE)
|
||||
this->m_parent->OnDbgHelpErr("SymGetSearchPath", GetLastError(), 0);
|
||||
@@ -458,10 +458,10 @@ private:
|
||||
|
||||
// try both dlls...
|
||||
const TCHAR *dllname[] = { _T("kernel32.dll"), _T("tlhelp32.dll") };
|
||||
HINSTANCE hToolhelp = NULL;
|
||||
tCT32S pCT32S = NULL;
|
||||
tM32F pM32F = NULL;
|
||||
tM32N pM32N = NULL;
|
||||
HINSTANCE hToolhelp = nullptr;
|
||||
tCT32S pCT32S = nullptr;
|
||||
tM32F pM32F = nullptr;
|
||||
tM32N pM32N = nullptr;
|
||||
|
||||
HANDLE hSnap;
|
||||
MODULEENTRY32 me;
|
||||
@@ -472,18 +472,18 @@ private:
|
||||
for (i = 0; i<(sizeof(dllname) / sizeof(dllname[0])); i++ )
|
||||
{
|
||||
hToolhelp = LoadLibrary( dllname[i] );
|
||||
if (hToolhelp == NULL)
|
||||
if (hToolhelp == nullptr)
|
||||
continue;
|
||||
pCT32S = (tCT32S) GetProcAddress(hToolhelp, "CreateToolhelp32Snapshot");
|
||||
pM32F = (tM32F) GetProcAddress(hToolhelp, "Module32First");
|
||||
pM32N = (tM32N) GetProcAddress(hToolhelp, "Module32Next");
|
||||
if ( (pCT32S != NULL) && (pM32F != NULL) && (pM32N != NULL) )
|
||||
if ( (pCT32S != nullptr) && (pM32F != nullptr) && (pM32N != nullptr) )
|
||||
break; // found the functions!
|
||||
FreeLibrary(hToolhelp);
|
||||
hToolhelp = NULL;
|
||||
hToolhelp = nullptr;
|
||||
}
|
||||
|
||||
if (hToolhelp == NULL)
|
||||
if (hToolhelp == nullptr)
|
||||
return FALSE;
|
||||
|
||||
hSnap = pCT32S( TH32CS_SNAPMODULE, pid );
|
||||
@@ -534,20 +534,20 @@ private:
|
||||
DWORD cbNeeded;
|
||||
MODULEINFO mi;
|
||||
HMODULE *hMods = 0;
|
||||
char *tt = NULL;
|
||||
char *tt2 = NULL;
|
||||
char *tt = nullptr;
|
||||
char *tt2 = nullptr;
|
||||
const SIZE_T TTBUFLEN = 8096;
|
||||
int cnt = 0;
|
||||
|
||||
hPsapi = LoadLibrary( _T("psapi.dll") );
|
||||
if (hPsapi == NULL)
|
||||
if (hPsapi == nullptr)
|
||||
return FALSE;
|
||||
|
||||
pEPM = (tEPM) GetProcAddress( hPsapi, "EnumProcessModules" );
|
||||
pGMFNE = (tGMFNE) GetProcAddress( hPsapi, "GetModuleFileNameExA" );
|
||||
pGMBN = (tGMFNE) GetProcAddress( hPsapi, "GetModuleBaseNameA" );
|
||||
pGMI = (tGMI) GetProcAddress( hPsapi, "GetModuleInformation" );
|
||||
if ( (pEPM == NULL) || (pGMFNE == NULL) || (pGMBN == NULL) || (pGMI == NULL) )
|
||||
if ( (pEPM == nullptr) || (pGMFNE == nullptr) || (pGMBN == nullptr) || (pGMI == nullptr) )
|
||||
{
|
||||
// we couldn?t find all functions
|
||||
FreeLibrary(hPsapi);
|
||||
@@ -557,7 +557,7 @@ private:
|
||||
hMods = (HMODULE*) malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof HMODULE));
|
||||
tt = (char*) malloc(sizeof(char) * TTBUFLEN);
|
||||
tt2 = (char*) malloc(sizeof(char) * TTBUFLEN);
|
||||
if ( (hMods == NULL) || (tt == NULL) || (tt2 == NULL) )
|
||||
if ( (hMods == nullptr) || (tt == nullptr) || (tt2 == nullptr) )
|
||||
goto cleanup;
|
||||
|
||||
if ( ! pEPM( hProcess, hMods, TTBUFLEN, &cbNeeded ) )
|
||||
@@ -590,10 +590,10 @@ private:
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if (hPsapi != NULL) FreeLibrary(hPsapi);
|
||||
if (tt2 != NULL) free(tt2);
|
||||
if (tt != NULL) free(tt);
|
||||
if (hMods != NULL) free(hMods);
|
||||
if (hPsapi != nullptr) FreeLibrary(hPsapi);
|
||||
if (tt2 != nullptr) free(tt2);
|
||||
if (tt != nullptr) free(tt);
|
||||
if (hMods != nullptr) free(hMods);
|
||||
|
||||
return cnt != 0;
|
||||
} // GetModuleListPSAPI
|
||||
@@ -603,7 +603,7 @@ private:
|
||||
CHAR *szImg = _strdup(img);
|
||||
CHAR *szMod = _strdup(mod);
|
||||
DWORD result = ERROR_SUCCESS;
|
||||
if ( (szImg == NULL) || (szMod == NULL) )
|
||||
if ( (szImg == nullptr) || (szMod == nullptr) )
|
||||
result = ERROR_NOT_ENOUGH_MEMORY;
|
||||
else
|
||||
{
|
||||
@@ -611,25 +611,25 @@ private:
|
||||
result = GetLastError();
|
||||
}
|
||||
ULONGLONG fileVersion = 0;
|
||||
if ( (m_parent != NULL) && (szImg != NULL) )
|
||||
if ( (m_parent != nullptr) && (szImg != nullptr) )
|
||||
{
|
||||
// try to retrive the file-version:
|
||||
if ( (this->m_parent->m_options & StackWalker::RetrieveFileVersion) != 0)
|
||||
{
|
||||
VS_FIXEDFILEINFO *fInfo = NULL;
|
||||
VS_FIXEDFILEINFO *fInfo = nullptr;
|
||||
DWORD dwHandle;
|
||||
DWORD dwSize = GetFileVersionInfoSizeA(szImg, &dwHandle);
|
||||
if (dwSize > 0)
|
||||
{
|
||||
LPVOID vData = malloc(dwSize);
|
||||
if (vData != NULL)
|
||||
if (vData != nullptr)
|
||||
{
|
||||
if (GetFileVersionInfoA(szImg, dwHandle, dwSize, vData) != 0)
|
||||
{
|
||||
UINT len;
|
||||
TCHAR szSubBlock[] = _T("\\");
|
||||
if (VerQueryValue(vData, szSubBlock, (LPVOID*) &fInfo, &len) == 0)
|
||||
fInfo = NULL;
|
||||
fInfo = nullptr;
|
||||
else
|
||||
{
|
||||
fileVersion = ((ULONGLONG)fInfo->dwFileVersionLS) + ((ULONGLONG)fInfo->dwFileVersionMS << 32);
|
||||
@@ -678,8 +678,8 @@ private:
|
||||
}
|
||||
this->m_parent->OnLoadModule(img, mod, baseAddr, size, result, szSymType, Module.LoadedImageName, fileVersion);
|
||||
}
|
||||
if (szImg != NULL) free(szImg);
|
||||
if (szMod != NULL) free(szMod);
|
||||
if (szImg != nullptr) free(szImg);
|
||||
if (szMod != nullptr) free(szMod);
|
||||
return result;
|
||||
}
|
||||
public:
|
||||
@@ -695,7 +695,7 @@ public:
|
||||
|
||||
BOOL GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V2 *pModuleInfo)
|
||||
{
|
||||
if(this->pSGMI == NULL)
|
||||
if(this->pSGMI == nullptr)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return FALSE;
|
||||
@@ -703,7 +703,7 @@ public:
|
||||
// First try to use the larger ModuleInfo-Structure
|
||||
// memset(pModuleInfo, 0, sizeof(IMAGEHLP_MODULE64_V3));
|
||||
// pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3);
|
||||
// if (this->pSGMI_V3 != NULL)
|
||||
// if (this->pSGMI_V3 != nullptr)
|
||||
// {
|
||||
// if (this->pSGMI_V3(hProcess, baseAddr, pModuleInfo) != FALSE)
|
||||
// return TRUE;
|
||||
@@ -714,7 +714,7 @@ public:
|
||||
// could not retrive the bigger structure, try with the smaller one (as defined in VC7.1)...
|
||||
pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2);
|
||||
void *pData = malloc(4096); // reserve enough memory, so the bug in v6.3.5.1 does not lead to memory-overwrites...
|
||||
if (pData == NULL)
|
||||
if (pData == nullptr)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return FALSE;
|
||||
@@ -742,7 +742,7 @@ StackWalker::StackWalker(DWORD dwProcessId, HANDLE hProcess)
|
||||
this->m_hProcess = hProcess;
|
||||
this->m_sw = new StackWalkerInternal(this, this->m_hProcess);
|
||||
this->m_dwProcessId = dwProcessId;
|
||||
this->m_szSymPath = NULL;
|
||||
this->m_szSymPath = nullptr;
|
||||
}
|
||||
StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess)
|
||||
{
|
||||
@@ -751,28 +751,28 @@ StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDL
|
||||
this->m_hProcess = hProcess;
|
||||
this->m_sw = new StackWalkerInternal(this, this->m_hProcess);
|
||||
this->m_dwProcessId = dwProcessId;
|
||||
if (szSymPath != NULL)
|
||||
if (szSymPath != nullptr)
|
||||
{
|
||||
this->m_szSymPath = _strdup(szSymPath);
|
||||
this->m_options |= SymBuildPath;
|
||||
}
|
||||
else
|
||||
this->m_szSymPath = NULL;
|
||||
this->m_szSymPath = nullptr;
|
||||
}
|
||||
|
||||
StackWalker::~StackWalker()
|
||||
{
|
||||
if (m_szSymPath != NULL)
|
||||
if (m_szSymPath != nullptr)
|
||||
free(m_szSymPath);
|
||||
m_szSymPath = NULL;
|
||||
if (this->m_sw != NULL)
|
||||
m_szSymPath = nullptr;
|
||||
if (this->m_sw != nullptr)
|
||||
delete this->m_sw;
|
||||
this->m_sw = NULL;
|
||||
this->m_sw = nullptr;
|
||||
}
|
||||
|
||||
BOOL StackWalker::LoadModules()
|
||||
{
|
||||
if (this->m_sw == NULL)
|
||||
if (this->m_sw == nullptr)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return FALSE;
|
||||
@@ -781,19 +781,19 @@ BOOL StackWalker::LoadModules()
|
||||
return TRUE;
|
||||
|
||||
// Build the sym-path:
|
||||
char *szSymPath = NULL;
|
||||
char *szSymPath = nullptr;
|
||||
if ( (this->m_options & SymBuildPath) != 0)
|
||||
{
|
||||
const size_t nSymPathLen = 4096;
|
||||
szSymPath = (char*) malloc(nSymPathLen);
|
||||
if (szSymPath == NULL)
|
||||
if (szSymPath == nullptr)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
szSymPath[0] = 0;
|
||||
// Now first add the (optional) provided sympath:
|
||||
if (this->m_szSymPath != NULL)
|
||||
if (this->m_szSymPath != nullptr)
|
||||
{
|
||||
strcat_s(szSymPath, nSymPathLen, this->m_szSymPath);
|
||||
strcat_s(szSymPath, nSymPathLen, ";");
|
||||
@@ -812,7 +812,7 @@ BOOL StackWalker::LoadModules()
|
||||
}
|
||||
|
||||
// Now add the path for the main-module:
|
||||
if (GetModuleFileNameA(NULL, szTemp, nTempLen) > 0)
|
||||
if (GetModuleFileNameA(nullptr, szTemp, nTempLen) > 0)
|
||||
{
|
||||
szTemp[nTempLen-1] = 0;
|
||||
for (char *p = (szTemp+strlen(szTemp)-1); p >= szTemp; --p)
|
||||
@@ -870,7 +870,7 @@ BOOL StackWalker::LoadModules()
|
||||
|
||||
// First Init the whole stuff...
|
||||
BOOL bRet = this->m_sw->Init(szSymPath);
|
||||
if (szSymPath != NULL) free(szSymPath); szSymPath = NULL;
|
||||
if (szSymPath != nullptr) free(szSymPath); szSymPath = nullptr;
|
||||
if (bRet == FALSE)
|
||||
{
|
||||
this->OnDbgHelpErr("Error while initializing dbghelp.dll", 0, 0);
|
||||
@@ -889,14 +889,14 @@ BOOL StackWalker::LoadModules()
|
||||
// This has to be done due to a problem with the "hProcess"-parameter in x64...
|
||||
// Because this class is in no case multi-threading-enabled (because of the limitations
|
||||
// of dbghelp.dll) it is "safe" to use a static-variable
|
||||
static StackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = NULL;
|
||||
static LPVOID s_readMemoryFunction_UserData = NULL;
|
||||
static StackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = nullptr;
|
||||
static LPVOID s_readMemoryFunction_UserData = nullptr;
|
||||
|
||||
BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadProcessMemoryRoutine readMemoryFunction, LPVOID pUserData)
|
||||
{
|
||||
CONTEXT c;;
|
||||
CallstackEntry csEntry;
|
||||
IMAGEHLP_SYMBOL64 *pSym = NULL;
|
||||
IMAGEHLP_SYMBOL64 *pSym = nullptr;
|
||||
StackWalkerInternal::IMAGEHLP_MODULE64_V2 Module;
|
||||
IMAGEHLP_LINE64 Line;
|
||||
int frameNum;
|
||||
@@ -904,7 +904,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
|
||||
if (m_modulesLoaded == FALSE)
|
||||
this->LoadModules(); // ignore the result...
|
||||
|
||||
if (this->m_sw->m_hDbhHelp == NULL)
|
||||
if (this->m_sw->m_hDbhHelp == nullptr)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return FALSE;
|
||||
@@ -913,7 +913,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
|
||||
s_readMemoryFunction = readMemoryFunction;
|
||||
s_readMemoryFunction_UserData = pUserData;
|
||||
|
||||
if (context == NULL)
|
||||
if (context == nullptr)
|
||||
{
|
||||
// If no context is provided, capture the context
|
||||
if (hThread == GetCurrentThread())
|
||||
@@ -989,7 +989,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
|
||||
// assume that either you are done, or that the stack is so hosed that the next
|
||||
// deeper frame could not be found.
|
||||
// CONTEXT need not to be suplied if imageTyp is IMAGE_FILE_MACHINE_I386!
|
||||
if ( ! this->m_sw->pSW(imageType, this->m_hProcess, hThread, &s, &c, myReadProcMem, this->m_sw->pSFTA, this->m_sw->pSGMB, NULL) )
|
||||
if ( ! this->m_sw->pSW(imageType, this->m_hProcess, hThread, &s, &c, myReadProcMem, this->m_sw->pSFTA, this->m_sw->pSGMB, nullptr) )
|
||||
{
|
||||
this->OnDbgHelpErr("StackWalk64", GetLastError(), s.AddrPC.Offset);
|
||||
break;
|
||||
@@ -1028,7 +1028,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
|
||||
}
|
||||
|
||||
// show line number info, NT5.0-method (SymGetLineFromAddr64())
|
||||
if (this->m_sw->pSGLFA != NULL )
|
||||
if (this->m_sw->pSGLFA != nullptr )
|
||||
{ // yes, we have SymGetLineFromAddr64()
|
||||
if (this->m_sw->pSGLFA(this->m_hProcess, s.AddrPC.Offset, &(csEntry.offsetFromLine), &Line) != FALSE)
|
||||
{
|
||||
@@ -1078,7 +1078,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
|
||||
break;
|
||||
default:
|
||||
//_snprintf( ty, sizeof ty, "symtype=%ld", (long) Module.SymType );
|
||||
csEntry.symTypeString = NULL;
|
||||
csEntry.symTypeString = nullptr;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1109,7 +1109,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
|
||||
cleanup:
|
||||
if (pSym) free( pSym );
|
||||
|
||||
if (context == NULL)
|
||||
if (context == nullptr)
|
||||
ResumeThread(hThread);
|
||||
|
||||
return TRUE;
|
||||
@@ -1123,7 +1123,7 @@ BOOL __stdcall StackWalker::myReadProcMem(
|
||||
LPDWORD lpNumberOfBytesRead
|
||||
)
|
||||
{
|
||||
if (s_readMemoryFunction == NULL)
|
||||
if (s_readMemoryFunction == nullptr)
|
||||
{
|
||||
SIZE_T st;
|
||||
BOOL bRet = ReadProcessMemory(hProcess, (LPVOID) qwBaseAddress, lpBuffer, nSize, &st);
|
||||
|
||||
@@ -66,7 +66,7 @@ public:
|
||||
|
||||
StackWalker(
|
||||
int options = OptionsAll, // 'int' is by design, to combine the enum-flags
|
||||
LPCSTR szSymPath = NULL,
|
||||
LPCSTR szSymPath = nullptr,
|
||||
DWORD dwProcessId = GetCurrentProcessId(),
|
||||
HANDLE hProcess = GetCurrentProcess()
|
||||
);
|
||||
@@ -86,9 +86,9 @@ public:
|
||||
|
||||
BOOL ShowCallstack(
|
||||
HANDLE hThread = GetCurrentThread(),
|
||||
const CONTEXT *context = NULL,
|
||||
PReadProcessMemoryRoutine readMemoryFunction = NULL,
|
||||
LPVOID pUserData = NULL // optional to identify some data in the 'readMemoryFunction'-callback
|
||||
const CONTEXT *context = nullptr,
|
||||
PReadProcessMemoryRoutine readMemoryFunction = nullptr,
|
||||
LPVOID pUserData = nullptr // optional to identify some data in the 'readMemoryFunction'-callback
|
||||
);
|
||||
|
||||
#if _MSC_VER >= 1300
|
||||
@@ -157,11 +157,11 @@ protected:
|
||||
#define GET_CURRENT_CONTEXT(c, contextFlags) \
|
||||
do { \
|
||||
memset(&c, 0, sizeof(CONTEXT)); \
|
||||
EXCEPTION_POINTERS *pExp = NULL; \
|
||||
EXCEPTION_POINTERS *pExp = nullptr; \
|
||||
__try { \
|
||||
throw 0; \
|
||||
} __except( ( (pExp = GetExceptionInformation()) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_EXECUTE_HANDLER)) {} \
|
||||
if (pExp != NULL) \
|
||||
if (pExp != nullptr) \
|
||||
memcpy(&c, pExp->ContextRecord, sizeof(CONTEXT)); \
|
||||
c.ContextFlags = contextFlags; \
|
||||
} while(0);
|
||||
|
||||
@@ -0,0 +1,330 @@
|
||||
/*
|
||||
* Copyright 2013 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "StringUtil.h"
|
||||
|
||||
#include <string>
|
||||
#include <cstdarg>
|
||||
#include <cstring> // for strncpy
|
||||
#include <stdexcept>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
|
||||
#define snprintf _snprintf
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#ifndef va_copy
|
||||
#define va_copy(d,s) ((d) = (s))
|
||||
#endif
|
||||
|
||||
// original source:
|
||||
// https://github.com/facebook/folly/blob/master/folly/String.cpp
|
||||
//
|
||||
void vStringFormat(std::string& output, const char* format, va_list args)
|
||||
{
|
||||
va_list tmpargs;
|
||||
|
||||
va_copy(tmpargs,args);
|
||||
int characters_used = vsnprintf(nullptr, 0, format, tmpargs);
|
||||
va_end(tmpargs);
|
||||
|
||||
if (characters_used < 0) {
|
||||
// Looks like we have an invalid format string.
|
||||
// error out.
|
||||
std::string errorMessage("Invalid format string; snprintf returned negative with format string: ");
|
||||
errorMessage.append(format);
|
||||
|
||||
throw std::runtime_error(errorMessage);
|
||||
}
|
||||
else if ((unsigned int)characters_used > output.capacity()) {
|
||||
output.resize(characters_used+1);
|
||||
va_copy(tmpargs,args);
|
||||
characters_used = vsnprintf(&output[0], output.capacity(), format, tmpargs);
|
||||
va_end(tmpargs);
|
||||
|
||||
if (characters_used < 0) {
|
||||
// We shouldn't have a format error by this point, but I can't imagine what error we
|
||||
// could have by this point. Still, error out and report it.
|
||||
std::string errorMessage("Invalid format string or unknown vsnprintf error; vsnprintf returned negative with format string: ");
|
||||
errorMessage.append(format);
|
||||
|
||||
throw std::runtime_error(errorMessage);
|
||||
}
|
||||
}
|
||||
else {
|
||||
output.resize(characters_used + 1);
|
||||
|
||||
va_copy(tmpargs,args);
|
||||
characters_used = vsnprintf(&output[0], output.capacity(), format, tmpargs);
|
||||
va_end(tmpargs);
|
||||
|
||||
if (characters_used < 0) {
|
||||
// We shouldn't have a format error by this point, but I can't imagine what error we
|
||||
// could have by this point. still error out and report it.
|
||||
std::string errorMessage("Invalid format string or unknown vsnprintf error; vsnprintf returned negative with format string: ");
|
||||
errorMessage.append(format);
|
||||
|
||||
throw std::runtime_error(errorMessage);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void StringFormat(std::string& output, const char* format, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
vStringFormat(output,format,args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
// normal strncpy doesnt put a null term on copied strings, this one does
|
||||
// ref: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecrt/htm/_wcecrt_strncpy_wcsncpy.asp
|
||||
char* strn0cpy(char* dest, const char* source, uint32 size) {
|
||||
if (!dest)
|
||||
return 0;
|
||||
if (size == 0 || source == 0) {
|
||||
dest[0] = 0;
|
||||
return dest;
|
||||
}
|
||||
strncpy(dest, source, size);
|
||||
dest[size - 1] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
// String N w/null Copy Truncated?
|
||||
// return value =true if entire string(source) fit, false if it was truncated
|
||||
bool strn0cpyt(char* dest, const char* source, uint32 size) {
|
||||
if (!dest)
|
||||
return 0;
|
||||
if (size == 0 || source == 0) {
|
||||
dest[0] = 0;
|
||||
return false;
|
||||
}
|
||||
strncpy(dest, source, size);
|
||||
dest[size - 1] = 0;
|
||||
return (bool) (source[strlen(dest)] == 0);
|
||||
}
|
||||
|
||||
const char *MakeLowerString(const char *source) {
|
||||
static char str[128];
|
||||
if (!source)
|
||||
return nullptr;
|
||||
MakeLowerString(source, str);
|
||||
return str;
|
||||
}
|
||||
|
||||
void MakeLowerString(const char *source, char *target) {
|
||||
if (!source || !target) {
|
||||
*target=0;
|
||||
return;
|
||||
}
|
||||
while (*source)
|
||||
{
|
||||
*target = tolower(*source);
|
||||
target++;source++;
|
||||
}
|
||||
*target = 0;
|
||||
}
|
||||
|
||||
int MakeAnyLenString(char** ret, const char* format, ...) {
|
||||
int buf_len = 128;
|
||||
int chars = -1;
|
||||
va_list argptr, tmpargptr;
|
||||
va_start(argptr, format);
|
||||
while (chars == -1 || chars >= buf_len) {
|
||||
safe_delete_array(*ret);
|
||||
if (chars == -1)
|
||||
buf_len *= 2;
|
||||
else
|
||||
buf_len = chars + 1;
|
||||
*ret = new char[buf_len];
|
||||
va_copy(tmpargptr, argptr);
|
||||
chars = vsnprintf(*ret, buf_len, format, tmpargptr);
|
||||
}
|
||||
va_end(argptr);
|
||||
return chars;
|
||||
}
|
||||
|
||||
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...) {
|
||||
if (*bufsize == 0)
|
||||
*bufsize = 256;
|
||||
if (*ret == 0)
|
||||
*strlen = 0;
|
||||
int chars = -1;
|
||||
char* oldret = 0;
|
||||
va_list argptr, tmpargptr;
|
||||
va_start(argptr, format);
|
||||
while (chars == -1 || chars >= (int32)(*bufsize-*strlen)) {
|
||||
if (chars == -1)
|
||||
*bufsize += 256;
|
||||
else
|
||||
*bufsize += chars + 25;
|
||||
oldret = *ret;
|
||||
*ret = new char[*bufsize];
|
||||
if (oldret) {
|
||||
if (*strlen)
|
||||
memcpy(*ret, oldret, *strlen);
|
||||
safe_delete_array(oldret);
|
||||
}
|
||||
va_copy(tmpargptr, argptr);
|
||||
chars = vsnprintf(&(*ret)[*strlen], (*bufsize-*strlen), format, tmpargptr);
|
||||
}
|
||||
va_end(argptr);
|
||||
*strlen += chars;
|
||||
return *strlen;
|
||||
}
|
||||
|
||||
uint32 hextoi(char* num) {
|
||||
int len = strlen(num);
|
||||
if (len < 3)
|
||||
return 0;
|
||||
|
||||
if (num[0] != '0' || (num[1] != 'x' && num[1] != 'X'))
|
||||
return 0;
|
||||
|
||||
uint32 ret = 0;
|
||||
int mul = 1;
|
||||
for (int i=len-1; i>=2; i--) {
|
||||
if (num[i] >= 'A' && num[i] <= 'F')
|
||||
ret += ((num[i] - 'A') + 10) * mul;
|
||||
else if (num[i] >= 'a' && num[i] <= 'f')
|
||||
ret += ((num[i] - 'a') + 10) * mul;
|
||||
else if (num[i] >= '0' && num[i] <= '9')
|
||||
ret += (num[i] - '0') * mul;
|
||||
else
|
||||
return 0;
|
||||
mul *= 16;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint64 hextoi64(char* num) {
|
||||
int len = strlen(num);
|
||||
if (len < 3)
|
||||
return 0;
|
||||
|
||||
if (num[0] != '0' || (num[1] != 'x' && num[1] != 'X'))
|
||||
return 0;
|
||||
|
||||
uint64 ret = 0;
|
||||
int mul = 1;
|
||||
for (int i=len-1; i>=2; i--) {
|
||||
if (num[i] >= 'A' && num[i] <= 'F')
|
||||
ret += ((num[i] - 'A') + 10) * mul;
|
||||
else if (num[i] >= 'a' && num[i] <= 'f')
|
||||
ret += ((num[i] - 'a') + 10) * mul;
|
||||
else if (num[i] >= '0' && num[i] <= '9')
|
||||
ret += (num[i] - '0') * mul;
|
||||
else
|
||||
return 0;
|
||||
mul *= 16;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool atobool(char* iBool) {
|
||||
if (!strcasecmp(iBool, "true"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "false"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "yes"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "no"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "on"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "off"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "enable"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "disable"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "enabled"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "disabled"))
|
||||
return false;
|
||||
if (!strcasecmp(iBool, "y"))
|
||||
return true;
|
||||
if (!strcasecmp(iBool, "n"))
|
||||
return false;
|
||||
if (atoi(iBool))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// solar: removes the crap and turns the underscores into spaces.
|
||||
char *CleanMobName(const char *in, char *out)
|
||||
{
|
||||
unsigned i, j;
|
||||
|
||||
for(i = j = 0; i < strlen(in); i++)
|
||||
{
|
||||
// convert _ to space.. any other conversions like this? I *think* this
|
||||
// is the only non alpha char that's not stripped but converted.
|
||||
if(in[i] == '_')
|
||||
{
|
||||
out[j++] = ' ';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isalpha(in[i]) || (in[i] == '`')) // numbers, #, or any other crap just gets skipped
|
||||
out[j++] = in[i];
|
||||
}
|
||||
}
|
||||
out[j] = 0; // terimnate the string before returning it
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
void RemoveApostrophes(std::string &s)
|
||||
{
|
||||
for(unsigned int i = 0; i < s.length(); ++i)
|
||||
if(s[i] == '\'')
|
||||
s[i] = '_';
|
||||
}
|
||||
|
||||
char *RemoveApostrophes(const char *s)
|
||||
{
|
||||
char *NewString = new char[strlen(s) + 1];
|
||||
|
||||
strcpy(NewString, s);
|
||||
|
||||
for(unsigned int i = 0 ; i < strlen(NewString); ++i)
|
||||
if(NewString[i] == '\'')
|
||||
NewString[i] = '_';
|
||||
|
||||
return NewString;
|
||||
}
|
||||
|
||||
const char *ConvertArray(int input, char *returnchar)
|
||||
{
|
||||
sprintf(returnchar, "%i" ,input);
|
||||
return returnchar;
|
||||
}
|
||||
|
||||
const char *ConvertArrayF(float input, char *returnchar)
|
||||
{
|
||||
sprintf(returnchar, "%0.2f", input);
|
||||
return returnchar;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright 2013 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef _STRINGUTIL_H_
|
||||
#define _STRINGUTIL_H_
|
||||
|
||||
#include <string>
|
||||
#include <cstdarg>
|
||||
#include "types.h"
|
||||
|
||||
|
||||
void vStringFormat(std::string& output, const char* format, va_list args);
|
||||
void StringFormat(std::string& output, const char* format, ...);
|
||||
|
||||
const char *MakeLowerString(const char *source);
|
||||
|
||||
void MakeLowerString(const char *source, char *target);
|
||||
|
||||
|
||||
int MakeAnyLenString(char** ret, const char* format, ...);
|
||||
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...);
|
||||
|
||||
uint32 hextoi(char* num);
|
||||
uint64 hextoi64(char* num);
|
||||
bool atobool(char* iBool);
|
||||
|
||||
char* strn0cpy(char* dest, const char* source, uint32 size);
|
||||
// return value =true if entire string(source) fit, false if it was truncated
|
||||
bool strn0cpyt(char* dest, const char* source, uint32 size);
|
||||
|
||||
char *CleanMobName(const char *in, char *out);
|
||||
|
||||
const char *ConvertArray(int input, char *returnchar);
|
||||
const char *ConvertArrayF(float input, char *returnchar);
|
||||
|
||||
void RemoveApostrophes(std::string &s);
|
||||
char *RemoveApostrophes(const char *s);
|
||||
|
||||
#endif
|
||||
@@ -31,7 +31,7 @@ void StructStrategy::Decode(EQApplicationPacket *p) const {
|
||||
|
||||
void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, EQStream *dest, bool ack_req) {
|
||||
EQApplicationPacket *p = *in_p;
|
||||
*in_p = NULL;
|
||||
*in_p = nullptr;
|
||||
|
||||
_log(NET__STRUCTS, "Error encoding opcode %s: no encoder provided. Dropping.", OpcodeManager::EmuToName(p->GetOpcode()));
|
||||
|
||||
@@ -57,17 +57,17 @@ void StructStrategy::PassDecoder(EQApplicationPacket *p) {
|
||||
//effectively a singleton, but I decided to do it this way for no apparent reason.
|
||||
namespace StructStrategyFactory {
|
||||
|
||||
static map<EmuOpcode, const StructStrategy *> strategies;
|
||||
static std::map<EmuOpcode, const StructStrategy *> strategies;
|
||||
|
||||
void RegisterPatch(EmuOpcode first_opcode, const StructStrategy *structs) {
|
||||
strategies[first_opcode] = structs;
|
||||
}
|
||||
|
||||
const StructStrategy *FindPatch(EmuOpcode first_opcode) {
|
||||
map<EmuOpcode, const StructStrategy *>::const_iterator res;
|
||||
std::map<EmuOpcode, const StructStrategy *>::const_iterator res;
|
||||
res = strategies.find(first_opcode);
|
||||
if(res == strategies.end())
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
return(res->second);
|
||||
}
|
||||
|
||||
|
||||
+31
-47
@@ -18,11 +18,9 @@
|
||||
#include "../common/debug.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
|
||||
#include "TCPConnection.h"
|
||||
#include "../common/servertalk.h"
|
||||
@@ -56,14 +54,14 @@ TCPConnection::TCPConnection()
|
||||
pState = TCPS_Ready;
|
||||
pFree = false;
|
||||
pEcho = false;
|
||||
recvbuf = NULL;
|
||||
sendbuf = NULL;
|
||||
recvbuf = nullptr;
|
||||
sendbuf = nullptr;
|
||||
pRunLoop = false;
|
||||
charAsyncConnect = 0;
|
||||
pAsyncConnect = false;
|
||||
m_previousLineEnd = false;
|
||||
#if TCPN_DEBUG_Memory >= 7
|
||||
cout << "Constructor #2 on outgoing TCP# " << GetID() << endl;
|
||||
std::cout << "Constructor #2 on outgoing TCP# " << GetID() << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -78,14 +76,14 @@ TCPConnection::TCPConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 ir
|
||||
pState = TCPS_Connected;
|
||||
pFree = false;
|
||||
pEcho = false;
|
||||
recvbuf = NULL;
|
||||
sendbuf = NULL;
|
||||
recvbuf = nullptr;
|
||||
sendbuf = nullptr;
|
||||
pRunLoop = false;
|
||||
charAsyncConnect = 0;
|
||||
pAsyncConnect = false;
|
||||
m_previousLineEnd = false;
|
||||
#if TCPN_DEBUG_Memory >= 7
|
||||
cout << "Constructor #2 on incoming TCP# " << GetID() << endl;
|
||||
std::cout << "Constructor #2 on incoming TCP# " << GetID() << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -99,12 +97,12 @@ TCPConnection::~TCPConnection() {
|
||||
MLoopRunning.lock();
|
||||
MLoopRunning.unlock();
|
||||
#if TCPN_DEBUG_Memory >= 6
|
||||
cout << "Deconstructor on outgoing TCP# " << GetID() << endl;
|
||||
std::cout << "Deconstructor on outgoing TCP# " << GetID() << std::endl;
|
||||
#endif
|
||||
}
|
||||
#if TCPN_DEBUG_Memory >= 5
|
||||
else {
|
||||
cout << "Deconstructor on incomming TCP# " << GetID() << endl;
|
||||
std::cout << "Deconstructor on incomming TCP# " << GetID() << std::endl;
|
||||
}
|
||||
#endif
|
||||
safe_delete_array(recvbuf);
|
||||
@@ -165,12 +163,6 @@ bool TCPConnection::GetSockName(char *host, uint16 *port)
|
||||
}
|
||||
|
||||
void TCPConnection::Free() {
|
||||
if (ConnectionType == Outgoing) {
|
||||
ThrowError("TCPConnection::Free() called on an Outgoing connection");
|
||||
}
|
||||
#if TCPN_DEBUG_Memory >= 5
|
||||
cout << "Free on TCP# " << GetID() << endl;
|
||||
#endif
|
||||
Disconnect();
|
||||
pFree = true;
|
||||
}
|
||||
@@ -186,7 +178,7 @@ bool TCPConnection::Send(const uchar* data, int32 size) {
|
||||
|
||||
void TCPConnection::ServerSendQueuePushEnd(const uchar* data, int32 size) {
|
||||
MSendQueue.lock();
|
||||
if (sendbuf == NULL) {
|
||||
if (sendbuf == nullptr) {
|
||||
sendbuf = new uchar[size];
|
||||
sendbuf_size = size;
|
||||
sendbuf_used = 0;
|
||||
@@ -362,7 +354,6 @@ void TCPConnection::AsyncConnect(uint32 irIP, uint16 irPort) {
|
||||
if (ConnectionType != Outgoing) {
|
||||
// If this code runs, we got serious problems
|
||||
// Crash and burn.
|
||||
ThrowError("TCPConnection::AsyncConnect() call on a Incomming connection object!");
|
||||
return;
|
||||
}
|
||||
if(!ConnectReady()) {
|
||||
@@ -394,7 +385,7 @@ void TCPConnection::AsyncConnect(uint32 irIP, uint16 irPort) {
|
||||
_beginthread(TCPConnectionLoop, 0, this);
|
||||
#else
|
||||
pthread_t thread;
|
||||
pthread_create(&thread, NULL, TCPConnectionLoop, this);
|
||||
pthread_create(&thread, nullptr, TCPConnectionLoop, this);
|
||||
#endif
|
||||
}
|
||||
return;
|
||||
@@ -423,7 +414,6 @@ bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf) {
|
||||
if (ConnectionType != Outgoing) {
|
||||
// If this code runs, we got serious problems
|
||||
// Crash and burn.
|
||||
ThrowError("TCPConnection::Connect() call on a Incomming connection object!");
|
||||
return false;
|
||||
}
|
||||
MState.lock();
|
||||
@@ -441,13 +431,13 @@ bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf) {
|
||||
_beginthread(TCPConnectionLoop, 0, this);
|
||||
#else
|
||||
pthread_t thread;
|
||||
pthread_create(&thread, NULL, TCPConnectionLoop, this);
|
||||
pthread_create(&thread, nullptr, TCPConnectionLoop, this);
|
||||
#endif
|
||||
}
|
||||
|
||||
connection_socket = INVALID_SOCKET;
|
||||
struct sockaddr_in server_sin;
|
||||
// struct in_addr in;
|
||||
//struct in_addr in;
|
||||
|
||||
if ((connection_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET || connection_socket == 0) {
|
||||
#ifdef _WINDOWS
|
||||
@@ -595,7 +585,7 @@ bool TCPConnection::Process() {
|
||||
if (!SendData(sent_something, errbuf)) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
cout << inet_ntoa(in) << ":" << GetrPort() << ": " << errbuf << endl;
|
||||
std::cout << inet_ntoa(in) << ":" << GetrPort() << ": " << errbuf << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -636,8 +626,8 @@ bool TCPConnection::RecvData(char* errbuf) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Read " << status << " bytes from network. (recvbuf_used = " << recvbuf_used << ") " << inet_ntoa(in) << ":" << GetrPort();
|
||||
cout << endl;
|
||||
std::cout << ": Read " << status << " bytes from network. (recvbuf_used = " << recvbuf_used << ") " << inet_ntoa(in) << ":" << GetrPort();
|
||||
std::cout << std::endl;
|
||||
#if TCPN_LOG_RAW_DATA_IN == 2
|
||||
int32 tmp = status;
|
||||
if (tmp > 32)
|
||||
@@ -691,7 +681,7 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||
return true;
|
||||
#if TCPN_DEBUG_Console >= 4
|
||||
if (recvbuf_used) {
|
||||
cout << "Starting Processing: recvbuf=" << recvbuf_used << endl;
|
||||
std::cout << "Starting Processing: recvbuf=" << recvbuf_used << std::endl;
|
||||
DumpPacket(recvbuf, recvbuf_used);
|
||||
}
|
||||
#endif
|
||||
@@ -723,13 +713,13 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||
}
|
||||
}
|
||||
#if TCPN_DEBUG_Console >= 5
|
||||
cout << "Removed 0x00" << endl;
|
||||
std::cout << "Removed 0x00" << std::endl;
|
||||
if (recvbuf_used) {
|
||||
cout << "recvbuf left: " << recvbuf_used << endl;
|
||||
std::cout << "recvbuf left: " << recvbuf_used << std::endl;
|
||||
DumpPacket(recvbuf, recvbuf_used);
|
||||
}
|
||||
else
|
||||
cout << "recbuf left: None" << endl;
|
||||
std::cout << "recbuf left: None" << std::endl;
|
||||
#endif
|
||||
m_previousLineEnd = false;
|
||||
break;
|
||||
@@ -737,7 +727,7 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||
case 10:
|
||||
case 13: // newline marker
|
||||
{
|
||||
char *line = NULL;
|
||||
char *line = nullptr;
|
||||
if (i==0) { // empty line
|
||||
if(!m_previousLineEnd) {
|
||||
//char right before this was NOT a CR, report the empty line.
|
||||
@@ -756,7 +746,7 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||
memset(line, 0, i+1);
|
||||
memcpy(line, recvbuf, i);
|
||||
#if TCPN_DEBUG_Console >= 3
|
||||
cout << "Line Out: " << endl;
|
||||
std::cout << "Line Out: " << std::endl;
|
||||
DumpPacket((uchar*) line, i);
|
||||
#endif
|
||||
//line[i] = 0;
|
||||
@@ -766,13 +756,13 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||
recvbuf_echo -= i+1;
|
||||
memcpy(recvbuf, &tmpdel[i+1], recvbuf_used);
|
||||
#if TCPN_DEBUG_Console >= 5
|
||||
cout << "i+1=" << i+1 << endl;
|
||||
std::cout << "i+1=" << i+1 << std::endl;
|
||||
if (recvbuf_used) {
|
||||
cout << "recvbuf left: " << recvbuf_used << endl;
|
||||
std::cout << "recvbuf left: " << recvbuf_used << std::endl;
|
||||
DumpPacket(recvbuf, recvbuf_used);
|
||||
}
|
||||
else
|
||||
cout << "recbuf left: None" << endl;
|
||||
std::cout << "recbuf left: None" << std::endl;
|
||||
#endif
|
||||
safe_delete_array(tmpdel);
|
||||
i = -1;
|
||||
@@ -780,7 +770,7 @@ bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||
}
|
||||
|
||||
|
||||
if(line != NULL) {
|
||||
if(line != nullptr) {
|
||||
bool finish_proc = false;
|
||||
finish_proc = LineOutQueuePush(line);
|
||||
if(finish_proc)
|
||||
@@ -837,8 +827,8 @@ bool TCPConnection::SendData(bool &sent_something, char* errbuf) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Wrote " << status << " bytes to network. " << inet_ntoa(in) << ":" << GetrPort();
|
||||
cout << endl;
|
||||
std::cout << ": Wrote " << status << " bytes to network. " << inet_ntoa(in) << ":" << GetrPort();
|
||||
std::cout << std::endl;
|
||||
#if TCPN_LOG_RAW_DATA_OUT == 2
|
||||
int32 tmp = status;
|
||||
if (tmp > 32)
|
||||
@@ -854,15 +844,14 @@ bool TCPConnection::SendData(bool &sent_something, char* errbuf) {
|
||||
struct in_addr in;
|
||||
in.s_addr = GetrIP();
|
||||
CoutTimestamp(true);
|
||||
cout << ": Pushed " << (size - status) << " bytes back onto the send queue. " << inet_ntoa(in) << ":" << GetrPort();
|
||||
cout << endl;
|
||||
std::cout << ": Pushed " << (size - status) << " bytes back onto the send queue. " << inet_ntoa(in) << ":" << GetrPort();
|
||||
std::cout << std::endl;
|
||||
#endif
|
||||
// If there's network congestion, the number of bytes sent can be less than
|
||||
// what we tried to give it... Push the extra back on the queue for later
|
||||
ServerSendQueuePushFront(&data[status], size - status);
|
||||
}
|
||||
else if (status > (signed)size) {
|
||||
ThrowError("TCPConnection::SendData(): WTF! status > size");
|
||||
return false;
|
||||
}
|
||||
// else if (status == size) {}
|
||||
@@ -905,8 +894,7 @@ ThreadReturnType TCPConnection::TCPConnectionLoop(void* tmp) {
|
||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||
#endif
|
||||
if (tmp == 0) {
|
||||
ThrowError("TCPConnectionLoop(): tmp = 0!");
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
TCPConnection* tcpc = (TCPConnection*) tmp;
|
||||
#ifndef WIN32
|
||||
@@ -942,7 +930,7 @@ ThreadReturnType TCPConnection::TCPConnectionLoop(void* tmp) {
|
||||
_log(COMMON__THREADS, "Ending TCPConnectionLoop with thread ID %d", pthread_self());
|
||||
#endif
|
||||
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
|
||||
bool TCPConnection::RunLoop() {
|
||||
@@ -953,7 +941,3 @@ bool TCPConnection::RunLoop() {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -24,9 +24,6 @@
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define snprintf _snprintf
|
||||
#if (_MSC_VER < 1500)
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
|
||||
@@ -177,5 +174,3 @@ private:
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
+3
-11
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
#include "debug.h"
|
||||
#include "TCPServer.h"
|
||||
#include <stdio.h>
|
||||
@@ -18,12 +16,8 @@
|
||||
#define SOCKET_ERROR -1
|
||||
#endif
|
||||
|
||||
|
||||
#define SERVER_LOOP_GRANULARITY 3 //# of ms between checking our socket/queues
|
||||
|
||||
|
||||
|
||||
|
||||
BaseTCPServer::BaseTCPServer(uint16 in_port) {
|
||||
NextID = 1;
|
||||
pPort = in_port;
|
||||
@@ -33,7 +27,7 @@ BaseTCPServer::BaseTCPServer(uint16 in_port) {
|
||||
_beginthread(BaseTCPServer::TCPServerLoop, 0, this);
|
||||
#else
|
||||
pthread_t thread;
|
||||
pthread_create(&thread, NULL, &BaseTCPServer::TCPServerLoop, this);
|
||||
pthread_create(&thread, nullptr, &BaseTCPServer::TCPServerLoop, this);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -67,8 +61,7 @@ ThreadReturnType BaseTCPServer::TCPServerLoop(void* tmp) {
|
||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||
#endif
|
||||
if (tmp == 0) {
|
||||
// ThrowError("BaseTCPServerLoop(): tmp = 0!");
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
BaseTCPServer* tcps = (BaseTCPServer*) tmp;
|
||||
|
||||
@@ -88,7 +81,7 @@ ThreadReturnType BaseTCPServer::TCPServerLoop(void* tmp) {
|
||||
_log(COMMON__THREADS, "Ending TCPServerLoop with thread ID %d", pthread_self());
|
||||
#endif
|
||||
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
|
||||
void BaseTCPServer::Process() {
|
||||
@@ -231,4 +224,3 @@ bool BaseTCPServer::IsOpen() {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ public:
|
||||
}
|
||||
|
||||
T * NewQueuePop() {
|
||||
T * ret = NULL;
|
||||
T * ret = nullptr;
|
||||
MNewQueue.lock();
|
||||
if(!m_NewQueue.empty()) {
|
||||
ret = m_NewQueue.front();
|
||||
|
||||
@@ -23,7 +23,7 @@ XMLParser::XMLParser() {
|
||||
}
|
||||
|
||||
bool XMLParser::ParseFile(const char *file, const char *root_ele) {
|
||||
map<string,ElementHandler>::iterator handler;
|
||||
std::map<std::string,ElementHandler>::iterator handler;
|
||||
TiXmlDocument doc( file );
|
||||
if(!doc.LoadFile()) {
|
||||
printf("Unable to load '%s': %s\n", file, doc.ErrorDesc());
|
||||
@@ -31,14 +31,14 @@ bool XMLParser::ParseFile(const char *file, const char *root_ele) {
|
||||
}
|
||||
|
||||
TiXmlElement *root = doc.FirstChildElement( root_ele );
|
||||
if(root == NULL) {
|
||||
if(root == nullptr) {
|
||||
printf("Unable to find root '%s' in %s\n",root_ele, file);
|
||||
return(false);
|
||||
}
|
||||
|
||||
ParseOkay=true;
|
||||
|
||||
TiXmlNode *main_element = NULL;
|
||||
TiXmlNode *main_element = nullptr;
|
||||
while( (main_element = root->IterateChildren( main_element )) ) {
|
||||
if(main_element->Type() != TiXmlNode::ELEMENT)
|
||||
continue; //skip crap we dont care about
|
||||
@@ -71,30 +71,30 @@ bool XMLParser::ParseFile(const char *file, const char *root_ele) {
|
||||
|
||||
const char *XMLParser::ParseTextBlock(TiXmlNode *within, const char *name, bool optional) {
|
||||
TiXmlElement * txt = within->FirstChildElement(name);
|
||||
if(txt == NULL) {
|
||||
if(txt == nullptr) {
|
||||
if(!optional) {
|
||||
printf("Unable to find a '%s' element on %s element at line %d\n", name, within->Value(), within->Row());
|
||||
ParseOkay=false;
|
||||
}
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
}
|
||||
TiXmlNode *contents = txt->FirstChild();
|
||||
if(contents == NULL || contents->Type() != TiXmlNode::TEXT) {
|
||||
if(contents == nullptr || contents->Type() != TiXmlNode::TEXT) {
|
||||
if(!optional)
|
||||
printf("Node '%s' was expected to be a text element in %s element at line %d\n", name, txt->Value(), txt->Row());
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
}
|
||||
return(contents->Value());
|
||||
}
|
||||
|
||||
const char *XMLParser::GetText(TiXmlNode *within, bool optional) {
|
||||
TiXmlNode *contents = within->FirstChild();
|
||||
if(contents == NULL || contents->Type() != TiXmlNode::TEXT) {
|
||||
if(contents == nullptr || contents->Type() != TiXmlNode::TEXT) {
|
||||
if(!optional) {
|
||||
printf("Node was expected to be a text element in %s element at line %d\n", within->Value(), within->Row());
|
||||
ParseOkay=false;
|
||||
}
|
||||
return(NULL);
|
||||
return(nullptr);
|
||||
}
|
||||
return(contents->Value());
|
||||
}
|
||||
|
||||
+3
-10
@@ -24,13 +24,10 @@
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* See note in XMLParser::ParseFile() before inheriting this class.
|
||||
*/
|
||||
* See note in XMLParser::ParseFile() before inheriting this class.
|
||||
*/
|
||||
class XMLParser {
|
||||
public:
|
||||
typedef void (XMLParser::*ElementHandler)(TiXmlElement *ele);
|
||||
@@ -45,15 +42,11 @@ protected:
|
||||
const char *ParseTextBlock(TiXmlNode *within, const char *name, bool optional = false);
|
||||
const char *GetText(TiXmlNode *within, bool optional = false);
|
||||
|
||||
map<string,ElementHandler> Handlers;
|
||||
std::map<std::string,ElementHandler> Handlers;
|
||||
|
||||
bool ParseOkay;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ typedef enum {
|
||||
BT_Dragon = 26,
|
||||
BT_Summoned2 = 27,
|
||||
BT_Summoned3 = 28,
|
||||
// 29
|
||||
//29
|
||||
BT_VeliousDragon = 30, //might not be a tight set
|
||||
// ...
|
||||
BT_Dragon3 = 32,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#define COMMON_PROFILE_H
|
||||
|
||||
#ifdef ZONE
|
||||
#include "../zone/features.h"
|
||||
#include "../common/features.h"
|
||||
|
||||
#ifndef EQPROFILE
|
||||
#ifdef COMMON_PROFILE
|
||||
|
||||
+120
-124
@@ -18,7 +18,6 @@
|
||||
#include "../common/debug.h"
|
||||
#include "../common/rulesys.h"
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -44,7 +43,8 @@ using namespace std;
|
||||
#include "database.h"
|
||||
#include "eq_packet_structs.h"
|
||||
#include "guilds.h"
|
||||
#include "MiscFunctions.h"
|
||||
//#include "MiscFunctions.h"
|
||||
#include "StringUtil.h"
|
||||
#include "extprofile.h"
|
||||
extern Client client;
|
||||
|
||||
@@ -193,7 +193,7 @@ uint32 Database::CheckLogin(const char* name, const char* password, int16* oStat
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in CheckLogin query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CheckLogin query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -227,7 +227,7 @@ bool Database::CheckBannedIPs(const char* loginIP)
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in CheckBannedIPs query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CheckBannedIPs query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return true;
|
||||
}
|
||||
@@ -240,7 +240,7 @@ bool Database::AddBannedIP(char* bannedIP, const char* notes)
|
||||
char *query = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "INSERT into Banned_IPs SET ip_address='%s', notes='%s'", bannedIP, notes), errbuf)) {
|
||||
cerr << "Error in ReserveName query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in ReserveName query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -290,7 +290,7 @@ void Database::LoginIP(uint32 AccountID, const char* LoginIP)
|
||||
char *query = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO account_ip SET accid=%i, ip='%s' ON DUPLICATE KEY UPDATE count=count+1, lastused=now()", AccountID, LoginIP), errbuf)) {
|
||||
cerr << "Error in Log IP query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in Log IP query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
}
|
||||
@@ -333,7 +333,7 @@ int16 Database::CheckStatus(uint32 account_id)
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in CheckStatus query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CheckStatus query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -352,16 +352,16 @@ uint32 Database::CreateAccount(const char* name, const char* password, int16 sta
|
||||
else
|
||||
querylen = MakeAnyLenString(&query, "INSERT INTO account SET name='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name, status, lsaccount_id);
|
||||
|
||||
cerr << "Account Attempting to be created:" << name << " " << (int16) status << endl;
|
||||
std::cerr << "Account Attempting to be created:" << name << " " << (int16) status << std::endl;
|
||||
if (!RunQuery(query, querylen, errbuf, 0, 0, &last_insert_id)) {
|
||||
cerr << "Error in CreateAccount query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CreateAccount query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return 0;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
|
||||
if (last_insert_id == 0) {
|
||||
cerr << "Error in CreateAccount query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CreateAccount query '" << query << "' " << errbuf << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ bool Database::DeleteAccount(const char* name) {
|
||||
char *query = 0;
|
||||
uint32 affected_rows = 0;
|
||||
|
||||
cerr << "Account Attempting to be deleted:" << name << endl;
|
||||
std::cerr << "Account Attempting to be deleted:" << name << std::endl;
|
||||
if (RunQuery(query, MakeAnyLenString(&query, "DELETE FROM account WHERE name='%s';",name), errbuf, 0, &affected_rows)) {
|
||||
safe_delete_array(query);
|
||||
if (affected_rows == 1) {
|
||||
@@ -382,7 +382,7 @@ bool Database::DeleteAccount(const char* name) {
|
||||
}
|
||||
else {
|
||||
|
||||
cerr << "Error in DeleteAccount query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in DeleteAccount query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
@@ -394,7 +394,7 @@ bool Database::SetLocalPassword(uint32 accid, const char* password) {
|
||||
char *query = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET password=MD5('%s') where id=%i;", password, accid), errbuf)) {
|
||||
cerr << "Error in SetLocalPassword query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in SetLocalPassword query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -408,7 +408,7 @@ bool Database::SetAccountStatus(const char* name, int16 status) {
|
||||
char *query = 0;
|
||||
uint32 affected_rows = 0;
|
||||
|
||||
cout << "Account being GM Flagged:" << name << ", Level: " << (int16) status << endl;
|
||||
std::cout << "Account being GM Flagged:" << name << ", Level: " << (int16) status << std::endl;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET status=%i WHERE name='%s';", status, name), errbuf, 0, &affected_rows)) {
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
@@ -416,7 +416,7 @@ bool Database::SetAccountStatus(const char* name, int16 status) {
|
||||
safe_delete_array(query);
|
||||
|
||||
if (affected_rows == 0) {
|
||||
cout << "Account: " << name << " does not exist, therefore it cannot be flagged\n";
|
||||
std::cout << "Account: " << name << " does not exist, therefore it cannot be flagged\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -429,7 +429,7 @@ bool Database::ReserveName(uint32 account_id, char* name)
|
||||
char *query = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "INSERT into character_ SET account_id=%i, name='%s', profile=NULL", account_id, name), errbuf)) {
|
||||
cerr << "Error in ReserveName query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in ReserveName query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -465,7 +465,7 @@ bool Database::DeleteCharacter(char *name)
|
||||
if (query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
matches = mysql_num_rows(result);
|
||||
if(matches == 1)
|
||||
@@ -482,7 +482,7 @@ bool Database::DeleteCharacter(char *name)
|
||||
if(result)
|
||||
{
|
||||
mysql_free_result(result);
|
||||
result = NULL;
|
||||
result = nullptr;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -490,7 +490,7 @@ bool Database::DeleteCharacter(char *name)
|
||||
if(result)
|
||||
{
|
||||
mysql_free_result(result);
|
||||
result = NULL;
|
||||
result = nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -499,195 +499,195 @@ bool Database::DeleteCharacter(char *name)
|
||||
printf("DeleteCharacter: deleting '%s' (id %d): ", name, charid);
|
||||
printf(" quest_globals");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from quest_globals WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from quest_globals WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" character_tasks");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_tasks WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_tasks WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" character_activities");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_activities WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_activities WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" character_enabledtasks");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_enabledtasks WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_enabledtasks WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" completed_tasks");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from completed_tasks WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from completed_tasks WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" friends");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from friends WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from friends WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" mail");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from mail WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from mail WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" ptimers");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from timers WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from timers WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" inventory");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from inventory WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from inventory WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" guild_members");
|
||||
#endif
|
||||
#ifdef BOTS
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM guild_members WHERE char_id='%d' AND GetMobTypeById(%i) = 'C'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM guild_members WHERE char_id='%d' AND GetMobTypeById(%i) = 'C'", charid), errbuf, nullptr, &affected_rows);
|
||||
#else
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM guild_members WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM guild_members WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
#endif
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" recipes");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM char_recipe_list WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM char_recipe_list WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" adventure_stats");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM adventure_stats WHERE player_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM adventure_stats WHERE player_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" zone_flags");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM zone_flags WHERE charID='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM zone_flags WHERE charID='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" titles");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM titles WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM titles WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" titlesets");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM player_titlesets WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM player_titlesets WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" keyring");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM keyring WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM keyring WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" factions");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM faction_values WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM faction_values WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" instances");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout_player WHERE charid='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout_player WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
printf(" _character");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_ WHERE id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE from character_ WHERE id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
if(affected_rows != 1) // here we have to have a match or it's an error
|
||||
{
|
||||
@@ -698,11 +698,11 @@ bool Database::DeleteCharacter(char *name)
|
||||
#if DEBUG >= 5
|
||||
printf(" alternate currency");
|
||||
#endif
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM character_alt_currency WHERE char_id='%d'", charid), errbuf, NULL, &affected_rows);
|
||||
RunQuery(query, MakeAnyLenString(&query, "DELETE FROM character_alt_currency WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows);
|
||||
if(query)
|
||||
{
|
||||
safe_delete_array(query);
|
||||
query = NULL;
|
||||
query = nullptr;
|
||||
}
|
||||
|
||||
#if DEBUG >= 5
|
||||
@@ -764,7 +764,7 @@ bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inven
|
||||
}
|
||||
|
||||
const char *zname = GetZoneName(pp->zone_id);
|
||||
if(zname == NULL) {
|
||||
if(zname == nullptr) {
|
||||
//zone not in the DB, something to prevent crash...
|
||||
strn0cpy(zone, "qeynos", 49);
|
||||
pp->zone_id = 1;
|
||||
@@ -877,7 +877,7 @@ uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) {
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in GetAccountIDByChar query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetAccountIDByChar query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
@@ -940,7 +940,7 @@ uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32*
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in GetAccountIDByAcc query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetAccountIDByAcc query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
@@ -968,7 +968,7 @@ void Database::GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID
|
||||
}
|
||||
else {
|
||||
safe_delete_array(query);
|
||||
cerr << "Error in GetAccountName query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetAccountName query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -990,7 +990,7 @@ void Database::GetCharName(uint32 char_id, char* name) {
|
||||
}
|
||||
else {
|
||||
safe_delete_array(query);
|
||||
cerr << "Error in GetCharName query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetCharName query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1007,7 +1007,7 @@ bool Database::LoadVariables() {
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
cerr << "Error in LoadVariables query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in LoadVariables query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
return false;
|
||||
@@ -1130,7 +1130,7 @@ bool Database::SetVariable(const char* varname_in, const char* varvalue_in) {
|
||||
}
|
||||
}
|
||||
else {
|
||||
cerr << "Error in SetVariable query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in SetVariable query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
free(varname);
|
||||
@@ -1152,7 +1152,7 @@ uint32 Database::GetMiniLoginAccount(char* ip){
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in GetMiniLoginAccount query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetMiniLoginAccount query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
return retid;
|
||||
@@ -1184,7 +1184,7 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe
|
||||
*minstatus = atoi(row[3]);
|
||||
if (minlevel != 0)
|
||||
*minlevel = atoi(row[4]);
|
||||
if (flag_needed != NULL)
|
||||
if (flag_needed != nullptr)
|
||||
strcpy(flag_needed, row[5]);
|
||||
mysql_free_result(result);
|
||||
return true;
|
||||
@@ -1194,11 +1194,11 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in GetSafePoint query '" << query << "' " << errbuf << endl;
|
||||
cerr << "If it errors, run the following querys:\n";
|
||||
cerr << "ALTER TABLE `zone` CHANGE `minium_level` `min_level` TINYINT(3) UNSIGNED DEFAULT \"0\" NOT NULL;\n";
|
||||
cerr << "ALTER TABLE `zone` CHANGE `minium_status` `min_status` TINYINT(3) UNSIGNED DEFAULT \"0\" NOT NULL;\n";
|
||||
cerr << "ALTER TABLE `zone` ADD flag_needed VARCHAR(128) NOT NULL DEFAULT '';\n";
|
||||
std::cerr << "Error in GetSafePoint query '" << query << "' " << errbuf << std::endl;
|
||||
std::cerr << "If it errors, run the following querys:\n";
|
||||
std::cerr << "ALTER TABLE `zone` CHANGE `minium_level` `min_level` TINYINT(3) UNSIGNED DEFAULT \"0\" NOT NULL;\n";
|
||||
std::cerr << "ALTER TABLE `zone` CHANGE `minium_status` `min_status` TINYINT(3) UNSIGNED DEFAULT \"0\" NOT NULL;\n";
|
||||
std::cerr << "ALTER TABLE `zone` ADD flag_needed VARCHAR(128) NOT NULL DEFAULT '';\n";
|
||||
|
||||
safe_delete_array(query);
|
||||
}
|
||||
@@ -1243,7 +1243,7 @@ bool Database::GetZoneLongName(const char* short_name, char** long_name, char* f
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in GetZoneLongName query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetZoneLongName query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1269,7 +1269,7 @@ uint32 Database::GetZoneGraveyardID(uint32 zone_id, uint32 version) {
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in GetZoneGraveyardID query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetZoneGraveyardID query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
return GraveyardID;
|
||||
@@ -1303,7 +1303,7 @@ bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zon
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in GetZoneGraveyard query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetZoneGraveyard query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1342,7 +1342,7 @@ bool Database::LoadZoneNames() {
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1352,7 +1352,7 @@ bool Database::LoadZoneNames() {
|
||||
}
|
||||
}
|
||||
else {
|
||||
cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1419,7 +1419,7 @@ uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in GetPEQZone query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetPEQZone query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
return peqzone;
|
||||
@@ -1450,7 +1450,7 @@ bool Database::CheckNameFilter(const char* name, bool surname)
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < str_name.size(); i++)
|
||||
for (size_t i = 0; i < str_name.size(); i++)
|
||||
{
|
||||
if(!isalpha(str_name[i]))
|
||||
{
|
||||
@@ -1458,14 +1458,14 @@ bool Database::CheckNameFilter(const char* name, bool surname)
|
||||
}
|
||||
}
|
||||
|
||||
for(int x = 0; x < str_name.size(); ++x)
|
||||
for(size_t x = 0; x < str_name.size(); ++x)
|
||||
{
|
||||
str_name[x] = tolower(str_name[x]);
|
||||
}
|
||||
|
||||
char c = '\0';
|
||||
uint8 num_c = 0;
|
||||
for(int x = 0; x < str_name.size(); ++x)
|
||||
for(size_t x = 0; x < str_name.size(); ++x)
|
||||
{
|
||||
if(str_name[x] == c)
|
||||
{
|
||||
@@ -1484,10 +1484,10 @@ bool Database::CheckNameFilter(const char* name, bool surname)
|
||||
|
||||
if (RunQuery(query, MakeAnyLenString(&query, "SELECT name FROM name_filter"), errbuf, &result)) {
|
||||
safe_delete_array(query);
|
||||
while(row = mysql_fetch_row(result))
|
||||
while((row = mysql_fetch_row(result)))
|
||||
{
|
||||
std::string current_row = row[0];
|
||||
for(int x = 0; x < current_row.size(); ++x)
|
||||
for(size_t x = 0; x < current_row.size(); ++x)
|
||||
{
|
||||
current_row[x] = tolower(current_row[x]);
|
||||
}
|
||||
@@ -1503,7 +1503,7 @@ bool Database::CheckNameFilter(const char* name, bool surname)
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Error in CheckNameFilter query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CheckNameFilter query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
@@ -1516,7 +1516,7 @@ bool Database::AddToNameFilter(const char* name) {
|
||||
uint32 affected_rows = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO name_filter (name) values ('%s')", name), errbuf, 0, &affected_rows)) {
|
||||
cerr << "Error in AddToNameFilter query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in AddToNameFilter query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1557,7 +1557,7 @@ uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* o
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in GetAccountIDFromLSID query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetAccountIDFromLSID query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return 0;
|
||||
}
|
||||
@@ -1583,7 +1583,7 @@ void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) {
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else
|
||||
cerr << "Error in GetAccountFromID query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetAccountFromID query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
@@ -1592,7 +1592,7 @@ void Database::ClearMerchantTemp(){
|
||||
char *query = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "delete from merchantlist_temp"), errbuf)) {
|
||||
cerr << "Error in ClearMerchantTemp query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in ClearMerchantTemp query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
}
|
||||
@@ -1602,7 +1602,7 @@ bool Database::UpdateName(const char* oldname, const char* newname) {
|
||||
char *query = 0;
|
||||
uint32 affected_rows = 0;
|
||||
|
||||
cout << "Renaming " << oldname << " to " << newname << "..." << endl;
|
||||
std::cout << "Renaming " << oldname << " to " << newname << "..." << std::endl;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET name='%s' WHERE name='%s';", newname, oldname), errbuf, 0, &affected_rows)) {
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
@@ -1626,7 +1626,7 @@ bool Database::CheckUsedName(const char* name)
|
||||
//if (strlen(name) > 15)
|
||||
// return false;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM character_ where name='%s'", name), errbuf, &result)) {
|
||||
cerr << "Error in CheckUsedName query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CheckUsedName query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1664,15 +1664,11 @@ uint8 Database::GetServerType()
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else
|
||||
|
||||
{
|
||||
|
||||
|
||||
cerr << "Error in GetServerType query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetServerType query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
@@ -1682,11 +1678,11 @@ bool Database::MoveCharacterToZone(const char* charname, const char* zonename,ui
|
||||
char *query = 0;
|
||||
uint32 affected_rows = 0;
|
||||
|
||||
if(zonename == NULL || strlen(zonename) == 0)
|
||||
if(zonename == nullptr || strlen(zonename) == 0)
|
||||
return(false);
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET zonename = '%s',zoneid=%i,x=-1, y=-1, z=-1 WHERE name='%s'", zonename,zoneid, charname), errbuf, 0,&affected_rows)) {
|
||||
cerr << "Error in MoveCharacterToZone(name) query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in MoveCharacterToZone(name) query '" << query << "' " << errbuf << std::endl;
|
||||
return false;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
@@ -1706,7 +1702,7 @@ bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) {
|
||||
char *query = 0;
|
||||
uint32 affected_rows = 0;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET zonename = '%s', zoneid=%i, x=-1, y=-1, z=-1 WHERE id=%i", iZonename, GetZoneID(iZonename), iCharID), errbuf, 0,&affected_rows)) {
|
||||
cerr << "Error in MoveCharacterToZone(id) query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in MoveCharacterToZone(id) query '" << query << "' " << errbuf << std::endl;
|
||||
return false;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
@@ -1739,7 +1735,7 @@ uint8 Database::CopyCharacter(const char* oldname, const char* newname, uint32 a
|
||||
}
|
||||
|
||||
else {
|
||||
cerr << "Error in CopyCharacter read query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CopyCharacter read query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return 0;
|
||||
}
|
||||
@@ -1755,7 +1751,7 @@ uint8 Database::CopyCharacter(const char* oldname, const char* newname, uint32 a
|
||||
end += sprintf(end, "\', account_id=%d, name='%s'", acctid, newname);
|
||||
|
||||
if (!RunQuery(query2, (uint32) (end - query2), errbuf, 0, &affected_rows)) {
|
||||
cerr << "Error in CopyCharacter query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in CopyCharacter query '" << query << "' " << errbuf << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1772,7 +1768,7 @@ bool Database::SetHackerFlag(const char* accountname, const char* charactername,
|
||||
char *query = 0;
|
||||
uint32 affected_rows = 0;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO hackers(account,name,hacked) values('%s','%s','%s')", accountname, charactername, hacked), errbuf, 0,&affected_rows)) {
|
||||
cerr << "Error in SetHackerFlag query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in SetHackerFlag query '" << query << "' " << errbuf << std::endl;
|
||||
return false;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
@@ -1792,7 +1788,7 @@ bool Database::SetMQDetectionFlag(const char* accountname, const char* character
|
||||
uint32 affected_rows = 0;
|
||||
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s')", accountname, charactername, hacked, zone), errbuf, 0,&affected_rows)) {
|
||||
cerr << "Error in SetMQDetectionFlag query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in SetMQDetectionFlag query '" << query << "' " << errbuf << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1911,7 +1907,7 @@ uint32 Database::GetCharacterInfo(const char* iName, uint32* oAccID, uint32* oZo
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in GetCharacterInfo query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetCharacterInfo query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
return 0;
|
||||
@@ -1921,7 +1917,7 @@ bool Database::UpdateLiveChar(char* charname,uint32 lsaccount_id) {
|
||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
||||
char *query = 0;
|
||||
if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET charname='%s' WHERE id=%i;",charname, lsaccount_id), errbuf)) {
|
||||
cerr << "Error in UpdateLiveChar query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in UpdateLiveChar query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
return false;
|
||||
}
|
||||
@@ -1946,7 +1942,7 @@ bool Database::GetLiveChar(uint32 account_id, char* cname) {
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in GetLiveChar query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetLiveChar query '" << query << "' " << errbuf << std::endl;
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
@@ -2113,7 +2109,7 @@ char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* mainta
|
||||
row = mysql_fetch_row(result);
|
||||
unsigned long* Lengths = mysql_fetch_lengths(result);
|
||||
|
||||
if(row != NULL){
|
||||
if(row != nullptr){
|
||||
|
||||
if(leaderbuf)
|
||||
strcpy(leaderbuf, row[0]);
|
||||
@@ -2171,14 +2167,14 @@ void Database::ClearGroupLeader(uint32 gid){
|
||||
safe_delete_array(query);
|
||||
}
|
||||
|
||||
bool FetchRowMap(MYSQL_RES *result, map<string,string> &rowmap)
|
||||
bool FetchRowMap(MYSQL_RES *result, std::map<std::string,std::string> &rowmap)
|
||||
{
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_ROW row;
|
||||
unsigned long num_fields,i;
|
||||
bool retval=false;
|
||||
rowmap.clear();
|
||||
if (result && (num_fields=mysql_num_fields(result)) && (row = mysql_fetch_row(result))!=NULL && (fields = mysql_fetch_fields(result))!=NULL) {
|
||||
if (result && (num_fields=mysql_num_fields(result)) && (row = mysql_fetch_row(result))!=nullptr && (fields = mysql_fetch_fields(result))!=nullptr) {
|
||||
retval=true;
|
||||
for(i=0;i<num_fields;i++) {
|
||||
rowmap[fields[i].name]=(row[i] ? row[i] : "");
|
||||
@@ -2285,7 +2281,7 @@ const char *Database::GetRaidLeaderName(uint32 rid)
|
||||
|
||||
if (RunQuery(query, MakeAnyLenString(&query, "SELECT name FROM raid_members WHERE raidid=%u AND israidleader=1",
|
||||
rid), errbuf, &result)) {
|
||||
if((row = mysql_fetch_row(result)) != NULL)
|
||||
if((row = mysql_fetch_row(result)) != nullptr)
|
||||
{
|
||||
memset(name, 0, 128);
|
||||
strcpy(name, row[0]);
|
||||
@@ -2399,8 +2395,8 @@ bool Database::CheckInstanceExpired(uint16 instance_id)
|
||||
MYSQL_RES *result;
|
||||
MYSQL_ROW row;
|
||||
|
||||
uint32 start_time = 0;
|
||||
uint32 duration = 0;
|
||||
int32 start_time = 0;
|
||||
int32 duration = 0;
|
||||
uint32 never_expires = 0;
|
||||
if (RunQuery(query, MakeAnyLenString(&query, "SELECT start_time, duration, never_expires FROM instance_lockout WHERE id=%u",
|
||||
instance_id), errbuf, &result))
|
||||
@@ -2432,7 +2428,7 @@ bool Database::CheckInstanceExpired(uint16 instance_id)
|
||||
}
|
||||
|
||||
timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
gettimeofday(&tv, nullptr);
|
||||
if((start_time + duration) <= tv.tv_sec)
|
||||
{
|
||||
return true;
|
||||
@@ -2553,7 +2549,7 @@ uint32 Database::GetTimeRemainingInstance(uint16 instance_id, bool &is_perma)
|
||||
}
|
||||
|
||||
timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
gettimeofday(&tv, nullptr);
|
||||
return ((start_time + duration) - tv.tv_sec);
|
||||
}
|
||||
|
||||
@@ -2591,15 +2587,15 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id)
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 count = RuleI(Zone, ReservedInstances) + 1;
|
||||
uint32 max = 65535;
|
||||
int32 count = RuleI(Zone, ReservedInstances) + 1;
|
||||
int32 max = 65535;
|
||||
|
||||
if (RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM instance_lockout where id >= %i ORDER BY id", count), errbuf, &result))
|
||||
{
|
||||
safe_delete_array(query);
|
||||
if (mysql_num_rows(result) != 0)
|
||||
{
|
||||
while(row = mysql_fetch_row(result))
|
||||
while((row = mysql_fetch_row(result)))
|
||||
{
|
||||
if(count < atoi(row[0]))
|
||||
{
|
||||
@@ -2666,7 +2662,7 @@ void Database::PurgeExpiredInstances()
|
||||
if (mysql_num_rows(result) > 0)
|
||||
{
|
||||
row = mysql_fetch_row(result);
|
||||
while(row != NULL)
|
||||
while(row != nullptr)
|
||||
{
|
||||
id = atoi(row[0]);
|
||||
DeleteInstance(id);
|
||||
@@ -2895,7 +2891,7 @@ void Database::AssignGroupToInstance(uint32 gid, uint32 instance_id)
|
||||
errbuf, &result))
|
||||
{
|
||||
safe_delete_array(query);
|
||||
while((row = mysql_fetch_row(result)) != NULL)
|
||||
while((row = mysql_fetch_row(result)) != nullptr)
|
||||
{
|
||||
uint32 charid = atoi(row[0]);
|
||||
if(GetInstanceID(zone_id, charid, version) == 0)
|
||||
@@ -2924,7 +2920,7 @@ void Database::AssignRaidToInstance(uint32 rid, uint32 instance_id)
|
||||
errbuf, &result))
|
||||
{
|
||||
safe_delete_array(query);
|
||||
while((row = mysql_fetch_row(result)) != NULL)
|
||||
while((row = mysql_fetch_row(result)) != nullptr)
|
||||
{
|
||||
uint32 charid = atoi(row[0]);
|
||||
if(GetInstanceID(zone_id, charid, version) == 0)
|
||||
@@ -3100,7 +3096,7 @@ void Database::UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win)
|
||||
}
|
||||
|
||||
if(RunQuery(query, MakeAnyLenString(&query, "UPDATE `adventure_stats` SET %s=%s+1 WHERE player_id=%u",
|
||||
field.c_str(), field.c_str(), char_id), errbuf, NULL, &affected))
|
||||
field.c_str(), field.c_str(), char_id), errbuf, nullptr, &affected))
|
||||
{
|
||||
safe_delete_array(query);
|
||||
}
|
||||
@@ -3138,7 +3134,7 @@ bool Database::GetAdventureStats(uint32 char_id, uint32 &guk_w, uint32 &mir_w, u
|
||||
char_id), errbuf, &result))
|
||||
{
|
||||
safe_delete_array(query);
|
||||
while((row = mysql_fetch_row(result)) != NULL)
|
||||
while((row = mysql_fetch_row(result)) != nullptr)
|
||||
{
|
||||
guk_w = atoi(row[0]);
|
||||
mir_w = atoi(row[1]);
|
||||
@@ -3175,7 +3171,7 @@ uint32 Database::GetGuildDBIDByCharID(uint32 char_id) {
|
||||
mysql_free_result(result);
|
||||
}
|
||||
else {
|
||||
cerr << "Error in GetAccountIDByChar query '" << query << "' " << errbuf << endl;
|
||||
std::cerr << "Error in GetAccountIDByChar query '" << query << "' " << errbuf << std::endl;
|
||||
}
|
||||
safe_delete_array(query);
|
||||
return retVal;
|
||||
|
||||
+7
-13
@@ -35,10 +35,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
|
||||
//atoi is not uint32 or uint32 safe!!!!
|
||||
#define atoul(str) strtoul(str, NULL, 10)
|
||||
#define atoul(str) strtoul(str, nullptr, 10)
|
||||
|
||||
//class Spawn;
|
||||
class Corpse;
|
||||
@@ -107,10 +106,6 @@ public:
|
||||
bool Connect(const char* host, const char* user, const char* passwd, const char* database,uint32 port);
|
||||
~Database();
|
||||
|
||||
|
||||
// void ExtraOptions();
|
||||
|
||||
|
||||
/*
|
||||
* General Character Related Stuff
|
||||
*/
|
||||
@@ -208,8 +203,8 @@ public:
|
||||
char* GetGroupLeaderForLogin(const char* name,char* leaderbuf);
|
||||
|
||||
void SetGroupLeaderName(uint32 gid, const char* name);
|
||||
char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = NULL, char* assist = NULL, char* puller = NULL, char *marknpc = NULL,
|
||||
GroupLeadershipAA_Struct* GLAA = NULL);
|
||||
char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr,
|
||||
GroupLeadershipAA_Struct* GLAA = nullptr);
|
||||
void ClearGroupLeader(uint32 gid = 0);
|
||||
|
||||
/*
|
||||
@@ -221,7 +216,7 @@ public:
|
||||
const char *GetRaidLeaderName(uint32 rid);
|
||||
|
||||
/*
|
||||
* Database Varaibles
|
||||
* Database Variables
|
||||
*/
|
||||
bool GetVariable(const char* varname, char* varvalue, uint16 varvalue_len);
|
||||
bool SetVariable(const char* varname, const char* varvalue);
|
||||
@@ -240,8 +235,8 @@ public:
|
||||
uint8 GetPEQZone(uint32 zoneID, uint32 version);
|
||||
const char* GetZoneName(uint32 zoneID, bool ErrorUnknown = false);
|
||||
uint8 GetServerType();
|
||||
bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = NULL);
|
||||
bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = NULL) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); }
|
||||
bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr);
|
||||
bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); }
|
||||
uint8 GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 in_level);
|
||||
uint8 GetRaceSkill(uint8 skillid, uint8 in_race);
|
||||
bool LoadPTimers(uint32 charid, PTimerList &into);
|
||||
@@ -256,7 +251,6 @@ public:
|
||||
|
||||
protected:
|
||||
void HandleMysqlError(uint32 errnum);
|
||||
//bool RunQuery(const char* query, uint32 querylen, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* errnum = 0, bool retry = true);
|
||||
|
||||
private:
|
||||
void DBInitVars();
|
||||
@@ -270,5 +264,5 @@ private:
|
||||
uint32 varcache_lastupdate;
|
||||
};
|
||||
|
||||
bool FetchRowMap(MYSQL_RES *result, map<string,string> &rowmap);
|
||||
bool FetchRowMap(MYSQL_RES *result, std::map<std::string,std::string> &rowmap);
|
||||
#endif
|
||||
|
||||
+16
-16
@@ -5,7 +5,6 @@
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "dbasync.h"
|
||||
#include "database.h"
|
||||
#include <errmsg.h>
|
||||
@@ -14,7 +13,8 @@ using namespace std;
|
||||
#include "dbcore.h"
|
||||
#include "common_profile.h"
|
||||
#include <string.h>
|
||||
#include "../common/MiscFunctions.h"
|
||||
//#include "../common/MiscFunctions.h"
|
||||
#include "StringUtil.h"
|
||||
#define ASYNC_LOOP_GRANULARITY 4 //# of ms between checking our work
|
||||
|
||||
bool DBAsyncCB_LoadVariables(DBAsyncWork* iWork) {
|
||||
@@ -24,7 +24,7 @@ bool DBAsyncCB_LoadVariables(DBAsyncWork* iWork) {
|
||||
if (dbaq->GetAnswer(errbuf, &result))
|
||||
iWork->GetDB()->LoadVariables_result(result);
|
||||
else
|
||||
cout << "Error: DBAsyncCB_LoadVariables failed: !GetAnswer: '" << errbuf << "'" << endl;
|
||||
std::cout << "Error: DBAsyncCB_LoadVariables failed: !GetAnswer: '" << errbuf << "'" << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ ThreadReturnType DBAsyncLoop(void* tmp) {
|
||||
_log(COMMON__THREADS, "Ending DBAsyncLoop with thread ID %d", pthread_self());
|
||||
#endif
|
||||
|
||||
THREAD_RETURN(NULL);
|
||||
THREAD_RETURN(nullptr);
|
||||
}
|
||||
|
||||
DBAsync::DBAsync(DBcore* iDBC)
|
||||
@@ -78,7 +78,7 @@ DBAsync::DBAsync(DBcore* iDBC)
|
||||
_beginthread(DBAsyncLoop, 0, this);
|
||||
#else
|
||||
pthread_t thread;
|
||||
pthread_create(&thread, NULL, DBAsyncLoop, this);
|
||||
pthread_create(&thread, nullptr, DBAsyncLoop, this);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -115,8 +115,8 @@ uint32 DBAsync::AddWork(DBAsyncWork** iWork, uint32 iDelay) {
|
||||
if (iDelay)
|
||||
(*iWork)->pExecuteAfter = Timer::GetCurrentTime() + iDelay;
|
||||
#if DEBUG_MYSQL_QUERIES >= 2
|
||||
cout << "Adding AsyncWork #" << (*iWork)->GetWorkID() << endl;
|
||||
cout << "ExecuteAfter = " << (*iWork)->pExecuteAfter << " (" << Timer::GetCurrentTime() << " + " << iDelay << ")" << endl;
|
||||
std::cout << "Adding AsyncWork #" << (*iWork)->GetWorkID() << std::endl;
|
||||
std::cout << "ExecuteAfter = " << (*iWork)->pExecuteAfter << " (" << Timer::GetCurrentTime() << " + " << iDelay << ")" << std::endl;
|
||||
#endif
|
||||
*iWork = 0;
|
||||
MInList.unlock();
|
||||
@@ -131,7 +131,7 @@ bool DBAsync::CancelWork(uint32 iWorkID) {
|
||||
if (iWorkID == 0)
|
||||
return false;
|
||||
#if DEBUG_MYSQL_QUERIES >= 2
|
||||
cout << "DBAsync::CancelWork: " << iWorkID << endl;
|
||||
std::cout << "DBAsync::CancelWork: " << iWorkID << std::endl;
|
||||
#endif
|
||||
MCurrentWork.lock();
|
||||
if (CurrentWork && CurrentWork->GetWorkID() == iWorkID) {
|
||||
@@ -174,8 +174,8 @@ DBAsyncWork* DBAsync::InListPop() {
|
||||
if (iterator.GetData()->pExecuteAfter <= Timer::GetCurrentTime()) {
|
||||
ret = iterator.GetData();
|
||||
#if DEBUG_MYSQL_QUERIES >= 2
|
||||
cout << "Poping AsyncWork #" << ret->GetWorkID() << endl;
|
||||
cout << ret->pExecuteAfter << " <= " << Timer::GetCurrentTime() << endl;
|
||||
std::cout << "Poping AsyncWork #" << ret->GetWorkID() << std::endl;
|
||||
std::cout << ret->pExecuteAfter << " <= " << Timer::GetCurrentTime() << std::endl;
|
||||
#endif
|
||||
iterator.RemoveCurrent(false);
|
||||
break;
|
||||
@@ -232,7 +232,7 @@ void DBAsync::Process() {
|
||||
tmpStatus = tmpWork->SetStatus(DBAsync::Finished);
|
||||
if (tmpStatus != Executing) {
|
||||
if (tmpStatus != Canceled) {
|
||||
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #1" << endl;
|
||||
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #1" << std::endl;
|
||||
}
|
||||
MCurrentWork.lock();
|
||||
safe_delete(tmpWork);
|
||||
@@ -246,7 +246,7 @@ void DBAsync::Process() {
|
||||
}
|
||||
else {
|
||||
if (tmpStatus != Canceled) {
|
||||
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #2" << endl;
|
||||
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #2" << std::endl;
|
||||
}
|
||||
MCurrentWork.lock();
|
||||
safe_delete(CurrentWork);
|
||||
@@ -274,7 +274,7 @@ void DBAsync::CheckTimeout() {
|
||||
|
||||
void DBAsync::CommitWrites() {
|
||||
#if DEBUG_MYSQL_QUERIES >= 2
|
||||
cout << "DBAsync::CommitWrites() called." << endl;
|
||||
std::cout << "DBAsync::CommitWrites() called." << std::endl;
|
||||
#endif
|
||||
DBAsyncWork* tmpWork;
|
||||
while ((tmpWork = InListPopWrite())) {
|
||||
@@ -284,7 +284,7 @@ void DBAsync::CommitWrites() {
|
||||
tmpStatus = tmpWork->SetStatus(DBAsync::Finished);
|
||||
if (tmpStatus != Executing) {
|
||||
if (tmpStatus != Canceled) {
|
||||
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #1" << endl;
|
||||
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #1" << std::endl;
|
||||
}
|
||||
safe_delete(tmpWork);
|
||||
}
|
||||
@@ -294,7 +294,7 @@ void DBAsync::CommitWrites() {
|
||||
}
|
||||
else {
|
||||
if (tmpStatus != Canceled) {
|
||||
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #2" << endl;
|
||||
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #2" << std::endl;
|
||||
}
|
||||
safe_delete(tmpWork);
|
||||
}
|
||||
@@ -305,7 +305,7 @@ void DBAsync::ProcessWork(DBAsyncWork* iWork, bool iSleep) {
|
||||
_CP(DBAsync_ProcessWork);
|
||||
DBAsyncQuery* CurrentQuery;
|
||||
#if DEBUG_MYSQL_QUERIES >= 2
|
||||
cout << "Processing AsyncWork #" << iWork->GetWorkID() << endl;
|
||||
std::cout << "Processing AsyncWork #" << iWork->GetWorkID() << std::endl;
|
||||
#endif
|
||||
while ((CurrentQuery = iWork->PopQuery())) {
|
||||
CurrentQuery->Process(pDBC);
|
||||
|
||||
+14
-13
@@ -5,7 +5,6 @@
|
||||
#endif
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include <errmsg.h>
|
||||
#include <mysqld_error.h>
|
||||
#include <limits.h>
|
||||
@@ -38,6 +37,7 @@ DBcore::DBcore() {
|
||||
pDatabase = 0;
|
||||
pCompress = false;
|
||||
pSSL = false;
|
||||
pStatus = Closed;
|
||||
}
|
||||
|
||||
DBcore::~DBcore() {
|
||||
@@ -71,17 +71,17 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
|
||||
#if DEBUG_MYSQL_QUERIES >= 1
|
||||
char tmp[120];
|
||||
strn0cpy(tmp, query, sizeof(tmp));
|
||||
cout << "QUERY: " << tmp << endl;
|
||||
std::cout << "QUERY: " << tmp << std::endl;
|
||||
#endif
|
||||
if (mysql_real_query(&mysql, query, querylen)) {
|
||||
if (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)
|
||||
pStatus = Error;
|
||||
if (mysql_errno(&mysql) == CR_SERVER_LOST || mysql_errno(&mysql) == CR_SERVER_GONE_ERROR) {
|
||||
if (retry) {
|
||||
cout << "Database Error: Lost connection, attempting to recover...." << endl;
|
||||
std::cout << "Database Error: Lost connection, attempting to recover...." << std::endl;
|
||||
ret = RunQuery(query, querylen, errbuf, result, affected_rows, last_insert_id, errnum, false);
|
||||
if (ret)
|
||||
cout << "Reconnection to database successful." << endl;
|
||||
std::cout << "Reconnection to database successful." << std::endl;
|
||||
}
|
||||
else {
|
||||
pStatus = Error;
|
||||
@@ -89,7 +89,7 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
|
||||
*errnum = mysql_errno(&mysql);
|
||||
if (errbuf)
|
||||
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||
cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << endl;
|
||||
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
|
||||
if (errbuf)
|
||||
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||
#ifdef _EQDEBUG
|
||||
cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << endl;
|
||||
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
|
||||
#endif
|
||||
ret = false;
|
||||
}
|
||||
@@ -123,7 +123,7 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
|
||||
}
|
||||
else {
|
||||
#ifdef _EQDEBUG
|
||||
cout << "DB Query Error: No Result" << endl;
|
||||
std::cout << "DB Query Error: No Result" << std::endl;
|
||||
#endif
|
||||
if (errnum)
|
||||
*errnum = UINT_MAX;
|
||||
@@ -138,15 +138,15 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
|
||||
}
|
||||
#if DEBUG_MYSQL_QUERIES >= 1
|
||||
if (ret) {
|
||||
cout << "query successful";
|
||||
std::cout << "query successful";
|
||||
if (result && (*result))
|
||||
cout << ", " << (int) mysql_num_rows(*result) << " rows returned";
|
||||
std::cout << ", " << (int) mysql_num_rows(*result) << " rows returned";
|
||||
if (affected_rows)
|
||||
cout << ", " << (*affected_rows) << " rows affected";
|
||||
cout<< endl;
|
||||
std::cout << ", " << (*affected_rows) << " rows affected";
|
||||
std::cout<< std::endl;
|
||||
}
|
||||
else {
|
||||
cout << "QUERY: query FAILED" << endl;
|
||||
std::cout << "QUERY: query FAILED" << std::endl;
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
@@ -180,9 +180,10 @@ bool DBcore::Open(uint32* errnum, char* errbuf) {
|
||||
LockMutex lock(&MDatabase);
|
||||
if (GetStatus() == Connected)
|
||||
return true;
|
||||
if (GetStatus() == Error)
|
||||
if (GetStatus() == Error) {
|
||||
mysql_close(&mysql);
|
||||
mysql_init(&mysql); // Initialize structure again
|
||||
}
|
||||
if (!pHost)
|
||||
return false;
|
||||
/*
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
//#include <winsock.h>
|
||||
#endif
|
||||
#include <mysql.h>
|
||||
#include "../common/DBMemLeak.h"
|
||||
#include "../common/types.h"
|
||||
#include "../common/Mutex.h"
|
||||
#include "../common/linked_list.h"
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
// Doors
|
||||
#ifdef SHAREMEM
|
||||
int32 Database::GetDoorsCount(uint32* oMaxID) {
|
||||
|
||||
+45
-34
@@ -1,25 +1,27 @@
|
||||
#include "debug.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include <string>
|
||||
#include <cstdarg>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <process.h>
|
||||
|
||||
#define snprintf _snprintf
|
||||
#if (_MSC_VER < 1500)
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
#define strncasecmp _strnicmp
|
||||
#define strcasecmp _stricmp
|
||||
|
||||
#else
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#endif
|
||||
#include "../common/MiscFunctions.h"
|
||||
#include "../common/platform.h"
|
||||
|
||||
#include "debug.h"
|
||||
#include "StringUtil.h"
|
||||
#include "MiscFunctions.h"
|
||||
#include "platform.h"
|
||||
|
||||
#ifndef va_copy
|
||||
#define va_copy(d,s) ((d) = (s))
|
||||
@@ -45,9 +47,9 @@ EQEMuLog::EQEMuLog() {
|
||||
#else
|
||||
pLogStatus[i] = 0;
|
||||
#endif
|
||||
logCallbackFmt[i] = NULL;
|
||||
logCallbackBuf[i] = NULL;
|
||||
logCallbackPva[i] = NULL;
|
||||
logCallbackFmt[i] = nullptr;
|
||||
logCallbackBuf[i] = nullptr;
|
||||
logCallbackPva[i] = nullptr;
|
||||
}
|
||||
// TODO: Make this read from an ini or something, everyone has different opinions on what it should be
|
||||
#if EQDEBUG < 2
|
||||
@@ -100,6 +102,8 @@ bool EQEMuLog::open(LogIDs id) {
|
||||
snprintf(exename, sizeof(exename), "_ucs");
|
||||
} else if(platform == ExePlatformQueryServ) {
|
||||
snprintf(exename, sizeof(exename), "_queryserv");
|
||||
} else if(platform == ExePlatformSharedMemory) {
|
||||
snprintf(exename, sizeof(exename), "_shared_memory");
|
||||
}
|
||||
|
||||
char filename[200];
|
||||
@@ -110,7 +114,7 @@ bool EQEMuLog::open(LogIDs id) {
|
||||
#endif
|
||||
fp[id] = fopen(filename, "a");
|
||||
if (!fp[id]) {
|
||||
cerr << "Failed to open log file: " << filename << endl;
|
||||
std::cerr << "Failed to open log file: " << filename << std::endl;
|
||||
pLogStatus[id] |= 4; // set file state to error
|
||||
return false;
|
||||
}
|
||||
@@ -326,7 +330,7 @@ bool EQEMuLog::writeNTS(LogIDs id, bool dofile, const char *fmt, ...) {
|
||||
bool EQEMuLog::Dump(LogIDs id, uint8* data, uint32 size, uint32 cols, uint32 skip) {
|
||||
if (!logFileValid) {
|
||||
#if EQDEBUG >= 10
|
||||
cerr << "Error: Dump() from null pointer"<<endl;
|
||||
std::cerr << "Error: Dump() from null pointer" << std::endl;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
@@ -348,36 +352,45 @@ bool EQEMuLog::Dump(LogIDs id, uint8* data, uint32 size, uint32 cols, uint32 ski
|
||||
|
||||
write(id, "Dumping Packet: %i", size);
|
||||
// Output as HEX
|
||||
int j = 0; char* ascii = new char[cols+1]; memset(ascii, 0, cols+1);
|
||||
uint32 i;
|
||||
for(i=skip; i<size; i++) {
|
||||
if ((i-skip)%cols==0) {
|
||||
if (i != skip)
|
||||
writeNTS(id, dofile, " | %s\n", ascii);
|
||||
writeNTS(id, dofile, "%4i: ", i-skip);
|
||||
memset(ascii, 0, cols+1);
|
||||
j = 0;
|
||||
|
||||
int beginningOfLineOffset = 0;
|
||||
uint32 indexInData;
|
||||
std::string asciiOutput;
|
||||
|
||||
for(indexInData=skip; indexInData<size; indexInData++) {
|
||||
if ((indexInData-skip)%cols==0) {
|
||||
if (indexInData != skip)
|
||||
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
|
||||
writeNTS(id, dofile, "%4i: ", indexInData-skip);
|
||||
asciiOutput.clear();
|
||||
beginningOfLineOffset = 0;
|
||||
}
|
||||
else if ((i-skip)%(cols/2) == 0) {
|
||||
else if ((indexInData-skip)%(cols/2) == 0) {
|
||||
writeNTS(id, dofile, "- ");
|
||||
}
|
||||
writeNTS(id, dofile, "%02X ", (unsigned char)data[i]);
|
||||
writeNTS(id, dofile, "%02X ", (unsigned char)data[indexInData]);
|
||||
|
||||
if (data[i] >= 32 && data[i] < 127)
|
||||
ascii[j++] = data[i];
|
||||
else
|
||||
ascii[j++] = '.';
|
||||
if (data[indexInData] >= 32 && data[indexInData] < 127)
|
||||
{
|
||||
// According to http://msdn.microsoft.com/en-us/library/vstudio/ee404875(v=vs.100).aspx
|
||||
// Visual Studio 2010 doesn't have std::to_string(int) but it does have the long long
|
||||
// version.
|
||||
asciiOutput.append(std::to_string((long long)data[indexInData]));
|
||||
}
|
||||
uint32 k = ((i-skip)-1)%cols;
|
||||
else
|
||||
{
|
||||
asciiOutput.append(".");
|
||||
}
|
||||
}
|
||||
uint32 k = ((indexInData-skip)-1)%cols;
|
||||
if (k < 8)
|
||||
writeNTS(id, dofile, " ");
|
||||
for (uint32 h = k+1; h < cols; h++) {
|
||||
writeNTS(id, dofile, " ");
|
||||
}
|
||||
writeNTS(id, dofile, " | %s\n", ascii);
|
||||
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
|
||||
if (dofile)
|
||||
fflush(fp[id]);
|
||||
safe_delete_array(ascii);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -435,5 +448,3 @@ void EQEMuLog::SetAllCallbacks(msgCallbackPva proc) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -45,29 +45,7 @@
|
||||
#ifndef _CRTDBG_MAP_ALLOC
|
||||
#include <stdlib.h>
|
||||
#include <crtdbg.h>
|
||||
#if (_MSC_VER < 1300)
|
||||
#include <new>
|
||||
#include <memory>
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ThrowError
|
||||
void CatchSignal(int);
|
||||
#if defined(CATCH_CRASH) || defined(_EQDEBUG)
|
||||
#define ThrowError(errstr) { cout << "Fatal error: " << errstr << " (" << __FILE__ << ", line " << __LINE__ << ")" << endl; LogFile->write(EQEMuLog::Error, "Thown Error: %s (%s:%i)", errstr, __FILE__, __LINE__); throw errstr; }
|
||||
#else
|
||||
#define ThrowError(errstr) { cout << "Fatal error: " << errstr << " (" << __FILE__ << ", line " << __LINE__ << ")" << endl; LogFile->write(EQEMuLog::Error, "Thown Error: %s (%s:%i)", errstr, __FILE__, __LINE__); CatchSignal(0); }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
// VS6 doesn't like the length of STL generated names: disabling
|
||||
#pragma warning(disable:4786)
|
||||
#pragma warning(disable:4996)
|
||||
#endif
|
||||
|
||||
#ifndef EQDEBUG_H
|
||||
|
||||
+12
-12
@@ -1,19 +1,19 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2005 EQEMu Development Team (http://eqemulator.net)
|
||||
Copyright (C) 2001-2005 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 04111-1307 USA
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 04111-1307 USA
|
||||
*/
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
@@ -49,5 +49,3 @@ extern const char *OpcodeNames[_maxEmuOpcode+1];
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -435,11 +435,11 @@ typedef enum {
|
||||
#define STAT_HASTE 19
|
||||
#define STAT_DAMAGE_SHIELD 20
|
||||
|
||||
/**
|
||||
* Recast timer types. Used as an off set to charProfileStruct timers.
|
||||
*/
|
||||
enum RecastTypes
|
||||
{
|
||||
/**
|
||||
* Recast timer types. Used as an off set to charProfileStruct timers.
|
||||
*/
|
||||
enum RecastTypes
|
||||
{
|
||||
RecastTimer0 = 0,
|
||||
RecastTimer1,
|
||||
WeaponHealClickTimer, // 2
|
||||
@@ -460,9 +460,9 @@ typedef enum {
|
||||
RecastTimer17,
|
||||
RecastTimer18,
|
||||
ModRodTimer // 19
|
||||
};
|
||||
};
|
||||
|
||||
enum GroupUpdateAction
|
||||
enum GroupUpdateAction
|
||||
{
|
||||
GUA_Joined = 0,
|
||||
GUA_Left = 1,
|
||||
|
||||
@@ -1,522 +0,0 @@
|
||||
/* EQEMu: Everquest Server Emulator
|
||||
Copyright (C) 2001-2003 EQEMu Development Team (http://eqemulator.net)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 04111-1307 USA
|
||||
*/
|
||||
#ifndef EQ_OPCODES_H
|
||||
#define EQ_OPCODES_H
|
||||
|
||||
|
||||
//THIS FILE IS NOT USED ANYMORE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
// solar: updated 2/12/04
|
||||
//
|
||||
// Invalid opcodes have been \t'd out, confirmed have no \t
|
||||
// all the ops have the first nibble as 0, so anything that's not 0x0???
|
||||
// is just an invalid opcode. if an opcode is known to be wrong set it to
|
||||
// this to avoid conflicts with real ops
|
||||
//
|
||||
// codes preceded by '//' are ones that are known to be right but not used
|
||||
// by any code yet
|
||||
//
|
||||
// codes preceded by '// not used' are ones that are probably wrong and not
|
||||
// used anywhere
|
||||
//
|
||||
|
||||
|
||||
//im feeling lazy today and I dont wanna find-replace this include
|
||||
#include "emu_opcodes.h"
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////
|
||||
// Zone.exe opcodes:
|
||||
//////////////////////////////////////
|
||||
//0x029f gives you money
|
||||
//280 makes you stop receiving and sending chat messages
|
||||
//260 send spell information
|
||||
//45 logout
|
||||
//72 player is in zone blah at dfdsfdsfg
|
||||
//80 The door says
|
||||
//89 Your expansion settings are:
|
||||
//104 scribes a spell to your spellbook
|
||||
//108,555 kicks player to server select
|
||||
//123 money split from groups
|
||||
//11 sense trap response
|
||||
//296 name approval question
|
||||
//338 failed to create new player guild
|
||||
//401 pk question, 0x0191 response
|
||||
//411 sacrifice question, 0x019b response
|
||||
//193,213,243,244,431 chat messages
|
||||
//425,499,505,506,525,526,596 crash
|
||||
//451 translocate question, 0x01c3 response
|
||||
//474,537 you escape from combat hiding yourself from view
|
||||
//492 stat buffs
|
||||
//496 your petition text is:
|
||||
//581 you receive money msg with money
|
||||
//562 you have control of yourself again
|
||||
//613 CTD
|
||||
//686 removes the unencumbered
|
||||
#define LiveOP_Heartbeat 0x0176 // client sends this periodically
|
||||
#define LiveOP_ReloadUI 0x02d7
|
||||
#define LiveOP_IncreaseStats 0x01eb
|
||||
#define LiveOP_ApproveZone 0x0134
|
||||
#define LiveOP_Dye 0x01d5
|
||||
|
||||
// not used #define LiveOP_ExpansionSetting 0x0203
|
||||
// not used #define LiveOP_GainMoney 0x0209
|
||||
// not used #define LiveOP_Sacrifice 0x019b
|
||||
// not used #define LiveOP_BecomePK 0x0191
|
||||
#define LiveOP_Stamina 0x0168
|
||||
#define LiveOP_ControlBoat 0x014d
|
||||
#define LiveOP_MobUpdate 0x003e
|
||||
#define LiveOP_ClientUpdate 0x0027
|
||||
#define LiveOP_ChannelMessage 0x0024
|
||||
#define LiveOP_SimpleMessage 0x01d7
|
||||
#define LiveOP_FormattedMessage 0x01d8
|
||||
//#define LiveOP_RaidInvite 0x01e4 // wrong. from seq - not used by eqemu
|
||||
// #define LiveOP_RaidJoin 0x01e5 // from seq - not used by eqemu
|
||||
// not used #define LiveOP_ApplyPoison 0x00b7
|
||||
#define LiveOP_TGB 0x01c6 // /targetgroupbuff
|
||||
// #define LiveOP_CharInfo 0x0012 // /charinfo
|
||||
// #define LiveOP_Movelog 0x0290 // /movelog
|
||||
// #define LiveOP_Beta 0x02cb // /beta
|
||||
#define LiveOP_TestBuff 0x0285 // /testbuffme
|
||||
// #define LiveOP_Key 0x01e2 // /keys
|
||||
#define LiveOP_Bind_Wound 0x012d
|
||||
#define LiveOP_Charm 0x01ab
|
||||
#define LiveOP_Begging 0x014c
|
||||
#define LiveOP_MoveCoin 0x0152
|
||||
#define LiveOP_SpawnDoor 0x0292
|
||||
#define LiveOP_Sneak 0x009d // Clicked sneak - Doodman 10/10/2003
|
||||
#define LiveOP_ExpUpdate 0x0079
|
||||
#define LiveOP_DumpName 0x027d //no idea what this is: just tired of looking at it as unknown; updated by Shawn319
|
||||
// #define LiveOP_UpdateAA 0x0222
|
||||
#define LiveOP_RespondAA 0x01ea // AA table
|
||||
#define LiveOP_SendAAStats 0x01c9
|
||||
#define LiveOP_SendAATable 0x0366
|
||||
#define LiveOP_AAAction 0x01e9 // Used for changing percent, buying? and activating skills
|
||||
#define LiveOP_BoardBoat 0x00bb
|
||||
#define LiveOP_LeaveBoat 0x00bc
|
||||
|
||||
#define LiveOP_AdventureInfoRequest 0x02b8 //Cofruben:received when client click on the recruiter.
|
||||
#define LiveOP_AdventureInfo 0x02b9 //Cofruben:sent when client right click on the recruiter.
|
||||
#define LiveOP_AdventureRequest 0x02a6 //Cofruben: received when client press request button.1 normal,2 hard
|
||||
#define LiveOP_AdventureDetails 0x02a8 //Cofruben: sent when client press request button.
|
||||
#define LiveOP_LDoNButton 0x02a9 //Cofruben: Received button.(uint8)00 decline,01 accept.
|
||||
#define LiveOP_AdventureData 0x02ba //Cofruben: Sent when client press accept button.
|
||||
|
||||
#define LiveOP_AdventureFinish 0x02c9 //Cofruben:Used when you win/lose a dungeon
|
||||
#define LiveOP_LeaveAdventure 0x02c6 //Cofruben:received when client press leave adventure button
|
||||
#define LiveOP_AdventureUpdate 0x02ce
|
||||
|
||||
|
||||
#define LiveOP_SendExpZonein 0x002b // 0 length packets
|
||||
#define LiveOP_ZoneInSendName 0x01e4
|
||||
//Guild Opcodes
|
||||
#define LiveOP_GuildLeader 0x01bf // /guildleader, was 00a7
|
||||
#define LiveOP_GuildPeace 0x009a // /guildpeace
|
||||
#define LiveOP_GuildRemove 0x0132 // /guildremove
|
||||
#define LiveOP_GuildMemberList 0x0059 //fixed by Shawn319 (dec 18th patch)
|
||||
#define LiveOP_GuildMemberUpdate 0x026e
|
||||
#define LiveOP_GuildInvite 0x0130 // /guildinvite
|
||||
#define LiveOP_GuildMOTD 0x01c0 // /guildmotd, was 01bf
|
||||
// not used #define LiveOP_GuildManagement 0x005e // LoY guild mgm't tool
|
||||
#define LiveOP_GuildPublicNote 0x003c
|
||||
#define LiveOP_GetGuildMOTD 0x027e // /getguildmotd
|
||||
#define LiveOP_GuildDemote 0x0277
|
||||
#define LiveOP_GuildInviteAccept 0x0131
|
||||
#define LiveOP_GuildWar 0x00a4 // /guildwar
|
||||
#define LiveOP_GuildUpdate 0x0b41
|
||||
#define LiveOP_GuildDelete 0x0133
|
||||
#define LiveOP_GuildManageRemove 0x0233
|
||||
#define LiveOP_GuildManageAdd 0x022d
|
||||
#define LiveOP_GuildManageStatus 0x0039
|
||||
//Bazaar
|
||||
#define LiveOP_Trader 0x01e8 // /trader
|
||||
#define LiveOP_Bazaar 0x01e7 // /bazaar search
|
||||
|
||||
#define LiveOP_BecomeTrader 0x01c4
|
||||
#define LiveOP_BazaarInspect 0x01f4
|
||||
#define LiveOP_TraderItemUpdate 0x006e
|
||||
#define LiveOP_TraderDelItem 0x017c
|
||||
#define LiveOP_TraderShop 0x01eb // right-click on a trader in bazaar
|
||||
|
||||
#define LiveOP_TraderBuy 0x01ca // buy from a trader in bazaar
|
||||
|
||||
#define LiveOP_PetCommands 0x01ac
|
||||
#define LiveOP_TradeSkillCombine 0x0042
|
||||
#define LiveOP_AugmentItem 0x02e5
|
||||
#define LiveOP_ItemName 0x0367
|
||||
|
||||
|
||||
|
||||
//Shops
|
||||
#define LiveOP_ShopItem 0x02cd // Send merchant item data to client (header = 0x64)
|
||||
#define LiveOP_ShopPlayerBuy 0x0065
|
||||
// not used #define LiveOP_ShopTakeMoney 0x0066
|
||||
#define LiveOP_ShopPlayerSell 0x006a
|
||||
#define LiveOP_ShopDelItem 0x006d
|
||||
#define LiveOP_ShopEndConfirm 0x0f6d
|
||||
#define LiveOP_ShopRequest 0x00f7 // right-click on merchant
|
||||
#define LiveOP_ShopEnd 0x006c // Finished shopping at merchant
|
||||
|
||||
#define LiveOP_AdventureMerchantRequest 0x02d1
|
||||
#define LiveOP_AdventureMerchantResponse 0x02d2
|
||||
#define LiveOP_AdventureMerchantPurchase 0x02d3
|
||||
#define LiveOP_AdventurePointsUpdate 0x02e3
|
||||
|
||||
// #define LiveOP_LFPCommand 0x0272 // Looking for player
|
||||
// #define LiveOP_LFPGetMatchesRequest 0x0273
|
||||
// #define LiveOP_LFPGetMatchesResponse 0x0275
|
||||
|
||||
// #define LiveOP_LFGGetMatchesRequest 0x0271
|
||||
// #define LiveOP_LFGGetMatchesResponse 0x0274
|
||||
#define LiveOP_LFGCommand 0x0270 // When client issues /LFG command
|
||||
// #define LiveOP_LFGResponse 0x01b1
|
||||
#define LiveOP_LFGAppearance 0x01d0 // Some other char in zone turns LFG on/off
|
||||
|
||||
#define LiveOP_MoneyUpdate 0x01b5
|
||||
|
||||
#define LiveOP_GroupDelete 0x0721
|
||||
#define LiveOP_GroupAcknowledge 0x0272
|
||||
|
||||
#define LiveOP_GroupUpdate 0x024a
|
||||
#define LiveOP_GroupInvite 0x025f
|
||||
#define LiveOP_GroupDisband 0x00ff
|
||||
#define LiveOP_GroupInvite2 0x00d5
|
||||
#define LiveOP_GroupFollow 0x025e
|
||||
#define LiveOP_GroupFollow2 0x00d7
|
||||
|
||||
#define LiveOP_GroupCancelInvite 0x00d6
|
||||
|
||||
#define LiveOP_Split 0x0156 // /split
|
||||
#define LiveOP_Jump 0x00d8 // not used atm but will be when stamina is fixed
|
||||
#define LiveOP_ConsiderCorpse 0x01d6
|
||||
#define LiveOP_SkillUpdate 0x0064
|
||||
|
||||
#define LiveOP_GMEndTrainingResponse 0x0178
|
||||
#define LiveOP_GMEndTraining 0x013c
|
||||
#define LiveOP_GMTrainSkill 0x0175
|
||||
#define LiveOP_GMTraining 0x013b
|
||||
|
||||
#define LiveOP_ConsumeAmmo 0x017b
|
||||
#define LiveOP_CombatAbility 0x0171
|
||||
|
||||
#define LiveOP_TrackUnknown 0x009c
|
||||
#define LiveOP_TrackTarget 0x0234
|
||||
#define LiveOP_Track 0x0286
|
||||
#define LiveOP_ReadBook 0x0297
|
||||
|
||||
#define LiveOP_ItemLinkClick 0x001f
|
||||
#define LiveOP_ItemLinkResponse 0x01f4
|
||||
#define LiveOP_ItemLinkText 0x01d9
|
||||
|
||||
#define LiveOP_RezzRequest 0x0a41
|
||||
#define LiveOP_RezzAnswer 0x00e5
|
||||
#define LiveOP_RezzComplete 0x019b
|
||||
|
||||
#define LiveOP_MoveDoor 0x0128
|
||||
#define LiveOP_ClickDoor 0x0127 // Click door
|
||||
#define LiveOP_SendZonepoints 0x0247 // Coords in a zone that will port you to another zone
|
||||
#define LiveOP_SetRunMode 0x008c // Client hit the "run" button (or control+r)
|
||||
#define LiveOP_InspectRequest 0x0248
|
||||
#define LiveOP_InspectAnswer 0x0249
|
||||
#define LiveOP_SenseTraps 0x0187 // Clicked sense traps - @Doodman 10/10/2003
|
||||
#define LiveOP_DisarmTraps 0x018e // Clicked disarm traps - @Doodman 10/10/2003
|
||||
#define LiveOP_Assist 0x01bc
|
||||
#define LiveOP_PickPocket 0x0240
|
||||
|
||||
#define LiveOP_LootRequest 0x0119
|
||||
#define LiveOP_EndLootRequest 0x011a
|
||||
#define LiveOP_MoneyOnCorpse 0x011b
|
||||
#define LiveOP_LootComplete 0x0179
|
||||
#define LiveOP_LootItem 0x013f
|
||||
// solar: there was an LiveOP_PlaceItem synonym for this
|
||||
#define LiveOP_MoveItem 0x0151 // Client moving an item from one slot to another (user action)
|
||||
|
||||
#define LiveOP_WhoAllRequest 0x0056
|
||||
#define LiveOP_WhoAllResponse 0x0229
|
||||
#define LiveOP_Consume 0x0167
|
||||
#define LiveOP_AutoAttack 0x0172
|
||||
#define LiveOP_AutoAttack2 0x0186
|
||||
#define LiveOP_TargetMouse 0x0173 // mouse targetting a person (also: Pressing F* key to target)
|
||||
#define LiveOP_TargetCommand 0x01ba // /target user
|
||||
#define LiveOP_TargetReject 0x01d8 // When /target fails (// solar: untested)
|
||||
#define LiveOP_Hide 0x009e
|
||||
#define LiveOP_Forage 0x012e // Clicked forage - @Doodman 10/10/2003
|
||||
#define LiveOP_Fishing 0x0077
|
||||
// #define LiveOP_Adventure 0x02d0 // /adventure
|
||||
// #define LiveOP_Feedback 0x0161 // /feedback
|
||||
#define LiveOP_Bug 0x0246 // /bug
|
||||
#define LiveOP_Emote 0x00f2 // /me goes blah
|
||||
#define LiveOP_EmoteAnim 0x0140 // solar: untested
|
||||
#define LiveOP_Consider 0x015c
|
||||
#define LiveOP_FaceChange 0x01cb // /face
|
||||
// not used #define LiveOP_Report 0x01e0
|
||||
#define LiveOP_RandomReq 0x0197
|
||||
#define LiveOP_RandomReply 0x0087
|
||||
#define LiveOP_Camp 0x01c3
|
||||
#define LiveOP_YellForHelp 0x0192
|
||||
#define LiveOP_SafePoint 0x00ef
|
||||
|
||||
#define LiveOP_Buff 0x0157
|
||||
#define LiveOP_BuffFadeMsg 0x00c0
|
||||
#define LiveOP_MultiLineMsg 0x0440 // is this still good for anything?
|
||||
#define LiveOP_SpecialMesg 0x021c // Communicate textual info to client
|
||||
#define LiveOP_Consent 0x0013 // /consent
|
||||
#define LiveOP_ConsentResponse 0x029d
|
||||
#define LiveOP_Deny 0x02d4
|
||||
#define LiveOP_Stun 0x016c
|
||||
#define LiveOP_BeginCast 0x0021
|
||||
#define LiveOP_CastSpell 0x00be
|
||||
#define LiveOP_InterruptCast 0x01a8
|
||||
#define LiveOP_Death 0x0105
|
||||
#define LiveOP_FeignDeath 0x023f
|
||||
#define LiveOP_Illusion 0x012b
|
||||
#define LiveOP_LevelUpdate 0x0078
|
||||
#define LiveOP_LevelAppearance 0x0371
|
||||
// not used #define LiveOP_LocateCorpse 0x00d1 //Sent when a client casts Locate Corpse spells?
|
||||
|
||||
#define LiveOP_MemorizeSpell 0x00c2 // Memming a spell from book to spell slot
|
||||
#define LiveOP_HPUpdate 0x0244 // Update HP % of a PC or NPC
|
||||
#define LiveOP_SendHPTarget 0x022e
|
||||
#define LiveOP_Mend 0x007d
|
||||
#define LiveOP_MendHPUpdate 0x009b
|
||||
#define LiveOP_Taunt 0x0160
|
||||
|
||||
// #define LiveOP_Summoncorpse 0x02b5 // /summoncorpse
|
||||
// #define LiveOP_GMSearchCorpse 0x0097 // GM /searchcorpse - Search all zones for named corpse
|
||||
// #define LiveOP_SearchCorpse LiveOP_GMSearchCorpse // /searchcorpse
|
||||
#define LiveOP_GMDelCorpse 0x0199 // /delcorpse
|
||||
#define LiveOP_GMFind 0x0047 // GM /find - ?
|
||||
// not used #define LiveOP_FindResponse 0x02cc
|
||||
#define LiveOP_GMServers 0x0020 // GM /servers - ?
|
||||
#define LiveOP_GMGoto 0x010b // GM /goto - Transport to another loc
|
||||
#define LiveOP_GMSummon 0x028c // GM /summon - Summon PC to self
|
||||
#define LiveOP_GMKick 0x010a // GM /kick - Boot player
|
||||
#define LiveOP_GMKill 0x0109 // GM /kill - Insta kill mob/pc
|
||||
#define LiveOP_GMNameChange 0x0b40 // /name
|
||||
#define LiveOP_GMLastName 0x00a3 // GM /lastname - Change user lastname
|
||||
#define LiveOP_GMToggle 0x01b3 // GM /toggle - Toggle ability to receive tells from other PC's
|
||||
#define LiveOP_GMEmoteZone 0x028f // GM /emotezone - Send zonewide emote
|
||||
#define LiveOP_GMBecomeNPC 0x0074 // GM /becomenpc - Become an NPC
|
||||
// (TODO: Use opcode 0x012d, which is also sent with LiveOP_GMBecomeNPC to create correct npc
|
||||
// #define LiveOP_GMApproval 0x01b0 // GM /approval - Name approval duty?
|
||||
// not used #define LiveOP_NameApproval 0x011f //Name approval
|
||||
#define LiveOP_GMHideMe 0x00de // GM /hideme - Remove self from spawn lists and make invis
|
||||
// #define LiveOP_GMInquire 0x00da // GM /inquire - Search soulmark data
|
||||
// #define LiveOP_GMSoulmark 0x00dc // GM /praise /warn - Add soulmark comment to user file
|
||||
#define LiveOP_GMZoneRequest 0x0184 // GM /zone - Transport to another zone
|
||||
#define LiveOP_GMZoneRequest2 0x0239 // GM /zone 2
|
||||
|
||||
#define LiveOP_Petition 0x0068
|
||||
#define LiveOP_PetitionRefresh 0x0085
|
||||
#define LiveOP_PDeletePetition 0x01ee
|
||||
#define LiveOP_PetitionBug 0x0092 // 0094 feedback 0095 guide
|
||||
// #define LiveOP_PViewPetition 0x01ef
|
||||
#define LiveOP_PetitionUpdate 0x0069 // Updates the Petitions in the Que
|
||||
#define LiveOP_PetitionCheckout 0x0076 // Petition Checkout
|
||||
#define LiveOP_PetitionCheckout2 0x0056 //Also sent when a player checks out a petition Possibly requesting who all
|
||||
#define LiveOP_PetitionDelete 0x0091 // Client Petition Delete Request
|
||||
#define LiveOP_PetitionResolve 0x02b4 // Client Petition Resolve Request
|
||||
#define LiveOP_PetitionCheckIn 0x007e // Petition Checkin
|
||||
#define LiveOP_PetitionUnCheckout 0x0090
|
||||
|
||||
#define LiveOP_PetitionQue 0x01ec //GM looking at petitions
|
||||
|
||||
|
||||
#define LiveOP_SetServerFilter 0x01bb
|
||||
// not used #define LiveOP_SetServerFilterAck 0x0341
|
||||
|
||||
#define LiveOP_NewSpawn 0x0218 // New NPC or PC entering zone
|
||||
#define LiveOP_Animation 0x0140
|
||||
// #define LiveOP_MobHealth 0x022e // health sent when a player clicks on the mob
|
||||
#define LiveOP_ZoneChange 0x0142 // Client requesting transfer to a different zone
|
||||
#define LiveOP_DeleteSpawn 0x00f3 // Remove a spawn from the current zone
|
||||
// not used #define LiveOP_ConfirmDelete 0x0178 //Client sends this to server to confirm op_deletespawn
|
||||
// not used #define LiveOP_NewCorpse 0x00da
|
||||
#define LiveOP_CrashDump 0x0265
|
||||
// not used #define LiveOP_CastOn 0x0119
|
||||
#define LiveOP_EnvDamage 0x00e8
|
||||
|
||||
#define LiveOP_Action 0x0101
|
||||
#define LiveOP_Damage 0x00e2 // seq calls this Action2
|
||||
#define LiveOP_ManaChange 0x00bf
|
||||
#define LiveOP_ClientError 0x027c
|
||||
// #define LiveOP_LoadSpellSet 0x02a4
|
||||
#define LiveOP_Save 0x00fb // Client asking server to save user state
|
||||
#define LiveOP_LocInfo 0x0316
|
||||
|
||||
#define LiveOP_Surname 0x0188
|
||||
#define LiveOP_SwapSpell 0x018f // Swapping spell positions within book
|
||||
#define LiveOP_DeleteSpell 0x01db
|
||||
#define LiveOP_CloseContainer 0x029f //Client closing world container (i.e., forge)
|
||||
#define LiveOP_ClickObjectAck 0x029f //Client closing world container (i.e., forge)
|
||||
#define LiveOP_CreateObject 0x00fa //Zone objects (pok books, objects on ground, etc)
|
||||
#define LiveOP_ClickObject 0x00f9 //Client clicking on object
|
||||
#define LiveOP_ClearObject 0x01c1
|
||||
#define LiveOP_ZoneUnavail 0x0265
|
||||
// #define LiveOP_FlashMessage 0x02cd //wierd opcode that flashes message on screen
|
||||
#define LiveOP_ItemPacket 0x02e0 // Variety of ways for sending out item data
|
||||
//0x0283 hmm
|
||||
#define LiveOP_TradeRequest 0x029a // Client request trade session
|
||||
#define LiveOP_TradeRequestAck 0x0037 // Trade request recipient is acknowledging they are able to trade
|
||||
#define LiveOP_TradeAcceptClick 0x002d
|
||||
// not used #define LiveOP_ItemToTrade 0x0031
|
||||
#define LiveOP_TradeMoneyUpdate 0x0162
|
||||
#define LiveOP_TradeCoins 0x0036
|
||||
#define LiveOP_CancelTrade 0x002e
|
||||
#define LiveOP_FinishTrade 0x002f
|
||||
// #define LiveOP_Translocate 0x01c5
|
||||
// not used #define LiveOP_WebUpdate 0x01f2
|
||||
#define LiveOP_SaveOnZoneReq 0x00a1
|
||||
#define LiveOP_Logout 0x0185 // Last opcode seny by server when you zone or camp
|
||||
#define LiveOP_RequestDuel 0x0298 //Shawn319: Fixed 1/3/04
|
||||
// LiveOP_DeclineDuel 0x029c
|
||||
#define LiveOP_DuelResponse 0x0a5d
|
||||
#define LiveOP_DuelResponse2 0x016e
|
||||
#define LiveOP_InstillDoubt 0x007c
|
||||
|
||||
#define LiveOP_SafeFallSuccess 0x00ac
|
||||
#define LiveOP_DisciplineUpdate 0x02fb
|
||||
|
||||
//Tribute Master
|
||||
|
||||
//send initial tribute update right before inventory
|
||||
//send the LiveOP_TributeInfo's in response to LiveOP_ReqClientSpawn
|
||||
#define LiveOP_TributeUpdate 0x02f2
|
||||
#define LiveOP_TributeItem 0x02f3
|
||||
#define LiveOP_TributePointUpdate 0x02f4
|
||||
#define LiveOP_SendTributes 0x02f5
|
||||
#define LiveOP_TributeInfo 0x02f6
|
||||
#define LiveOP_SelectTribute 0x02f7
|
||||
#define LiveOP_TributeTimer 0x02f8
|
||||
#define LiveOP_StartTribute 0x02f9
|
||||
#define LiveOP_TributeNPC 0x02fa //no idea what this is for
|
||||
#define LiveOP_TributeMoney 0x02fe
|
||||
#define LiveOP_TributeToggle 0x0364
|
||||
|
||||
//New Tradeskill Interface
|
||||
#define LiveOP_RecipesFavorite 0x0322
|
||||
#define LiveOP_RecipesSearch 0x01f9
|
||||
#define LiveOP_RecipeReply 0x01fa
|
||||
#define LiveOP_RecipeDetails 0x01fb
|
||||
#define LiveOP_RecipeAutoCombine 0x01fc
|
||||
|
||||
//for the 'find' command
|
||||
#define LiveOP_FindPersonRequest 0x02db
|
||||
#define LiveOP_FindPersonReply 0x02dc
|
||||
|
||||
#define LiveOP_Shielding 0x01dd //this is prolly wrong
|
||||
|
||||
//////////////////////////////////////
|
||||
// Zone.exe opcodes for login sequence:
|
||||
//////////////////////////////////////
|
||||
#define LiveOP_SetDataRate 0x0198 // Client sending datarate.txt value
|
||||
#define LiveOP_ZoneEntry 0x023b // Info about char entering zone..
|
||||
#define LiveOP_PlayerProfile 0x006b // Basic player info (no inventory)
|
||||
#define LiveOP_CharInventory 0x0291 // Full inventory of player
|
||||
#define LiveOP_ZoneSpawns 0x0170 // All spawns in current zone
|
||||
#define LiveOP_TimeOfDay 0x0026 // Notify client of current time
|
||||
#define LiveOP_Weather 0x015b // Weather update
|
||||
#define LiveOP_ReqNewZone 0x00ec // Client requesting NewZone_Struct
|
||||
#define LiveOP_NewZone 0x00eb // Info about zone being loaded (exp multiplier, etc)
|
||||
#define LiveOP_ReqClientSpawn 0x00fd // Client requesting spawn data
|
||||
#define LiveOP_SpawnAppearance 0x012F // Sets spawnid/animation/equipment
|
||||
#define LiveOP_ClientReady 0x0086 // Client fully connected, finished loading
|
||||
#define LiveOP_ZoneComplete LiveOP_ClientReady //Client sends upon successful zone in
|
||||
|
||||
//////////////////////////////////////
|
||||
// World.exe opcodes:
|
||||
//////////////////////////////////////
|
||||
#define LiveOP_LoginComplete 0x02db
|
||||
#define LiveOP_ApproveWorld 0x0195
|
||||
#define LiveOP_LogServer 0x035f
|
||||
#define LiveOP_MOTD 0x01b2 // Server message of the day
|
||||
#define LiveOP_SendLoginInfo 0x0251
|
||||
#define LiveOP_DeleteCharacter 0x00ea // Delete character @ char select
|
||||
#define LiveOP_SendCharInfo 0x0102 // Send all chars visible @ char select
|
||||
#define LiveOP_ExpansionInfo 0x00e1 // Which expansions user has
|
||||
#define LiveOP_CharacterCreate 0x0104 // Create character @ char select
|
||||
#define LiveOP_RandomNameGenerator 0x02ab // Returns a random name
|
||||
#define LiveOP_GuildsList 0x005d // Server sending client list of guilds
|
||||
#define LiveOP_ApproveName 0x0125 // Approving new character name @ char creation
|
||||
#define LiveOP_EnterWorld 0x0261 // Server approval for client to enter world
|
||||
#define LiveOP_World_Client_CRC1 0x015a // Contains a snippet of spell data
|
||||
#define LiveOP_World_Client_CRC2 0x015e // Second client verification packet
|
||||
#define LiveOP_SetChatServer 0x0269 // Chatserver? IP,Port,servername.Charname,password(?)
|
||||
#define LiveOP_ZoneServerInfo 0x0264 // Zone server? IP,0's,uint16?
|
||||
// not used #define LiveOP_UserCompInfo 0x02a5 // User submitting computer information
|
||||
|
||||
//////////////////////////////////////
|
||||
// Zone.exe/World.exe shared opcodes:
|
||||
//////////////////////////////////////
|
||||
#define LiveOP_AckPacket 0x0017 // Appears to be generic ack at the presentation level
|
||||
#define LiveOP_WearChange 0x012c // Client texture/color update
|
||||
|
||||
////////////////////////////
|
||||
// OLD opcodes:
|
||||
////////////////////////////
|
||||
|
||||
// not used #define LiveOP_SummonedItem 0x0841
|
||||
// not used #define LiveOP_HarmTouch 0x0E41
|
||||
// not used #define LiveOP_Drink 0x0641
|
||||
// not used #define LiveOP_Medding 0x0841
|
||||
// not used #define LiveOP_SenseHeading 0x00c3 // Clicked sense heading button - solar: not used anymore
|
||||
|
||||
#define PET_BACKOFF 1
|
||||
#define PET_GETLOST 2
|
||||
#define PET_HEALTHREPORT 4
|
||||
#define PET_GUARDHERE 5
|
||||
#define PET_GUARDME 6
|
||||
#define PET_ATTACK 7
|
||||
#define PET_FOLLOWME 8
|
||||
#define PET_SITDOWN 9
|
||||
#define PET_STANDUP 10
|
||||
#define PET_TAUNT 11
|
||||
#define PET_HOLD 12
|
||||
#define PET_NOTAUNT 14
|
||||
#define PET_LEADER 16
|
||||
#define PET_SLUMBER 17
|
||||
|
||||
|
||||
// Agz: The following is from the old source I used as base
|
||||
/ENUMERATED PACKET OPCODE
|
||||
#define ALL_FINISH 0x0005
|
||||
#define LS_REQUEST_VERSION 0x0059
|
||||
#define LS_SEND_VERSION 0x0059
|
||||
#define LS_SEND_LOGIN_INFO 0x0001
|
||||
#define LS_SEND_SESSION_ID 0x0004
|
||||
#define LS_REQUEST_UPDATE 0x0052
|
||||
#define LS_SEND_UPDATE 0x0052
|
||||
|
||||
#define LS_REQUEST_SERVERLIST 0x0046
|
||||
#define LS_SEND_SERVERLIST 0x0046
|
||||
|
||||
#define LS_REQUEST_SERVERSTATUS 0x0048
|
||||
#define LS_SEND_SERVERSTATUS 0x004A
|
||||
#define LS_GET_WORLDID 0x0047
|
||||
#define LS_SEND_WORLDID 0x0047
|
||||
#define WS_SEND_LOGIN_INFO 0x5818
|
||||
#define WS_SEND_LOGIN_APPROVED 0x0710
|
||||
#define WS_SEND_LOGIN_APPROVED2 0x0180
|
||||
#define WS_SEND_CHAR_INFO 0x4720*/
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user