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

341 lines
8.8 KiB
C++

#include "StdAfx.h"
#include "../base/Container.hpp"
CReviveDurationSystem::CReviveDurationSystem()
{
m_ReviveDurationDataList.clear();
}
CReviveDurationSystem::~CReviveDurationSystem()
{
}
bool CReviveDurationSystem::Initialize(void *data,SIZE_T size)
{
PACTORDBDATA pActorData = (ACTORDBDATA *)data;
if(pActorData ==NULL || size != sizeof(ACTORDBDATA))
{
OutputMsg(rmError,_T("data len error len=%d ,correct len=%d"),size, sizeof(ACTORDBDATA));
return false;
}
LoadFromDB();
return true;
}
void CReviveDurationSystem::Destroy()
{
}
VOID CReviveDurationSystem::OnTimeCheck(TICKCOUNT nTickCount)
{
if (!m_pEntity || m_pEntity->GetType() != enActor)
{
return;
}
INT_PTR nCount = m_ReviveDurationDataList.count();
if ( nCount <= 0 )
{
return;
}
//已拥有永久复活特权
if (-1 == m_pEntity->GetProperty<int>(PROP_ACTOR_CURREVIVEDURATION) )
{
return;
}
unsigned int nCurrentTime = GetGlobalLogicEngine()->getMiniDateTime(); //当前的时间
for(INT_PTR i= nCount -1 ; i>=0 ; i--)
{
ReviveDurationDATA* tempData = &m_ReviveDurationDataList[i];
if (!tempData)
{
return;
}
//更新持续时间复活特权
bool boTime = GetLogicServer()->GetDataProvider()->GetReviveDurationsConfig().IsTimeReviveDuration(tempData->wId);
if ( boTime )
{
if (tempData->nRemainTime <= nCurrentTime)
{
DelReviveDuration(tempData->wId);
}
} else {
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, -1);
}
}
}
VOID CReviveDurationSystem::OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader)
{
if(m_pEntity ==NULL)
{
OutputMsg(rmError,_T("LoadReviveDuration Data is Error..."));
return;
}
if ( nCmd == jxInterSrvComm::DbServerProto::dcLoadReviveDurationData && nErrorCode == jxInterSrvComm::DbServerProto::reSucc )
{
//需要判断是否重复装载玩家的数据,避免出现装载复制
if(HasDbDataInit())
{
OutputMsg(rmError,_T("db return ReviveDuration repeated,actorid=%u "),m_pEntity->GetProperty<unsigned int>(PROP_ENTITY_ID));
return;
}
int nCount = 0;
reader >> nCount;
int nMax = 0;
for (int i=0;i<nCount;i++)
{
unsigned int nValue = 0, nTime = 0;
reader >> nValue >> nTime;
WORD wId = LOWORD(nValue);
if( nTime == 0 )
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, -1);
}
ReviveDurationDATA ReviveDurationData;
ReviveDurationData.wId = wId;
ReviveDurationData.nRemainTime = nTime;
m_ReviveDurationDataList.add(ReviveDurationData);
}
if (-1 != m_pEntity->GetProperty<int>(PROP_ACTOR_CURREVIVEDURATION) && nCount > 0)
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, m_ReviveDurationDataList[nCount - 1].nRemainTime);
}
OnDbInitData();
// ((CActor*)m_pEntity)->OnFinishOneInitStep(13);
}
else if ( nCmd == jxInterSrvComm::DbServerProto::dcSaveReviveDurationData && nErrorCode == jxInterSrvComm::DbServerProto::reSucc )
{
return;
}
}
void CReviveDurationSystem::LoadFromDB()
{
if(!m_pEntity) return;
if (((CActor*)m_pEntity)->OnGetIsTestSimulator())
{
return;
}
unsigned int nActorId = m_pEntity->GetId();
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if (pDbClient->connected())
{
CDataPacket& DataPacket =pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadReviveDurationData);
DataPacket<< m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
DataPacket << (unsigned int)nActorId;
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
}
}
void CReviveDurationSystem::SaveToDB()
{
if (!m_pEntity)
{
return;
}
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if (!pDbClient->connected())
{
return;
}
unsigned int nActorId = m_pEntity->GetId();
CDataPacket& DataPacket = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveReviveDurationData);
DataPacket<< m_pEntity->GetRawServerIndex() << GetLogicServer()->GetServerIndex();
DataPacket << (unsigned int)nActorId;
INT_PTR nDataCount = 0;
int nPos = DataPacket.getPosition();
DataPacket << int(nDataCount);
for (int i = 0; i < m_ReviveDurationDataList.count(); i++)
{
ReviveDurationDATA* ReviveDurationData = &m_ReviveDurationDataList[i];
if ( ReviveDurationData )
{
OneReviveDurationConfig* pConfig = GetLogicServer()->GetDataProvider()->GetReviveDurationsConfig().GetReviveDurationConfig(ReviveDurationData->wId);
if (pConfig)
{
unsigned int nMakeLong = MAKELONG(ReviveDurationData->wId,MAKEWORD(0,0));
DataPacket << (unsigned int)nMakeLong << (unsigned int)ReviveDurationData->nRemainTime;
nDataCount++;
}
}
}
int *ptrPos = (int*)DataPacket.getPositionPtr(nPos);
*ptrPos = (int)nDataCount;
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
SetDataModifyFlag(false);
}
int CReviveDurationSystem::IsHaveReviveDuration( WORD wId )
{
for (INT_PTR i = m_ReviveDurationDataList.count() - 1; i >= 0 ; i--)
{
ReviveDurationDATA* tempData = &m_ReviveDurationDataList[i];
if (tempData)
{
if ( tempData->wId == wId )
{
return (int)i;
}
}
}
return -1;
}
void CReviveDurationSystem::AddReviveDuration( WORD wId )
{
if (!m_pEntity || m_pEntity->GetType() != enActor)
{
return;
}
OneReviveDurationConfig* pConfig = GetLogicServer()->GetDataProvider()->GetReviveDurationsConfig().GetReviveDurationConfig(wId);
if ( !pConfig )
{
return;
}
//已是永久复活特权
if(-1 == m_pEntity->GetProperty<int>(PROP_ACTOR_CURREVIVEDURATION) )
{
return;
}
//如果是永久复活特权
if(pConfig->nReviveDurationTime == 0)
{
m_ReviveDurationDataList.clear();
}
ReviveDurationDATA newData;
newData.wId = pConfig->nReviveDurationId;
unsigned int nTime = 0;
if (pConfig->nReviveDurationTime > 0 )
{
if ( m_ReviveDurationDataList.count() == 0)
{
nTime = GetGlobalLogicEngine()->getMiniDateTime() + pConfig->nReviveDurationTime;
} else {
nTime = m_ReviveDurationDataList[m_ReviveDurationDataList.count() - 1].nRemainTime + pConfig->nReviveDurationTime;
}
}
newData.nRemainTime = nTime;
m_ReviveDurationDataList.add(newData);
//更新持续时间复活特权
if( m_ReviveDurationDataList[m_ReviveDurationDataList.count() - 1].nRemainTime )
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, m_ReviveDurationDataList[m_ReviveDurationDataList.count() - 1].nRemainTime);
}
else //更新永久复活特权
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, -1);
}
// ((CActor*)m_pEntity)->CollectOperate(CEntityOPCollector::coRefAbility);
SetDataModifyFlag(true);
}
void CReviveDurationSystem::DelReviveDuration( WORD wId )
{
if (!m_pEntity || m_pEntity->GetType() != enActor)
{
return;
}
int nIndex = IsHaveReviveDuration(wId);
if ( nIndex < 0 )
{
return;
}
m_ReviveDurationDataList.remove(nIndex);
//更新复活特权持续时间
if (m_ReviveDurationDataList.count() == 0)
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, 0);
// ((CActor*)m_pEntity)->CollectOperate(CEntityOPCollector::coRefAbility);
SetDataModifyFlag(true);
}
}
//跨服数据
void CReviveDurationSystem::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_ReviveDurationDataList.count();
packet << (int)count ; //玩家物品的数量
if(count > 0)
{
for(int i = 0; i < count; i++) {
unsigned int nMakeLong = MAKELONG(m_ReviveDurationDataList[i].wId,MAKEWORD(0,0));
packet <<(unsigned int) (nMakeLong);
packet << (unsigned int)(m_ReviveDurationDataList[i].nRemainTime);
}
}
pCrossClient->flushProtoPacket(packet);
}
VOID CReviveDurationSystem::OnCrossInitData(std::vector<CReviveDurationSystem::ReviveDurationDATA>& titles)
{
if(m_pEntity ==NULL)
{
OutputMsg(rmError,_T("OnCrossInitData Data is Error..."));
return;
}
{
m_ReviveDurationDataList.clear();
int nCount = titles.size();
// reader >> nCount;
int nMax = 0;
for (int i=0;i<nCount;i++)
{
ReviveDurationDATA newTitleData = titles[i];
m_ReviveDurationDataList.add(newTitleData);
if( newTitleData.nRemainTime == 0 )
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, -1);
}
}
if (-1 != m_pEntity->GetProperty<int>(PROP_ACTOR_CURREVIVEDURATION) && nCount > 0)
{
m_pEntity->SetProperty<int>(PROP_ACTOR_CURREVIVEDURATION, m_ReviveDurationDataList[nCount - 1].nRemainTime);
}
OnDbInitData();
((CActor*)m_pEntity)->OnCrossFinishOneInitStep(MSG_CRELIVE);
}
}