server/game/src/monarch.cpp
2022-03-05 12:44:06 +02:00

276 lines
5.9 KiB
C++

#include "stdafx.h"
#include "constants.h"
#include "monarch.h"
#include "char.h"
#include "sectree_manager.h"
#include "desc_client.h"
#include "dev_log.h"
extern int test_server;
extern int passes_per_sec;
CMonarch::CMonarch()
{
memset( &m_MonarchInfo, 0, sizeof(m_MonarchInfo) );
Initialize();
}
CMonarch::~CMonarch()
{
}
bool CMonarch::Initialize()
{
memset(m_PowerUp, 0, sizeof(m_PowerUp));
memset(m_DefenseUp, 0, sizeof(m_DefenseUp));
memset(m_PowerUpCT, 0, sizeof(m_PowerUpCT));
memset(m_DefenseUpCT, 0, sizeof(m_DefenseUpCT));
return 0;
}
struct FHealMyEmpire
{
BYTE m_bEmpire;
void operator () (LPENTITY ent)
{
if (ent->IsType(ENTITY_CHARACTER))
{
LPCHARACTER ch = (LPCHARACTER) ent;
if (ch->IsPC() && m_bEmpire == ch->GetEmpire())
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("군주가 내린 축복으로 모든 에너지가 가득 채워집니다"));
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
ch->EffectPacket(SE_SPUP_BLUE);
ch->EffectPacket(SE_HPUP_RED);
}
}
}
};
int CMonarch::HealMyEmpire(LPCHARACTER ch ,DWORD price)
{
BYTE Empire = ch->GetEmpire();
DWORD pid = ch->GetPlayerID();
sys_log(0, "HealMyEmpire[%d] pid:%d price %d", pid, Empire, price);
if (IsMonarch(pid, Empire) == 0)
{
if (!ch->IsGM())
{
ch->ChatPacket(CHAT_TYPE_INFO ,LC_TEXT("군주의 자격을 가지고 있지 않습니다"));
sys_err("No Monarch pid %d ", pid);
return 0;
}
}
if (!ch->IsMCOK(CHARACTER::MI_HEAL))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%d 초 후에 군주의 축복을 사용할 수 있습니다"), ch->GetMCLTime(CHARACTER::MI_HEAL));
return 0;
}
if (!IsMoneyOk(price, Empire))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("국고에 돈이 부족합니다. 현재 : %u 필요금액 : %u"), GetMoney(Empire), price);
return 0;
}
int iMapIndex = ch->GetMapIndex();
FHealMyEmpire f;
f.m_bEmpire = Empire;
SECTREE_MANAGER::instance().for_each(iMapIndex, f);
// DB에 돈 삭감 보내기
SendtoDBDecMoney(price, Empire, ch);
// 쿨타임 설정
ch->SetMC(CHARACTER::MI_HEAL);
if (test_server)
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[TEST_ONLY]현재 국고 : %d "), GetMoney(Empire) - price);
return 1;
}
void CMonarch::SetMonarchInfo(TMonarchInfo * pInfo)
{
memcpy(&m_MonarchInfo, pInfo, sizeof(TMonarchInfo));
}
bool CMonarch::IsMonarch(DWORD pid, BYTE bEmpire)
{
if (bEmpire >= _countof(m_MonarchInfo.pid))
return false;
return (m_MonarchInfo.pid[bEmpire] == pid);
}
bool CMonarch::IsMoneyOk(int price, BYTE bEmpire)
{
dev_log(LOG_DEB1, "GetMoney(%d), price = (%d,%d)", bEmpire, GetMoney(bEmpire), price);
return (GetMoney(bEmpire) >= price);
}
bool CMonarch::SendtoDBAddMoney(int Money, BYTE bEmpire, LPCHARACTER ch)
{
if (GetMoney(bEmpire) + Money > 2000000000)
return false;
if (GetMoney(bEmpire) + Money < 0)
return false;
int nEmpire = bEmpire;
db_clientdesc->DBPacketHeader(HEADER_GD_ADD_MONARCH_MONEY, ch->GetDesc()->GetHandle(), sizeof(int) + sizeof(int));
db_clientdesc->Packet(&nEmpire, sizeof(int));
db_clientdesc->Packet(&Money, sizeof(int));
return true;
}
bool CMonarch::SendtoDBDecMoney(int Money, BYTE bEmpire, LPCHARACTER ch)
{
if (bEmpire >= _countof(m_MonarchInfo.money))
return false;
if (GetMoney(bEmpire) - Money < 0)
return false;
// 실제 줄이는 부분은 서버에 갔다 온 다음에 처리된다
int nEmpire = bEmpire;
db_clientdesc->DBPacketHeader(HEADER_GD_DEC_MONARCH_MONEY, ch->GetDesc()->GetHandle(), sizeof(int) + sizeof(int));
db_clientdesc->Packet(&nEmpire, sizeof(int));
db_clientdesc->Packet(&Money, sizeof(int));
return true;
}
bool CMonarch::AddMoney(int Money, BYTE bEmpire)
{
if (bEmpire >= _countof(m_MonarchInfo.money))
return false;
// 20억 이상 입금 불가능
if (GetMoney(bEmpire) + Money > 2000000000)
return false;
m_MonarchInfo.money[bEmpire] += Money;
return true;
}
bool CMonarch::DecMoney(int Money, BYTE bEmpire)
{
if (bEmpire >= _countof(m_MonarchInfo.money))
return false;
if (GetMoney(bEmpire) - Money < 0)
return false;
m_MonarchInfo.money[bEmpire] -= Money;
return true;
}
int CMonarch::GetMoney(BYTE bEmpire)
{
if (bEmpire >= _countof(m_MonarchInfo.money))
return 0;
return m_MonarchInfo.money[bEmpire];
}
TMonarchInfo* CMonarch::GetMonarch()
{
return &m_MonarchInfo;
}
DWORD CMonarch::GetMonarchPID(BYTE Empire)
{
return Empire < _countof(m_MonarchInfo.pid) ? m_MonarchInfo.pid[Empire] : 0;
}
bool CMonarch::IsPowerUp(BYTE Empire)
{
return Empire < _countof(m_PowerUp) ? m_PowerUp[Empire] : false;
}
bool CMonarch::IsDefenceUp(BYTE Empire)
{
return Empire < _countof(m_DefenseUp) ? m_DefenseUp[Empire] : false;
}
bool CMonarch::CheckPowerUpCT(BYTE Empire)
{
if (Empire >= _countof(m_PowerUpCT))
return false;
if (m_PowerUpCT[Empire] > thecore_pulse())
{
if (test_server)
sys_log(0, "[TEST_ONLY] : CheckPowerUpCT CT%d Now%d 60sec %d", m_PowerUpCT[Empire], thecore_pulse(), PASSES_PER_SEC(60 * 10));
return false;
}
return true;
}
bool CMonarch::CheckDefenseUpCT(BYTE Empire)
{
if (Empire >= _countof(m_DefenseUpCT))
return false;
if (m_DefenseUpCT[Empire] > thecore_pulse())
{
if (test_server)
sys_log(0, "[TEST_ONLY] : CheckPowerUpCT CT%d Now%d 60sec %d", m_PowerUpCT[Empire], thecore_pulse(), PASSES_PER_SEC(60 * 10));
return false;
}
return true;
}
void CMonarch::PowerUp(BYTE Empire, bool On)
{
if (Empire >= _countof(m_PowerUpCT))
return;
m_PowerUp[Empire] = On;
// 군주 사자후 쿨타임
m_PowerUpCT[Empire] = thecore_pulse() + PASSES_PER_SEC(60 * 10);
}
void CMonarch::DefenseUp(BYTE Empire, bool On)
{
if (Empire >= _countof(m_DefenseUpCT))
return;
m_DefenseUp[Empire] = On;
// 군주 금강권 쿨타임
m_DefenseUpCT[Empire] = thecore_pulse() + PASSES_PER_SEC(60 * 10);
}
bool IsMonarchWarpZone (int map_idx)
{
// 아귀동굴, 천의동굴.
if (map_idx >= 10000)
map_idx /= 10000;
switch (map_idx)
{
case 301:
case 302:
case 303:
case 304:
//던전
case 351: // 적룡성
case 352: // 백룡지성
return false;
}
return (map_idx != 208 && map_idx != 216 && map_idx != 217);
}