CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
1086 lines
35 KiB
C++
1086 lines
35 KiB
C++
#include "StdAfx.h"
|
|
#include ".\gameserverex.h"
|
|
#include <ServerSession.h>
|
|
#include "FileParser.h"
|
|
|
|
|
|
#include <ServerGlobal.h>
|
|
|
|
//custom
|
|
#include "ServerOptionParser.h"
|
|
#include "ObjectFactory.h"
|
|
#include "AbilityFactory.h"
|
|
#include "SummonManager.h"
|
|
#include "StatisticsManager.h"
|
|
#include "GameZoneManager.h"
|
|
#include "UnitGroupManager.h"
|
|
#include "QuestManager_Concrete.h"
|
|
#include "DropManager.h"
|
|
#include "PacketHandler/PacketHandler.h"
|
|
#include "ResrcManager.h"
|
|
#include "TradeManager.h"
|
|
#include "GMCmdManager.h"
|
|
#include "SunEventInfoParser.h"
|
|
#include "PeakTimeEvent.h"
|
|
#include "GameGuildManager.h"
|
|
#include "QuestInfoManagerEx.h"
|
|
#include "RatioManager.h"
|
|
#include "FunctionalRestrictManager.h"
|
|
#include "GameShopManager.h"
|
|
#include "PerfCheck.h"
|
|
#include "RewardManager.h"
|
|
#include <ItemTypeList.h>
|
|
#include <DropRatioInfoList.h>
|
|
#include <MovementChecker.h>
|
|
#include <ServerOptionParserEx.h>
|
|
#include <ServerBuildVersion.h>
|
|
|
|
#include "GameParty/NewGamePartyManager.h"
|
|
#include "GameDominationManager.h"
|
|
#include ".\FriendInvitation\GFriendInvitationController.h"
|
|
#ifdef _NA_0_20110308_SKILL_COOL_TIME_STORAGE
|
|
#include "./SkillSystem/SkillCoolTimeAccessor.h"
|
|
#endif
|
|
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
#include "GameShop/GameShop.Manager.h"
|
|
#endif
|
|
#ifdef _NA_003027_20111013_HONOR_SYSTEM
|
|
#include "HonorSystem/HonorSystem.h"
|
|
#endif //_NA_003027_20111013_HONOR_SYSTEM
|
|
#include "VendorManager.h"
|
|
#include <ExtraNPCManager.h>
|
|
|
|
#ifdef _NA_007992_20150127_EVENT_MONSTER_INVASION
|
|
#include "MonsterInvasionEvent.h"
|
|
#endif //_NA_007992_20150127_EVENT_MONSTER_INVASION
|
|
|
|
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
|
|
#include "SunRanking/SunRankingGradeManager.h"
|
|
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
|
|
|
|
#ifdef _DEBUG
|
|
#pragma comment(lib, "../../lib/"VC_DIR_REDIRECT"/tinyxml_d.lib")
|
|
#else
|
|
#pragma comment(lib, "../../lib/"VC_DIR_REDIRECT"/tinyxml.lib")
|
|
#endif //
|
|
|
|
GameServerEx * g_pGameServer = NULL;
|
|
|
|
NetworkObject * GameServerEx::DoAllocServerSession()
|
|
{
|
|
return (NetworkObject *)g_pGameServer->AllocServerSession(TEMP_SERVER);
|
|
}
|
|
VOID GameServerEx::DoFreeServerSession( NetworkObject * pNetObject )
|
|
{
|
|
g_pGameServer->FreeServerSession((ServerSession*)pNetObject);
|
|
}
|
|
|
|
BOOL GameServerEx::SendToServer( eSERVER_TYPE type, MSG_BASE * pMsg, WORD wSize )
|
|
{
|
|
if( !m_pSession[type] ) return FALSE;
|
|
return m_pSession[type]->Send( (BYTE*)pMsg, wSize );
|
|
}
|
|
|
|
BOOL GameServerEx::IsConnected( eSERVER_TYPE type )
|
|
{
|
|
if( !m_pSession[type] ) return FALSE;
|
|
|
|
return m_pSession[type]->IsConnected();
|
|
}
|
|
|
|
VOID GameServerEx::SetServerAddr( eSERVER_TYPE type, char *pszIP, WORD wPort )
|
|
{
|
|
if( !m_pSession[type] ) return ;
|
|
m_pSession[type]->SetAddr( pszIP, wPort );
|
|
}
|
|
|
|
ServerSession * GameServerEx::GetSession( eSERVER_TYPE type )
|
|
{
|
|
return m_pSession[type];
|
|
}
|
|
BOOL GameServerEx::ConnectTo( eSERVER_TYPE type )
|
|
{
|
|
#ifndef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
|
|
if( !m_pSession[type] ) return FALSE;
|
|
|
|
if( m_pSession[type]->IsConnecting() || m_pSession[type]->IsConnected() )
|
|
{
|
|
ASSERT( !"Already connecting or connected" );
|
|
return FALSE;
|
|
}
|
|
|
|
Connect(m_pSession[type]);
|
|
|
|
return TRUE;
|
|
|
|
#else //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
|
|
ServerSession* pSession = m_pSession[type];
|
|
if( !pSession )
|
|
return FALSE;
|
|
|
|
if( ! IsServerInfoFromFile() )
|
|
{
|
|
if( (MASTER_SERVER != type)
|
|
&& (GetPhaseStatus() != PHASE_SERVICE) )
|
|
return FALSE;
|
|
}
|
|
|
|
if( !( pSession->IsConnecting() || pSession->IsConnected() ) )
|
|
{
|
|
if( (MASTER_SERVER != type)
|
|
&& (! IsServerInfoFromFile() )
|
|
&& (GetPhaseStatus() != PHASE_SERVICE) )
|
|
return FALSE;
|
|
|
|
Connect( pSession );
|
|
return TRUE;
|
|
}
|
|
|
|
ASSERT( !"Already connecting or connected" );
|
|
return FALSE;
|
|
|
|
#endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
}
|
|
|
|
ServerSession * GameServerEx::AllocServerSession( eSERVER_TYPE type )
|
|
{
|
|
ServerSession* pServerSession = NULL;
|
|
if( TEMP_SERVER == type )
|
|
{
|
|
pServerSession = TempServerSession::ALLOC();
|
|
pServerSession->Init( this );
|
|
return pServerSession;
|
|
}
|
|
|
|
if( m_pSession[type] == NULL )
|
|
{
|
|
switch( type )
|
|
{
|
|
#if !defined(_NA002635_GP_DP_PROTOCOL_UINIFICATION)
|
|
case PORTAL_SERVER: pServerSession = m_pSession[type] = PortalServerSession::ALLOC(); break;
|
|
#endif
|
|
#if !defined(_NA002635_GZ_DZ_PROTOCOL_UINIFICATION)
|
|
case GUILD_SERVER: pServerSession = m_pSession[type] = GuildServerSession::ALLOC(); break;
|
|
#endif
|
|
case AGENT_SERVER: pServerSession = m_pSession[type] = AgentServerSession::ALLOC(); break;
|
|
case MASTER_SERVER: pServerSession = m_pSession[type] = MasterServerSession::ALLOC(); break;
|
|
case GAME_DBPROXY:
|
|
pServerSession = m_pSession[type] = GameDBProxySession::ALLOC();
|
|
#ifdef _NA002635_GZ_DZ_PROTOCOL_UINIFICATION
|
|
m_pSession[GUILD_SERVER] = pServerSession;
|
|
#endif
|
|
break;
|
|
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
case SHOP_SERVER: pServerSession = m_pSession[type] = ShopServerSession::ALLOC(); break;
|
|
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
|
|
default: { ASSERT(!"Not Existed ServerType"); return NULL; }
|
|
}
|
|
|
|
// dispatch
|
|
if( pServerSession )
|
|
{
|
|
pServerSession->Init( this );
|
|
return pServerSession;
|
|
}
|
|
}
|
|
|
|
// <WARNING!>
|
|
// error handling
|
|
//
|
|
// upperbound?? ??????? ??? ?????? ?????????
|
|
// ??? m_pSession[type] == NULL ??????? ?????? ?????? ?????? ?????.
|
|
// ????? ???? ??? ??? ???? ??????? ????? ????? ?? ?????.
|
|
// ????? ?????? ????? ???? ??? ????? ???? ???? ????? ??????
|
|
// ????? ?????. - ????? ??? ???????? ???? ???? ????.
|
|
if( (DWORD)MAX_SERVER > (DWORD)type )
|
|
{
|
|
TCHAR* pSessionName = GetServerType2String(type);
|
|
SUNLOG( eCRITICAL_LOG, _T("[%16s] Connect session allocation failed."), pSessionName );
|
|
}
|
|
else
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, _T("Unknown server type, cannot allocate session.") );
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void GameServerEx::FreeServerSession( ServerSession * pSession )
|
|
{
|
|
pSession->Release();
|
|
eSERVER_TYPE type = pSession->GetServerType();
|
|
switch( type )
|
|
{
|
|
#if !defined(_NA002635_GZ_DZ_PROTOCOL_UINIFICATION)
|
|
case GUILD_SERVER:
|
|
GuildServerSession::FREE( (GuildServerSession *)pSession ); m_pSession[type] = NULL; break;
|
|
#endif
|
|
#if !defined(_NA002635_GP_DP_PROTOCOL_UINIFICATION)
|
|
case PORTAL_SERVER:
|
|
PortalServerSession::FREE( (PortalServerSession *)pSession ); m_pSession[type] = NULL; break;
|
|
#endif
|
|
case TEMP_SERVER:
|
|
TempServerSession::FREE( (TempServerSession *)pSession ); break;
|
|
case MASTER_SERVER:
|
|
MasterServerSession::FREE( (MasterServerSession *)pSession ); m_pSession[type] = NULL; break;
|
|
case AGENT_SERVER:
|
|
AgentServerSession::FREE( (AgentServerSession *)pSession ); m_pSession[type] = NULL; break;
|
|
case GAME_DBPROXY:
|
|
GameDBProxySession::FREE( (GameDBProxySession *)pSession );
|
|
m_pSession[type] = NULL;
|
|
#ifdef _NA002635_GZ_DZ_PROTOCOL_UINIFICATION
|
|
m_pSession[GUILD_SERVER] = NULL;
|
|
#endif
|
|
break;
|
|
|
|
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
case SHOP_SERVER:
|
|
ShopServerSession::FREE( (ShopServerSession *)pSession ); m_pSession[type] = NULL; break;
|
|
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
|
|
default:
|
|
{
|
|
ASSERT( !"Unknown session type, cannot free session." );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
GameServerEx::GameServerEx()
|
|
: m_bConnectWorldServer(FALSE)
|
|
, m_hDll3DTerrain(NULL)
|
|
, battle_ground_log_(NULL) //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#ifdef _NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
, mondschein_log_ (NULL)
|
|
#endif //_NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
, sonnenschein_log_ (NULL)
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
#ifdef _NA_008706_20160229_TEXTLOG_PK
|
|
, battle_monitor_log_ (NULL)
|
|
#endif //_NA_008706_20160229_TEXTLOG_PK
|
|
{
|
|
ZeroMemory(m_pSession, sizeof(ServerSession *)*MAX_SERVER);
|
|
|
|
SetPhaseStatus( PHASE_UNKNOWN );
|
|
|
|
m_bPVPMode = 0;
|
|
}
|
|
|
|
GameServerEx::~GameServerEx()
|
|
{
|
|
for (int i = 0; i < _countof(m_pSession); ++i)
|
|
{
|
|
ServerSession* server_session = m_pSession[i];
|
|
if (server_session != NULL)
|
|
{
|
|
FreeServerSession(server_session);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
BOOL GameServerEx::GetServerTypeStr( TCHAR* pszServerType, int nSize )
|
|
{
|
|
ZeroMemory( pszServerType, nSize );
|
|
|
|
if( GetServerType() == BATTLE_SERVER )
|
|
strncpy( pszServerType, "Battle", nSize );
|
|
else if( GetServerType() == FIELD_SERVER )
|
|
strncpy( pszServerType, "Field", nSize );
|
|
else
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL GameServerEx::CreateSunLog()
|
|
{
|
|
BYTE bySunLogOption = 0, bySunLogFileLevel = 0;
|
|
TCHAR szSunLogFilePath[256]; //__READ_CONFIG_STRING???? ?????????? ??? 256???? ?????? ???.
|
|
TCHAR szServerType[MAX_PATH];
|
|
DWORD dwServerInfoCycle = 0;
|
|
__READ_CONFIG_NUMBER( bySunLogOption, "LOGFILE", "SUN_LOGFILE_OPTION", 0, GetDescFileName() );
|
|
__READ_CONFIG_NUMBER( bySunLogFileLevel, "LOGFILE", "SUN_LOGFILE_LEVEL", 0, GetDescFileName() );
|
|
__READ_CONFIG_STRING( szSunLogFilePath, "LOGFILE", "SUN_LOGFILE_PATH", "", GetDescFileName() );
|
|
__READ_CONFIG_NUMBER( dwServerInfoCycle, "LOGFILE", "SERVERINFO_CYCLE", 0, GetDescFileName() );
|
|
|
|
GetServerTypeStr( szServerType, MAX_PATH );
|
|
|
|
g_pSunLog = new CSunLog;
|
|
if( !g_pSunLog->Init( bySunLogOption, bySunLogFileLevel, szSunLogFilePath, szServerType ) )
|
|
return FALSE;
|
|
|
|
g_pSunLog->SetFileOutDelayOption( FALSE );
|
|
|
|
SUNLOG( eCRITICAL_LOG, "*** %s Server Start ***", szServerType );
|
|
SUNLOG( eCRITICAL_LOG, "*** %s Server Version = %d ***", szServerType, SERVER_RELEASE_BUILD_NO );
|
|
|
|
SUNLOG( eDEV_LOG, "*** log level test ***");
|
|
|
|
|
|
//2. ???????
|
|
g_pSecureLog = new SecureLog();
|
|
if( g_pSecureLog->Init(bySunLogOption, bySunLogFileLevel, szSunLogFilePath, "Secure", FALSE) )
|
|
{
|
|
g_pSecureLog->RegisterHandler( SecureLog::WriteMessage_Network );
|
|
}
|
|
else
|
|
{
|
|
P_FAILED;
|
|
}
|
|
|
|
if (GetServerType() == FIELD_SERVER)
|
|
{
|
|
#ifdef _NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
mondschein_log_ = new CSunLog;
|
|
if (mondschein_log_->Init(bySunLogOption, bySunLogFileLevel, szSunLogFilePath, "Mondschein") == false) {
|
|
DISPMSG( "SUNCONNLOG(MONDSCHIEN) initialize failed... \n");
|
|
}
|
|
#endif //_NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
|
|
#ifdef _NA_008706_20160229_TEXTLOG_PK
|
|
battle_monitor_log_ = new CSunLog;
|
|
if (battle_monitor_log_->Init(bySunLogOption, bySunLogFileLevel, szSunLogFilePath, "BattleMonitor") == false) {
|
|
DISPMSG( "SUNCONNLOG(BATTLEMONITOR) initialize failed... \n");
|
|
}
|
|
#endif //_NA_008706_20160229_TEXTLOG_PK
|
|
}
|
|
|
|
if (GetServerType() == BATTLE_SERVER)
|
|
{
|
|
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
//3. ??????? ??? ???????? ????? ????..
|
|
battle_ground_log_ = new CSunLog;
|
|
if( battle_ground_log_->Init(bySunLogOption, bySunLogFileLevel, szSunLogFilePath, "BattleGround") == false )
|
|
{
|
|
DISPMSG( "SUNCONNLOG initialize failed...\n" );
|
|
}
|
|
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
sonnenschein_log_ = new CSunLog;
|
|
if (sonnenschein_log_->Init(bySunLogOption, bySunLogFileLevel, szSunLogFilePath, "SonnenSchein") == false) {
|
|
DISPMSG( "SUNCONNLOG(SONNENSCHEIN) initialize failed... \n");
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
}
|
|
|
|
if( dwServerInfoCycle == 0 )
|
|
m_ServerInfoLogTimer.DisableCheckTime();
|
|
else
|
|
m_ServerInfoLogTimer.SetTimer( dwServerInfoCycle*1000*60 );
|
|
|
|
#ifdef _DEBUG
|
|
|
|
{
|
|
const int AverageRenderInfoSize = sizeof(PLAYER_RENDER_INFO_EX) -
|
|
sizeof(STATE_TOTAL_INFO) +
|
|
sizeof(STATE_INFO) * 15;
|
|
SUNLOG(eCRITICAL_LOG, "[Simulation Max PlayerRenderSize] %d",
|
|
AverageRenderInfoSize * MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool GameServerEx::LoadGameShopConfiguration()
|
|
{
|
|
#if !defined(_NA_0_20110613_GAME_SHOP_RENEWAL)
|
|
return false;
|
|
#endif
|
|
#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
return false;
|
|
#else
|
|
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
char section_name[32 + 1];
|
|
//
|
|
const char* file_name = GetDescFileName();
|
|
int number_of_connections = 0;
|
|
__READ_CONFIG_NUMBER(number_of_connections,
|
|
"SERVER_IOHANDLER", "CONEECTION_NUM", 0, file_name);
|
|
int index = 0;
|
|
for (; index < number_of_connections; ++index)
|
|
{
|
|
_snprintf(section_name, _countof(section_name), "CONNECTION_%d", index);
|
|
int server_type = UNKNOWN_SERVER;
|
|
__READ_CONFIG_NUMBER(server_type, section_name, "TYPE", 0, file_name);
|
|
if (server_type != SHOP_SERVER) {
|
|
continue;
|
|
};
|
|
|
|
char ip_address[MAX_IPADDRESS_SIZE + 1];
|
|
WORD connect_port = 0;
|
|
__READ_CONFIG_STRING_IP(ip_address, section_name, "IP", NULL, file_name);
|
|
ip_address[_countof(ip_address) - 1] = '\0';
|
|
__READ_CONFIG_NUMBER(connect_port, section_name, "PORT", 0, file_name);
|
|
|
|
GameShop::Manager* const shop_manager = GameShop::Manager::Instance();
|
|
shop_manager->Initialize(ip_address, connect_port);
|
|
break;
|
|
};
|
|
|
|
if (index == number_of_connections) {
|
|
return false;
|
|
};
|
|
|
|
GameShop::Manager* const shop_manager = GameShop::Manager::Instance();
|
|
shop_manager->StartService();
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
BOOL GameServerEx::Init()
|
|
{
|
|
#ifndef _SUSUNLOVE_DRIVE_NOT_FOUND_
|
|
if( !CreateSunLog() )
|
|
{
|
|
DISPMSG(" Create SunLog failed.." );
|
|
return FALSE;
|
|
}
|
|
#endif
|
|
db_connector_index_ = 0;
|
|
|
|
WorkLoadManager::CreateInstance();
|
|
|
|
//Check ServerMode
|
|
|
|
m_AgentServerSessionPool.Initialize(20, 0, "AgentServerSession", AssertionLogger4Pool_Server);
|
|
m_DBProxyServerSessionPool.Initialize(2, 0, "GameDBProxySession", AssertionLogger4Pool_Server);
|
|
#if !defined(_NA002635_GZ_DZ_PROTOCOL_UINIFICATION)
|
|
m_GuildServerSessionPool.Initialize(2, 0, "GuildServerSession", AssertionLogger4Pool_Server);
|
|
#endif
|
|
m_MasterServerSessionPool.Initialize(2, 0, "MasterServerSession", AssertionLogger4Pool_Server);
|
|
#if !defined(_NA002635_GP_DP_PROTOCOL_UINIFICATION)
|
|
m_PortalServerSessionPool.Initialize(2, 0, "PortalServerSession", AssertionLogger4Pool_Server);
|
|
#endif
|
|
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
m_ShopServerSessionPool.Initialize(2, 0, "ShopServerSession", AssertionLogger4Pool_Server);
|
|
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
|
|
m_TempServerSessionPool.Initialize(1, 0, "TempServerSession", AssertionLogger4Pool_Server);
|
|
|
|
AgentServerSession::SetPool(&m_AgentServerSessionPool);
|
|
GameDBProxySession::SetPool(&m_DBProxyServerSessionPool);
|
|
#if !defined(_NA002635_GZ_DZ_PROTOCOL_UINIFICATION)
|
|
GuildServerSession::SetPool(&m_GuildServerSessionPool);
|
|
#endif
|
|
MasterServerSession::SetPool(&m_MasterServerSessionPool);
|
|
#if !defined(_NA002635_GP_DP_PROTOCOL_UINIFICATION)
|
|
PortalServerSession::SetPool(&m_PortalServerSessionPool);
|
|
#endif
|
|
TempServerSession::SetPool(&m_TempServerSessionPool);
|
|
|
|
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
ShopServerSession::SetPool(&m_ShopServerSessionPool);
|
|
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
|
|
#ifndef _SUSUNLOVE_DRIVE_NOT_FOUND_
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
// 3D?????? ????????DLL, ???????DLL ????
|
|
#ifdef _DEV_TAIYO_PATHENGINE_CODE
|
|
#ifdef _DEBUG
|
|
char *lpsz3DTerrainDLL = "3DTerrainPE_sd.dll";
|
|
char *lpszNumericDLL = "Numeric_d.dll";
|
|
#else
|
|
char *lpsz3DTerrainDLL = "3DTerrainPE_s.dll";
|
|
char *lpszNumericDLL = "Numeric.dll";
|
|
#endif
|
|
#else //< DEV_TAIYO_PATHENGINE_CODE
|
|
#ifdef _DEBUG
|
|
char *lpsz3DTerrainDLL = "3DTerrain_sd.dll";
|
|
char *lpszNumericDLL = "Numeric_d.dll";
|
|
#else
|
|
char *lpsz3DTerrainDLL = "3DTerrain_s.dll";
|
|
char *lpszNumericDLL = "Numeric.dll";
|
|
#endif
|
|
#endif //< DEV_TAIYO_PATHENGINE_CODE
|
|
DISPMSG( "Loading \"%s\"...", lpsz3DTerrainDLL );
|
|
m_hDll3DTerrain = Load3DTerrainLibrary( lpsz3DTerrainDLL, &m_fnContactTerrain );
|
|
if ( !m_hDll3DTerrain )
|
|
{
|
|
P_FAILED;
|
|
return FALSE;
|
|
}
|
|
P_SUCCESS;
|
|
|
|
m_pLoadHelper = (CLoadHelper *)g_pGameServer->m_fnContactTerrain( CT_NEW_MAPLOADER, 0 );
|
|
#endif
|
|
|
|
//?????? ????......
|
|
if( !ParserInit() )
|
|
return FALSE;
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
DISPMSG( "Register PacketHandler..." );
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step before PacketHandler\n"); fclose(trace); }
|
|
PacketHandler::Instance();
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step PacketHandler\n"); fclose(trace); }
|
|
P_SUCCESS;
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
if( g_pSunLog ) g_pSunLog->SetFileOutDelayOption( TRUE );
|
|
|
|
return TRUE;
|
|
|
|
#else //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
|
|
// ????? ?????? ???????? ????
|
|
LogicInit();
|
|
|
|
if( g_pSunLog ) g_pSunLog->SetFileOutDelayOption( TRUE );
|
|
|
|
return TRUE;
|
|
#endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
|
|
}
|
|
|
|
BOOL GameServerEx::Update( DWORD dwDeltaTick )
|
|
{
|
|
// f110805.3L, f100920.3L, change a time control to support multi-time utilization
|
|
const util::ServerTimeInfoPerFrame& time_info = this->GetTimeInfoPerFrame();
|
|
//WAVERIX_TIME_CHECK_INIT_START();
|
|
MovementChecker::Update(time_info.delta_tick_);
|
|
// CHANGES: f110214.2L, added heartbeat control
|
|
nsAI::NpcHeartbeat::Update(&time_info);
|
|
|
|
WorkLoadManager::Update();
|
|
|
|
g_GameZoneManager.Update(time_info.delta_tick_);
|
|
|
|
// (WAVERIX) (090517) (NOTE) ?? ????? PlayerManager???? ???? ???????? ???.
|
|
NewGamePartyManager::Instance()->Update();
|
|
PlayerManager::Instance()->Update(&time_info);
|
|
|
|
g_DropManager.Process();
|
|
|
|
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
g_GameShopManager.Update();
|
|
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
if (GameDominationManager* const domination_manager = GameDominationManager::Instance())
|
|
{
|
|
if (domination_manager->DominationTimerIsExpired()) {
|
|
domination_manager->LoadProcess();
|
|
};
|
|
};
|
|
|
|
if (m_ServerInfoLogTimer.IsExpired())
|
|
{
|
|
DisplayAppInfo(true);
|
|
DisplayServerInfo(true);
|
|
};
|
|
#ifndef _SUSUNLOVE_DRIVE_NOT_FOUND_
|
|
g_pSunLog->Update();
|
|
#endif
|
|
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
if (battle_ground_log_)
|
|
battle_ground_log_->Update();
|
|
|
|
#ifdef _NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
if (mondschein_log_) {
|
|
mondschein_log_->Update();
|
|
}
|
|
#endif //_NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
if (sonnenschein_log_) {
|
|
sonnenschein_log_->Update();
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
|
|
#ifdef _NA_008706_20160229_TEXTLOG_PK
|
|
if (battle_monitor_log_)
|
|
{
|
|
battle_monitor_log_->Update();
|
|
}
|
|
#endif //_NA_008706_20160229_TEXTLOG_PK
|
|
|
|
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
GameShop::Manager::Instance()->Update(dwDeltaTick);
|
|
#endif
|
|
|
|
#ifdef _NA_003027_20111013_HONOR_SYSTEM
|
|
HonorSystem::Instance()->Update();
|
|
#endif //_NA_003027_20111013_HONOR_SYSTEM
|
|
#ifdef _NA_005988_20120901_VENDOR_SEARCH_SYSTEM
|
|
g_VendorManager.Update();
|
|
#endif //_NA_005988_20120901_VENDOR_SEARCH_SYSTEM
|
|
|
|
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
|
|
SunRankingGradeManager::Instance()->Update();
|
|
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
|
|
|
|
g_nPerfCounter++;
|
|
|
|
return true;
|
|
}
|
|
|
|
void GameServerEx::Release()
|
|
{
|
|
SetPhaseStatus( PHASE_UNKNOWN );
|
|
WorkLoadManager::DestroyInstance();
|
|
|
|
g_GameZoneManager.Release();
|
|
g_GameGuildManager.Release();
|
|
|
|
g_ResrcMgr.Destroy();
|
|
// g_MapAllocator.Release();
|
|
g_TradeManager.Release();
|
|
|
|
PacketHandler::DestroyInstance();
|
|
SummonManager::Instance()->Release();
|
|
PlayerManager::DestroyInstance();
|
|
|
|
GameDominationManager::DestroyInstance();
|
|
|
|
NewGamePartyManager::Instance()->Release(); NewGamePartyManager::DestroyInstance();
|
|
ObjectFactory::Instance()->Release();
|
|
|
|
SummonManager::DestroyInstance();
|
|
PeakTimeEvent::DestroyInstance();
|
|
|
|
GFriendInvitationController::DestroyInstance();
|
|
|
|
#ifdef _NA_0_20110308_SKILL_COOL_TIME_STORAGE
|
|
SkillCoolTimeAccessor::DestroyInstance();
|
|
#endif
|
|
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
GameShop::Manager::DestroyInstance();
|
|
#endif
|
|
#ifdef _NA_003027_20111013_HONOR_SYSTEM
|
|
HonorSystem::DestroyInstance();
|
|
#endif //_NA_003027_20111013_HONOR_SYSTEM
|
|
g_VendorManager.Destroy();
|
|
|
|
//QuestManager?? Release ??? ?????? QuestInfoManager?? Unload??? ????.
|
|
//QuestManager?? Release?? PlayerManager::DestroyInstance() ???? ????????.
|
|
g_QuestInfoManager.Unload();
|
|
g_DropManager.Release();
|
|
#ifdef _NA_000000_20140120_SMART_NPC_SYSTEM
|
|
g_ExtraNPCManager.release();
|
|
#endif //_NA_000000_20140120_SMART_NPC_SYSTEM
|
|
|
|
ParserRelease();
|
|
|
|
HighLoadBalancer::DestroyInstance();
|
|
|
|
#ifndef _SUSUNLOVE_DRIVE_NOT_FOUND_
|
|
g_pGameServer->m_fnContactTerrain( CT_DELETE_MAPLOADER, m_pLoadHelper );
|
|
|
|
if( m_hDll3DTerrain )
|
|
{
|
|
FreeLibrary( m_hDll3DTerrain );
|
|
}
|
|
#endif
|
|
|
|
SUNLOG( eCRITICAL_LOG, "*** Server Close ***" );
|
|
|
|
SAFE_DELETE(g_pLOG);
|
|
SAFE_DELETE(g_pSunLog);
|
|
SAFE_DELETE(g_pSecureLog);
|
|
SAFE_DELETE(battle_ground_log_); //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#ifdef _NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
SAFE_DELETE(mondschein_log_);
|
|
#endif //_NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
SAFE_DELETE(sonnenschein_log_);
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
|
|
#ifdef _NA_008706_20160229_TEXTLOG_PK
|
|
SAFE_DELETE(battle_monitor_log_);
|
|
#endif //_NA_008706_20160229_TEXTLOG_PK
|
|
}
|
|
|
|
VOID GameServerEx::Finalize()
|
|
{
|
|
PlayerManager::DestroyInstance();
|
|
ServerOptionParserEx::DestroyInstance();
|
|
NewGamePartyManager::DestroyInstance();
|
|
ObjectFactory::DestroyInstance();
|
|
}
|
|
|
|
|
|
//
|
|
VOID GameServerEx::ReloadData()
|
|
{
|
|
// // ?????? ???? ????? ??!!!
|
|
// //MapInfoParser::Instance()->Reload();
|
|
// //TriggerParser::Instance()->Reload();
|
|
//
|
|
// // ??? ??? ??????
|
|
//
|
|
// ItemInfoParser::Instance()->Reload("data\\WeaponItemInfo.txt");
|
|
// ItemInfoParser::Instance()->Reload("data\\ArmorItemInfo.txt");
|
|
// ItemInfoParser::Instance()->Reload("data\\WasteItemInfo.txt");
|
|
// ItemInfoParser::Instance()->Reload("data\\AccessoryItemInfo.txt");
|
|
//
|
|
// NPCInfoParser::Instance()->Reload();
|
|
// // CharInfoParser::Instance()->Reload();
|
|
// ShopInfoParser::Instance()->Reload();
|
|
// SkillInfoParser::Instance()->Reload();
|
|
// RegenParser::Instance()->Reload();
|
|
// GroupParser::Instance()->Reload();
|
|
// StateInfoParser::Instance()->Reload();
|
|
// //ItemOptionParser::Instance()->Reload();
|
|
// ItemCompositeParser::Instance()->Reload();
|
|
// //RareItemDropParser::Instance()->Reload();
|
|
// //ItemDropParser::Instance()->Reload();
|
|
//
|
|
// MissionRewardParser::Instance()->Reload();
|
|
// FormulaRatioParser::Instance()->Reload();
|
|
// StyleQuickRegistInfoParser::Instance()->Reload();
|
|
// AIParamParser::Instance()->Reload();
|
|
// ServerOptionParser::Instance()->Reload();
|
|
// EnchantParser::Instance()->Reload();
|
|
// // GMList::Instance()->Reload(); => ?????? ????? ???!! ?????? ???? ?????? ??!!
|
|
//
|
|
// ExpValueInfoParser::Instance()->Reload();
|
|
// CHuntingRewardParser::Instance()->Reload();
|
|
// RewardInfoList::Instance()->Reload();
|
|
//
|
|
// g_Ratio.Release();
|
|
// g_Ratio.Init();
|
|
//
|
|
// // ????????? ????????? ??? ??
|
|
// g_DropManager.Reload();
|
|
//
|
|
// ServerOptionParser::Instance()->Reload();
|
|
//
|
|
// PKScriptParser::Instance()->Reload();
|
|
//
|
|
}
|
|
|
|
VOID GameServerEx::DisplayServerInfo( BOOL bLog )
|
|
{
|
|
if( bLog )
|
|
SUNLOG( eCRITICAL_LOG, "Player Connections : %d", PlayerManager::Instance()->GetNumberOfPlayers() );
|
|
else
|
|
DISPMSG( "Player Connections : %d\n", PlayerManager::Instance()->GetNumberOfPlayers() );
|
|
|
|
if( m_pSession[AGENT_SERVER] && m_pSession[GAME_DBPROXY] )
|
|
{
|
|
DWORD dwCurAgentSendBuffer = GetIOCPServer()->GetCurSendBuffer( SERVER_IOHANDLER, m_pSession[AGENT_SERVER]->GetSessionIndex() );
|
|
DWORD dwCurAgentRecvBuffer = GetIOCPServer()->GetCurRecvBuffer( SERVER_IOHANDLER, m_pSession[AGENT_SERVER]->GetSessionIndex() );
|
|
DWORD dwCurDBProxySendBuffer = GetIOCPServer()->GetCurSendBuffer( SERVER_IOHANDLER, m_pSession[GAME_DBPROXY]->GetSessionIndex() );
|
|
DWORD dwCurDBProxyRecvBuffer = GetIOCPServer()->GetCurRecvBuffer( SERVER_IOHANDLER, m_pSession[GAME_DBPROXY]->GetSessionIndex() );
|
|
|
|
if( dwCurAgentSendBuffer >= 10000 || dwCurAgentRecvBuffer >= 10000 ||
|
|
dwCurDBProxySendBuffer >= 10000 || dwCurDBProxyRecvBuffer >= 10000 )
|
|
{
|
|
if( bLog )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "Agent dwCurSendBuffer[%d] : dwCurRecvBuffer[%d]", dwCurAgentSendBuffer, dwCurAgentRecvBuffer );
|
|
SUNLOG( eCRITICAL_LOG, "DBProxy dwCurSendBuffer[%d] : dwCurRecvBuffer[%d]", dwCurDBProxySendBuffer, dwCurDBProxyRecvBuffer );
|
|
}
|
|
else
|
|
{
|
|
DISPMSG( "Agent dwCurSendBuffer[%d] : dwCurRecvBuffer[%d] \n", dwCurAgentSendBuffer, dwCurAgentRecvBuffer );
|
|
DISPMSG( "DBProxy dwCurSendBuffer[%d] : dwCurRecvBuffer[%d] \n", dwCurDBProxySendBuffer, dwCurDBProxyRecvBuffer );
|
|
}
|
|
}
|
|
}
|
|
|
|
if( bLog )
|
|
SUNLOG( eCRITICAL_LOG, "FUNCTION RESTRICT VALUE : %u", g_FunctionalRestrictMgr.GetRestrictFunction() );
|
|
else
|
|
DISPMSG( "FUNCTION RESTRICT VALUE : %u\n", g_FunctionalRestrictMgr.GetRestrictFunction() );
|
|
|
|
//g_ZoneManager.zone_print();
|
|
g_GameZoneManager.Display( bLog );
|
|
g_GameGuildManager.DisplayerGuildInfo( bLog );
|
|
|
|
NewGamePartyManager::Instance()->Display();
|
|
}
|
|
|
|
VOID GameServerEx::ReloadAttributes()
|
|
{
|
|
// ??? ???? ????
|
|
DWORD AbuseFunctionRestrict = 0xFFFFFFFF;
|
|
__READ_CONFIG_NUMBER( AbuseFunctionRestrict, "RELOAD_ATTRIBUTES", "ABUSE_FUNCTION_RESTRICT_VALUE", 0xFFFFFFFF, GetDescFileName() );
|
|
if( 0xFFFFFFFF != AbuseFunctionRestrict )
|
|
{
|
|
SUNLOG( eCRITICAL_LOG, "FUCTION_RESTRICT_VALUE=%u", AbuseFunctionRestrict );
|
|
g_FunctionalRestrictMgr.SetRestrictFunction( AbuseFunctionRestrict );
|
|
}
|
|
|
|
//// ???? ???? ????
|
|
BYTE SunLogLevel = 0xFF;
|
|
__READ_CONFIG_NUMBER( SunLogLevel, "RELOAD_ATTRIBUTES", "SUN_LOG_LEVEL", 0xFF, GetDescFileName() );
|
|
if( 0xFF != SunLogLevel )
|
|
{
|
|
if( g_pSunLog )
|
|
{
|
|
g_pSunLog->SetLogLevel( SunLogLevel );
|
|
SUNLOG( eCRITICAL_LOG, "SUN_LOG_LEVEL=%u", SunLogLevel );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
BOOL GameServerEx::CheckServerMode( eSERVER_MODE ServerMode, eSERVER_TYPE ServerType, BYTE byServerPoolType )
|
|
{
|
|
if( byServerPoolType > 3 ) return FALSE;
|
|
|
|
//1. FIELD, BATTLE_SERVER_TYPE CHECK (???? 0 ,1???? ???.)
|
|
if( ServerMode == eSERVER_LIVE || ServerMode == eSERVER_TESTLIVE ) //?????? ???? ??????..
|
|
{
|
|
if( ServerType == FIELD_SERVER && byServerPoolType == 0 )
|
|
return TRUE;
|
|
else if( ServerType == BATTLE_SERVER && byServerPoolType == 1 )
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
//??????, ???? ?????M ???? ?? ?????? OK..
|
|
return TRUE;
|
|
}
|
|
|
|
VOID GameServerEx::LogicInit()
|
|
{
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a"))
|
|
{
|
|
fprintf(trace, "step LogicInit start\n");
|
|
fclose(trace);
|
|
}
|
|
SERVER_POOL_OPTION& stServerPoolOptionInfo = ServerOptionParser::Instance()->GetPoolInfo();
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a"))
|
|
{
|
|
fprintf(trace, "step LogicInit pools player=%u npc=%u item=%u\n",
|
|
(unsigned)stServerPoolOptionInfo.m_wPlayerPool,
|
|
(unsigned)stServerPoolOptionInfo.m_wNPCPool,
|
|
(unsigned)stServerPoolOptionInfo.m_wItemPool);
|
|
fclose(trace);
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
// Object Pool ????
|
|
DISPMSG( "Creating object factories..." );
|
|
ObjectFactory* const object_factory = ObjectFactory::Instance();
|
|
object_factory->Init(
|
|
stServerPoolOptionInfo.m_wPlayerPool,
|
|
stServerPoolOptionInfo.m_wNPCPool,
|
|
stServerPoolOptionInfo.m_wItemPool,
|
|
stServerPoolOptionInfo.m_wMapObjectPool,
|
|
stServerPoolOptionInfo.m_wMapNPCPool,
|
|
stServerPoolOptionInfo.m_wMerchantPool,
|
|
100
|
|
);
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step ObjectFactory\n"); fclose(trace); }
|
|
P_SUCCESS;
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
// ???? ????
|
|
DISPMSG( "Initializing ability factory..." );
|
|
AbilityFactory::Instance()->Init( stServerPoolOptionInfo.m_wAbilityPool );
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step AbilityFactory\n"); fclose(trace); }
|
|
NewGamePartyManager::Instance()->Initialize( stServerPoolOptionInfo.m_wPartyPool );
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step PartyManager\n"); fclose(trace); }
|
|
SummonManager::Instance()->Init( stServerPoolOptionInfo.m_wSummonPool ); // ????? ?? ?? ?????? ????...????? ???????!
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step SummonManager\n"); fclose(trace); }
|
|
g_StatisticsManager.Init();
|
|
|
|
GameZoneManager::ReservedZonePool(20); // zone?? ? ????
|
|
|
|
UnitRegenManager::CreatePool( 1000 );
|
|
UnitGroupManager::CreatePool( stServerPoolOptionInfo.m_wObjGroupPool );
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step ZonePools\n"); fclose(trace); }
|
|
|
|
QuestManager_Concrete::Init(20);
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step QuestManager\n"); fclose(trace); }
|
|
g_DropManager.Init(stServerPoolOptionInfo.m_wItemPool);
|
|
g_TradeManager.Init( stServerPoolOptionInfo.m_wTradePool );
|
|
|
|
PeakTimeEvent::Instance()->Init();
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step DropTrade\n"); fclose(trace); }
|
|
g_RewardManager.Init( ItemTypeList::Instance(), DropRatioInfoList::Instance() );
|
|
g_VendorManager.Initialize();
|
|
#ifdef _NA_000000_20140120_SMART_NPC_SYSTEM
|
|
g_ExtraNPCManager.initialize();
|
|
#endif //_NA_000000_20140120_SMART_NPC_SYSTEM
|
|
|
|
#ifdef _NA_007992_20150127_EVENT_MONSTER_INVASION
|
|
MonsterInvasionEvent::Instance()->Init();
|
|
#endif //_NA_007992_20150127_EVENT_MONSTER_INVASION
|
|
|
|
P_SUCCESS;
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
DISPMSG( "Register PacketHandler..." );
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step before PacketHandler\n"); fclose(trace); }
|
|
PacketHandler::Instance();
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step PacketHandler\n"); fclose(trace); }
|
|
P_SUCCESS;
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
DISPMSG( "Loading map resources..." );
|
|
#ifndef _SUSUNLOVE_DRIVE_NOT_FOUND_
|
|
ResrcManager::SetPoolSize( stServerPoolOptionInfo.m_wMapPool, stServerPoolOptionInfo.m_wSectorPool );
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step ResrcMgr.Establish\n"); fclose(trace); }
|
|
g_ResrcMgr.Establish();
|
|
if (FILE* trace = fopen("script_load_trace.txt", "a")) { fprintf(trace, "step ResrcMgr.Establish done\n"); fclose(trace); }
|
|
#endif
|
|
// _NA_0_20110613_GAME_SHOP_RENEWAL
|
|
if (this->IsServerInfoFromFile()) {
|
|
LoadGameShopConfiguration();
|
|
};
|
|
|
|
P_SUCCESS;
|
|
}
|
|
|
|
// __KR_001355_20090608_EXP_ACQUISITION_NOTIFICATION
|
|
BOOL GameServerEx::NotifyEXPAcquisition(CHARGUID charGuid, eEXP_ACQUISITION_TYPE type, EXPTYPE amount)
|
|
{
|
|
MSG_AG_STATUS_GROUP_EXP_ACQUISITION_CMD sendMsg;
|
|
|
|
sendMsg.m_CharGuid = charGuid;
|
|
sendMsg.m_byAcquisitionType = type;
|
|
sendMsg.m_Amount = amount;
|
|
|
|
return SendToServer(AGENT_SERVER, &sendMsg, sizeof(sendMsg));
|
|
}
|
|
|
|
// implemented by '__NA_0_20090627_HEIM_ACQUISITION_S2S_NOTIFICATION'
|
|
BOOL GameServerEx::NotifyHeimAcquisition(CHARGUID charGuid, eHEIM_ACQUISITION_TYPE type, MONEY amount)
|
|
{
|
|
// ??? ???????? ???? ??? ?????? ????? ?? ????? AgentServer?? ????
|
|
MSG_AG_STATUS_HEIM_ACQUISITION_NTF noti;
|
|
noti.m_CharGuid = charGuid;
|
|
noti.m_byAcquisitionType = type;
|
|
noti.m_Amount = amount;
|
|
return SendToServer(AGENT_SERVER, ¬i, sizeof(noti));
|
|
}
|
|
|
|
// implemented by '__NA_0_20090627_HEIM_CONSUMPTION_S2S_NOTIFICATION'
|
|
// changes input arguments by _NA_0_20091119_HEIM_LOTTO_ACCUM_CTRL_BY_SHOP
|
|
BOOL GameServerEx::NotifyHeimConsumption(CHARGUID charGuid, eHEIM_CONSUMPTION_TYPE type, MONEY amount, int lottoAccumRatio)
|
|
{
|
|
// ??? ???????? ???? ??? ?????? ????? ?? ????? AgentServer?? ????
|
|
MSG_AG_STATUS_HEIM_CONSUMPTION_NTF noti;
|
|
noti.m_CharGuid = charGuid;
|
|
noti.m_byConsumptionType = type;
|
|
noti.m_Amount = amount;
|
|
noti.m_LottoAccumRatio = lottoAccumRatio; //_NA_0_20091119_HEIM_LOTTO_ACCUM_CTRL_BY_SHOP
|
|
return SendToServer(AGENT_SERVER, ¬i, sizeof(noti));
|
|
}
|
|
|
|
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
bool GameServerEx::MessageBattleGroundOut( eSUN_LOG_LEVEL log_level, const TCHAR* format, ... )
|
|
{
|
|
bool result = false;
|
|
va_list args;
|
|
va_start(args, format);
|
|
|
|
if (battle_ground_log_)
|
|
{
|
|
result = CSunLog::LOGGINGwithARG(battle_ground_log_,
|
|
CSunLog::cOUTPUT_FILE,CSunLog::eLOGLEVEL(log_level), CSunLog::cCATE_MASK,
|
|
format, args) != false;
|
|
}
|
|
else
|
|
{
|
|
TCHAR making_message[1024];
|
|
result = (_vsntprintf(making_message, _countof(making_message), format, args) >= 0);
|
|
making_message[_countof(making_message) - 1] = _T('\0');
|
|
_putts(making_message);
|
|
}
|
|
va_end(args);
|
|
|
|
return result;
|
|
}
|
|
|
|
#ifdef _NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
BOOL GameServerEx::MessageMondscheinOut(eSUN_LOG_LEVEL log_level, const TCHAR* format, ...)
|
|
{
|
|
bool result = false;
|
|
va_list args;
|
|
va_start(args, format);
|
|
|
|
if (mondschein_log_)
|
|
{
|
|
result = CSunLog::LOGGINGwithARG(mondschein_log_,
|
|
CSunLog::cOUTPUT_FILE,CSunLog::eLOGLEVEL(log_level), CSunLog::cCATE_MASK,
|
|
format, args) != false;
|
|
}
|
|
else
|
|
{
|
|
TCHAR making_message[1024];
|
|
result = (_vsntprintf(making_message, _countof(making_message), format, args) >= 0);
|
|
making_message[_countof(making_message) - 1] = _T('\0');
|
|
_putts(making_message);
|
|
}
|
|
va_end(args);
|
|
|
|
return result;
|
|
}
|
|
#endif //_NA_008132_20150316_MONDSCHEIN_TEXTLOG
|
|
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
BOOL GameServerEx::MessageSonnenScheinOut(eSUN_LOG_LEVEL log_level, const TCHAR* format, ...)
|
|
{
|
|
bool result = false;
|
|
va_list args;
|
|
va_start(args, format);
|
|
|
|
if (sonnenschein_log_)
|
|
{
|
|
result = CSunLog::LOGGINGwithARG(sonnenschein_log_,
|
|
CSunLog::cOUTPUT_FILE,CSunLog::eLOGLEVEL(log_level), CSunLog::cCATE_MASK,
|
|
format, args) != false;
|
|
}
|
|
else
|
|
{
|
|
TCHAR making_message[1024];
|
|
result = (_vsntprintf(making_message, _countof(making_message), format, args) >= 0);
|
|
making_message[_countof(making_message) - 1] = _T('\0');
|
|
_putts(making_message);
|
|
}
|
|
va_end(args);
|
|
|
|
return result;
|
|
}
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
|
|
#ifdef _NA_008706_20160229_TEXTLOG_PK
|
|
BOOL GameServerEx::MessageBattleMonitorOut(eSUN_LOG_LEVEL log_level, const TCHAR* format, ...)
|
|
{
|
|
bool result = false;
|
|
va_list args;
|
|
va_start(args, format);
|
|
|
|
if (battle_monitor_log_)
|
|
{
|
|
result = CSunLog::LOGGINGwithARG(battle_monitor_log_,
|
|
CSunLog::cOUTPUT_FILE,CSunLog::eLOGLEVEL(log_level), CSunLog::cCATE_MASK,
|
|
format, args) != false;
|
|
}
|
|
else
|
|
{
|
|
TCHAR making_message[1024];
|
|
result = (_vsntprintf(making_message, _countof(making_message), format, args) >= 0);
|
|
making_message[_countof(making_message) - 1] = _T('\0');
|
|
_putts(making_message);
|
|
}
|
|
va_end(args);
|
|
|
|
return result;
|
|
}
|
|
#endif //_NA_008706_20160229_TEXTLOG_PK
|
|
|
|
//==================================================================================================
|
|
//==================================================================================================
|
|
//==================================================================================================
|
|
|