Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
#ifndef _GAME_TIME_CONSTANTS_H_
#define _GAME_TIME_CONSTANTS_H_
namespace GameTime
{
// 게임 시간 타입
enum TimeType
{
TYPE_NONE = 0,
GUILD = 1, // 길드전 시간
REALM = 2, // 렐름전 시간
SIEGE = 3, // 공성 시간
MINE = 4, // 매일 주기적으로 임시 채굴
NEWZONE = 5, // 테섭용 신규존 입장제한
EVENT = 6, // 게임관련 이벤트
MAX_GAME_TIME_TYPE = 7
};
// 시간 주기
enum Cycle
{
CYCLE_NONE = 0,
WEEKLY = 1, // 매주 특저 요일 특정 시간대
DAILY = 2, // 매일 특정 시간대
MONTHLY = 3, // 매월 특정 날짜 특정 시간대
DATE = 4, // 특정 날짜 특정 시간대
MAX_TIME_CYCLE_TYPE = 5
};
// 요일
enum Week
{
WEEK_NONE = 0,
SUNDAY = 1,
MONDAY = 2,
TUESDAY = 3,
WEDNESDAY = 4,
THURSDAY = 5,
FRIDAY = 6,
SATURDAY = 7,
};
// 길드전 시간 종류
enum GuildTime
{
GT_NORMAL = 0, // 일반
GT_PREPARE_START_30 = 1, // 길드전 시작 30분전
GT_PREPARE_START_5 = 2, // 길드전 시작 5분전
GT_GUILD_WAR = 3, // 길드전 시간
GT_PREPARE_END_30 = 4, // 길드전 종료 30분전
};
// 렐름전 시간 종류
enum RealmTime
{
RT_NORMAL = 0, // 일반
RT_PREPARE_START_30 = 1, // 렐름전 시작 30분전
RT_PREPARE_START_15 = 2, // 렐름전 시작 15분전
RT_PREPARE_START_10 = 3, // 렐름전 시작 10분전
RT_PREPARE_START_5 = 4, // 렐름전 시작 5분전
RT_REALM_WAR = 5, // 렐름전 시간
RT_REALM_WAR_END_5 = 6, // 렐름전 종료 5분전.
};
// 공성전 시간 종류
enum SiegeTime
{
ST_NORMAL = 0, // 일반
ST_PREPARE_START_5 = 1, // 공성전 시작 5분전
ST_SIEGE_WAR = 2, // 공성 시간
ST_PREPARE_END_5 = 3, // 공성전 종료 5분전
};
// 신규존 시간 종류
enum NewZoneTime
{
ET_LIMIT = 0, // 입장 불가
ET_PREPARE_START_5 = 1, // 입장 5분전
ET_ALLOWENTER = 2, // 입장 가능
ET_PREPARE_END_5 = 3, // 종료 5분전
};
// 임새 채굴 시간 종류
enum MiningTime
{
MT_NORMAL = 0, // 일반
MT_MINING = 1, // 채굴중인 시간 (MT_MINING -> MT_NORMAL 로 바뀔때 임시 채굴됨)
};
// 게임 이벤트 종류
enum EventTime
{
EVENT_NORMAL = 0, // 이벤트 시간이 아니다.
EVENT_All20 = 1, // Value1 에 의해 결정되는 값으로 Value1 값이 이벤트 값이된다.
EVENT_All50 = 2, // Value1 에 의해 결정되는 값으로 Value1 값이 이벤트 값이된다.
};
// GameTimeInfo 패킷 종류
enum GameTimeInfoType
{
TYPE_GAMESERVER_LOGIN = 0, // 게임서버가 중계서버에 연결될때 게임 시간 정보 전송
TYPE_CHARACTER_LOGIN = 1, // 캐릭터가 게임서버에 로그인시 게임 시간 정보 전송
TYPE_CHANGE_GAME_TIME = 2, // 게임 시간이 변경되어서 업데이트시
TYPE_ENABLE_CASTLE_SIEGE = 3, // 특정 성의 공성 가능 정보 변경시
TYPE_UPDATE_TIME = 4, // 클라이언트에게 주기적으로 시간 정보 업데이트시
};
}
#endif //_GAME_TIME_CONSTANTS_H_

View File

