Removed Boost dependency, changed MySQL library to MariaDB
This commit is contained in:
parent
7cc9550efc
commit
d4fa88b7e2
|
@ -2,6 +2,10 @@
|
||||||
cmake-build-debug/
|
cmake-build-debug/
|
||||||
cmake-build-release/
|
cmake-build-release/
|
||||||
|
|
||||||
|
# IDE folders
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
# Dockerfile (in order to allow changes without rebuilding)
|
# Dockerfile (in order to allow changes without rebuilding)
|
||||||
Dockerfile
|
Dockerfile
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ ENV VCPKG_FORCE_SYSTEM_BINARIES=1
|
||||||
# Install vcpkg and the required libraries
|
# Install vcpkg and the required libraries
|
||||||
RUN git clone https://github.com/Microsoft/vcpkg.git
|
RUN git clone https://github.com/Microsoft/vcpkg.git
|
||||||
RUN bash ./vcpkg/bootstrap-vcpkg.sh
|
RUN bash ./vcpkg/bootstrap-vcpkg.sh
|
||||||
RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog argon2
|
RUN ./vcpkg/vcpkg install cryptopp effolkronium-random libmariadb libevent lzo fmt spdlog argon2
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
|
41
README.md
41
README.md
|
@ -7,14 +7,34 @@ For-profit usage of this material is certainly illegal without the proper
|
||||||
licensing agreements and is hereby discouraged (not legal advice). Even so, the
|
licensing agreements and is hereby discouraged (not legal advice). Even so, the
|
||||||
nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now.
|
nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now.
|
||||||
|
|
||||||
## 1. Building and usage
|
## 1. Usage
|
||||||
|
|
||||||
### A. Use Docker to instantly bring up a server (recommended)
|
|
||||||
We aim to provide Docker images which _just work_ for your convenience.
|
We aim to provide Docker images which _just work_ for your convenience.
|
||||||
A Docker Compose project is maintained in the [Deployment project](https://git.old-metin2.com/metin2/deploy).
|
A Docker Compose project is maintained in the [Deployment project](https://git.old-metin2.com/metin2/deploy).
|
||||||
Please head over there for further instructions.
|
Please head over there for further instructions.
|
||||||
|
|
||||||
### B. Build the binaries yourself (for advanced users)
|
## 2. Building
|
||||||
|
### A. Building Docker images
|
||||||
|
#### Building a Docker image from the repository
|
||||||
|
In order to build a local Docker image on your local architecture, just build the
|
||||||
|
provided Dockerfile in this project:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker build -t metin2/server:test --provenance=false .
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Publishing a multiplatform Docker image manually
|
||||||
|
This command is reserved only for repository maintainers in order to publish
|
||||||
|
new Docker images for public use with the Deployment project.
|
||||||
|
|
||||||
|
**WARNING:** Using WSL for building might lead to QEMU segmentation fault issues;
|
||||||
|
this can be worked around by using `binfmt` and `qemu-user-static` as described
|
||||||
|
[here](https://github.com/docker/buildx/issues/1170#issuecomment-1159350550).
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker build --push -t git.old-metin2.com/metin2/server:<IMAGE-TAG-HERE> --platform linux/amd64,linux/arm64 --provenance=false .
|
||||||
|
```
|
||||||
|
|
||||||
|
### B. Building the binaries yourself (for advanced users)
|
||||||
_Sadly, we're unable to provide hand-holding services. You should have some C++ development experience
|
_Sadly, we're unable to provide hand-holding services. You should have some C++ development experience
|
||||||
going forward with this route._
|
going forward with this route._
|
||||||
|
|
||||||
|
@ -23,6 +43,7 @@ variety. This project is also compatible with WSL, even though WSL can be buggy
|
||||||
at times. FreeBSD/Windows compatibility is untested and unsupported for the
|
at times. FreeBSD/Windows compatibility is untested and unsupported for the
|
||||||
time being - there are other projects out there if that's what you want.
|
time being - there are other projects out there if that's what you want.
|
||||||
|
|
||||||
|
#### Setting up the requirements
|
||||||
On your Linux box, install the dependencies for `vcpkg` and the other libraries
|
On your Linux box, install the dependencies for `vcpkg` and the other libraries
|
||||||
we're going to install.
|
we're going to install.
|
||||||
```shell
|
```shell
|
||||||
|
@ -39,18 +60,21 @@ Install `vcpkg` according to the [latest instructions](https://vcpkg.io/en/getti
|
||||||
|
|
||||||
Build and install the required libraries:
|
Build and install the required libraries:
|
||||||
```shell
|
```shell
|
||||||
vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog argon2
|
vcpkg install cryptopp effolkronium-random libmariadb libevent lzo fmt spdlog argon2
|
||||||
```
|
```
|
||||||
|
|
||||||
Then, it's time to build your binaries. Your commands should look along the lines of:
|
#### Building the binaries
|
||||||
|
Instead of building the binaries directly from the CLI, we recommend using an IDE, since
|
||||||
|
you're probably doing some kind of development anyway. See the "Development" section for more information on that.
|
||||||
|
|
||||||
|
If you decide do build from the command line, make sure to find the right path for `vcpkg.cmake` and run the following:
|
||||||
```shell
|
```shell
|
||||||
mkdir build/
|
mkdir build/
|
||||||
cd build && cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
cd build && cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
||||||
make -j $(nproc)
|
make -j $(nproc)
|
||||||
```
|
```
|
||||||
|
|
||||||
If everything goes right, you should now have compiled binaries you should just be able to use
|
If everything goes right, you should now have compiled binaries in the `build/` directory.
|
||||||
as a drop-in replacement for your BSD binaries in your favourite serverfiles.
|
|
||||||
|
|
||||||
## 2. Development
|
## 2. Development
|
||||||
The preferred IDE in order to develop and debug the server is [CLion](https://www.jetbrains.com/clion/),
|
The preferred IDE in order to develop and debug the server is [CLion](https://www.jetbrains.com/clion/),
|
||||||
|
@ -103,7 +127,6 @@ This is a very serious security risk and one of the reasons this project is stil
|
||||||
|
|
||||||
## 5. Further plans
|
## 5. Further plans
|
||||||
- Migrate `db.conf` and `game.conf` to a modern dotenv-like format, which would enable pretty nice Docker images.
|
- Migrate `db.conf` and `game.conf` to a modern dotenv-like format, which would enable pretty nice Docker images.
|
||||||
- Add a health check to the Docker image.
|
|
||||||
- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting.
|
- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting.
|
||||||
- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server.
|
- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server.
|
||||||
- Improve memory safety.
|
- Improve memory safety.
|
||||||
|
|
|
@ -20,23 +20,19 @@ endif()
|
||||||
# Treat char variables as signed, especially useful for ARM builds
|
# Treat char variables as signed, especially useful for ARM builds
|
||||||
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
|
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
|
||||||
|
|
||||||
# Find dependencies
|
# Find and link dependencies
|
||||||
|
|
||||||
#
|
#
|
||||||
# vcpkg dependencies
|
# vcpkg dependencies
|
||||||
#
|
#
|
||||||
|
|
||||||
# Boost
|
|
||||||
find_package(Boost COMPONENTS system REQUIRED)
|
|
||||||
target_link_libraries (${PROJECT_NAME} PRIVATE Boost::boost Boost::system)
|
|
||||||
|
|
||||||
# Libevent
|
# Libevent
|
||||||
find_package(Libevent CONFIG REQUIRED)
|
find_package(Libevent CONFIG REQUIRED)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
|
target_link_libraries(${PROJECT_NAME} libevent::core libevent::extra libevent::pthreads)
|
||||||
|
|
||||||
# effolkronium/random
|
# effolkronium/random
|
||||||
find_package(effolkronium_random CONFIG REQUIRED)
|
find_package(effolkronium_random CONFIG REQUIRED)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE effolkronium_random)
|
target_link_libraries(${PROJECT_NAME} effolkronium_random)
|
||||||
|
|
||||||
#
|
#
|
||||||
# System-provided dependencies
|
# System-provided dependencies
|
||||||
|
@ -45,9 +41,9 @@ target_link_libraries(${PROJECT_NAME} PRIVATE effolkronium_random)
|
||||||
# Pthreads
|
# Pthreads
|
||||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
|
target_link_libraries(${PROJECT_NAME} Threads::Threads)
|
||||||
|
|
||||||
# LibBSD
|
# LibBSD
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE bsd)
|
target_link_libraries(${PROJECT_NAME} bsd)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE libpoly libsql libthecore)
|
target_link_libraries(${PROJECT_NAME} libpoly libsql libthecore)
|
||||||
|
|
|
@ -20,15 +20,15 @@ endif()
|
||||||
# Treat char variables as signed, especially useful for ARM builds
|
# Treat char variables as signed, especially useful for ARM builds
|
||||||
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
|
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
|
||||||
|
|
||||||
# Find dependencies
|
# Find and link dependencies
|
||||||
|
|
||||||
#
|
#
|
||||||
# vcpkg dependencies
|
# vcpkg dependencies
|
||||||
#
|
#
|
||||||
|
|
||||||
# MySQL
|
# MariaDB
|
||||||
find_package(unofficial-libmysql REQUIRED)
|
find_package(unofficial-libmariadb REQUIRED)
|
||||||
target_link_libraries(${PROJECT_NAME} unofficial::libmysql::libmysql)
|
target_link_libraries(${PROJECT_NAME} unofficial::libmariadb)
|
||||||
|
|
||||||
# Argon2
|
# Argon2
|
||||||
find_package(unofficial-argon2 CONFIG REQUIRED)
|
find_package(unofficial-argon2 CONFIG REQUIRED)
|
||||||
|
@ -36,11 +36,7 @@ target_link_libraries(${PROJECT_NAME} unofficial::argon2::libargon2)
|
||||||
|
|
||||||
# Crypto++
|
# Crypto++
|
||||||
find_package(cryptopp CONFIG REQUIRED)
|
find_package(cryptopp CONFIG REQUIRED)
|
||||||
target_link_libraries (${PROJECT_NAME} cryptopp::cryptopp)
|
target_link_libraries(${PROJECT_NAME} cryptopp::cryptopp)
|
||||||
|
|
||||||
# Boost
|
|
||||||
find_package(Boost REQUIRED)
|
|
||||||
target_link_libraries (${PROJECT_NAME} Boost::boost)
|
|
||||||
|
|
||||||
# Libevent
|
# Libevent
|
||||||
find_package(Libevent CONFIG REQUIRED)
|
find_package(Libevent CONFIG REQUIRED)
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include "dragon_soul_table.h"
|
#include "dragon_soul_table.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "DragonSoul.h"
|
#include "DragonSoul.h"
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
|
|
||||||
typedef std::vector <std::string> TTokenVector;
|
typedef std::vector <std::string> TTokenVector;
|
||||||
|
|
||||||
|
@ -389,7 +388,7 @@ bool DSManager::ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtract
|
||||||
pDH->SetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX, iCharge);
|
pDH->SetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX, iCharge);
|
||||||
ch->AutoGiveItem(pDH, true);
|
ch->AutoGiveItem(pDH, true);
|
||||||
|
|
||||||
std::string s = boost::lexical_cast <std::string> (iCharge);
|
std::string s = std::to_string(iCharge);
|
||||||
s += "%s";
|
s += "%s";
|
||||||
LogManager::instance().ItemLog(ch, pItem, "DS_HEART_EXTRACT_SUCCESS", s.c_str());
|
LogManager::instance().ItemLog(ch, pItem, "DS_HEART_EXTRACT_SUCCESS", s.c_str());
|
||||||
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Dragon Stone remaining duration has been extracted."));
|
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Dragon Stone remaining duration has been extracted."));
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef IFILEMONITOR_INCLUDED
|
#ifndef IFILEMONITOR_INCLUDED
|
||||||
#define IFILEMONITOR_INCLUDED
|
#define IFILEMONITOR_INCLUDED
|
||||||
|
|
||||||
//#include <boost/function.hpp>
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
enum eFileUpdatedOptions
|
enum eFileUpdatedOptions
|
||||||
|
|
|
@ -1,31 +1,13 @@
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#ifndef DEBUG_ALLOC
|
|
||||||
#include <boost/pool/object_pool.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "affect.h"
|
#include "affect.h"
|
||||||
|
|
||||||
#ifndef DEBUG_ALLOC
|
|
||||||
boost::object_pool<CAffect> affect_pool;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CAffect* CAffect::Acquire()
|
CAffect* CAffect::Acquire()
|
||||||
{
|
{
|
||||||
#ifndef DEBUG_ALLOC
|
|
||||||
return affect_pool.malloc();
|
|
||||||
#else
|
|
||||||
return M2_NEW CAffect;
|
return M2_NEW CAffect;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAffect::Release(CAffect* p)
|
void CAffect::Release(CAffect* p)
|
||||||
{
|
{
|
||||||
#ifndef DEBUG_ALLOC
|
|
||||||
affect_pool.free(p);
|
|
||||||
#else
|
|
||||||
M2_DELETE(p);
|
M2_DELETE(p);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include "item_manager.h"
|
#include "item_manager.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
#include <boost/bind.hpp>
|
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "desc_client.h"
|
#include "desc_client.h"
|
||||||
#include <common/tables.h>
|
#include <common/tables.h>
|
||||||
|
|
|
@ -4244,7 +4244,7 @@ bool CHARACTER::RequestToParty(LPCHARACTER leader)
|
||||||
|
|
||||||
void CHARACTER::DenyToParty(LPCHARACTER member)
|
void CHARACTER::DenyToParty(LPCHARACTER member)
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("DenyToParty {} member {} {}", GetName(), member->GetName(), (void*) get_pointer(member->m_pkPartyRequestEvent));
|
SPDLOG_DEBUG("DenyToParty {} member {} {}", GetName(), member->GetName(), (void*) member->m_pkPartyRequestEvent.get());
|
||||||
|
|
||||||
if (!member->m_pkPartyRequestEvent)
|
if (!member->m_pkPartyRequestEvent)
|
||||||
return;
|
return;
|
||||||
|
@ -4270,7 +4270,7 @@ void CHARACTER::DenyToParty(LPCHARACTER member)
|
||||||
|
|
||||||
void CHARACTER::AcceptToParty(LPCHARACTER member)
|
void CHARACTER::AcceptToParty(LPCHARACTER member)
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("AcceptToParty {} member {} {}", GetName(), member->GetName(), (void*) get_pointer(member->m_pkPartyRequestEvent));
|
SPDLOG_DEBUG("AcceptToParty {} member {} {}", GetName(), member->GetName(), (void*) member->m_pkPartyRequestEvent.get());
|
||||||
|
|
||||||
if (!member->m_pkPartyRequestEvent)
|
if (!member->m_pkPartyRequestEvent)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -160,7 +160,7 @@ void CHARACTER::StartAffectEvent()
|
||||||
char_event_info* info = AllocEventInfo<char_event_info>();
|
char_event_info* info = AllocEventInfo<char_event_info>();
|
||||||
info->ch = this;
|
info->ch = this;
|
||||||
m_pkAffectEvent = event_create(affect_event, info, passes_per_sec);
|
m_pkAffectEvent = event_create(affect_event, info, passes_per_sec);
|
||||||
SPDLOG_DEBUG("StartAffectEvent {} {} {}", GetName(), (void*) this, (void*) get_pointer(m_pkAffectEvent));
|
SPDLOG_DEBUG("StartAffectEvent {} {} {}", GetName(), (void*) this, (void*) m_pkAffectEvent.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHARACTER::ClearAffect(bool bSave)
|
void CHARACTER::ClearAffect(bool bSave)
|
||||||
|
|
|
@ -1420,7 +1420,7 @@ void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
|
||||||
{
|
{
|
||||||
if (m_pkDeadEvent)
|
if (m_pkDeadEvent)
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("DEAD_EVENT_CANCEL: {} {} {}", GetName(), (void*) this, (void*) get_pointer(m_pkDeadEvent));
|
SPDLOG_DEBUG("DEAD_EVENT_CANCEL: {} {} {}", GetName(), (void*) this, (void*) m_pkDeadEvent.get());
|
||||||
event_cancel(&m_pkDeadEvent);
|
event_cancel(&m_pkDeadEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1456,7 +1456,7 @@ void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SPDLOG_DEBUG("DEAD_EVENT_CREATE: {} {} {}", GetName(), (void*) this, (void*) get_pointer(m_pkDeadEvent));
|
SPDLOG_DEBUG("DEAD_EVENT_CREATE: {} {} {}", GetName(), (void*) this, (void*) m_pkDeadEvent.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_pkExchange != NULL)
|
if (m_pkExchange != NULL)
|
||||||
|
|
|
@ -16,10 +16,6 @@
|
||||||
#include "questlua.h"
|
#include "questlua.h"
|
||||||
#include "locale_service.h"
|
#include "locale_service.h"
|
||||||
|
|
||||||
#ifndef __GNUC__
|
|
||||||
#include <boost/bind.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CHARACTER_MANAGER::CHARACTER_MANAGER() :
|
CHARACTER_MANAGER::CHARACTER_MANAGER() :
|
||||||
m_iVIDCount(0),
|
m_iVIDCount(0),
|
||||||
m_pkChrSelectedStone(NULL),
|
m_pkChrSelectedStone(NULL),
|
||||||
|
@ -646,9 +642,7 @@ struct FuncUpdateAndResetChatCounter
|
||||||
void CHARACTER_MANAGER::Update(int iPulse)
|
void CHARACTER_MANAGER::Update(int iPulse)
|
||||||
{
|
{
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#ifdef __GNUC__
|
|
||||||
using namespace __gnu_cxx;
|
using namespace __gnu_cxx;
|
||||||
#endif
|
|
||||||
|
|
||||||
BeginPendingDestroy();
|
BeginPendingDestroy();
|
||||||
|
|
||||||
|
@ -659,11 +653,7 @@ void CHARACTER_MANAGER::Update(int iPulse)
|
||||||
// 컨테이너 복사
|
// 컨테이너 복사
|
||||||
CHARACTER_VECTOR v;
|
CHARACTER_VECTOR v;
|
||||||
v.reserve(m_map_pkPCChr.size());
|
v.reserve(m_map_pkPCChr.size());
|
||||||
#ifdef __GNUC__
|
|
||||||
transform(m_map_pkPCChr.begin(), m_map_pkPCChr.end(), back_inserter(v), select2nd<NAME_MAP::value_type>());
|
transform(m_map_pkPCChr.begin(), m_map_pkPCChr.end(), back_inserter(v), select2nd<NAME_MAP::value_type>());
|
||||||
#else
|
|
||||||
transform(m_map_pkPCChr.begin(), m_map_pkPCChr.end(), back_inserter(v), boost::bind(&NAME_MAP::value_type::second, _1));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (0 == (iPulse % PASSES_PER_SEC(5)))
|
if (0 == (iPulse % PASSES_PER_SEC(5)))
|
||||||
{
|
{
|
||||||
|
@ -686,11 +676,8 @@ void CHARACTER_MANAGER::Update(int iPulse)
|
||||||
{
|
{
|
||||||
CHARACTER_VECTOR v;
|
CHARACTER_VECTOR v;
|
||||||
v.reserve(m_set_pkChrState.size());
|
v.reserve(m_set_pkChrState.size());
|
||||||
#ifdef __GNUC__
|
|
||||||
transform(m_set_pkChrState.begin(), m_set_pkChrState.end(), back_inserter(v), identity<CHARACTER_SET::value_type>());
|
transform(m_set_pkChrState.begin(), m_set_pkChrState.end(), back_inserter(v), identity<CHARACTER_SET::value_type>());
|
||||||
#else
|
|
||||||
v.insert(v.end(), m_set_pkChrState.begin(), m_set_pkChrState.end());
|
|
||||||
#endif
|
|
||||||
for_each(v.begin(), v.end(), bind2nd(mem_fun(&CHARACTER::UpdateStateMachine), iPulse));
|
for_each(v.begin(), v.end(), bind2nd(mem_fun(&CHARACTER::UpdateStateMachine), iPulse));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1029,16 +1016,10 @@ void CHARACTER_MANAGER::FlushPendingDestroy()
|
||||||
CharacterVectorInteractor::CharacterVectorInteractor(const CHARACTER_SET & r)
|
CharacterVectorInteractor::CharacterVectorInteractor(const CHARACTER_SET & r)
|
||||||
{
|
{
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#ifdef __GNUC__
|
|
||||||
using namespace __gnu_cxx;
|
using namespace __gnu_cxx;
|
||||||
#endif
|
|
||||||
|
|
||||||
reserve(r.size());
|
reserve(r.size());
|
||||||
#ifdef __GNUC__
|
|
||||||
transform(r.begin(), r.end(), back_inserter(*this), identity<CHARACTER_SET::value_type>());
|
transform(r.begin(), r.end(), back_inserter(*this), identity<CHARACTER_SET::value_type>());
|
||||||
#else
|
|
||||||
insert(end(), r.begin(), r.end());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (CHARACTER_MANAGER::instance().BeginPendingDestroy())
|
if (CHARACTER_MANAGER::instance().BeginPendingDestroy())
|
||||||
m_bMyBegin = true;
|
m_bMyBegin = true;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "group_text_parse_tree.h"
|
#include "group_text_parse_tree.h"
|
||||||
#include "dragon_soul_table.h"
|
#include "dragon_soul_table.h"
|
||||||
#include "item_manager.h"
|
#include "item_manager.h"
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
const std::string g_astGradeName[] =
|
const std::string g_astGradeName[] =
|
||||||
{
|
{
|
||||||
"grade_normal",
|
"grade_normal",
|
||||||
|
@ -789,7 +789,7 @@ bool DragonSoulTable::GetRefineStrengthValues(BYTE ds_type, BYTE material_type,
|
||||||
stDragonSoulName.c_str(), g_astMaterialName[material_type].c_str());
|
stDragonSoulName.c_str(), g_astMaterialName[material_type].c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::string stStrengthIdx = boost::lexical_cast <std::string> ((int)strength_idx);
|
std::string stStrengthIdx = std::to_string((int)strength_idx);
|
||||||
|
|
||||||
if (!m_pRefineStrengthTableNode->GetGroupValue(stDragonSoulName, g_astMaterialName[material_type], stStrengthIdx, prob))
|
if (!m_pRefineStrengthTableNode->GetGroupValue(stDragonSoulName, g_astMaterialName[material_type], stStrengthIdx, prob))
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,7 @@ LPEVENT event_create_ex(TEVENTFUNC func, event_info_data* info, int when)
|
||||||
#ifdef M2_USE_POOL
|
#ifdef M2_USE_POOL
|
||||||
new_event = event_pool.Construct();
|
new_event = event_pool.Construct();
|
||||||
#else
|
#else
|
||||||
new_event = M2_NEW event;
|
new_event = std::make_shared<event>();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
assert(NULL != new_event);
|
assert(NULL != new_event);
|
||||||
|
@ -136,7 +136,7 @@ int event_process(int pulse)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
new_time = (the_event->func) (get_pointer(the_event), processing_time);
|
new_time = (the_event->func) (the_event, processing_time);
|
||||||
|
|
||||||
if (new_time <= 0 || the_event->is_force_to_end)
|
if (new_time <= 0 || the_event->is_force_to_end)
|
||||||
{
|
{
|
||||||
|
@ -201,17 +201,3 @@ int event_count()
|
||||||
{
|
{
|
||||||
return cxx_q.Size();
|
return cxx_q.Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void intrusive_ptr_add_ref(EVENT* p) {
|
|
||||||
++(p->ref_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
void intrusive_ptr_release(EVENT* p) {
|
|
||||||
if ( --(p->ref_count) == 0 ) {
|
|
||||||
#ifdef M2_USE_POOL
|
|
||||||
event_pool.Destroy(p);
|
|
||||||
#else
|
|
||||||
M2_DELETE(p);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,10 +4,9 @@
|
||||||
*
|
*
|
||||||
* Author: 김한주 (aka. 비엽, Cronan), 송영진 (aka. myevan, 빗자루)
|
* Author: 김한주 (aka. 비엽, Cronan), 송영진 (aka. myevan, 빗자루)
|
||||||
*/
|
*/
|
||||||
#ifndef __INC_LIBTHECORE_EVENT_H__
|
#pragma once
|
||||||
#define __INC_LIBTHECORE_EVENT_H__
|
|
||||||
|
|
||||||
#include <boost/intrusive_ptr.hpp>
|
#include <memory>
|
||||||
|
|
||||||
#ifdef M2_USE_POOL
|
#ifdef M2_USE_POOL
|
||||||
#include "pool.h"
|
#include "pool.h"
|
||||||
|
@ -34,7 +33,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct event EVENT;
|
typedef struct event EVENT;
|
||||||
typedef boost::intrusive_ptr<EVENT> LPEVENT;
|
typedef std::shared_ptr<EVENT> LPEVENT;
|
||||||
typedef int (*TEVENTFUNC) (LPEVENT event, int processing_time);
|
typedef int (*TEVENTFUNC) (LPEVENT event, int processing_time);
|
||||||
|
|
||||||
#define EVENTFUNC(name) int (name) (LPEVENT event, int processing_time)
|
#define EVENTFUNC(name) int (name) (LPEVENT event, int processing_time)
|
||||||
|
@ -63,9 +62,6 @@ struct event
|
||||||
size_t ref_count;
|
size_t ref_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void intrusive_ptr_add_ref(EVENT* p);
|
|
||||||
extern void intrusive_ptr_release(EVENT* p);
|
|
||||||
|
|
||||||
template<class T> // T should be a subclass of event_info_data
|
template<class T> // T should be a subclass of event_info_data
|
||||||
T* AllocEventInfo() {
|
T* AllocEventInfo() {
|
||||||
#ifdef M2_USE_POOL
|
#ifdef M2_USE_POOL
|
||||||
|
@ -89,5 +85,3 @@ extern void event_set_verbose(int level);
|
||||||
|
|
||||||
extern event_info_data* FindEventInfo(DWORD dwID);
|
extern event_info_data* FindEventInfo(DWORD dwID);
|
||||||
extern event_info_data* event_info(LPEVENT event);
|
extern event_info_data* event_info(LPEVENT event);
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
#ifndef _FIFO_ALLOCATOR_H_
|
|
||||||
#define _FIFO_ALLOCATOR_H_
|
|
||||||
|
|
||||||
#include <deque>
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#include <tr1/unordered_map>
|
|
||||||
#define std std::tr1
|
|
||||||
#else
|
|
||||||
#include <unordered_map>
|
|
||||||
#define std boost
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Allocator implementation detail with simple FIFO grow-only pool.
|
|
||||||
// It relies on default CRT malloc/free.
|
|
||||||
class FifoAllocator {
|
|
||||||
public:
|
|
||||||
FifoAllocator() {}
|
|
||||||
~FifoAllocator() {}
|
|
||||||
|
|
||||||
void SetUp() {}
|
|
||||||
void TearDown() {
|
|
||||||
CleanUp(); // deallocate pooled blocks
|
|
||||||
}
|
|
||||||
|
|
||||||
void* Alloc(size_t size) {
|
|
||||||
void* p = NULL;
|
|
||||||
PoolType& pool = pool_map_[size];
|
|
||||||
if (pool.size() < kWatermark) {
|
|
||||||
p = ::malloc(size);
|
|
||||||
} else {
|
|
||||||
p = pool.front();
|
|
||||||
pool.pop_front();
|
|
||||||
}
|
|
||||||
if (p != NULL) {
|
|
||||||
alloc_map_[p] = size;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
void Free(void* p) {
|
|
||||||
if (p == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AllocMapType::iterator it = alloc_map_.find(p);
|
|
||||||
if (it == alloc_map_.end()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
size_t size = it->second;
|
|
||||||
alloc_map_.erase(it);
|
|
||||||
PoolMapType::iterator it2 = pool_map_.find(size);
|
|
||||||
if (it2 == pool_map_.end()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
PoolType& pool = it2->second;
|
|
||||||
pool.push_back(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void CleanUp() {
|
|
||||||
PoolMapType::iterator it = pool_map_.begin(), end = pool_map_.end();
|
|
||||||
for ( ; it != end; ++it) {
|
|
||||||
PoolType& pool = it->second;
|
|
||||||
PoolType::iterator it2 = pool.begin(), end2 = pool.end();
|
|
||||||
for ( ; it2 != end2; ++it2) {
|
|
||||||
::free(*it2);
|
|
||||||
}
|
|
||||||
pool.clear();
|
|
||||||
}
|
|
||||||
pool_map_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef std::deque<void*> PoolType;
|
|
||||||
typedef std::unordered_map<size_t, PoolType> PoolMapType;
|
|
||||||
typedef std::unordered_map<void*, size_t> AllocMapType;
|
|
||||||
|
|
||||||
static const size_t kWatermark = 4; // FIFO enforcement level
|
|
||||||
|
|
||||||
PoolMapType pool_map_;
|
|
||||||
AllocMapType alloc_map_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _FIFO_ALLOCATOR_H_
|
|
|
@ -247,7 +247,7 @@ EVENTFUNC(horse_stamina_consume_event)
|
||||||
}
|
}
|
||||||
|
|
||||||
hr->CheckHorseHealthDropTime();
|
hr->CheckHorseHealthDropTime();
|
||||||
SPDLOG_DEBUG("HORSE STAMINA - {}", (void*) get_pointer(event));
|
SPDLOG_DEBUG("HORSE STAMINA - {}", (void*) event.get());
|
||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ EVENTFUNC(horse_stamina_regen_event)
|
||||||
}
|
}
|
||||||
|
|
||||||
hr->CheckHorseHealthDropTime();
|
hr->CheckHorseHealthDropTime();
|
||||||
SPDLOG_DEBUG("HORSE STAMINA + {}", (void*) get_pointer(event));
|
SPDLOG_DEBUG("HORSE STAMINA + {}", (void*) event.get());
|
||||||
|
|
||||||
|
|
||||||
return delta;
|
return delta;
|
||||||
|
@ -292,7 +292,7 @@ void CHorseRider::StartStaminaConsumeEvent()
|
||||||
if (GetHorseHealth() <= 0)
|
if (GetHorseHealth() <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CANCEL {}", (void*) get_pointer(m_eventStaminaRegen));
|
SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CANCEL {}", (void*) m_eventStaminaRegen.get());
|
||||||
event_cancel(&m_eventStaminaRegen);
|
event_cancel(&m_eventStaminaRegen);
|
||||||
|
|
||||||
if (m_eventStaminaConsume)
|
if (m_eventStaminaConsume)
|
||||||
|
@ -302,7 +302,7 @@ void CHorseRider::StartStaminaConsumeEvent()
|
||||||
|
|
||||||
info->hr = this;
|
info->hr = this;
|
||||||
m_eventStaminaConsume = event_create(horse_stamina_consume_event, info, PASSES_PER_SEC(HORSE_STAMINA_CONSUME_INTERVAL));
|
m_eventStaminaConsume = event_create(horse_stamina_consume_event, info, PASSES_PER_SEC(HORSE_STAMINA_CONSUME_INTERVAL));
|
||||||
SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CREATE {}", (void*) get_pointer(m_eventStaminaConsume));
|
SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CREATE {}", (void*) m_eventStaminaConsume.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHorseRider::StartStaminaRegenEvent()
|
void CHorseRider::StartStaminaRegenEvent()
|
||||||
|
@ -313,7 +313,7 @@ void CHorseRider::StartStaminaRegenEvent()
|
||||||
if (GetHorseHealth() <= 0)
|
if (GetHorseHealth() <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CANCEL {}", (void*) get_pointer(m_eventStaminaConsume));
|
SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CANCEL {}", (void*) m_eventStaminaConsume.get());
|
||||||
event_cancel(&m_eventStaminaConsume);
|
event_cancel(&m_eventStaminaConsume);
|
||||||
|
|
||||||
if (m_eventStaminaRegen)
|
if (m_eventStaminaRegen)
|
||||||
|
@ -323,7 +323,7 @@ void CHorseRider::StartStaminaRegenEvent()
|
||||||
|
|
||||||
info->hr = this;
|
info->hr = this;
|
||||||
m_eventStaminaRegen = event_create(horse_stamina_regen_event, info, PASSES_PER_SEC(HORSE_STAMINA_REGEN_INTERVAL));
|
m_eventStaminaRegen = event_create(horse_stamina_regen_event, info, PASSES_PER_SEC(HORSE_STAMINA_REGEN_INTERVAL));
|
||||||
SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CREATE {}", (void*) get_pointer(m_eventStaminaRegen));
|
SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CREATE {}", (void*) m_eventStaminaRegen.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Health
|
// Health
|
||||||
|
@ -358,7 +358,7 @@ void CHorseRider::UpdateHorseHealth(int iHealth, bool bSend)
|
||||||
|
|
||||||
void CHorseRider::HorseDie()
|
void CHorseRider::HorseDie()
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("HORSE DIE {} {}", (void*) get_pointer(m_eventStaminaRegen), (void*) get_pointer(m_eventStaminaConsume));
|
SPDLOG_DEBUG("HORSE DIE {} {}", (void*) m_eventStaminaRegen.get(), (void*) m_eventStaminaConsume.get());
|
||||||
UpdateHorseStamina(-m_Horse.sStamina);
|
UpdateHorseStamina(-m_Horse.sStamina);
|
||||||
event_cancel(&m_eventStaminaRegen);
|
event_cancel(&m_eventStaminaRegen);
|
||||||
event_cancel(&m_eventStaminaConsume);
|
event_cancel(&m_eventStaminaConsume);
|
||||||
|
|
|
@ -1676,7 +1676,7 @@ namespace quest
|
||||||
|
|
||||||
void CQuestManager::AddServerTimer(const std::string& name, DWORD arg, LPEVENT event)
|
void CQuestManager::AddServerTimer(const std::string& name, DWORD arg, LPEVENT event)
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("XXX AddServerTimer {} {} {}", name, arg, (void*) get_pointer(event));
|
SPDLOG_DEBUG("XXX AddServerTimer {} {} {}", name, arg, (void*) event.get());
|
||||||
if (m_mapServerTimer.find(make_pair(name, arg)) != m_mapServerTimer.end())
|
if (m_mapServerTimer.find(make_pair(name, arg)) != m_mapServerTimer.end())
|
||||||
{
|
{
|
||||||
SPDLOG_ERROR("already registered server timer name:{} arg:{}", name, arg);
|
SPDLOG_ERROR("already registered server timer name:{} arg:{}", name, arg);
|
||||||
|
|
|
@ -165,7 +165,7 @@ namespace quest
|
||||||
{
|
{
|
||||||
RemoveTimer(name);
|
RemoveTimer(name);
|
||||||
m_TimerMap.insert(make_pair(name, pEvent));
|
m_TimerMap.insert(make_pair(name, pEvent));
|
||||||
SPDLOG_DEBUG("QUEST add timer {} {}", (void*) get_pointer(pEvent), m_TimerMap.size());
|
SPDLOG_DEBUG("QUEST add timer {} {}", (void*) pEvent.get(), m_TimerMap.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void PC::RemoveTimerNotCancel(const string & name)
|
void PC::RemoveTimerNotCancel(const string & name)
|
||||||
|
@ -174,7 +174,7 @@ namespace quest
|
||||||
|
|
||||||
if (it != m_TimerMap.end())
|
if (it != m_TimerMap.end())
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("QUEST remove with no cancel {}", (void*) get_pointer(it->second));
|
SPDLOG_DEBUG("QUEST remove with no cancel {}", (void*) it->second.get());
|
||||||
m_TimerMap.erase(it);
|
m_TimerMap.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ namespace quest
|
||||||
|
|
||||||
if (it != m_TimerMap.end())
|
if (it != m_TimerMap.end())
|
||||||
{
|
{
|
||||||
SPDLOG_DEBUG("QUEST remove timer {}", (void*) get_pointer(it->second));
|
SPDLOG_DEBUG("QUEST remove timer {}", (void*) it->second.get());
|
||||||
CancelTimerEvent(&it->second);
|
CancelTimerEvent(&it->second);
|
||||||
m_TimerMap.erase(it);
|
m_TimerMap.erase(it);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,29 +2,23 @@
|
||||||
#include "../../libgame/include/grid.h"
|
#include "../../libgame/include/grid.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "config.h"
|
|
||||||
#include "shop.h"
|
#include "shop.h"
|
||||||
#include "desc.h"
|
#include "desc.h"
|
||||||
#include "desc_manager.h"
|
|
||||||
#include "char.h"
|
#include "char.h"
|
||||||
#include "char_manager.h"
|
#include "char_manager.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "item_manager.h"
|
#include "item_manager.h"
|
||||||
#include "buffer_manager.h"
|
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "log.h"
|
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
#include "questmanager.h"
|
#include "questmanager.h"
|
||||||
#include "monarch.h"
|
#include "monarch.h"
|
||||||
#include "mob_manager.h"
|
#include "mob_manager.h"
|
||||||
#include "locale_service.h"
|
#include "locale_service.h"
|
||||||
#include "desc_client.h"
|
|
||||||
#include "shop_manager.h"
|
#include "shop_manager.h"
|
||||||
#include "group_text_parse_tree.h"
|
#include "group_text_parse_tree.h"
|
||||||
#include "shopEx.h"
|
#include "shopEx.h"
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
|
||||||
#include "shop_manager.h"
|
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
CShopManager::CShopManager()
|
CShopManager::CShopManager()
|
||||||
{
|
{
|
||||||
|
@ -388,11 +382,11 @@ bool ConvertToShopItemTable(IN CGroupNode* pNode, OUT TShopTableEx& shopTable)
|
||||||
stCoinType = "Gold";
|
stCoinType = "Gold";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (boost::iequals(stCoinType, "Gold"))
|
if (iequals(stCoinType, "Gold"))
|
||||||
{
|
{
|
||||||
shopTable.coinType = SHOP_COIN_TYPE_GOLD;
|
shopTable.coinType = SHOP_COIN_TYPE_GOLD;
|
||||||
}
|
}
|
||||||
else if (boost::iequals(stCoinType, "SecondaryCoin"))
|
else if (iequals(stCoinType, "SecondaryCoin"))
|
||||||
{
|
{
|
||||||
shopTable.coinType = SHOP_COIN_TYPE_SECONDARY_COIN;
|
shopTable.coinType = SHOP_COIN_TYPE_SECONDARY_COIN;
|
||||||
}
|
}
|
||||||
|
@ -442,11 +436,11 @@ bool ConvertToShopItemTable(IN CGroupNode* pNode, OUT TShopTableEx& shopTable)
|
||||||
stSort = "None";
|
stSort = "None";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (boost::iequals(stSort, "Asc"))
|
if (iequals(stSort, "Asc"))
|
||||||
{
|
{
|
||||||
std::sort(shopItems.begin(), shopItems.end(), CompareShopItemName);
|
std::sort(shopItems.begin(), shopItems.end(), CompareShopItemName);
|
||||||
}
|
}
|
||||||
else if(boost::iequals(stSort, "Desc"))
|
else if (iequals(stSort, "Desc"))
|
||||||
{
|
{
|
||||||
std::sort(shopItems.rbegin(), shopItems.rend(), CompareShopItemName);
|
std::sort(shopItems.rbegin(), shopItems.rend(), CompareShopItemName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,3 +230,12 @@ bool WildCaseCmp(const char *w, const char *s)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ichar_equals(char a, char b)
|
||||||
|
{
|
||||||
|
return std::tolower(static_cast<unsigned char>(a)) == std::tolower(static_cast<unsigned char>(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool iequals(const std::string& a, const std::string& b)
|
||||||
|
{
|
||||||
|
return std::equal(a.begin(), a.end(), b.begin(), b.end(), ichar_equals);
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#ifndef __INC_METIN_II_UTILS_H__
|
#include <cmath>
|
||||||
#define __INC_METIN_II_UTILS_H__
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#define IS_SET(flag, bit) ((flag) & (bit))
|
#define IS_SET(flag, bit) ((flag) & (bit))
|
||||||
#define SET_BIT(var, bit) ((var) |= (bit))
|
#define SET_BIT(var, bit) ((var) |= (bit))
|
||||||
|
@ -64,5 +62,5 @@ extern int parse_time_str(const char* str);
|
||||||
|
|
||||||
extern bool WildCaseCmp(const char *w, const char *s);
|
extern bool WildCaseCmp(const char *w, const char *s);
|
||||||
|
|
||||||
#endif /* __INC_METIN_II_UTILS_H__ */
|
extern bool ichar_equals(char a, char b);
|
||||||
|
extern bool iequals(const std::string& a, const std::string& b);
|
||||||
|
|
|
@ -68,7 +68,7 @@ namespace marriage
|
||||||
{
|
{
|
||||||
if (m_pEndEvent)
|
if (m_pEndEvent)
|
||||||
{
|
{
|
||||||
SPDLOG_ERROR("WeddingMap::SetEnded - ALREADY EndEvent(m_pEndEvent={})", (void*) get_pointer(m_pEndEvent));
|
SPDLOG_ERROR("WeddingMap::SetEnded - ALREADY EndEvent(m_pEndEvent={})", (void*) m_pEndEvent.get());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
project(libgame CXX)
|
project(libgame CXX)
|
||||||
|
|
||||||
|
@ -11,12 +11,11 @@ file(GLOB SOURCES
|
||||||
# Include header files
|
# Include header files
|
||||||
include_directories("include")
|
include_directories("include")
|
||||||
|
|
||||||
find_package(Boost REQUIRED)
|
|
||||||
|
|
||||||
# Create shared library
|
# Create shared library
|
||||||
add_library(${PROJECT_NAME} STATIC ${SOURCES})
|
add_library(${PROJECT_NAME} STATIC ${SOURCES})
|
||||||
|
|
||||||
if (Boost_FOUND)
|
# Find and link dependencies
|
||||||
include_directories(${Boost_INCLUDE_DIRS})
|
|
||||||
target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES})
|
# spdlog
|
||||||
endif (Boost_FOUND)
|
find_package(spdlog CONFIG REQUIRED)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog::spdlog)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
project(liblua CXX)
|
project(liblua CXX)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
project(libpoly CXX)
|
project(libpoly CXX)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
project(libsql CXX)
|
project(libsql CXX)
|
||||||
|
|
||||||
|
@ -14,10 +14,12 @@ include_directories("include")
|
||||||
# Create shared library
|
# Create shared library
|
||||||
add_library(${PROJECT_NAME} STATIC ${SOURCES})
|
add_library(${PROJECT_NAME} STATIC ${SOURCES})
|
||||||
|
|
||||||
# Find dependencies
|
# Find and link dependencies
|
||||||
find_package(unofficial-libmysql REQUIRED)
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE unofficial::libmysql::libmysql)
|
|
||||||
|
|
||||||
find_package(Boost REQUIRED)
|
# MariaDB
|
||||||
include_directories(${Boost_INCLUDE_DIRS})
|
find_package(unofficial-libmariadb REQUIRED)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ${Boost_LIBRARIES})
|
target_link_libraries(${PROJECT_NAME} PUBLIC unofficial::libmariadb)
|
||||||
|
|
||||||
|
# spdlog
|
||||||
|
find_package(spdlog CONFIG REQUIRED)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog::spdlog)
|
||||||
|
|
|
@ -143,7 +143,7 @@ bool CAsyncSQL::Connect()
|
||||||
if (0 != mysql_options(&m_hDB, MYSQL_OPT_RECONNECT, &reconnect))
|
if (0 != mysql_options(&m_hDB, MYSQL_OPT_RECONNECT, &reconnect))
|
||||||
SPDLOG_ERROR("Setting MYSQL_OPT_RECONNECT via mysql_options failed: {}", mysql_error(&m_hDB));
|
SPDLOG_ERROR("Setting MYSQL_OPT_RECONNECT via mysql_options failed: {}", mysql_error(&m_hDB));
|
||||||
|
|
||||||
SPDLOG_INFO("AsyncSQL: connected to {} (reconnect {})", m_stHost, m_hDB.reconnect);
|
SPDLOG_INFO("AsyncSQL: connected to {}", m_stHost);
|
||||||
|
|
||||||
// db cache는 common db의 LOCALE 테이블에서 locale을 알아오고, 이후 character set을 수정한다.
|
// db cache는 common db의 LOCALE 테이블에서 locale을 알아오고, 이후 character set을 수정한다.
|
||||||
// 따라서 최초 Connection을 맺을 때에는 locale을 모르기 때문에 character set을 정할 수가 없음에도 불구하고,
|
// 따라서 최초 Connection을 맺을 때에는 locale을 모르기 때문에 character set을 정할 수가 없음에도 불구하고,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
project(libthecore CXX)
|
project(libthecore CXX)
|
||||||
|
|
||||||
|
@ -14,14 +14,7 @@ include_directories("include")
|
||||||
# Create shared library
|
# Create shared library
|
||||||
add_library(${PROJECT_NAME} STATIC ${SOURCES})
|
add_library(${PROJECT_NAME} STATIC ${SOURCES})
|
||||||
|
|
||||||
#
|
# Find and link dependencies
|
||||||
# vcpkg dependencies
|
|
||||||
#
|
|
||||||
|
|
||||||
# Boost
|
|
||||||
find_package(Boost REQUIRED)
|
|
||||||
include_directories(${Boost_INCLUDE_DIRS})
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ${Boost_LIBRARIES})
|
|
||||||
|
|
||||||
# fmt
|
# fmt
|
||||||
find_package(fmt CONFIG REQUIRED)
|
find_package(fmt CONFIG REQUIRED)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
|
|
||||||
project(quest CXX)
|
project(quest CXX)
|
||||||
|
|
||||||
|
@ -7,19 +7,13 @@ file(GLOB_RECURSE sources
|
||||||
src/*.c
|
src/*.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Add the src directory to the include path
|
||||||
include_directories(src)
|
include_directories(src)
|
||||||
|
|
||||||
# Find dependencies
|
|
||||||
find_package(Boost REQUIRED)
|
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${sources})
|
add_executable(${PROJECT_NAME} ${sources})
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qc")
|
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qc")
|
||||||
|
|
||||||
# Link dependencies if found
|
# Find and link dependencies
|
||||||
if (Boost_FOUND)
|
|
||||||
include_directories(${Boost_INCLUDE_DIRS})
|
|
||||||
target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES})
|
|
||||||
endif (Boost_FOUND)
|
|
||||||
|
|
||||||
|
# liblua
|
||||||
target_link_libraries(${PROJECT_NAME} liblua)
|
target_link_libraries(${PROJECT_NAME} liblua)
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC . ../liblua)
|
|
|
@ -20,18 +20,9 @@ extern "C" {
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#ifndef __WIN32__
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#else
|
|
||||||
#include <boost/typeof/typeof.hpp>
|
|
||||||
#define typeof(t) BOOST_TYPEOF(t)
|
|
||||||
#include <direct.h>
|
|
||||||
#define mkdir(path, mode) _mkdir(path)
|
|
||||||
#endif
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <errno.h>
|
#include <cerrno>
|
||||||
|
|
||||||
#include "crc32.h"
|
#include "crc32.h"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue