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

308 lines
7.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "constants.h"
#include "priv_manager.h"
#include "char.h"
#include "desc_client.h"
#include "guild.h"
#include "guild_manager.h"
#include "unique_item.h"
#include "utils.h"
#include "log.h"
static const char * GetEmpireName(int priv)
{
return LC_TEXT(c_apszEmpireNames[priv]);
}
static const char * GetPrivName(int priv)
{
return LC_TEXT(c_apszPrivNames[priv]);
}
CPrivManager::CPrivManager()
{
memset(m_aakPrivEmpireData, 0, sizeof(m_aakPrivEmpireData));
}
void CPrivManager::RequestGiveGuildPriv(DWORD guild_id, BYTE type, int value, time_t duration_sec)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: RequestGiveGuildPriv: wrong guild priv type(%u)", type);
return;
}
value = MINMAX(0, value, 50);
duration_sec = MINMAX(0, duration_sec, 60*60*24*7);
TPacketGiveGuildPriv p;
p.type = type;
p.value = value;
p.guild_id = guild_id;
p.duration_sec = duration_sec;
db_clientdesc->DBPacket(HEADER_GD_REQUEST_GUILD_PRIV, 0, &p, sizeof(p));
}
void CPrivManager::RequestGiveEmpirePriv(BYTE empire, BYTE type, int value, time_t duration_sec)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: RequestGiveEmpirePriv: wrong empire priv type(%u)", type);
return;
}
value = MINMAX(0, value, 200);
duration_sec = MINMAX(0, duration_sec, 60*60*24*7);
TPacketGiveEmpirePriv p;
p.type = type;
p.value = value;
p.empire = empire;
p.duration_sec = duration_sec;
db_clientdesc->DBPacket(HEADER_GD_REQUEST_EMPIRE_PRIV, 0, &p, sizeof(p));
}
void CPrivManager::RequestGiveCharacterPriv(DWORD pid, BYTE type, int value)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: RequestGiveCharacterPriv: wrong char priv type(%u)", type);
return;
}
value = MINMAX(0, value, 100);
TPacketGiveCharacterPriv p;
p.type = type;
p.value = value;
p.pid = pid;
db_clientdesc->DBPacket(HEADER_GD_REQUEST_CHARACTER_PRIV, 0, &p, sizeof(p));
}
void CPrivManager::GiveGuildPriv(DWORD guild_id, BYTE type, int value, BYTE bLog, time_t end_time_sec)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: GiveGuildPriv: wrong guild priv type(%u)", type);
return;
}
sys_log(0,"Set Guild Priv: guild_id(%u) type(%d) value(%d) duration_sec(%d)", guild_id, type, value, end_time_sec - get_global_time());
value = MINMAX(0, value, 50);
end_time_sec = MINMAX(0, end_time_sec, get_global_time()+60*60*24*7);
m_aPrivGuild[type][guild_id].value = value;
m_aPrivGuild[type][guild_id].end_time_sec = end_time_sec;
CGuild* g = CGuildManager::instance().FindGuild(guild_id);
if (g)
{
if (value)
{
char buf[100];
snprintf(buf, sizeof(buf), LC_TEXT("%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s<><73> %d%% <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>!"), g->GetName(), GetPrivName(type), value);
SendNotice(buf);
}
else
{
char buf[100];
snprintf(buf, sizeof(buf), LC_TEXT("%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s<><73> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԽ<C6BF><D4BD>ϴ<EFBFBD>."), g->GetName(), GetPrivName(type));
SendNotice(buf);
}
if (bLog)
{
LogManager::instance().CharLog(0, guild_id, type, value, "GUILD_PRIV", "", "");
}
}
}
void CPrivManager::GiveCharacterPriv(DWORD pid, BYTE type, int value, BYTE bLog)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: GiveCharacterPriv: wrong char priv type(%u)", type);
return;
}
sys_log(0,"Set Character Priv %u %d %d", pid, type, value);
value = MINMAX(0, value, 100);
m_aPrivChar[type][pid] = value;
if (bLog)
LogManager::instance().CharLog(pid, 0, type, value, "CHARACTER_PRIV", "", "");
}
void CPrivManager::GiveEmpirePriv(BYTE empire, BYTE type, int value, BYTE bLog, time_t end_time_sec)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: GiveEmpirePriv: wrong empire priv type(%u)", type);
return;
}
sys_log(0, "Set Empire Priv: empire(%d) type(%d) value(%d) duration_sec(%d)", empire, type, value, end_time_sec-get_global_time());
value = MINMAX(0, value, 200);
end_time_sec = MINMAX(0, end_time_sec, get_global_time()+60*60*24*7);
SPrivEmpireData& rkPrivEmpireData=m_aakPrivEmpireData[type][empire];
rkPrivEmpireData.m_value = value;
rkPrivEmpireData.m_end_time_sec = end_time_sec;
if (value)
{
char buf[100];
snprintf(buf, sizeof(buf), LC_TEXT("%s<><73> %s<><73> %d%% <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>!"), GetEmpireName(empire), GetPrivName(type), value);
if (empire)
SendNotice(buf);
else
SendLog(buf);
}
else
{
char buf[100];
snprintf(buf, sizeof(buf), LC_TEXT("%s<><73> %s<><73> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԽ<C6BF><D4BD>ϴ<EFBFBD>."), GetEmpireName(empire), GetPrivName(type));
if (empire)
SendNotice(buf);
else
SendLog(buf);
}
if (bLog)
{
LogManager::instance().CharLog(0, empire, type, value, "EMPIRE_PRIV", "", "");
}
}
void CPrivManager::RemoveGuildPriv(DWORD guild_id, BYTE type)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: RemoveGuildPriv: wrong guild priv type(%u)", type);
return;
}
m_aPrivGuild[type][guild_id].value = 0;
m_aPrivGuild[type][guild_id].end_time_sec = 0;
}
void CPrivManager::RemoveEmpirePriv(BYTE empire, BYTE type)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: RemoveEmpirePriv: wrong empire priv type(%u)", type);
return;
}
SPrivEmpireData& rkPrivEmpireData=m_aakPrivEmpireData[type][empire];
rkPrivEmpireData.m_value = 0;
rkPrivEmpireData.m_end_time_sec = 0;
}
void CPrivManager::RemoveCharacterPriv(DWORD pid, BYTE type)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: RemoveCharacterPriv: wrong char priv type(%u)", type);
return;
}
itertype(m_aPrivChar[type]) it = m_aPrivChar[type].find(pid);
if (it != m_aPrivChar[type].end())
m_aPrivChar[type].erase(it);
}
int CPrivManager::GetPriv(LPCHARACTER ch, BYTE type)
{
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> -<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -<2D><> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>
int val_ch = GetPrivByCharacter(ch->GetPlayerID(), type);
if (val_ch < 0 && !ch->IsEquipUniqueItem(UNIQUE_ITEM_NO_BAD_LUCK_EFFECT))
return val_ch;
else
{
int val;
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><>ü <20><> ū <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
val = MAX(val_ch, GetPrivByEmpire(0, type));
val = MAX(val, GetPrivByEmpire(ch->GetEmpire(), type));
if (ch->GetGuild())
val = MAX(val, GetPrivByGuild(ch->GetGuild()->GetID(), type));
return val;
}
}
int CPrivManager::GetPrivByEmpire(BYTE bEmpire, BYTE type)
{
SPrivEmpireData* pkPrivEmpireData = GetPrivByEmpireEx(bEmpire, type);
if (pkPrivEmpireData)
return pkPrivEmpireData->m_value;
return 0;
}
CPrivManager::SPrivEmpireData* CPrivManager::GetPrivByEmpireEx(BYTE bEmpire, BYTE type)
{
if (type >= MAX_PRIV_NUM)
return NULL;
if (bEmpire >= EMPIRE_MAX_NUM)
return NULL;
return &m_aakPrivEmpireData[type][bEmpire];
}
int CPrivManager::GetPrivByGuild(DWORD guild_id, BYTE type)
{
if (type >= MAX_PRIV_NUM)
return 0;
itertype( m_aPrivGuild[ type ] ) itFind = m_aPrivGuild[ type ].find( guild_id );
if ( itFind == m_aPrivGuild[ type ].end() )
return 0;
return itFind->second.value;
}
const CPrivManager::SPrivGuildData* CPrivManager::GetPrivByGuildEx( DWORD dwGuildID, BYTE byType ) const
{
if ( byType >= MAX_PRIV_NUM )
return NULL;
itertype( m_aPrivGuild[ byType ] ) itFind = m_aPrivGuild[ byType ].find( dwGuildID );
if ( itFind == m_aPrivGuild[ byType ].end() )
return NULL;
return &itFind->second;
}
int CPrivManager::GetPrivByCharacter(DWORD pid, BYTE type)
{
if (type >= MAX_PRIV_NUM)
return 0;
itertype(m_aPrivChar[type]) it = m_aPrivChar[type].find(pid);
if (it != m_aPrivChar[type].end())
return it->second;
return 0;
}