@@ -0,0 +1,120 @@
#include "stdafx.h"
#include "GameTimeDBComponent.h"
#include <Log/ServerLog.h>
#include <GameTime/GameTimeConstants.h>
#include <Network/Packet/PacketStruct/CastlePacket.h>
#include <DB/DBDefine.h>
#include <DB/DBComponent.h>
#include <Utility/Math/Math.h>
#include <Utility/Debug/PerformanceCheck.h>
bool DBComponent::GameTimeDB::UpdateGameTimeInfo(CDBComponent& DBComponent, unsigned char cGuildTime, unsigned char cRealmTime,
unsigned char cSiegeTime, unsigned char cMiningTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(),
"UPDATE TblGameTime SET GuildTime=%d, RealmTime=%d, SiegeTime=%d, MiningTime=%d", cGuildTime, cRealmTime, cSiegeTime, cMiningTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "게임 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}
bool DBComponent::GameTimeDB::UpdateGuildTime(CDBComponent& DBComponent, unsigned char cGuildTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(), "UPDATE TblGameTime SET GuildTime=%d", cGuildTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "길드전 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}
bool DBComponent::GameTimeDB::UpdateRealmTime(CDBComponent& DBComponent, unsigned char cRealmTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(), "UPDATE TblGameTime SET RealmTime=%d", cRealmTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "국가전 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}
bool DBComponent::GameTimeDB::UpdateSiegeTime(CDBComponent& DBComponent, unsigned char cSiegeTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(), "UPDATE TblGameTime SET SiegeTime=%d", cSiegeTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "공성전 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}
bool DBComponent::GameTimeDB::UpdateEnterTime(CDBComponent& DBComponent, unsigned char cEnterTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(), "UPDATE TblGameTime SET EnterTime=%d", cEnterTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "신규존 진입제한 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}
bool DBComponent::GameTimeDB::UpdateMiningTime(CDBComponent& DBComponent, unsigned char cMiningTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(), "UPDATE TblGameTime SET MiningTime=%d", cMiningTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "채굴기 임시 채굴 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}
bool DBComponent::GameTimeDB::UpdateEventTime(CDBComponent& DBComponent, unsigned char cEventTime)
{
DBOBJECT_PERFORMANCE_CHECK(FunctionTimingCheck);
_snprintf(DBComponent.GetQueryBuffer(), DBComponent.GetQueryBufferLen(), "UPDATE TblGameTime SET EventTime=%d", cEventTime);
if (false == DBComponent.ExecuteQuery(DBComponent.GetQueryBuffer()))
{
SERLOG2(g_Log, "게임이벤트 시간 정보 업데이트 실패 : %s : Query:%s", DBComponent.GetErrorString(), DBComponent.GetQueryBuffer());
return false;
}
return true;
}

View File

@@ -0,0 +1,24 @@
#ifndef _RYL_GAMETIME_DB_COMPONENT_H_
#define _RYL_GAMETIME_DB_COMPONENT_H_
// forward decl.
class CDBComponent;
namespace DBComponent
{
namespace GameTimeDB
{
// °ÔÀÓ ½Ã°£ ¾÷µ¥ÀÌÆ®
bool UpdateGameTimeInfo(CDBComponent& DBComponent, unsigned char cGuildTime, unsigned char cRealmTime,
unsigned char cSiegeTime, unsigned char cMiningTime);
bool UpdateGuildTime(CDBComponent& DBComponent, unsigned char cGuildTime);
bool UpdateRealmTime(CDBComponent& DBComponent, unsigned char cRealmTime);
bool UpdateSiegeTime(CDBComponent& DBComponent, unsigned char cSiegeTime);
bool UpdateEnterTime(CDBComponent& DBComponent, unsigned char cEnterTime);
bool UpdateMiningTime(CDBComponent& DBComponent, unsigned char cMiningTime);
bool UpdateEventTime(CDBComponent& DBComponent, unsigned char cEventTime);
}
}
#endif

View File

@@ -0,0 +1,666 @@
#include "stdafx.h"
#include "GameTimeConstants.h"
#include "GameTimeMgr.h"
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/CastlePacket.h>
#include <Castle/CastleMgr.h>
#include <Creature/CreatureManager.h>
CGameTimeMgr::CGameTimeMgr()
: m_cNowGuildTime(GameTime::GT_NORMAL),
m_cNowRealmTime(GameTime::RT_NORMAL),
m_cNowSiegeTime(GameTime::ST_NORMAL),
m_cNowEnterTime(GameTime::ET_LIMIT),
m_cNowEventTime(GameTime::EVENT_NORMAL),
m_dwOldGuildRemainSec(0),
m_dwOldRealmRemainSec(0),
m_dwOldSiegeRemainSec(0),
m_dwOldEnterRemainSec(0),
m_dwOldEventRemainSec(0)
{
}
CGameTimeMgr::~CGameTimeMgr()
{
}
CGameTimeMgr& CGameTimeMgr::GetInstance()
{
static CGameTimeMgr ms_this;
return ms_this;
}
void CGameTimeMgr::SetTimeValue(unsigned char cTimeType, unsigned char cTimeValue, unsigned char cMonth, unsigned char cDay,
unsigned char cHour, unsigned char cMinute, unsigned long dwDuration)
{
switch (cTimeType)
{
case GameTime::GUILD:
{
m_cNowGuildTime = cTimeValue;
m_GuildDetailTimeInfo = sDetailTimeInfo(cMonth, cDay, cHour, cMinute, dwDuration);
m_dwOldGuildRemainSec = GetDetailRemainSec(GameTime::GUILD);
}
break;
case GameTime::REALM:
{
m_cNowRealmTime = cTimeValue;
m_RealmDetailTimeInfo = sDetailTimeInfo(cMonth, cDay, cHour, cMinute, dwDuration);
m_dwOldRealmRemainSec = GetDetailRemainSec(GameTime::REALM);
}
break;
case GameTime::SIEGE:
{
m_cNowSiegeTime = cTimeValue;
m_SiegeDetailTimeInfo = sDetailTimeInfo(cMonth, cDay, cHour, cMinute, dwDuration);
m_dwOldSiegeRemainSec = GetDetailRemainSec(GameTime::SIEGE);
}
break;
case GameTime::NEWZONE:
{
m_cNowEnterTime = cTimeValue;
m_EnterDetailTimeInfo = sDetailTimeInfo(cMonth, cDay, cHour, cMinute, dwDuration);
m_dwOldEnterRemainSec = GetDetailRemainSec(GameTime::NEWZONE);
}
break;
case GameTime::EVENT:
{
m_cNowEventTime = cTimeValue;
m_EventDetailTimeInfo = sDetailTimeInfo(cMonth, cDay, cHour, cMinute, dwDuration);
m_dwOldEventRemainSec = GetDetailRemainSec(GameTime::EVENT);
}
break;
default: ERRLOG1(g_Log, "게임타입의 시간 값을 설정하는데 실패했습니다. Type : %d", cTimeType); break;
}
}
unsigned char CGameTimeMgr::GetCurrentGameTime(unsigned char cTimeType) const
{
switch (cTimeType)
{
case GameTime::GUILD: return m_cNowGuildTime; break;
case GameTime::REALM: return m_cNowRealmTime; break;
case GameTime::SIEGE: return m_cNowSiegeTime; break;
case GameTime::NEWZONE: return m_cNowEnterTime; break;
case GameTime::EVENT: return m_cNowEventTime; break;
}
ERRLOG1(g_Log, "현재 게임타입의 시간 상태를 얻는데 실패했습니다. Type : %d", cTimeType);
return 0;
}
unsigned char CGameTimeMgr::GetCurrentGuildTime() const
{
return m_cNowGuildTime;
}
unsigned char CGameTimeMgr::GetCurrentRealmTime() const
{
return m_cNowRealmTime;
}
unsigned char CGameTimeMgr::GetCurrentSiegeTime() const
{
return m_cNowSiegeTime;
}
unsigned char CGameTimeMgr::GetCurrentEnterTime() const
{
return m_cNowEnterTime;
}
unsigned char CGameTimeMgr::GetCurrentEventTime() const
{
return m_cNowEventTime;
}
bool CGameTimeMgr::SendGameTimeInfo(CSendStream& SendStream)
{
unsigned short wBufferSize = static_cast<unsigned short>(sizeof(PktGameTimeInfo)
+ sizeof(CastleSiegeInfo) * Castle::CCastleMgr::GetInstance().GetCastleNum());
char* lpBuffer = SendStream.GetBuffer(wBufferSize);
if (lpBuffer)
{
PktGameTimeInfo* lpPktGTI = reinterpret_cast<PktGameTimeInfo*>(lpBuffer);
CastleSiegeInfo* lpCastleSiegeInfo = reinterpret_cast<CastleSiegeInfo*>(lpPktGTI + 1);
unsigned char cNum = 0;
unsigned short wSize = sizeof(PktGameTimeInfo);
ZeroMemory(lpPktGTI, sizeof(PktGameTimeInfo));
Castle::CCastleMgr::GetInstance().GetCastleSiegeInfo(lpCastleSiegeInfo, cNum, wSize);
lpPktGTI->m_cType = GameTime::TYPE_CHARACTER_LOGIN;
lpPktGTI->m_wSize = wSize;
lpPktGTI->m_cCastleNum = cNum;
lpPktGTI->m_GuildTimeInfo.m_bUpdated = true;
lpPktGTI->m_RealmTimeInfo.m_bUpdated = true;
lpPktGTI->m_SiegeTimeInfo.m_bUpdated = true;
lpPktGTI->m_EventTimeInfo.m_bUpdated = true;
lpPktGTI->m_GuildTimeInfo.m_cNowGuildTime = m_cNowGuildTime;
lpPktGTI->m_RealmTimeInfo.m_cNowRealmTime = m_cNowRealmTime;
lpPktGTI->m_SiegeTimeInfo.m_cNowSiegeTime = m_cNowSiegeTime;
lpPktGTI->m_EventTimeInfo.m_cNowEventTime = m_cNowEventTime;
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::GUILD);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::REALM);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::SIEGE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::NEWZONE);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::EVENT);
return SendStream.WrapCrypt(wBufferSize, CmdGameTimeInfo, 0, PktBase::NO_SERVER_ERR);
}
return false;
}
void CGameTimeMgr::UpdateGameTimeInfo()
{
if (CheckNeedUpdate())
{
const unsigned short MAX_BUFFER_SIZE = static_cast<unsigned short>(
sizeof(PktGameTimeInfo) + sizeof(CastleSiegeInfo) * Castle::MAX_CASTLE_NUM);
char szPacket[MAX_BUFFER_SIZE] = {0, };
PktGameTimeInfo* lpPktGTI = reinterpret_cast<PktGameTimeInfo*>(szPacket);
CastleSiegeInfo* lpCastleSiegeInfo = reinterpret_cast<CastleSiegeInfo*>(lpPktGTI + 1);
unsigned char cNum = 0;
unsigned short wSize = sizeof(PktGameTimeInfo);
ZeroMemory(lpPktGTI, sizeof(PktGameTimeInfo));
Castle::CCastleMgr::GetInstance().GetCastleSiegeInfo(lpCastleSiegeInfo, cNum, wSize);
lpPktGTI->m_cType = GameTime::TYPE_UPDATE_TIME;
lpPktGTI->m_wSize = wSize;
lpPktGTI->m_cCastleNum = cNum;
lpPktGTI->m_GuildTimeInfo.m_bUpdated = true;
lpPktGTI->m_RealmTimeInfo.m_bUpdated = true;
lpPktGTI->m_SiegeTimeInfo.m_bUpdated = true;
lpPktGTI->m_EventTimeInfo.m_bUpdated = true;
lpPktGTI->m_GuildTimeInfo.m_cNowGuildTime = m_cNowGuildTime;
lpPktGTI->m_RealmTimeInfo.m_cNowRealmTime = m_cNowRealmTime;
lpPktGTI->m_SiegeTimeInfo.m_cNowSiegeTime = m_cNowSiegeTime;
lpPktGTI->m_EventTimeInfo.m_cNowEventTime = m_cNowEventTime;
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::GUILD);
lpPktGTI->m_GuildTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::GUILD);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::REALM);
lpPktGTI->m_RealmTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::REALM);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::SIEGE);
lpPktGTI->m_SiegeTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::SIEGE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::NEWZONE);
lpPktGTI->m_EnterTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::NEWZONE);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cMonth = GetDetailMonth(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cDay = GetDetailDay(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cHour = GetDetailHour(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_cMinute = GetDetailMinute(GameTime::EVENT);
lpPktGTI->m_EventTimeInfo.m_TimeInfo.m_dwTime = GetDetailRemainSec(GameTime::EVENT);
if (PacketWrap::WrapCrypt(szPacket, wSize, CmdGameTimeInfo, 0, 0))
{
CCreatureManager::GetInstance().SendAllCharacter(szPacket, wSize, CmdGameTimeInfo);
}
}
}
bool CGameTimeMgr::CheckNeedUpdate()
{
unsigned long dwGuildRemainSec = GetDetailRemainSec(GameTime::GUILD);
unsigned long dwRealmRemainSec = GetDetailRemainSec(GameTime::REALM);
unsigned long dwSiegeRemainSec = GetDetailRemainSec(GameTime::SIEGE);
unsigned long dwEnterRemainSec = GetDetailRemainSec(GameTime::NEWZONE);
unsigned long dwEventRemainSec = GetDetailRemainSec(GameTime::EVENT);
// 길드전 일반 상태와 길드전 상태일때 5분에 한번씩 업데이트
if ((GameTime::GT_NORMAL == m_cNowGuildTime || GameTime::GT_GUILD_WAR == m_cNowGuildTime) &&
m_dwOldGuildRemainSec - dwGuildRemainSec >= 300)
{
m_dwOldGuildRemainSec = dwGuildRemainSec;
return true;
}
// 길드전 시작 30분전, 종료 30분전은 1분에 한번씩 업데이트
else if ((GameTime::GT_PREPARE_START_30 == m_cNowGuildTime || GameTime::GT_PREPARE_END_30 == m_cNowGuildTime) &&
m_dwOldGuildRemainSec - dwGuildRemainSec >= 60)
{
m_dwOldGuildRemainSec = dwGuildRemainSec;
return true;
}
// 길드전 시작 5분전에는 10초에 한번씩 업데이트
else if (GameTime::GT_PREPARE_START_5 == m_cNowGuildTime && m_dwOldGuildRemainSec - dwGuildRemainSec >= 10)
{
m_dwOldGuildRemainSec = dwGuildRemainSec;
return true;
}
// 국가전 일반 상태와 국가전 상태일때 5분에 한번씩 업데이트
if ((GameTime::RT_NORMAL == m_cNowRealmTime || GameTime::RT_REALM_WAR == m_cNowRealmTime) &&
m_dwOldRealmRemainSec - dwRealmRemainSec >= 300)
{
m_dwOldRealmRemainSec = dwRealmRemainSec;
return true;
}
// 국가전 시작 30분, 15분전은 1분에 한번씩 업데이트, 종료30분전 포함
/* else if ((GameTime::RT_PREPARE_START_30 == m_cNowRealmTime || GameTime::RT_PREPARE_START_15 == m_cNowRealmTime) &&
m_dwOldRealmRemainSec - dwRealmRemainSec >= 60)
{
m_dwOldRealmRemainSec = dwRealmRemainSec;
return true;
}
*/ else if ((GameTime::RT_PREPARE_START_30 == m_cNowRealmTime || GameTime::RT_PREPARE_START_15 == m_cNowRealmTime || GameTime::RT_REALM_WAR_END_5 == m_cNowRealmTime) &&
m_dwOldRealmRemainSec - dwRealmRemainSec >= 60)
{
m_dwOldRealmRemainSec = dwRealmRemainSec;
return true;
}
// 국가전 시작 10분은 30초에 한번씩 업데이트
else if (GameTime::RT_PREPARE_START_10 == m_cNowRealmTime && m_dwOldRealmRemainSec - dwRealmRemainSec >= 30)
{
m_dwOldRealmRemainSec = dwRealmRemainSec;
return true;
}
// 국가전 시작 5분은 10초에 한번씩 업데이트
else if (GameTime::RT_PREPARE_START_5 == m_cNowRealmTime && m_dwOldRealmRemainSec - dwRealmRemainSec >= 10)
{
m_dwOldRealmRemainSec = dwRealmRemainSec;
return true;
}
// 공성전 일반 상태와 공성전 상태일때는 5분에 한번씩 업데이트
if ((GameTime::ST_NORMAL == m_cNowSiegeTime || GameTime::ST_SIEGE_WAR == m_cNowSiegeTime ) &&
m_dwOldSiegeRemainSec - dwSiegeRemainSec >= 300)
{
m_dwOldSiegeRemainSec = dwSiegeRemainSec;
return true;
}
// 공성전 시작 5분전, 종료 5분전에는 10초에 한번씩 업데이트
else if ((GameTime::ST_PREPARE_START_5 == m_cNowSiegeTime || GameTime::ST_PREPARE_END_5 == m_cNowSiegeTime) &&
m_dwOldSiegeRemainSec - dwSiegeRemainSec >= 10)
{
m_dwOldSiegeRemainSec = dwSiegeRemainSec;
return true;
}
// 존 진입제한 불가 상태와 가능 상태일때는 5분에 한번씩 업데이트
if ((GameTime::ET_LIMIT == m_cNowEnterTime || GameTime::ET_ALLOWENTER == m_cNowEnterTime ) &&
m_dwOldEnterRemainSec - dwEnterRemainSec >= 300)
{
m_dwOldEnterRemainSec = dwEnterRemainSec;
return true;
}
// 존 진입제한 시작 5분전, 종료 5분전에는 10초에 한번씩 업데이트
else if ((GameTime::ET_PREPARE_START_5 == m_cNowEnterTime || GameTime::ET_PREPARE_END_5 == m_cNowEnterTime) &&
m_dwOldEnterRemainSec - dwEnterRemainSec >= 10)
{
m_dwOldEnterRemainSec = dwEnterRemainSec;
return true;
}
// 게임 이벤트 불가 상태와 이벤트 상태일때는 10초에 한번씩 업데이트
if ( (GameTime::EVENT_NORMAL != m_cNowEventTime) && m_dwOldEventRemainSec - dwEventRemainSec >= 10)
{
m_dwOldEventRemainSec = dwEventRemainSec;
return true;
}
return false;
}
unsigned char CGameTimeMgr::GetDetailMonth(unsigned char cType) const
{
switch (cType)
{
case GameTime::GUILD: return m_GuildDetailTimeInfo.m_cMonth;
case GameTime::REALM: return m_RealmDetailTimeInfo.m_cMonth;
case GameTime::SIEGE: return m_SiegeDetailTimeInfo.m_cMonth;
case GameTime::NEWZONE: return m_EnterDetailTimeInfo.m_cMonth;
case GameTime::EVENT: return m_EventDetailTimeInfo.m_cMonth;
}
return 0;
}
unsigned char CGameTimeMgr::GetDetailDay(unsigned char cType) const
{
switch (cType)
{
case GameTime::GUILD: return m_GuildDetailTimeInfo.m_cDay;
case GameTime::REALM: return m_RealmDetailTimeInfo.m_cDay;
case GameTime::SIEGE: return m_SiegeDetailTimeInfo.m_cDay;
case GameTime::NEWZONE: return m_EnterDetailTimeInfo.m_cDay;
case GameTime::EVENT: return m_EventDetailTimeInfo.m_cDay;
}
return 0;
}
unsigned char CGameTimeMgr::GetDetailHour(unsigned char cType) const
{
switch (cType)
{
case GameTime::GUILD: return m_GuildDetailTimeInfo.m_cHour;
case GameTime::REALM: return m_RealmDetailTimeInfo.m_cHour;
case GameTime::SIEGE: return m_SiegeDetailTimeInfo.m_cHour;
case GameTime::NEWZONE: return m_EnterDetailTimeInfo.m_cHour;
case GameTime::EVENT: return m_EventDetailTimeInfo.m_cHour;
}
return 0;
}
unsigned char CGameTimeMgr::GetDetailMinute(unsigned char cType) const
{
switch (cType)
{
case GameTime::GUILD: return m_GuildDetailTimeInfo.m_cMinute;
case GameTime::REALM: return m_RealmDetailTimeInfo.m_cMinute;
case GameTime::SIEGE: return m_SiegeDetailTimeInfo.m_cMinute;
case GameTime::NEWZONE: return m_EnterDetailTimeInfo.m_cMinute;
case GameTime::EVENT: return m_EventDetailTimeInfo.m_cMinute;
}
return 0;
}
unsigned long CGameTimeMgr::GetDetailRemainSec(unsigned char cType) const
{
// 끝날때까지의 남은 시간을 구하는 것인지 체크
bool bRequestEndTime = false;
CTime nowTime = CTime::GetCurrentTime();
CTime tempTime;
unsigned long dwDuration = 0;
switch (cType)
{
case GameTime::GUILD:
{
if (0 != m_GuildDetailTimeInfo.m_cDay)
{
tempTime = CTime(nowTime.GetYear(), m_GuildDetailTimeInfo.m_cMonth, m_GuildDetailTimeInfo.m_cDay,
m_GuildDetailTimeInfo.m_cHour, m_GuildDetailTimeInfo.m_cMinute, 0);
dwDuration = m_GuildDetailTimeInfo.m_dwDuration;
if (IsGuildWarTime())
bRequestEndTime = true;
}
else
{
return 0;
}
}
break;
case GameTime::REALM:
{
if (0 != m_RealmDetailTimeInfo.m_cDay)
{
tempTime = CTime(nowTime.GetYear(), m_RealmDetailTimeInfo.m_cMonth, m_RealmDetailTimeInfo.m_cDay,
m_RealmDetailTimeInfo.m_cHour, m_RealmDetailTimeInfo.m_cMinute, 0);
dwDuration = m_RealmDetailTimeInfo.m_dwDuration;
if (IsRealmWarTime())
bRequestEndTime = true;
}
else
{
return 0;
}
}
break;
case GameTime::SIEGE:
{
if (0 != m_SiegeDetailTimeInfo.m_cDay)
{
tempTime = CTime(nowTime.GetYear(), m_SiegeDetailTimeInfo.m_cMonth, m_SiegeDetailTimeInfo.m_cDay,
m_SiegeDetailTimeInfo.m_cHour, m_SiegeDetailTimeInfo.m_cMinute, 0);
dwDuration = m_SiegeDetailTimeInfo.m_dwDuration;
if (IsSiegeWarTime())
bRequestEndTime = true;
}
else
{
return 0;
}
}
break;
case GameTime::NEWZONE:
{
if (0 != m_EnterDetailTimeInfo.m_cDay)
{
tempTime = CTime(nowTime.GetYear(), m_EnterDetailTimeInfo.m_cMonth, m_EnterDetailTimeInfo.m_cDay,
m_EnterDetailTimeInfo.m_cHour, m_EnterDetailTimeInfo.m_cMinute, 0);
dwDuration = m_EnterDetailTimeInfo.m_dwDuration;
if (IsEnterTime())
bRequestEndTime = true;
}
else
{
return 0;
}
}
break;
case GameTime::EVENT:
{
if (0 != m_EventDetailTimeInfo.m_cDay)
{
tempTime = CTime(nowTime.GetYear(), m_EventDetailTimeInfo.m_cMonth, m_EventDetailTimeInfo.m_cDay,
m_EventDetailTimeInfo.m_cHour, m_EventDetailTimeInfo.m_cMinute, 0);
dwDuration = m_EventDetailTimeInfo.m_dwDuration;
if (IsEventTime())
bRequestEndTime = true;
}
else
{
return 0;
}
}
break;
}
CTimeSpan tempSpan(tempTime - nowTime);
if (bRequestEndTime)
{
tempSpan += dwDuration * 60;
}
if (tempSpan.GetTimeSpan() > 0)
{
return static_cast<unsigned long>(tempSpan.GetTimeSpan());
}
return 0;
}
bool CGameTimeMgr::IsGuildWarTime() const
{
switch (m_cNowGuildTime)
{
case GameTime::GT_GUILD_WAR:
case GameTime::GT_PREPARE_END_30:
return true;
default:
return false;
}
return false;
}
bool CGameTimeMgr::IsRealmWarTime() const
{
if (GameTime::RT_REALM_WAR == m_cNowRealmTime || GameTime::RT_REALM_WAR_END_5 == m_cNowRealmTime)
return true;
return false;
}
bool CGameTimeMgr::IsSiegeWarTime() const
{
if (GameTime::ST_SIEGE_WAR == m_cNowSiegeTime || GameTime::ST_PREPARE_END_5 == m_cNowSiegeTime)
{
return true;
}
return false;
}
bool CGameTimeMgr::IsEnterTime() const
{
if (GameTime::ET_ALLOWENTER == m_cNowEnterTime || GameTime::ET_PREPARE_END_5 == m_cNowEnterTime)
{
return true;
}
return false;
}
bool CGameTimeMgr::IsEventTime() const
{
if (GameTime::EVENT_NORMAL != m_cNowEventTime)
{
return true;
}
return false;
}
bool CGameTimeMgr::IsGuildWarTime(unsigned char cTime) const
{
switch (cTime)
{
case GameTime::GT_GUILD_WAR:
case GameTime::GT_PREPARE_END_30:
return true;
default:
return false;
}
return false;
}
bool CGameTimeMgr::IsRealmWarTime(unsigned char cTime) const
{
if (GameTime::RT_REALM_WAR == cTime || GameTime::RT_REALM_WAR_END_5 == cTime)
return true;
return false;
}
bool CGameTimeMgr::IsSiegeWarTime(unsigned char cTime) const
{
if (GameTime::ST_SIEGE_WAR == cTime || GameTime::ST_PREPARE_END_5 == cTime)
{
return true;
}
return false;
}
bool CGameTimeMgr::IsEnterTime(unsigned char cTime) const
{
if (GameTime::ET_ALLOWENTER== cTime || GameTime::ET_PREPARE_END_5 == cTime)
{
return true;
}
return false;
}
bool CGameTimeMgr::IsEventTime(unsigned char cTime) const
{
if (GameTime::EVENT_NORMAL != cTime)
{
return true;
}
return false;
}
bool CGameTimeMgr::IsRealmWarReadyTime() const
{
switch (m_cNowRealmTime)
{
case GameTime::RT_PREPARE_START_10:
case GameTime::RT_PREPARE_START_5:
return true;
default:
return false;
}
return false;
}
bool CGameTimeMgr::IsRealmWarReadyTime(unsigned char cTime) const
{
switch (cTime)
{
case GameTime::RT_PREPARE_START_10:
case GameTime::RT_PREPARE_START_5:
return true;
default:
return false;
}
return false;
}

View File

@@ -0,0 +1,104 @@
#ifndef _GAME_TIME_MANAGER_H_
#define _GAME_TIME_MANAGER_H_
#pragma once
#include <Network/Stream/SendStream.h>
class CGameTimeMgr
{
protected:
CGameTimeMgr();
~CGameTimeMgr();
// 다음번 길드전, 렐름전, 공성전의 날짜 및 시간과 전쟁시간 정보 구조체
struct sDetailTimeInfo
{
unsigned char m_cMonth;
unsigned char m_cDay;
unsigned char m_cHour;
unsigned char m_cMinute;
unsigned long m_dwDuration; // (분)
sDetailTimeInfo()
: m_cMonth(0), m_cDay(0), m_cHour(0), m_cMinute(0), m_dwDuration(0)
{
}
sDetailTimeInfo(unsigned char cMonth, unsigned char cDay, unsigned char cHour, unsigned char cMinute, unsigned long dwDuration)
: m_cMonth(cMonth), m_cDay(cDay), m_cHour(cHour), m_cMinute(cMinute), m_dwDuration(dwDuration)
{
}
};
bool CheckNeedUpdate();
public:
bool SendGameTimeInfo(CSendStream& SendStream);
void UpdateGameTimeInfo(); // 모든 클라이언트에게 게임 시간 정보 업데이트(싱크를 맞추기 위해서)
void SetTimeValue(unsigned char cTimeType, unsigned char cTimeValue, unsigned char cMonth, unsigned char cDay,
unsigned char cHour, unsigned char cMinute, unsigned long dwDuration);
unsigned char GetCurrentGameTime(unsigned char cTimeType) const;
unsigned char GetCurrentGuildTime() const;
unsigned char GetCurrentRealmTime() const;
unsigned char GetCurrentSiegeTime() const;
unsigned char GetCurrentEnterTime() const;
// edith 2009.07.21 게임타임 작업물
unsigned char GetCurrentEventTime() const;
unsigned char GetDetailMonth(unsigned char cType) const;
unsigned char GetDetailDay(unsigned char cType) const;
unsigned char GetDetailHour(unsigned char cType) const;
unsigned char GetDetailMinute(unsigned char cType) const;
unsigned long GetDetailRemainSec(unsigned char cType) const;
bool IsGuildWarTime() const;
bool IsRealmWarTime() const;
bool IsSiegeWarTime() const;
bool IsEnterTime() const;
// edith 2009.07.21 게임타임 작업물
bool IsEventTime() const;
bool IsGuildWarTime(unsigned char cTime) const;
bool IsRealmWarTime(unsigned char cTime) const;
bool IsSiegeWarTime(unsigned char cTime) const;
bool IsEnterTime(unsigned char cTime) const;
// edith 2009.07.21 게임타임 작업물
bool IsEventTime(unsigned char cTime) const;
bool IsRealmWarReadyTime() const;
bool IsRealmWarReadyTime(unsigned char cTime) const;
static CGameTimeMgr& GetInstance();
private:
unsigned char m_cNowGuildTime;
unsigned char m_cNowRealmTime;
unsigned char m_cNowSiegeTime;
unsigned char m_cNowEnterTime; // 테섭용 신규존 입장 제한 플래그
// edith 2009.07.21 게임타임 작업물
unsigned char m_cNowEventTime;
sDetailTimeInfo m_GuildDetailTimeInfo;
sDetailTimeInfo m_RealmDetailTimeInfo;
sDetailTimeInfo m_SiegeDetailTimeInfo;
sDetailTimeInfo m_EnterDetailTimeInfo;
// edith 2009.07.21 게임타임 작업물
sDetailTimeInfo m_EventDetailTimeInfo;
unsigned long m_dwOldGuildRemainSec;
unsigned long m_dwOldRealmRemainSec;
unsigned long m_dwOldSiegeRemainSec;
unsigned long m_dwOldEnterRemainSec;
// edith 2009.07.21 게임타임 작업물
unsigned long m_dwOldEventRemainSec;
};
#endif // _GAME_TIME_MANAGER_H_