#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(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; iGetDataProvider()->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; iAllocPacket(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; iGetDataProvider()->GetFashionConfig(); FashionActive* actCfg = Cfg.getFashionActive(nModleId); if(!actCfg) return false; if(nState == 1) { if(Cfg.takeofflist.find(actCfg->nType) != Cfg.takeofflist.end()) { std::set takeOff(Cfg.takeofflist[actCfg->nType].begin(), Cfg.takeofflist[actCfg->nType].end()); TakeOffAlmirah(takeOff); } } for(INT_PTR i=0; inType == 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(PROP_ACTOR_SOLDIERSOULAPPEARANCE,nModleId); // } // else if(actCfg->nType == 2)//武器 // { // ((CActor*)m_pEntity)->SetProperty(PROP_ACTOR_WEAPONAPPEARANCE,nModleId); // } SetDataModifyFlag(true); //数据修改过了 // OnSendInitData(); return false; } int CAlmirahSystem::GetNowModeId() { INT_PTR nCount = m_cAlmirahLists.count(); for(INT_PTR i=0; iGetDataProvider()->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 takeOff(Cfg.takeofflist[actCfg->nType].begin(), Cfg.takeofflist[actCfg->nType].end()); TakeOffAlmirah(takeOff); } // for(INT_PTR i=0; inType == 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; iGetDataProvider()->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& takeOffs) { if(!takeOffs.size()) return ; for(INT_PTR i=0; iGetDataProvider()->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 <flushProtoPacket(packet); } void CAlmirahSystem::OnCrossInitData(std::vector& 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); }