Files
mir_server/server/LogicServer/entitysystem/CStrengthenSystem.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

514 lines
14 KiB
C++

#include "StdAfx.h"
#include "CStrengthenSystem.h"
bool CStrengthenSystem::Initialize(void* data, size_t size)
{
isInitData = false;
isDataModify = false;
m_nStrengths.clear();
return true;
}
void CStrengthenSystem::OnEnterGame()
{
}
void CStrengthenSystem::SaveToDb()
{
if(!m_pEntity) return;
if(!isInitData) return;
if(!isDataModify) return;
CDataPacket& dataPacket = GetLogicServer()->GetDbClient()->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveActorStrengthenInfo);
dataPacket <<((CActor*)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket <<(unsigned int)m_pEntity->GetId(); //玩家id
size_t count = 0;
int nPos = dataPacket.getPosition();
dataPacket <<(int)count;
strongMapIter it = m_nStrengths.begin();
for(; it != m_nStrengths.end(); it++)
{
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
StrengthInfo& info = v_list[i];
dataPacket <<(int)(it->first);
dataPacket <<(int)(info.nId);
dataPacket <<(int)(info.nLv);
count++;;
}
}
int *Ptr = (int*)dataPacket.getPositionPtr(nPos);
*Ptr = (int)count;
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
isDataModify = false;
}
void CStrengthenSystem::OnDbRetData(INT_PTR nCmd, INT_PTR nErrorCode, CDataPacketReader& packet)
{
if(!m_pEntity) return;
if(nCmd == jxInterSrvComm::DbServerProto::dcLoadActorStrengthenInfo && nErrorCode == jxInterSrvComm::DbServerProto::reSucc) //返回数据
{
int nCount = 0;
packet >> nCount;
m_nStrengths.clear();
for(int i = 0; i < nCount; i++)
{
int nType = 0;
StrengthInfo it;
packet >> nType >>it.nId >> it.nLv;
if(it.nId > 0)
m_nStrengths[nType].push_back(it);
}
}
isInitData = true;
((CActor*)m_pEntity)->OnFinishOneInitStep(eMSG_USR_LOGIN_DATA_STRENGTHEN_SYSTEM); //完成一个步骤
}
void CStrengthenSystem::ProcessNetData(INT_PTR nCmd, CDataPacketReader& packet)
{
switch (nCmd)
{
case cGetStrengthenSystemInfo:
{
GetStrongInfo(packet);
break;
}
case cUpStrengthenSystemInfo:
{
UpStrong(packet);
break;
}
default:
break;
}
}
void CStrengthenSystem::GetStrongInfo(CDataPacketReader& packet) {
if(!m_pEntity) return;
BYTE index = 0;
packet >> index;
strongMapIter it = m_nStrengths.find(index);
CActorPacket ap ;
CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(ap);
data <<(BYTE)GetSystemID()<<(BYTE)sGetStrengthenSystemInfo;
BYTE nCount = 0;
data <<(BYTE)(index);
int pos = data.getPosition();
data <<(BYTE)(nCount);
if(it != m_nStrengths.end()) {
nCount = it->second.size();
if(nCount > 0) {
strongVectorIter iter = it->second.begin();
for(; iter != it->second.end(); iter++)
{
StrengthInfo& info = *iter;
data <<(BYTE)(info.nId);
data <<(int)(info.nLv);
}
}
}
BYTE *pCount = (BYTE *)data.getPositionPtr(pos);
*pCount = (BYTE)nCount;
ap.flush();
}
void CStrengthenSystem::UpStrong(CDataPacketReader& packet)
{
if(!m_pEntity) return;
BYTE nType = 0;
BYTE nPos = 0;
packet >> nType >> nPos;
int nCode = 0;
int nLevel = 0;
int nNowLv = 0;
// StrengthInfo* pInfo = nullptr;
StrengthenInfo* pCfg = nullptr;
do {
//判断当前发送的数据是否存在
int nJob = ((CActor*)m_pEntity)->GetJob();
pCfg = GetLogicServer()->GetDataProvider()->GetStrengthen().getPstrengthenCfg(nType, nPos, 1,nJob);
if(!pCfg) {
nCode = 1;
break;
}
//获取
nNowLv = GetStrongLv(nType, nPos);
// if(!pInfo) { //--不存在就新加
// pInfo = addNewStrongInfo(nType, nPos);
// }
// if(!pInfo)
// {
// nCode = 2;
// break;
// }
//配置
pCfg = GetLogicServer()->GetDataProvider()->GetStrengthen().getPstrengthenCfg(nType, nPos, nNowLv+1,nJob);
if(!pCfg) {
nCode = 3;
break;
}
if(nType == 1)
{
int nNum = m_pEntity->GetStaticCountSystem().GetStaticCount(nSTRENGTHRN_NUM_1);
if (nNum && (pCfg->nId - 1) != nNum)
{
nCode = 7;
break;
}
}
// if(nNowLv != 0)
// {
// StrengthenInfo * pNowCfg = GetLogicServer()->GetDataProvider()->GetStrengthen().getPstrengthenCfg(nType, nPos, nNowLv);
// if(!pNowCfg || (pNowCfg->nId != 0 && (pCfg->nId - pNowCfg->nId > 1 ) ) ) {
// nCode = 7; //异常操作
// break;
// }
// }
if(pCfg->limit.size())
{
for(int i = 0; i < pCfg->limit.size(); i++)
{
StrengthUpLimit& limit = pCfg->limit[i];
if(limit.nPos)
{
if(!CheckStrengthenLv(nType, limit.nPos, limit.nLimitlv) )
{
nCode = 4;
break;
}
}
else
{
if(!((CActor*)m_pEntity)->CheckLevel(limit.nLimitlv, limit.zsLevel))
{
nCode = 5;
break;
}
}
}
}
if(nCode)
break;
if(pCfg->cost.size()) {
for(int i = 0; i < pCfg->cost.size(); i++) {
StrengthCost& cost = pCfg->cost[i];
if(!m_pEntity->CheckActorSource(cost.nType, cost.nId, cost.nCount, tstUI) ) {
nCode = 6;
break;
}
}
}
if(nCode)
break;
int nLogId = GameLog::Log_Strengthen;
if(nType == 2)
nLogId = GameLog::Log_FourStarStrength;
else if(nType == 3)
nLogId = GameLog::Log_CirtRing;
else if(nType == 4)
nLogId = GameLog::Log_DizzyRing;
else if(nType == 5) // 字诀
nLogId = GameLog::Log_Words;
if(pCfg->cost.size()) {
for(int i = 0; i < pCfg->cost.size(); i++) {
StrengthCost& cost = pCfg->cost[i];
m_pEntity->RemoveConsume(cost.nType, cost.nId, cost.nCount, -1, -1,-1,0, nLogId);
}
}
if(strlen(pCfg->nTips) > 0) {
char sText[1024];
sprintf_s(sText, sizeof(sText), pCfg->nTips, ( char *)((CActor*)m_pEntity->GetEntityName()));
GetGlobalLogicEngine()->GetEntityMgr()->BroadcastTipmsg(sText,tstKillDrop);
}
nNowLv++;
SetStrengthenLv(nType, nPos, nNowLv);
((CActor*)m_pEntity)->CollectOperate(CEntityOPCollector::coRefAbility);
isDataModify = true;
int lv = nNowLv;
if(nType == 2)//四象
{
lv = 1;//AddlvByType(nType);
}
((CActor*)m_pEntity)->GetAchieveSystem().ActorAchievementComplete(nAchieveStrengthenLv, lv, nType);
if(nType == 1)
{
m_pEntity->GetStaticCountSystem().SetStaticCount(nSTRENGTHRN_NUM_1, pCfg->nId);
}
} while (false);
CActorPacket ap ;
CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(ap);
data <<(BYTE)GetSystemID()<<(BYTE)sUpStrengthenSystemInfo ;
data <<(BYTE)(nCode);
data <<(BYTE)(nType);
data <<(BYTE)(nPos);
data <<(int)(nNowLv);
ap.flush();
}
StrengthInfo* CStrengthenSystem::GetStrongPtrInfo(int nType, int nPos) {
strongMapIter it = m_nStrengths.find(nType);
if(it != m_nStrengths.end()) {
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
if(v_list[i].nId == nPos)
return &v_list[i];
}
}
return NULL;
}
int CStrengthenSystem::GetStrongLv(int nType, int nPos) {
strongMapIter it = m_nStrengths.find(nType);
if(it != m_nStrengths.end()) {
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
if(v_list[i].nId == nPos)
return v_list[i].nLv;
}
}
return 0;
}
bool CStrengthenSystem::CheckStrengthenLv(int nType, int nPos, int nLv) {
strongMapIter it = m_nStrengths.find(nType);
if(it != m_nStrengths.end()) {
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
if(v_list[i].nId == nPos && v_list[i].nLv >= nLv)
return true;
}
}
return false;
}
void CStrengthenSystem::SetStrengthenLv(int nType, int nPos, int nLv) {
strongMapIter it = m_nStrengths.find(nType);
StrengthInfo info;
info.nLv = nLv;
info.nId = nPos;
bool isNew = true;
if(it != m_nStrengths.end()) {
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
if(v_list[i].nId == nPos)
{
v_list[i].nLv = nLv;
isNew = false;
}
}
if(isNew)
it->second.push_back(info);
}
else
{
m_nStrengths[nType].push_back(info);
}
}
VOID CStrengthenSystem::CalcAttributes(CAttrCalc &calc)
{
if(m_pEntity ==NULL) return ;
GAMEATTR attr;
strongMapIter it = m_nStrengths.begin();
int nJob = ((CActor*)m_pEntity)->GetJob();
for(; it != m_nStrengths.end(); it++)
{
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
StrengthInfo& info = v_list[i];
StrengthenInfo* pCfg = GetLogicServer()->GetDataProvider()->GetStrengthen().getPstrengthenCfg(it->first, info.nId, info.nLv,nJob);
if(pCfg) {
for(int i = 0; i < pCfg->attri.nCount; i++)
{
calc << pCfg->attri.pAttrs[i];
}
}
}
}
}
VOID CStrengthenSystem::returnStrongInfo(CDataPacket &data)
{
data <<(BYTE)(m_nStrengths.size());
strongMapIter it = m_nStrengths.begin();
for(; it != m_nStrengths.end(); it++)
{
std::vector<StrengthInfo>& v_list = it->second;
data <<(BYTE)(it->first);
data <<(BYTE)(v_list.size());
for(int i = 0; i < v_list.size(); i++)
{
StrengthInfo& info = v_list[i];
data<<(BYTE)(info.nId);
data<<(int)(info.nLv);
}
}
}
bool CStrengthenSystem::checkCanUPStrengthenLv(int nType, int nLv) {
if(nLv == 0)
return true;
strongMapIter it = m_nStrengths.find(nType);
int Lv = 0;
if(it != m_nStrengths.end()) {
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
if(v_list[i].nLv < nLv)
return false;
}
return true;
}
return false;
}
int CStrengthenSystem::AddlvByType(int nType) {
strongMapIter it = m_nStrengths.find(nType);
int Lv = 0;
// int sub = 1;
// if(nType == 2)
// sub = 30;
if(it != m_nStrengths.end()) {
std::vector<StrengthInfo>& v_list = it->second;
for(int i = 0; i < v_list.size(); i++)
{
Lv += v_list[i].nLv;
}
}
return Lv;
}
//跨服数据
void CStrengthenSystem::SendMsg2CrossServer(int nType)
{
if(m_pEntity ==NULL) return;
CLocalCrossClient *pCrossClient = GetLogicServer()->GetCrossClient();
CDataPacket &packet = pCrossClient->allocProtoPacket(jxInterSrvComm::CrossServerProto::cSendCrossData);
int nServerId = GetLogicServer()->GetCrossServerId();
unsigned int nActorID = m_pEntity->GetId();
OutputMsg(rmTip,_T("[CrossLogin 8] SendMsg2CrossServer type:%d nActorID:%d "),nType,nActorID);
packet << nServerId << nActorID;
packet <<(BYTE)nType;
packet << m_pEntity->GetCrossActorId();
packet << m_pEntity->GetAccountID();
//数据
size_t count = 0;
int pos = packet.getPosition();
packet << (int)count ; //玩家物品的数量
for(auto it : m_nStrengths) {
for(auto ik : it.second) {
packet << (int)it.first;
packet << (int)ik.nId;
packet << (int)ik.nLv;
count++;
}
}
int *Ppos = (int*)packet.getPositionPtr(pos);
*Ppos = count;
pCrossClient->flushProtoPacket(packet);
}
void CStrengthenSystem::OnCrossInitData(std::map<int, std::vector<StrengthInfo> >& nStrengths)
{
if(!m_pEntity) return;
{
int nCount = nStrengths.size();
// packet >> nCount;
m_nStrengths.clear();
// for(int i = 0; i < nCount; i++)
// {
// int nType = 0;
// StrengthInfo it;
// packet >> nType >>it.nId >> it.nLv;
// if(it.nId > 0)
// m_nStrengths[nType].push_back(it);
// }
for(auto& Values: nStrengths) {
for(auto info : Values.second) {
if(info.nId > 0)
m_nStrengths[Values.first].push_back(info);
OutputMsg(rmTip,_T("OnCrossInitData CStrengthenSystem nActorID:%d nId:%d,nLv:%d"),
m_pEntity->GetId(),info.nId,info.nLv);
}
}
}
isInitData = true;
isDataModify = true;
((CActor*)m_pEntity)->OnCrossFinishOneInitStep(MSG_CSTRENGTH); //完成一个步骤
}