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

577 lines
14 KiB
C++

#include "StdAfx.h"
#include "AlmirahSystem.h"
#include "../base/Container.hpp"
CAlmirahSystem::CAlmirahSystem(void)
{
}
CAlmirahSystem::~CAlmirahSystem(void)
{
}
void CAlmirahSystem::ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet )
{
if(!m_pEntity) return;
switch(nCmd)
{
case cTakeOnAndOff:
{
int nModelId = 0;
packet >> nModelId;
byte state = 0;
packet >> state;
SetTakeon(nModelId, state);
}
break;
case cGetInfo:
{
OnSendInitData();
}
break;
case cActivation:
{
int nModelId = 0;
packet >> nModelId;
ActivationAlmirah(nModelId);
break;
}
case cUpdateFashion:
{
int nModelId = 0;
packet >> nModelId;
UpGradeFashion(nModelId);
break;
}
default:
break;
}
}
void CAlmirahSystem::UpGradeFashion(int nModleId)
{
if(!m_pEntity) return;
int error = 0;
int nLv = 1;
do
{
if(!GetActivation(nModleId))
{
error = 1;
break;
}
nLv = GetFashionLv(nModleId);
tagFashionAttribute* actCfg = GetLogicServer()->GetDataProvider()->GetFashionConfig().getFashionUpdate(nModleId,nLv);
if(!actCfg)
{
error = 2;
break;
}
tagFashionAttribute* nextCfg = GetLogicServer()->GetDataProvider()->GetFashionConfig().getFashionUpdate(nModleId,nLv+1);
if(!nextCfg)
{
error = 3;
break;
}
if(nextCfg->cost.size())
{
for(int i = 0; i < nextCfg->cost.size(); i++)
{
if(!((CActor*)m_pEntity)->CheckActorSource(nextCfg->cost[i].nType, nextCfg->cost[i].nId, nextCfg->cost[i].nCount, tstUI) )
{
error = 4;
break ;
}
}
}
if(error)
break;
if(nextCfg->cost.size())
{
for(int i = 0; i < nextCfg->cost.size(); i++)
{
((CActor*)m_pEntity)->RemoveConsume(nextCfg->cost[i].nType, nextCfg->cost[i].nId, nextCfg->cost[i].nCount, -1, -1, -1, 0,GameLog::Log_Fashion);
}
}
nLv += 1;
UpdateFashion(nModleId,nLv);
//需要重新计算属性
((CActor*)m_pEntity)->CollectOperate(CEntityOPCollector::coRefAbility);
// 更新升级后的血、蓝
} while (false);
CActorPacket ap;
CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(ap);
data <<(BYTE)GetSystemID() << (BYTE)sUpdateFashion;
data << (BYTE)error;
data <<(int)nModleId;
data <<(int)nLv;
ap.flush();
}
void CAlmirahSystem::Save(PACTORDBDATA pData)
{
if(m_pEntity ==NULL) return;
if (!HasDataModified())
{
return;
}
CDataClient * pDb = GetLogicServer()->GetDbClient();
if (!pDb->connected())
{
return;
}
CDataPacket& dataPacket = pDb->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveAlmirahItem);
dataPacket << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
dataPacket <<(unsigned int ) m_pEntity->GetId(); //玩家ID
WORD nCount = (WORD)m_cAlmirahLists.count();
dataPacket << (WORD)nCount;
for (INT_PTR i = 0; i < nCount; i++)
{
CAlmirahItem & oneItem = m_cAlmirahLists[i];
dataPacket << (WORD)oneItem.nModelId;
dataPacket << (byte)oneItem.btTakeOn;
dataPacket << (int)oneItem.nLv;
}
pDb->flushProtoPacket(dataPacket);
SetDataModifyFlag(false);
}
void CAlmirahSystem::OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader )
{
if(m_pEntity ==NULL)
{
OutputMsg(rmError,_T("装载玩家衣橱的数据出错,实体指针为MULL"));
return;
}
//装载物品数据
if(nCmd == jxInterSrvComm::DbServerProto::dcLoadAlmirahItem && nErrorCode == jxInterSrvComm::DbServerProto::reSucc) //返回物品的列表
{
WORD nCount =0;
reader >> nCount;
m_cAlmirahLists.clear();
CAlmirahItem oneItem;
for (WORD i = 0; i < nCount; i++)
{
reader >> oneItem.nModelId;
reader >> oneItem.nLv;
reader >> oneItem.btTakeOn;
m_cAlmirahLists.add(oneItem);
// if(oneItem.btTakeOn == 1)
// {
// ((CActor*)m_pEntity)->SetProperty<unsigned int>(PROP_ACTOR_SOLDIERSOULAPPEARANCE,oneItem.nModelId);
// }
}
OnDbInitData(); //DB加载好了
}
else if(nCmd == jxInterSrvComm::DbServerProto::dcLoadAlmirahItem && nErrorCode != jxInterSrvComm::DbServerProto::reSucc)
{
OutputMsg(rmError,_T("装载玩家[%s]的衣橱的数据出错,actorid=%u"),((CActor*)m_pEntity)->GetEntityName(),m_pEntity->GetId());
((CActor*)m_pEntity)->CloseActor(lwiAlmirahDbFail, false); //如果装载装备的数据出错就踢出
}
}
void CAlmirahSystem::OnSendInitData()
{
if(!m_pEntity) return;
byte nSystemId = (byte)GetSystemID();
byte count = (byte)m_cAlmirahLists.count();
CActorPacket pack;
CDataPacket & netPack = m_pEntity->AllocPacket(pack);
netPack << nSystemId << (byte)sSendInfo;
netPack << (byte)count;
for (INT_PTR i = 0; i < count; i++)
{
CAlmirahItem & oneItem = m_cAlmirahLists[i];
netPack << (int)oneItem.nModelId;
netPack << (BYTE)oneItem.btTakeOn;
netPack << (int)oneItem.nLv;
}
pack.flush();
}
CAttrCalc& CAlmirahSystem::CalcAttr(CAttrCalc &calc)
{
if(m_pEntity == NULL)
return calc;
INT_PTR nCount = m_cAlmirahLists.count();
for(INT_PTR i=0; i<nCount; i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
tagFashionAttribute* cfg = GetLogicServer()->GetDataProvider()->GetFashionConfig().getFashionUpdate(stAlmirahItem.nModelId, stAlmirahItem.nLv);
if(cfg)
{
for(int j = 0; j < cfg->attri.nCount; j++)
{
calc << cfg->attri.pAttrs[j];
}
}
}
return calc;
}
bool CAlmirahSystem::SetActivation(int nModleId)
{
// INT_PTR nCount = m_WingItem.count();
// byte nState = 1;
// byte nSystemId = (byte)GetSystemID();
// for(INT_PTR i=0; i<nCount; i++)
// {
// CAlmirahItem& stAlmirahItem = m_WingItem[i];
// if( stAlmirahItem.nModelId == nModleId )
// {
// SetDataModifyFlag(true); //数据修改过了
// CActorPacket pack;
// CDataPacket & netPack = m_pEntity->AllocPacket(pack);
// netPack << nSystemId << (byte)sActivation;
// netPack << (WORD)nModleId;
// netPack << nState;
// pack.flush();
// return true;
// }
// }
return false;
}
bool CAlmirahSystem::GetActivation(int nModleId)
{
INT_PTR nCount = m_cAlmirahLists.count();
for(INT_PTR i=0; i<nCount; i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
if( stAlmirahItem.nModelId == nModleId )
{
return true;
}
}
return false;
}
bool CAlmirahSystem::SetTakeon(int nModleId, byte nState)
{
if(m_pEntity ==NULL)
return false;
if(nState < 0 || 1 < nState)
return false;
CFashionCfg& Cfg = GetLogicServer()->GetDataProvider()->GetFashionConfig();
FashionActive* actCfg = Cfg.getFashionActive(nModleId);
if(!actCfg)
return false;
if(nState == 1)
{
if(Cfg.takeofflist.find(actCfg->nType) != Cfg.takeofflist.end()) {
std::set<int> takeOff(Cfg.takeofflist[actCfg->nType].begin(), Cfg.takeofflist[actCfg->nType].end());
TakeOffAlmirah(takeOff);
}
}
for(INT_PTR i=0; i<m_cAlmirahLists.count(); i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
// FashionActive* Cfg = Cfg.getFashionActive(stAlmirahItem.nModelId);
// if(!Cfg)
// continue;
if( stAlmirahItem.nModelId == nModleId )
{
stAlmirahItem.btTakeOn = nState;
}
// if(Cfg->nType == actCfg->nType && stAlmirahItem.nModelId != nModleId && stAlmirahItem.btTakeOn == 1)
// {
// stAlmirahItem.btTakeOn = 0;
// }
}
byte nSystemId = (byte)GetSystemID();
CActorPacket pack;
CDataPacket & netPack = m_pEntity->AllocPacket(pack);
netPack << nSystemId << (byte)sTakeOnAndOff;
netPack << (int)nModleId;
netPack << nState;
netPack << (BYTE) actCfg->nType;
pack.flush();
if(nState == 0)
{
nModleId = 0;
}
((CActor*)m_pEntity)->GetEquipmentSystem().RefreshAppear(); //刷外观
m_pEntity->CollectOperate(CEntityOPCollector::coRefAbility);
// 更新升级后的血、蓝
// if(actCfg->nType == 1)//衣服
// {
// ((CActor*)m_pEntity)->SetProperty<unsigned int>(PROP_ACTOR_SOLDIERSOULAPPEARANCE,nModleId);
// }
// else if(actCfg->nType == 2)//武器
// {
// ((CActor*)m_pEntity)->SetProperty<unsigned int>(PROP_ACTOR_WEAPONAPPEARANCE,nModleId);
// }
SetDataModifyFlag(true); //数据修改过了
// OnSendInitData();
return false;
}
int CAlmirahSystem::GetNowModeId()
{
INT_PTR nCount = m_cAlmirahLists.count();
for(INT_PTR i=0; i<nCount; i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
if( stAlmirahItem.btTakeOn == 1 )
{
return stAlmirahItem.nModelId;
}
}
return 0;
}
int CAlmirahSystem::GetFashionLv(int nModeId)
{
INT_PTR nCount = m_cAlmirahLists.count();
for(INT_PTR i=0; i<nCount; i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
if( stAlmirahItem.nModelId == nModeId )
{
return m_cAlmirahLists[i].nLv;
}
}
return 0;
}
void CAlmirahSystem::ActivationAlmirah(int nModleId)
{
if(!m_pEntity) return;
int error = 0;
int nWear = 0;
int nType = 0;
do
{
if(GetActivation(nModleId))
{
error = 1;
break;
}
CFashionCfg& Cfg = GetLogicServer()->GetDataProvider()->GetFashionConfig();
FashionActive* actCfg = Cfg.getFashionActive(nModleId);
if(!actCfg)
{
error = 2;
break;
}
if(actCfg->cost.size())
{
for(int i = 0; i < actCfg->cost.size(); i++)
{
if(!((CActor*)m_pEntity)->CheckActorSource(actCfg->cost[i].nType, actCfg->cost[i].nId, actCfg->cost[i].nCount, tstUI) )
{
error = 3;
break ;
}
}
}
if(error)
break;
if(actCfg->cost.size())
{
for(int i = 0; i < actCfg->cost.size(); i++)
{
((CActor*)m_pEntity)->RemoveConsume(actCfg->cost[i].nType, actCfg->cost[i].nId, actCfg->cost[i].nCount, -1, -1, -1, 0,GameLog::Log_Fashion);
}
}
if(actCfg->nWear)
{
if(Cfg.takeofflist.find(actCfg->nType) != Cfg.takeofflist.end()) {
std::set<int> takeOff(Cfg.takeofflist[actCfg->nType].begin(), Cfg.takeofflist[actCfg->nType].end());
TakeOffAlmirah(takeOff);
}
// for(INT_PTR i=0; i<m_cAlmirahLists.count(); i++)
// {
// CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
// // FashionActive* Cfg = Cfg.getFashionActive(stAlmirahItem.nModelId);
// // if(!Cfg)
// // continue;
// if(Cfg->nType == actCfg->nType && stAlmirahItem.btTakeOn == 1)
// {
// stAlmirahItem.btTakeOn = 0;
// }
// }
}
nWear = AddNewFashion(nModleId,actCfg->nWear);
nType = actCfg->nType ;
if(actCfg->nWear)
{
((CActor*)m_pEntity)->GetEquipmentSystem().RefreshAppear(); //刷外观
m_pEntity->CollectOperate(CEntityOPCollector::coRefAbility);
// 更新升级后的血、蓝
}
} while (false);
CActorPacket ap;
CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(ap);
data <<(BYTE)GetSystemID() << (BYTE)sActivation;
data << (BYTE)error;
data <<(int)nModleId;
data <<(BYTE)nWear;
data <<(BYTE)nType;
ap.flush();
}
int CAlmirahSystem::AddNewFashion(int nModelId, int nWear)
{
SetDataModifyFlag(true);
CAlmirahItem oneItem;
oneItem.nModelId = nModelId;
oneItem.btTakeOn = nWear;
oneItem.nLv = 1;
m_cAlmirahLists.add(oneItem);
return oneItem.btTakeOn;
}
void CAlmirahSystem::UpdateFashion(int nModelId, int nLv)
{
SetDataModifyFlag(true);
INT_PTR nCount = m_cAlmirahLists.count();
for(INT_PTR i=0; i<nCount; i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
if( stAlmirahItem.nModelId == nModelId)
{
stAlmirahItem.nLv = nLv;
}
}
}
FashionActive* CAlmirahSystem::GetFashionModeId(int nType)
{
INT_PTR nCount = m_cAlmirahLists.count();
for(INT_PTR i=0; i<nCount; i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
FashionActive* cfg = GetLogicServer()->GetDataProvider()->GetFashionConfig().getFashionActive(stAlmirahItem.nModelId);
if(cfg && cfg->nType == nType && stAlmirahItem.btTakeOn == 1)
{
return cfg;
}
}
return NULL;
}
void CAlmirahSystem::returnInfo(CDataPacket& netPack)
{
byte count = 0;
if(!m_pEntity)
{
netPack << (byte)count;
return;
}
count = (byte)m_cAlmirahLists.count();
netPack << (byte)count;
for (INT_PTR i = 0; i < count; i++)
{
CAlmirahItem & oneItem = m_cAlmirahLists[i];
netPack << (int)oneItem.nModelId;
netPack << (BYTE)oneItem.btTakeOn;
netPack << (int)oneItem.nLv;
}
}
void CAlmirahSystem::TakeOffAlmirah(std::set<int>& takeOffs)
{
if(!takeOffs.size()) return ;
for(INT_PTR i=0; i<m_cAlmirahLists.count(); i++)
{
CAlmirahItem& stAlmirahItem = m_cAlmirahLists[i];
FashionActive* Cfg = GetLogicServer()->GetDataProvider()->GetFashionConfig().getFashionActive(stAlmirahItem.nModelId);
if(!Cfg)
continue;
if(takeOffs.count(Cfg->nType) && stAlmirahItem.btTakeOn == 1)
{
stAlmirahItem.btTakeOn = 0;
}
}
}
//跨服数据
void CAlmirahSystem::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 = m_cAlmirahLists.count();
packet << (int)count ; //玩家物品的数量
if(count > 0)
{
for(int i = 0; i < count; i++) {
packet <<m_cAlmirahLists[i].nModelId;
packet <<m_cAlmirahLists[i].nLv;
packet <<m_cAlmirahLists[i].btTakeOn;
}
}
pCrossClient->flushProtoPacket(packet);
}
void CAlmirahSystem::OnCrossInitData(std::vector<CAlmirahItem>& m_Almira)
{
if(m_pEntity ==NULL)
{
OutputMsg(rmError,_T("装载玩家衣橱的数据出错,实体指针为MULL"));
return;
}
//装载物品数据
WORD nCount =m_Almira.size();
// reader >> nCount;
m_cAlmirahLists.clear();
CAlmirahItem oneItem;
for (WORD i = 0; i < nCount; i++)
{
// reader >> oneItem.nModelId;
// reader >> oneItem.nLv;
// reader >> oneItem.btTakeOn;
oneItem =m_Almira[i];
m_cAlmirahLists.add(oneItem);
OutputMsg(rmTip,_T("OnCrossInitData CAlmirahSystem nActorID:%d nModelId:%d,level:%d"),
m_pEntity->GetId(),oneItem.nModelId,oneItem.nLv);
}
SetDataModifyFlag(true); //数据修改过了
((CActor*)m_pEntity)->OnCrossFinishOneInitStep(MSG_CFASH);
}