#include "StdAfx.h" #include "UserBag.h" #include using namespace jxInterSrvComm::SessionServerProto; const INT64 MinSeriesLmt = 1000000000000000000; #define ACCOUNTITEM 1 //账户绑定 #define ACTORITEM 2 //角色绑定 #define MAXITEMID 100000 //物品id超过这个数字,表示这是金钱 char CUserBag::s_ItemTipmsgBuff[] = {}; char CUserBag::s_ConsignItemLinkBuff[] ={}; char CUserBag::s_UserItemFormat[] = {}; char CUserBag::s_ItemMidStr1[] = {}; char CUserBag::s_ItemMidStr2[] = {}; int CUserBag::s_nEggYbCircleCount = 0; template<> const CUserBag::InheritedSybSystem::OnHandleSockPacket CUserBag::InheritedSybSystem::Handlers[]= { &CUserBag::HandError, //错误处理 &CUserBag::HandAddItem, //添加道具 enBagSystemcDelItem &CUserBag::HandQueryItems, //获取背包列表 enBagSystemcQueryItem &CUserBag::HandDelItem, //删除物品 enBagSystemcDelItem &CUserBag::HandError, //错误处理 -- &CUserBag::HandSlpitItem, //拆分 enBagSystemcBagSplit 5 &CUserBag::HandMergeItem, //合并 enBagSystemcBagMerge &CUserBag::HandArrangeItemList, //整理背包 enBagSystemcArrangeBag &CUserBag::HandUseItem, //使用物品 enBagSystemcUseItem &CUserBag::HandleExChangeMoney, //兑换金币 encExChangeMoney &CUserBag::HandleRecoverItem, //回收物品 &CUserBag::HandBatchUseItem, //批量使用物品 enBagSystemcBatchUseItem &CUserBag::HandQueryItemsExtraInfo, //批量使用物品 enBagSystemcBatchUseItem &CUserBag::HandQueryItemsExtraInfoOne, //批量使用物 // &CUserBag::HandGetBagEnlargeFee, //获取扩大背包费用 enBagSystemcGetBagEnlargeFee // &CUserBag::HandEnlargeBag, //扩大背包 enBagSystemcEnlargeBag // &CUserBag::HandMergeItemBindInfect, //合并道具(绑定感染) enBagSystemcUnBindToBind //&CUserBag::HandProcessItem, //处理一件物品 //&CUserBag::HandGetProcessItemConsume, //获取处理一件装备需要的消耗 //&CUserBag::HandGetItemProcessConfig, //获取物品提升参数 10 //&CUserBag::HandSourcePour, //灌注源泉 //&CUserBag::HandActiveBagList, //&CUserBag::HandGetActiveBagItem,//丢弃物品 //&CUserBag::HandDestroyCoin, //丢弃金币 //&CUserBag::HandGetUpgradeCfg, //获取能升级的装备 15 //&CUserBag::HandUseStrongItem, //废弃 //&CUserBag::HandSmashGoldEgg, //废弃 //&CUserBag::HandLuckAwardOpt, //废弃 //&CUserBag::HandGetPerfectCompTimes, //废弃 //&CUserBag::HandUseFiveAttrItem, //废弃 20 //&CUserBag::HandUseItemRecoverEx, //废弃 // }; bool CUserBag::SetItemProperty(CUserItem * pUserItem,INT_PTR propID,INT_PTR nValue) { if(propID <0 || propID >=Item::ipItemMaxProperty ) return false; if(pUserItem ==NULL) return false; const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) { return false; } //是否是装备在身上 int nItemPos = 0; int nHeroId = 0; //如果背包里找不到就在身上去找,判断强化的这个装备是身上的还是背包里的 GetEquipItemPtr(pUserItem->series, nItemPos, nHeroId); if (nItemPos == 0) { OutputMsg(rmError,_T("无效的装备,装备增强失败,guid=%lld"),pUserItem->series.llId); return false; } if (nItemPos == 1) //背包数据改变 { OnDataModified(); //数据发生了改变,需要存盘 } //PACKEDGAMEATTR attr; bool flag =false; bool bNeedRefreshAppear =false; //是否需要刷外观 int nLogID =0; //记录日志的日志号 int nOldValue = 0; //旧的数值 int nParam =0; //附加的参数 int nAchieveEventID=0; //成就事件的ID int nAchieveParam =0; //成就的参数 switch(propID) { // case Item::ipItemDua: // nOldValue = pUserItem->wDura; // nLogID = GameLog::clEquipPropertyDurChange; // // //pUserItem->wDura =(WORD)nValue; // if (m_pEntity->GetType() == enActor) // { // if (pStdItem->m_btType == Item::itFunctionItem) // { // pUserItem->wDura =(WORD)nValue; // flag = true; // } // else // { // bool boForce = nValue > nOldValue; // ((CActor *)m_pEntity)->GetEquipmentSystem().ChangeEquipDua(pUserItem, (int)(nValue - pUserItem->wDura), boForce); // } // } // //CUserEquipment::SendItemDuaChange(pUserItem,(CActor*)m_pEntity); // break; // case Item::ipItemDuaMax: // nOldValue = pUserItem->wDuraMax; // nLogID = GameLog::clEquipPropertyMaxDurChange; // // pUserItem->wDuraMax =(WORD)nValue; // CUserEquipment::SendItemDuaChange(pUserItem,(CActor*)m_pEntity); // break; case Item::ipItemCount: nOldValue = pUserItem->wCount; nLogID = GameLog::clEquipPropertyCountChange; // pUserItem->wCount =(WORD)nValue; flag =true; break; case Item::ipItemStrong: nOldValue = pUserItem->btStrong; nLogID = GameLog::clEQuipPropertyStrong; // pUserItem->btStrong =(BYTE)nValue; nAchieveParam = (int)nValue; if (pStdItem->isEquipment()) { bNeedRefreshAppear =true; //需要刷外观 // if (pStdItem->isBaseEquipment()) //只有基本装备能触发强化成就 // { // nAchieveEventID = eAchieveEventEquipStrong; // } } flag =true; break; case Item::ipItemQuality: nOldValue = pUserItem->btQuality; nLogID = GameLog::clEQuipPropertyQuality; // pUserItem->btQuality = (BYTE)nValue; //如果穿神器的话,需要刷新一下玩家的外观 if(pUserItem->btQuality == CStdItem::iqItemOrange) { bNeedRefreshAppear =true; } flag =true; break; case Item::ipItemBind: nOldValue = pUserItem->btFlag; nLogID = GameLog::clEquipPropertyBindChange; // pUserItem->btFlag = (BYTE)nValue; flag =true; break; case Item::ipItemHole1IsOpen: // 这4个枚举要连续,否则出错 case Item::ipItemHole2IsOpen: case Item::ipItemHole3IsOpen: case Item::ipItemHole4IsOpen: { /* INT_PTR nIndex(propID - Item::ipItemHole1IsOpen); nOldValue = (int)nIndex + 1; nLogID = GameLog::clEQuipPropertyHole; // pUserItem->wHoles[nIndex].open(nValue != 0); if(pStdItem->isEquipment()) { nAchieveEventID = eAchieveEventEquipHole; nAchieveParam = (int)((CActor *)m_pEntity)->GetEquipmentSystem().GetTotalHoleCount(); } flag =true; */ } break; case Item::ipItemHole1Item: // 这4个枚举要连续,否则出错 case Item::ipItemHole2Item: case Item::ipItemHole3Item: case Item::ipItemHole4Item: { /* INT_PTR nIndex(propID - Item::ipItemHole1Item); nOldValue = (int)nIndex + 1; nLogID = GameLog::clEQuipPropertyInlay; // pUserItem->wHoles[nIndex].setInlayedItem(nValue); flag =true; bNeedRefreshAppear =true; //需要刷外观 */ } break; case Item::ipItemRandForge: //随机锻造 //nValue =GetGlobalLogicEngine()->GetRandValue() % CUserItem::MaxSmithAttrCount ; flag= RandAttrSelector::ItemSmithAttribute(pUserItem, (int)nValue); if(flag) { nOldValue = (int)nValue; nLogID = GameLog::clEQuipPropertyRandForge; } break; case Item::ipItemForgeProtect: flag= RandAttrSelector::ItemSmithAttribute(pUserItem, (int)nValue, true); if(flag) { nOldValue = (int)nValue; nLogID = GameLog::clEQuipPropertyRandForge; } break; /* case Item::ipItemForgeTimes: //精锻次数 nOldValue =-1; nLogID = GameLog::clEQuipPropertyInject; // pUserItem->btSmithCount= (WORD)nValue; flag = true; break; */ case Item::ipItemForgeProperty1Value: //精锻的属性,这几个枚举要连续,否则出错 case Item::ipItemForgeProperty2Value: //精锻的属性 case Item::ipItemForgeProperty3Value: //精锻的属性 { INT_PTR nIndex(propID - Item::ipItemForgeProperty1Value); nOldValue = (int)nIndex + 1; nLogID = GameLog::clEquipPropertyForge; // pUserItem->smithAttrs[nIndex].nValue = (int)nValue; flag = true; } break; case Item::ipItemInscriptExp: nOldValue = 1; nLogID = GameLog::clItemSpecSmith; pUserItem->nAreaId= (int)nValue; flag = true; break; case Item::ipItemLuck: nOldValue = pUserItem->btLuck; nLogID = GameLog::clEquipPropertyLuck; pUserItem->btLuck = (char)nValue; flag = true; break; case Item::ipItemSharp: nOldValue = pUserItem->btSharp; nLogID = GameLog::clEquipSharp; pUserItem->btSharp = (byte)nValue; flag = true; break; case Item::ipItemLostStar: //强化损失星级 nOldValue = pUserItem->bLostStar; nLogID = GameLog::clEQuipPropertyLostStar; pUserItem->bLostStar = (int)nValue; flag = true; break; case Item::ipItemInscriptLevel: //铭刻等级 nOldValue = pUserItem->bInSourceType; nLogID = GameLog::clEQuipPropertyInscriptLevel; pUserItem->bInSourceType = (int)nValue; flag = true; break; case Item::ipItemStar: nOldValue = pUserItem->wStar; nLogID = GameLog::clEquipStar; pUserItem->wStar = (int)nValue; flag = true; break; case Item::ipIdentifySlotNum: nOldValue = pUserItem->wIdentifySlotNum; nLogID = GameLog::clEquipIdentifySlotUnlock; pUserItem->wIdentifySlotNum = (WORD)nValue; flag = true; break; } if (flag) //更改成功 { NotifyItemChange(pUserItem); if(nLogID) { //char sSeries[64]; //sprintf(sSeries,"%lld",pUserItem->series.llId); //序列号 if(GetLogicServer()->GetLocalClient() && pStdItem->m_Flags.recordLog) { } } if(nAchieveEventID) { ((CActor*)m_pEntity)->GetAchieveSystem().OnEvent(nAchieveEventID,nAchieveParam); //跳跃一下 } // BagQuestTarget(propID ); //触发任务强化相关的完成目标 //是打了宝石 // if(nAchieveEventID == eAchieveEventEquipEnlay) //检测宝石 // { // ((CActor*)m_pEntity)->GetEquipmentSystem().OnCheckDiamondLevel(); // } // else if(nAchieveEventID == eAchieveEventEquipStrong) //强化 // { // //此成就触发在 function EquipStrong( sysarg, args) // //int nBrightStrongStarCount = pUserItem->GetBrightStrongStarCount(); // //((CActor*)m_pEntity)->GetAchieveSystem().OnEvent(aAchieveEventAllEquipStrongChange, nBrightStrongStarCount); // } //刷属性 //如果需要刷外观的话就刷外观 if (nItemPos == 2) //是身上装备,并且成功,需要重新刷属性 { m_pEntity->CollectOperate(CEntityOPCollector::coRefAbility); if (bNeedRefreshAppear) //刷外观 { m_pEntity->CollectOperate(CEntityOPCollector::coRefFeature); } } if (nItemPos == 3 && nHeroId > 0) //是英雄 { //CHeroSystem& sys = ((CActor*)m_pEntity)->GetHeroSystem(); //sys.SetHeroEquipChange(); //设置数据更改 //sys.ResetProperty(sys.GetHeroPos(nHeroId), false, bNeedRefreshAppear); //刷属性 } } return flag; } /* 通知装备数据变化了 */ void CUserBag::NotifyItemChange(CUserItem *pUserItem) { CActorPacket pack; CDataPacket & data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE)(enBagSystemID) << (BYTE)(enBagSystemsItemInfoChange); //data << * pUserItem; *pUserItem>>data; pack.flush(); } VOID CUserBag::ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet ) { if(m_pEntity ==NULL) return; CActor *pActor = (CActor *)m_pEntity; int nSceneId = pActor->GetSceneID(); int nFuBenId = pActor->GetFuBen()->GetFbId(); int nOldSrvId = pActor->getOldSrvId(); //原9跨0 int nRawSrvId = pActor->GetRawServerIndex(); //原9跨10009 int nServerId = GetLogicServer()->GetServerIndex(); //原9跨11 //OutputMsg(rmError,"[WG][FubenSystem] ReqEnterFuben ERROR_USER 错误,副本ID=%d,玩家=%d name=%s!", nFbid, ((CActor*)m_pEntity)->GetId(), m_pEntity->GetEntityName()); if(m_pEntity->GetHandle().GetType() != enActor) return; if(nCmd >=1 && nCmd < enBagSystemcMaxBagCodeID) { (this->*Handlers[nCmd] )(packet); } } std::vector DealDbBagCount(int bagCount) { std::vector t_counts; t_counts.clear(); int wValue = LOWORD(bagCount); t_counts.push_back((int)HIWORD(bagCount)); t_counts.push_back((int)HIBYTE(wValue)); t_counts.push_back((int)LOBYTE(wValue)); } bool CUserBag::Initialize(void *data,SIZE_T size) { m_bGetActiveItemFlag = false; m_nUseXiuWeiCount = 0; ZeroMemory(m_aItemCDGroupExpireTimeTbl, sizeof(m_aItemCDGroupExpireTimeTbl)); m_pExpItem =NULL; //经验道具 if ( !InheritedSybSystem::Initialize(data, size) ) { OutputMsg(rmError,_T("bag InheritedSybSystem init fail")); return false; } m_pUserItemList.clear(); // Inherited::clear(); m_sellUserList.clear(); if(m_pEntity ==NULL) { OutputMsg(rmError,_T("m_pEntity ==NULL")); return false; } if(m_pEntity->GetHandle().GetType() ==enActor) { 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; } else { //默认的背包的数量 SetBagNums( GetLogicServer()->GetDataProvider()->GetBagConfig().nMaxBagCount); //std::vector counts = DealDbBagCount(pActorData->nBagGridCount); std::vector counts; counts.clear(); int wValue = LOWORD(pActorData->nBagGridCount); counts.push_back((int)HIWORD(pActorData->nBagGridCount)); counts.push_back((int)HIBYTE(wValue)); counts.push_back((int)LOBYTE(wValue)); BAGCONFIG & dataConfig = GetLogicServer()->GetDataProvider()->GetBagConfig(); for(int i = 0; i GetDataProvider()->GetBagConfig().nDefaultBagCount[i]; if(counts[i] > nDefaultBagGridCount) { nDefaultBagGridCount = counts[i]; } PushBagMaxCount(nDefaultBagGridCount); m_BagCostCounts.push_back(0); } int nSlotCount = MAKELONG(MAKEWORD(m_BagMaxCounts[1],m_BagMaxCounts[2]), (WORD)m_BagMaxCounts[0]); m_pEntity->SetProperty(PROP_ACTOR_BAG_GRID_COUNT, nSlotCount); setCapacity (nSlotCount); //设定格子的数量 --暂时用不到 } } return true; } char * CUserBag::GetItemDetailLogStr(const CUserItem *pUserItem ) { if(pUserItem ==NULL) return ""; //数目:品质:强化_打孔的数目:宝石1:宝石2:宝石3_精锻度 /* int nHoleCount =0; //物品开启了多少个孔 for(INT_PTR i=0;i < CStdItem::MaxItemHole;i ++) { if( pUserItem->wHoles[i].opened()) { nHoleCount ++; } } */ sprintf(CUserBag::s_ItemTipmsgBuff,"%d:%d:%d:%d_%d:%d_%d_%d", (int)pUserItem->wCount, //数目 (int)pUserItem->wStar, //强化 (int)pUserItem->bLostStar, //当前强化损失的星级 (int)pUserItem->btFlag, //绑定的标记 pUserItem->bInSourceType, pUserItem->nAreaId, pUserItem->wIdentifySlotNum, pUserItem->nDropMonsterId ); return CUserBag::s_ItemTipmsgBuff; } char * CUserBag::GetItemMidStr1(const CUserItem * pUserItem) { if (NULL == pUserItem) { return ""; } sprintf(CUserBag::s_ItemMidStr1, "%d_%d_%d", (int)pUserItem->btQuality, (int)pUserItem->btLuck, (int)pUserItem->smithAttrs[0].nValue ); return CUserBag::s_ItemMidStr1; } char * CUserBag::GetItemMidStr2(const CUserItem * pUserItem) { if (NULL == pUserItem) { return ""; } sprintf(CUserBag::s_ItemMidStr2, "%d_%d", (int)pUserItem->smithAttrs[1].nValue, //极品属性4 (int)pUserItem->smithAttrs[2].nValue //极品属性5 ); return CUserBag::s_ItemMidStr2; } /* 将物品(装备)属性拼接成字符串,客户端按照此顺序读取字符串,形成物品的链接 */ char* CUserBag::GetUseItemLinkFormat(const CUserItem* pUserItem) { if (pUserItem) { sprintf(s_UserItemFormat,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", pUserItem->wItemId, //1.物品ID pUserItem->btQuality, //2.品质 pUserItem->btStrong, //3.强化(不使用) //pUserItem->wDura, //4.耐久 //pUserItem->wDuraMax, //5.最大耐久 pUserItem->wCount, //6.物品数量 pUserItem->btFlag, //7.标记1-绑定,2-不可交易 pUserItem->btHandPos, //8.左右手 pUserItem->wStar, //9.强化星级 pUserItem->bLostStar, //10.强化失败损失的星级(客户端显示时,最大强化星级通过配置减去该值) pUserItem->bInSourceType, pUserItem->nAreaId, pUserItem->nCreatetime.tv, //13.创建时间 pUserItem->smithAttrs[0].nValue, //14.鉴定属性 pUserItem->smithAttrs[1].nValue, pUserItem->smithAttrs[2].nValue, pUserItem->smithAttrs[3].nValue, pUserItem->smithAttrs[4].nValue, pUserItem->btLuck //19.幸运值 ); } return s_UserItemFormat; } char * CUserBag::GetConsignItemLink(const CUserItem *pUserItem, unsigned int nPrice) { //v1 普通物品 弹tip; //v6 寄卖物品 弹购买窗口 if (!pUserItem) { return NULL; } const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) { return NULL; } char *pName = (char *)pStdItem->m_sName; sprintf(CUserBag::s_ConsignItemLinkBuff,"<#c%s#%s/v6;%s;%d;%d;%d;%u>", GetQualityColorStr(pUserItem->btQuality),//1 pName,//2 GetUseItemLinkFormat(pUserItem), pUserItem->series.t.time, pUserItem->series.t.wSeries, pUserItem->series.t.btServer, nPrice ); return CUserBag::s_ConsignItemLinkBuff; } char * CUserBag::GetItemLink(WORD wItemId, const CUserItem *pUserItem ) { const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(wItemId); if(pStdItem ==NULL) { return NULL; } char *pName = (char *)pStdItem->m_sName; if( (pStdItem->isEquipment()) && pUserItem ) //如果是叠加的话 { //sprintf(CUserBag::s_ItemTipmsgBuff,"<#b%s/v%d,%d,%lld>","name",wItemId,nActorID,guid); //"<%s/v%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d> //<物品名字/v //物品id,物品的品质,物品的强化,物品的耐久,物品的耐久上限,物品数量,物品的过期时间, //物品第1个孔的信息,物品第2个孔的信息,物品第3个孔的信息,物品第4个孔的信息 //物品第1个精锻的信息,物品第2个精锻的信息,物品第3个精锻的信息 //物品的剩余精锻次数> sprintf(CUserBag::s_ItemTipmsgBuff,"<#c%s#%s/v1;%s>", GetQualityColorStr(pUserItem->btQuality),//1 pName,//2 GetUseItemLinkFormat(pUserItem) ); //sprintf(CUserBag::s_ItemTipmsgBuff,"<#b%s/v%d,%d,%d>",pStdItem->m_sName,wItemId,); } else { if(pStdItem->b_showQuality ==0) { sprintf(CUserBag::s_ItemTipmsgBuff,"<%s/v1,%d>",pName,wItemId); } else { sprintf(CUserBag::s_ItemTipmsgBuff,"<#c%s#%s/v1,%d>",GetQualityColorStr(pStdItem->b_showQuality),pName,wItemId); } //sprintf(CUserBag::s_ItemTipmsgBuff,"<%s/v1,%d>",pName,wItemId); } return CUserBag::s_ItemTipmsgBuff; } //强化一件物品 void CUserBag::HandProcessItem(CDataPacketReader &packet) { /* CScriptValueList paramList; CUserItem::ItemSeries itemGuid; ((CActor*)m_pEntity)->InitEventScriptVaueList(paramList,aeItemProcess); BYTE nGuidCount=0; packet >> nGuidCount; paramList << nGuidCount; BYTE nEntityId=0; for(INT_PTR i=0;i < nGuidCount; i++) { packet >> nEntityId; //装备所属ID id=0:玩家/背包 id>0:英雄ID packet >> itemGuid.llId; int nItemPos=0, nHeroId=0; CUserItem* pUserItem = GetEquipItemPtr(itemGuid, nItemPos, nHeroId, nEntityId); if (pUserItem ==NULL) { ((CActor*)m_pEntity)->SendOldTipmsgWithId(tpItemNotExist); return; } const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) { ((CActor*)m_pEntity)->SendOldTipmsgWithId(tpItemNotExist); return; } paramList << pUserItem; } BYTE nItemProcessType =0,nParaCount =0; //物品操作码 packet >> nItemProcessType >> nParaCount; if(nParaCount >=8 ) { OutputMsg(rmError,_T("HandProcessItem参数过多=%d"),nParaCount); return; } //玩家开始强化装备, [物品的ID,物品的指针,祈福枝的数量] paramList << nItemProcessType ; int nParam ; for(int i=0; i< nParaCount; i++) { packet >> nParam; paramList << nParam; } ((CActor*)m_pEntity)->OnEvent(paramList,paramList); */ }; //获取强化一件装备需要的消耗 void CUserBag::HandGetProcessItemConsume(CDataPacketReader &packet) { /* CScriptValueList paramList; CUserItem::ItemSeries itemGuid; ((CActor*)m_pEntity)->InitEventScriptVaueList(paramList,aeGetItemProcessConsume); BYTE nGuidCount=0; packet >> nGuidCount; paramList << nGuidCount; BYTE nEntityId=0; for(INT_PTR i=0;i < nGuidCount; i++) { packet >> nEntityId; //装备所属ID id=0:玩家/背包 id>0:英雄ID packet >> itemGuid.llId; int nItemPos=0, nHeroId=0; CUserItem* pUserItem = GetEquipItemPtr(itemGuid, nItemPos, nHeroId, nEntityId); if (pUserItem ==NULL) { ((CActor*)m_pEntity)->SendOldTipmsgWithId(tpItemNotExist); return; } const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) { ((CActor*)m_pEntity)->SendOldTipmsgWithId(tpItemNotExist); return; } paramList << pUserItem; } BYTE nItemProcessType =0,nParaCount =0; //物品操作码 packet >> nItemProcessType >> nParaCount; if(nParaCount >=8 ) { OutputMsg(rmError,_T("HandGetProcessItemConsume参数过多=%d"),nParaCount); return; } //玩家开始强化装备, [物品的ID,物品的指针,祈福枝的数量] paramList << nItemProcessType ; int nParam ; for(int i=0; i< nParaCount; i++) { packet >> nParam; paramList << nParam; } ((CActor*)m_pEntity)->OnEvent(paramList,paramList); */ }; //获取祈福枝的提升概率列表 void CUserBag::HandGetItemProcessConfig(CDataPacketReader &packet) { /* CScriptValueList paramList; BYTE btType=0; packet >> btType; ((CActor*)m_pEntity)->InitEventScriptVaueList(paramList,aeGetItemProcessConfig); paramList << btType; ((CActor*)m_pEntity)->OnEvent(paramList,paramList); */ }; //使用物品的处理函数 bool CUserBag::OnUseItem(CUserItem *pUserItem,const CStdItem * pStdItem, int nCount, bool isHeroUse, int nParam,bool bNeedRes) { int nType = pStdItem->m_btType; bool needDelete = false; bool isSucceed = true; //是否成功 bool isDeath =m_pEntity->IsDeath(); //是活的 int nValue; int nCDGroupId = pStdItem->m_btColGroup; int nCDTime = pStdItem->m_nCDTime; bool isEquip = pStdItem->isEquipment(); int nUseCount = 1; if (!isEquip && CheckUseItemCD(nCDGroupId)) { CActorPacket pack ; CDataPacket &data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE) (enBagSystemID) << (BYTE) (enBagSystemsUseItemResult); data << (WORD)(pStdItem->m_nIndex); data << (BYTE)0; pack.flush(); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemInCd, tstUI); return false; } bool bNeedAddBuff =true; if( nType == Item::itSlowHpdMed || nType == Item::itSlowBluedMed) //普通药品 { CAnimal * pEeater = m_pEntity; if(isHeroUse) //是给英雄使用的 { isDeath = pEeater->IsDeath(); } //4个一组的 if(isDeath || pEeater ==NULL) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemCanNotUseNow,tstUI); return false; } else if(pStdItem->m_StaticAttrs.nCount > 0) { needDelete = true; for(INT_PTR i=0; i< pStdItem->m_StaticAttrs.nCount; i++) { //添加Buff PGAMEATTR pattr = &pStdItem->m_StaticAttrs.pAttrs[i]; int nBuffId = pattr->value.nValue; CBuffProvider::BUFFCONFIG * pBuff = GetLogicServer()->GetDataProvider()->GetBuffProvider().GetBuff(nBuffId); if (pBuff == NULL) { continue; } if(pBuff->nType == aBuffExpAdd || pBuff->nType == aHpMpAdd || pBuff->nType == aHpAdd || pBuff->nType == aMpAdd) { CDynamicBuff newBuff; int nBuffAddCount = nCount; CDynamicBuff * pExpAddBuff = ((CActor *)m_pEntity)->GetBuffSystem()->GetBuff((GAMEATTRTYPE)pBuff->nType, pBuff->nGroup); if (pExpAddBuff == NULL)//批量使用时,不存在buff,先添加1个 { ((CActor *)m_pEntity)->GetBuffSystem()->Append(nBuffId); pExpAddBuff = ((CActor *)m_pEntity)->GetBuffSystem()->GetBuff((GAMEATTRTYPE)pBuff->nType, pBuff->nGroup); nBuffAddCount--; } if (pExpAddBuff != NULL && nBuffAddCount > 0) { newBuff.wBuffId = pExpAddBuff->wBuffId; newBuff.dwTwice = pExpAddBuff->dwTwice; if ((double)pExpAddBuff->value.uValue + pBuff->dValue * nBuffAddCount > 0xFFFFFFFF) { newBuff.value.uValue = 0xFFFFFFFF; } else { newBuff.value.uValue = pExpAddBuff->value.uValue + (unsigned int)pBuff->dValue * nBuffAddCount; } newBuff.wActWait = pExpAddBuff->wActWait; newBuff.pConfig = pExpAddBuff->pConfig; ((CActor *)m_pEntity)->GetBuffSystem()->Append(nBuffId, &newBuff); } } } } } else if(nType == Item::itAddBuff ) //挂机卷轴加多倍经验buff { if(pStdItem->m_StaticAttrs.nCount > 0) { for(INT_PTR i=0; i< pStdItem->m_StaticAttrs.nCount; i++) { //添加Buff PGAMEATTR pattr = &pStdItem->m_StaticAttrs.pAttrs[i]; int nBuffId = pattr->value.nValue; ((CActor *)m_pEntity)->GetBuffSystem()->Append(nBuffId); } if(pStdItem->nTips) ((CActor *)m_pEntity)->SendTipmsgFormatWithId(pStdItem->nTips,tstKillDrop,((CActor *)m_pEntity)->GetEntityName(), pStdItem->m_sName); needDelete = true; } } else if(nType == Item::itRecover ) // { int nState = m_pEntity->GetProperty(PROP_ACTOR_RECOVERSTATE); if(nState == 1) { ((CActor*)m_pEntity)->GiveDropAward(pStdItem->m_ndropGroupid, GameLog::Log_UseVipCard); ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmUseRecoverItem,tstUIWindows); }else { m_pEntity->SetProperty(PROP_ACTOR_RECOVERSTATE, 1); } needDelete = true; } else if(nType == Item::itGuaJiJuanZhou ) //挂机卷轴加多倍经验buff { if( ((CActor *)m_pEntity)->GetBuffSystem()->Exists(aExpPower)) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmGuaJiJuanZhouOnUse,tstUI); return false ; } if(pStdItem->m_StaticAttrs.nCount > 0) { for(INT_PTR i=0; i< pStdItem->m_StaticAttrs.nCount; i++) { //添加Buff PGAMEATTR pattr = &pStdItem->m_StaticAttrs.pAttrs[i]; int nBuffId = pattr->value.nValue; ((CActor *)m_pEntity)->GetBuffSystem()->Append(nBuffId); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmGuaJiJuanZhouUseSucc,tstUI); } needDelete = true; } } else if(nType == Item::itFastMedicament ) //速回药品 { CAnimal * pEeater = m_pEntity; if(isHeroUse) { isDeath = pEeater->IsDeath(); } if(isDeath || pEeater ==NULL) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemCanNotUseNow,tstUI); } else if(pStdItem->m_StaticAttrs.nCount ) { needDelete = true; float fFastMedicamentRenew = pEeater->GetFastMedicamentRenew(); for(INT_PTR i=0; i< pStdItem->m_StaticAttrs.nCount; i++) { PGAMEATTR pattr = &pStdItem->m_StaticAttrs.pAttrs[i]; switch(pattr->type) { //血增加 case aHpAdd: { float fRate = fFastMedicamentRenew; pEeater->ChangeHP((int)(pattr->value.nValue * (1 + fRate))); break; } case aHpPower: //血倍率增加 pEeater->ChangeHP((int)((pattr->value.fValue+fFastMedicamentRenew) * m_pEntity->GetProperty(PROP_CREATURE_MAXHP) )); break; //魔增加 case aMpAdd: { float fRate = fFastMedicamentRenew; pEeater->ChangeMP((int)(pattr->value.nValue * (1+fRate))); break; } case aMpPower: //魔倍率增加 pEeater->ChangeMP((int)((pattr->value.fValue+fFastMedicamentRenew) * m_pEntity->GetProperty(PROP_CREATURE_MAXMP) )); break; case aExpAdd: //经验改变 ((CActor *)m_pEntity)->AddExp(pattr->value.nValue, GameLog::clItemAddExp, pStdItem->m_nIndex); // break; break; } } } } else if(nType == Item::itRandomMove) { CScene * pScene = m_pEntity->GetScene(); if (!pScene) { return false; } CSkillResult::RandTransfer(m_pEntity->GetFuBen(), pScene, m_pEntity); needDelete = true; } else if(nType == Item::itHair) { m_pEntity->SetProperty(PROP_ENTITY_ICON,pStdItem->m_wShape); needDelete = true; } else if(nType == Item::itDoubleExp) { Uint64 nNowexp =m_pEntity->GetProperty(PROP_ACTOR_MULTI_EXP_UNUSED); // int nMaxexp = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nMaxDoubleExpValue; // if(nNowexp >= nMaxexp) // { // ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmdoubleExpFull, tstUI); // return false; // } if(((CActor*)m_pEntity)->checkGetMaxDouExp()) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmdoubleExpFull, tstUI); return false; } int lv =m_pEntity->GetProperty(PROP_CREATURE_LEVEL); unsigned int nMaxPlayerLevel = GetLogicServer()->GetDataProvider()->GetMiscConfig().GetPlayerMaxLevel(m_pEntity->GetProperty(PROP_ACTOR_CIRCLE), 1); if(lv >= nMaxPlayerLevel) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmCircleToMaxLv, tstUI); return false; } int64_t nAddValue = 0; for(INT_PTR i=0; i< pStdItem->m_StaticAttrs.nCount; i++) { PGAMEATTR pattr = &pStdItem->m_StaticAttrs.pAttrs[i]; nAddValue += pattr->value.nValue; } m_pEntity->SetProperty(PROP_ACTOR_MULTI_EXP_UNUSED, (Uint64)(nNowexp+nAddValue)); ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmUseItemAddExpGeneral, tstUI, nAddValue); needDelete = true; } else if(nType == Item::itFunctionItem || nType == Item::itDailyUse || nType == Item::itAutoUse) //功能物品执行脚本(使用此类道具需要触发脚本) { int nDelType = 0; CScriptValueList paramList, retList; paramList << m_pEntity; paramList << nCount; paramList << (int)pUserItem->wItemId; paramList << pUserItem; paramList << nDelType; //扣除物品类型 如果为0则在脚本删除物品 1则扣除耐久(次数) paramList << (int)nParam; ((CActor*)m_pEntity)->OnItemEvent(paramList, retList); if (retList.count() > 1) //通过脚本返回true或false { isSucceed = (bool)retList[1]; needDelete = false; } if (retList.count() > 2) { nUseCount = (int)retList[2]; } } else if (nType == Item::itGift || nType == Item::itGold) { if(!bagIsEnough(BagGitf)) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmGiftNoBagNum, tstUI); return false; } //神装BOSS挑战卷 单独处理 if(437 == pStdItem->m_nIndex) { if (((CActor*)m_pEntity)->GetStaticCountSystem().GetStaticCount(nSZBOSS_STATICTYPE) >= 100 ) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmItemLimitSZBossTime, tstUI); return false; } ((CActor*)m_pEntity)->GetBossSystem().SendSZBossTimes(); } bool bSend2Client = false; if(1051 == pStdItem->m_nIndex) bSend2Client = true; bool isSucceed = ((CActor*)m_pEntity)->GiveDropAward(pStdItem->m_ndropGroupid, GameLog::Log_UseGift,bSend2Client); if(isSucceed == true) needDelete= true; } else if (nType == Item::itBox) { if(!bagIsEnough(BagGitf)) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmGiftNoBagNum, tstUI); return false; } if (pStdItem->m_SelectItems.size() > 0) { for(int i = 0; i < pStdItem->m_SelectItems.size(); i++) { const SelectItemInfo& info = pStdItem->m_SelectItems[i]; if(info.nIndex == nParam) { // for(int k = 0; k < info.items.size(); k++) // { // const ItemDeathSplit& item = info.items[k]; // ((CActor*)m_pEntity)->GiveAward(item.nType, item.nItemId, item.nCount); // } bool isSucceed = ((CActor*)m_pEntity)->GiveDropAward(info.m_ndropGroupid,GameLog::Log_UseBox); if(isSucceed == true) needDelete= true; } } } } else if (nType == Item::itSelectOneBox) { //次元首领 开启归属奖、勇斗奖、参与奖宝箱 if(1085 == pUserItem->wItemId || 1086 == pUserItem->wItemId || 1087 == pUserItem->wItemId) { //次元钥匙不足提示 if ( ((CActor*)m_pEntity)->GetStaticCountSystem().GetStaticCount(eSTATIC_TYPE_DIMENSIONAL_KEY) <= 0) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmKuaFuDimensionalKeyNotEnough, tstUI); return false; } for(int i = 0; i < pStdItem->m_SelectItems.size(); i++) { const SelectItemInfo& info = pStdItem->m_SelectItems[i]; for (size_t j = 0; j < info.items.size(); j++) { const ItemDeathSplit& item = info.items[j]; if (item.nItemId == pUserItem->wItemId) { ((CActor*)m_pEntity)->GetStaticCountSystem().OnAddDimensionalKey(-1 * item.nCount); ((CActor*)m_pEntity)->SetProperty(PROP_ACTOR_DIMENSIONALKEY, ((CActor*)m_pEntity)->GetStaticCountSystem().GetStaticCount(eSTATIC_TYPE_DIMENSIONAL_KEY)); bool isSucceed = ((CActor*)m_pEntity)->GiveDropAward(info.m_ndropGroupid, GameLog::Log_UseBox); if(isSucceed == true) needDelete= true; break; } } } } } else if(nType == Item::itYuanBaoCharge) { bool isSucceed = ((CActor*)m_pEntity)->GiveDropAward(pStdItem->m_ndropGroupid,GameLog::Log_RechargeCard); if(isSucceed == true) needDelete= true; } else if(nType == Item::itRebateYuanBaoCharge) // 使用返利卡 { ((CActor*)m_pEntity)->SetRebateCharge(true); bool isSucceed = ((CActor*)m_pEntity)->GiveDropAward(pStdItem->m_ndropGroupid,GameLog::Log_RechargeCard); if(isSucceed == true) needDelete= true; } // else if (nType == Item::itSkillBook) // { // if(pStdItem->m_nSillId > 0) // { // INT_PTR nSkillLevel = ((CActor *)m_pEntity)->GetSkillSystem().GetSkillLevel(pStdItem->m_nSillId); // if(nSkillLevel > 0) // { // ((CActor *)m_pEntity)->SendOldTipmsgWithId(tpHasLearnSkill,ttTipmsgWindow + ttFlyTip); // return; // } // } // CActorPacket AP; // CDataPacket& DataPacket = ((CActor*)m_pEntity)->AllocPacket(AP); // DataPacket << (BYTE)enScriptMiscSystem << (BYTE)enScriptMiscSystemsUseSkillBookResult; // DataPacket << (BYTE)1; // DataPacket << (int)pUserItem->wItemId; // AP.flush(); // } if(needDelete) { // if( nType == Item::itSlowHpdMed || nType == Item::itSlowBluedMed || nType == Item::itFastMedicament) //药品 // { // if(bNeedAddBuff) //没加buf就不扣道具 // { // DeleteItem(pUserItem, nCount,"use item",GameLog::clUserItem); // } // else // { // isSucceed = false; // } // } // else { DeleteItem(pUserItem,nCount,"use item",GameLog::Log_UserItem); ((CActor*)m_pEntity)->GetAchieveSystem().ActorAchievementComplete(nAchieveCostItem, nCount, pUserItem->wItemId); } } if(bNeedRes) { CActorPacket pack ; CDataPacket &data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE) (enBagSystemID) << (BYTE) (enBagSystemsUseItemResult); data << (WORD)(pStdItem->m_nIndex); data << (BYTE) (isSucceed ? 1:0); pack.flush(); } if (isSucceed && !isEquip ) { ItemUseEnterCD(nCDGroupId, nCDTime); } if ( isSucceed ) { // ((CActor*)m_pEntity)->GetQuestSystem()->OnQuestEvent(CQuestData::qtUseItem, pStdItem->m_nIndex, nUseCount); // ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmItemUseSuccess, tstUI, pStdItem->m_sName); } return isSucceed; } bool CUserBag::CheckUseItemCD(int nGroupId) { if (nGroupId < 0 || nGroupId >= s_nMaxItemCDGroupCount) { OutputMsg(rmError, _T("%s invalid item cd group[%d]"), __FUNCTION__, nGroupId); return true; } if (GetGlobalLogicEngine()->getTickCount() < m_aItemCDGroupExpireTimeTbl[nGroupId]) return true; return false; } void CUserBag::ItemUseEnterCD(int nGroupId, int nCDTime) { if (nGroupId < 0 || nGroupId >= s_nMaxItemCDGroupCount) { OutputMsg(rmError, _T("%s invalid item cd group[%d]"), __FUNCTION__, nGroupId); return; } m_aItemCDGroupExpireTimeTbl[nGroupId] = GetGlobalLogicEngine()->getTickCount() + nCDTime; } void CUserBag::HandUseItem(CDataPacketReader &packet) { //判断区域内能不能用这个物品 if (!m_pEntity) return; CUserItem::ItemSeries itemGuid; BYTE bIsHeroUse = 0; //是否是给英雄用的 int nIndex = 0; packet >> itemGuid.llId >> bIsHeroUse >> nIndex; CUserItem* pUserItem = Inherited::FindItemByGuid(itemGuid); if( pUserItem == NULL) return ; //找不到这个物品 const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem == NULL) return; CScene* pScene = m_pEntity->GetScene(); int x, y; m_pEntity->GetPosition(x, y); //((CActor *)m_pEntity)->m_nFcmTime = 10; if (pScene && pScene->HasMapAttribute(x, y, aaNotItemId, pStdItem->m_nIndex)) { return; //((CActor *)m_pEntity)->SendOldTipmsgWithId(tpItemRegionCanNotUseItem,ttFlyTip + ttTipmsgWindow); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemRegionCanNotUseItem, tstUI); } if (m_pEntity->HasState(esStateStall)) { ((CActor *)m_pEntity)->SendOldTipmsgWithId(tpStallNoUseItem, ttFlyTip); return; } int nOpenServerDay = GetLogicServer()->GetDaysSinceOpenServer(); if(pStdItem->m_nOpenDaylimit != 0 && pStdItem->m_nOpenDaylimit >= nOpenServerDay) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmUseItemOpenDaylimit, tstUI); return; } //特定使用次数 年月周的限制 if(pStdItem->m_CanUseType > eITEM_USE_LIMIT_NULL && pStdItem->m_CanUseType < eITEM_USE_LIMIT_MAX) //使用次数限制 { LONGLONG nStaticNum = 0; if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_DAY) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexDailyInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountDaily(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexDaily(pStdItem->m_nIndex); } } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_WEEK) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexWeekInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountWeek(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexWeek(pStdItem->m_nIndex); } } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_MONTH) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexMonthInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountMonth(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexMonth(pStdItem->m_nIndex); } } if(nStaticNum <= 0) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmUseItemUselimit, tstUI);//提示新增 return; } } if (pStdItem->isEquipment()) //如果是装备的话 { ((CActor*)m_pEntity)->GetEquipmentSystem().TakeOn(itemGuid); //穿上装备 } else { INT_PTR nTipmsgID = CUserEquipment::CheckTakeOnCondition(m_pEntity, pStdItem, pUserItem); if (nTipmsgID) { if(m_pEntity->GetHandle().GetType() == enActor) { // 通知客户端使用物品失败 CActorPacket pack ; CDataPacket &data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE) (enBagSystemID) << (BYTE) (enBagSystemsUseItemResult); data << (WORD)(pStdItem->m_nIndex); data << (BYTE) 0; pack.flush(); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemCanNotUse, tstUI); } return; //不能使用 } bool result = OnUseItem(pUserItem, pStdItem, 1, bIsHeroUse ? true : false, nIndex); if (result) { if(pStdItem->m_CanUseType > eITEM_USE_LIMIT_NULL && pStdItem->m_CanUseType < eITEM_USE_LIMIT_MAX) //使用次数限制 { if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_DAY) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountDaily(pStdItem->m_nIndex, 1); } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_WEEK) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountWeek(pStdItem->m_nIndex, 1); } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_MONTH) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountMonth(pStdItem->m_nIndex, 1); } } } } } void CUserBag::HandDelItem(CDataPacketReader &packet) { CUserItem::ItemSeries itemGuid; packet >> itemGuid.llId; CUserItem *pUserItem = Inherited::FindItemByGuid(itemGuid); if(pUserItem ==NULL) { ((CActor *)m_pEntity)->SendOldTipmsgWithId(tpItemNotExist, ttTipmsgWindow); return; } if ( GetLogicServer()->IsCommonServer() ) { if ( !pUserItem->binded() ) { ((CActor*)m_pEntity)->SendOldTipmsgWithId(tpNotDropItemCommon, ttTipmsgWindow); return; } } int nPosX, nPosY; m_pEntity->GetPosition(nPosX, nPosY); if (m_pEntity->HasState(esStateStall)) { return; } const CStdItem * pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(NULL == pStdItem) return; bool canDelete = true; WORD wItemId(pUserItem->wItemId); if( pStdItem->m_btType == Item::itQuestItem ) { } else { if(pStdItem->m_Flags.denyDestroy) { canDelete = false; } if(strlen(pUserItem->cBestAttr) != 0) { canDelete = false; } } if(!canDelete) //如果不能删除的话 { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemCanNotDelete, tstUI); return; } if (((CActor *)m_pEntity)->GetDealSystem().FindDealItem(pUserItem)) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmFailForDealing, tstUI); return; } WORD nCount= pUserItem->wCount; DeleteItem(pUserItem,pUserItem->wCount,"self_del_item",GameLog::Log_SelfDelItem, true); } //丢弃金币 void CUserBag::HandDestroyCoin(CDataPacketReader &packet) { } void CUserBag::HandQueryItems(CDataPacketReader &packet) { //TestAddItem(266, 1); CActorPacket pack; INT_PTR nCount = Inherited::count(); CDataPacket &data = ((CActor *)m_pEntity)->AllocPacket(pack); data <<(BYTE)enBagSystemID << (BYTE)enBagSystemsInitBagItem; data <<(int)GetBagCount(0); data <<(int)GetBagCount(1); data <<(int)GetBagCount(2); data << (WORD) nCount; // CUserItem ** pItem =Inherited::operator CUserItem**(); for(INT_PTR i=0; i< nCount; i++) { if(m_pUserItemList[i]) { (CUserItem)*m_pUserItemList[i] >> data; } } pack.flush(); // GetGlobalLogicEngine()->GetEntityMgr()->BroadTipmsgWithParams(tmNoMoreCoin, tstFigthing); } void CUserBag::HandQueryItemsExtraInfo(CDataPacketReader &packet) { //TestAddItem(266, 1); CActorPacket pack; INT_PTR nCount = Inherited::count(); CDataPacket &data = ((CActor *)m_pEntity)->AllocPacket(pack); data <<(BYTE)enBagSystemID << (BYTE)sBagSystemQueryItemsExtraInfo; // data <<(int)GetBagCount(0); // data <<(int)GetBagCount(1); // data <<(int)GetBagCount(2); int ccount = 0; INT_PTR nOffer = data.getPosition(); data << ccount; // CUserItem ** pItem =Inherited::operator CUserItem**(); for(INT_PTR i = 0; i< nCount; i++) { if(m_pUserItemList[i]) { const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(m_pUserItemList[i]->wItemId); if(pStdItem == NULL) continue; //特定使用次数 年月周的限制 if(pStdItem->m_CanUseType > eITEM_USE_LIMIT_NULL && pStdItem->m_CanUseType < eITEM_USE_LIMIT_MAX) //使用次数限制 { LONGLONG nStaticNum = 0; if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_DAY) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexDailyInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountDaily(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexDaily(pStdItem->m_nIndex); } } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_WEEK) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexWeekInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountWeek(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexWeek(pStdItem->m_nIndex); } } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_MONTH) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexMonthInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountMonth(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexMonth(pStdItem->m_nIndex); } } data << pStdItem->m_nIndex; data << (int)nStaticNum; ccount++; } } } INT_PTR nOffer2 = data.getPosition(); data.setPosition(nOffer); data << ccount; data.setPosition(nOffer2); pack.flush(); // GetGlobalLogicEngine()->GetEntityMgr()->BroadTipmsgWithParams(tmNoMoreCoin, tstFigthing); } void CUserBag::HandQueryItemsExtraInfoOne(CDataPacketReader &packet) { int nItemIndex = 0; packet >> nItemIndex; //TestAddItem(266, 1); CActorPacket pack; INT_PTR nCount = Inherited::count(); CDataPacket &data = ((CActor *)m_pEntity)->AllocPacket(pack); data <<(BYTE)enBagSystemID << (BYTE)sBagSystemQueryItemsExtraInfoOne; // data <<(int)GetBagCount(0); // data <<(int)GetBagCount(1); // data <<(int)GetBagCount(2); const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(nItemIndex); if(pStdItem == NULL) { data << 0; data << 0; pack.flush(); return; } //特定使用次数 年月周的限制 if(pStdItem->m_CanUseType > eITEM_USE_LIMIT_NULL && pStdItem->m_CanUseType < eITEM_USE_LIMIT_MAX) //使用次数限制 { LONGLONG nStaticNum = 0; if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_DAY) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexDailyInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountDaily(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexDaily(pStdItem->m_nIndex); } } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_WEEK) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexWeekInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountWeek(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexWeek(pStdItem->m_nIndex); } } if(pStdItem->m_CanUseType == eITEM_USE_LIMIT_MONTH) { if(((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexMonthInit(pStdItem->m_nIndex)) { ((CActor *)m_pEntity)->GetStaticCountSystem().OnReduceItemInnerStaticCountMonth(pStdItem->m_nIndex, - (pStdItem->m_CanUseCount + 1)); nStaticNum = pStdItem->m_CanUseCount; } else { nStaticNum = ((CActor *)m_pEntity)->GetStaticCountSystem().OnGetItemInnerIndexMonth(pStdItem->m_nIndex); } } data << pStdItem->m_nIndex; data << (int)nStaticNum; } else { data << 0; data << 0; pack.flush(); return; } pack.flush(); // GetGlobalLogicEngine()->GetEntityMgr()->BroadTipmsgWithParams(tmNoMoreCoin, tstFigthing); } //添加道具 void CUserBag::HandAddItem(CDataPacketReader &packet) { if (m_pEntity->HasState(esStateStall)) { return; } CActor *pActor = (CActor *)m_pEntity; int nCitemid = 0; int nCitemNum = 0; WORD nCount =0; packet >>nCount; //拆分出来的数量 WORD nItemId, nItemCount; byte btQuality, btStrong, btBind; std::vector v_iParams; int needCount = 0; int errorCode = 0; for(int i = 0; i < nCount; i++) { packet >> nItemId >> nItemCount >> btQuality >> btStrong >> btBind; CUserItemContainer::ItemOPParam iParam; iParam.wItemId = nItemId; iParam.wCount = (WORD)nItemCount; iParam.btQuality = btQuality; iParam.btStrong = btStrong; iParam.btBindFlag = btBind; needCount += nItemCount; v_iParams.push_back(iParam); } if(needCount > availableMinCount()) { errorCode = 1; } if(v_iParams.size() == 0) { errorCode = 2; } if(!errorCode) { std::vector::iterator it = v_iParams.begin(); for(;it!= v_iParams.end(); it++) { AddItem(*it,m_pEntity->GetEntityName(),GameLog::clAddItem); } }else { CActorPacket pack; CDataPacket &data= pActor->AllocPacket(pack); data << (BYTE)enBagSystemID << (BYTE)enBagSystemcAddItem <<(BYTE)errorCode; pack.flush(); } } void CUserBag::HandGetBagEnlargeFee(CDataPacketReader &packet) { // BYTE nEnGrids = 0; //扩展多少个格子 // packet >> nEnGrids; // INT_PTR nFee = 0, nNeedItemCount = 0; // CActor *pActor = (CActor *)m_pEntity; // unsigned int nBagCount = pActor->GetProperty(PROP_ACTOR_BAG_GRID_COUNT);//当前的背包的数量 // BAGCONFIG &config = GetLogicServer()->GetDataProvider()->GetBagConfig(); // unsigned int nNewGrids = nBagCount + nEnGrids; // BYTE bEnLargeFlag = 1; // if (nBagCount == (unsigned int)config.nMaxBagCount) // { // pActor->SendOldTipmsgWithId(tpItemBagTooBig, ttFlyTip); // return; // } // if( nNewGrids > (unsigned int)config.nMaxBagCount ) //已经是最大的容量了 // { // pActor->SendOldTipmsgFormatWithId(tpItemBagOverMax, ttFlyTip, nEnGrids); // return; // } // for (INT_PTR i = nBagCount + 1; i <= nNewGrids; i++) // { // INT_PTR nDiffCount = i;//- config.nDefaultBagCount; // nNeedItemCount += nDiffCount * config.nEnLargeFeeArray[spefItemCount]; // nFee += nDiffCount * config.nEnLargeFeeArray[spefFeeVal]; // } // CActorPacket pack; // CDataPacket &data= pActor->AllocPacket(pack); // data << (BYTE)enBagSystemID << (BYTE)enBagSystemsSendBagEnlargeFee <<(BYTE)bEnLargeFlag << (int)nFee <GetProperty(PROP_ACTOR_BAG_GRID_COUNT); //获取当前的网格的数量 BAGCONFIG &config = GetLogicServer()->GetDataProvider()->GetBagConfig(); if(config.nMaxBagCount <= nOldGrid) { pActor->SendOldTipmsgWithId(tpItemBagTooBig,ttDialog ); return false; } INT_PTR nNewGrid = nOldGrid + nAddGridCount; //新增加的格子之后的 if(nNewGrid > config.nMaxBagCount ) //不能超过最大 { nNewGrid =config.nMaxBagCount ; } pActor->SetProperty(PROP_ACTOR_BAG_GRID_COUNT,(unsigned int)nNewGrid); pActor->SendOldTipmsgFormatWithId(tpItemEnlargeSucceed,ttTipmsgWindow,nNewGrid -nOldGrid ); setCapacity(nNewGrid); return true; } //处理网络消息包,扩展背包 void CUserBag::HandEnlargeBag(CDataPacketReader &packet) { // { // BYTE nEnGrids; // packet >> nEnGrids; // CActor * pActor = (CActor*)m_pEntity; // INT_PTR nCurGrids = pActor->GetProperty(PROP_ACTOR_BAG_GRID_COUNT); // BAGCONFIG & config = GetLogicServer()->GetDataProvider()->GetBagConfig(); // INT_PTR nNewGrids = nCurGrids + nEnGrids; // if (nCurGrids == config.nMaxBagCount) // { // pActor->SendOldTipmsgWithId(tpItemBagTooBig, ttFlyTip); // return; // } // if (nNewGrids > config.nMaxBagCount) // { // pActor->SendOldTipmsgFormatWithId(tpItemBagOverMax, ttFlyTip, nEnGrids); // return; // } // unsigned int nNowDt = GetGlobalLogicEngine()->getMiniDateTime(); // int nCurAddSecs = nNowDt - m_nResetBagTime; // if (nCurAddSecs < 0) // { // nCurAddSecs = 0; // } // int nCurTimes = pActor->GetProperty(PROP_ACTOR_BAG_TIME) + nCurAddSecs; // INT_PTR nFee = 0, nGiveExp = 0, nNeedTimes = 0; // for (INT_PTR i = nCurGrids + 1; i <= nNewGrids; i++) // { // INT_PTR nDiffCount = i ;//- config.nDefaultBagCount; // nGiveExp += config.nEnlargeGiveExp[nDiffCount-1]; // int nTimes = config.nEnlargeTimes[nDiffCount-1]*60; // if (nCurTimes >= nTimes) // { // nCurTimes -= nTimes; // } // else // { // nFee += nDiffCount * config.nEnLargeFeeArray[spefFeeVal]; // } // } // if (nFee > 0 && pActor->GetMoneyCount(eMoneyType(config.nEnLargeFeeArray[spefFeeType])) < nFee) // { // pActor->SendOldTipmsgFormatWithId(tpItemMoneyNotEnoughEnlargeBag, ttFlyTip, // nEnGrids, nFee, CMiscSystem::GetMoneyName(config.nEnLargeFeeArray[spefFeeType])); // return; // } // LPCSTR sLogStr = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpLogEnlargeBag); // if (nFee > 0 && !pActor->ChangeMoney(config.nEnLargeFeeArray[spefFeeType], -1*nFee, GameLog::clEnlargeBag, 0, sLogStr)) // { // return; // } // if (nGiveExp > 0) // { // pActor->AddExp(nGiveExp, GameLog::clEnlargeBag); // } // pActor->SetProperty(PROP_ACTOR_BAG_GRID_COUNT, (unsigned int)nNewGrids); // pActor->SetProperty(PROP_ACTOR_BAG_TIME, nCurTimes); // m_nResetBagTime = nNowDt; // pActor->SendOldTipmsgFormatWithId(tpItemEnlargeSucceed, ttFlyTip, nEnGrids, nGiveExp); // setCapacity(nNewGrids); } void CUserBag::HandSlpitItem(CDataPacketReader &packet) { if (m_pEntity->HasState(esStateStall)) { return; } CUserItem::ItemSeries itemGuid; WORD nCount =0; packet >> itemGuid.llId; //物品的Guid packet >>nCount; //拆分出来的数量 if( !Inherited::SplitItem(itemGuid,nCount) ) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmItemSplitBagFail,tstUI); //通知拆分失败 } } /* 道具合并叠加 两方道具必须都是绑定或者非绑定 */ void CUserBag::HandMergeItem(CDataPacketReader &packet) { if (m_pEntity->HasState(esStateStall)) { return; } CUserItem::ItemSeries srcGuid,tgtGuid; packet >> srcGuid.llId; // 源的GUID packet >> tgtGuid.llId; // 目标GUID if( (tgtGuid.llId == srcGuid.llId) || (! Inherited::MergeItem(srcGuid,tgtGuid)) ) { ((CActor*)m_pEntity)->SendOldTipmsgWithId(tpItemMergeFail,ttTipmsgWindow); //通知拆分失败 } } INT_PTR CUserBag::GetBagEnlargeFeeErorCode(INT_PTR &nFee,INT_PTR & nGridCount,INT_PTR &nMoneyType) { unsigned int nBagCount =m_pEntity->GetProperty(PROP_ACTOR_BAG_GRID_COUNT);//当前的背包的数量 BAGCONFIG &config = GetLogicServer()->GetDataProvider()->GetBagConfig(); bool bCanEnlared = true; //能否扩大背包格子 if((unsigned int)config.nMaxBagCount <= nBagCount) //已经是最大的容量了 { nFee =0; //费用 nGridCount =0; nMoneyType =0; return tpItemBagTooBig; } else { /* int nEnlargeTimes = (config.nMaxBagCount - nBagCount)/ config.nEnlargeOneTime; //还能扩展多少次 if(nEnlargeTimes <=0 ) { nEnlargeTimes =1; } else if(nEnlargeTimes > MAX_BAG_ENLARGE_TIMES) { nEnlargeTimes = MAX_BAG_ENLARGE_TIMES; //防止溢出 } nMoneyType = config.enlargeFeeTypeArray[MAX_BAG_ENLARGE_TIMES -nEnlargeTimes]; //金钱的类型 nFee = config.enlargeFeeArray[MAX_BAG_ENLARGE_TIMES -nEnlargeTimes]; //金钱的数值 int nTime= (nBagCount - config.nDefaultBagCount) / config.nEnlargeOneTime; //第几次扩展 if(nTime <0) { nTime =0; } else if(nTime >= MAX_BAG_ENLARGE_TIMES) { nTime = MAX_BAG_ENLARGE_TIMES-1; } nMoneyType = config.enlargeFeeTypeArray[nTime]; //金钱的类型 nFee = config.enlargeFeeArray[nTime]; //金钱的数值 nGridCount = config.nEnlargeOneTime; //每次扩大的个数 if( ((CActor *)m_pEntity)->GetMoneyCount(nMoneyType) < nFee ) //金钱不够 { return tpItemMoneyNotEnoughEnlargeBag; }*/ } return tpNoError; } void CUserBag::Save(PACTORDBDATA pData) { if(m_pEntity ==NULL) return; if(HasDbDataInit() ==false ) { OutputMsg(rmWaning,"CUserBag::Save has not inited"); return; //如果没有装载玩家的数据就不存储 } if( !HasDataModified()) return;//如果数据没有修改,并且没有数据没保存成功 CDataPacket& dataPacket =GetLogicServer()->GetDbClient()->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSaveBagItem); dataPacket << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex(); dataPacket <<(unsigned int ) m_pEntity->GetId(); //玩家ID size_t count = Inherited::count(); // OutputMsg(rmTip,_T("玩家 %s 保存背包数据count=%d"),m_pEntity->GetEntityName(), count); dataPacket << (BYTE )itItemBag << (int)count ; //玩家物品的数量 // CUserItem ** pItem =Inherited::operator CUserItem**(); for (UINT_PTR i=0; iGetDbClient()->flushProtoPacket(dataPacket); //SetDataOnWayFlag(true); //有数据在路上 SetDataModifyFlag(false); //数据的修改全部发往了db服务器 } VOID CUserBag::OnTimeCheck(TICKCOUNT nTickCount) { // if (!m_pEntity || m_pEntity->GetType() != enActor) // { // return; // } // //检查物品到期时间 // CMiniDateTime tc; // CUserItem *pUserItem, **pItemList; // if (m_ItemTimeChkTimer.CheckAndSet(nTickCount)) // { // // pItemList = *this; // tc = GetLogicServer()->GetLogicEngine()->getMiniDateTime(); // //此处必须降序循环,否则会造成内存错误!因为循环中有删除操作。 // for (INT_PTR i=count()-1; i>-1; --i) // { // pUserItem = m_pUserItemList[i]; // //物品过期! // if (pUserItem && (pUserItem->time.tv & CMiniDateTime::RecordFlag) && tc >= pUserItem->time) // { // //发送物品时间到期的提示消息 // if (m_pEntity->GetType() == enActor) // { // SendItemTimeUp((CActor*)m_pEntity, pUserItem, 0); // const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(((CUserItem*)pUserItem)->wItemId); // //记录日志 // if (pStdItem && pStdItem->m_Flags.recordLog) // { // CUserBag::LogChangeItemCount(pUserItem, pStdItem, -pUserItem->wCount, // "Item TimeUp", m_pEntity->GetId(), m_pEntity->GetEntityName(), // GameLog::clTimeupItem, ((CActor*)m_pEntity)->GetAccount()); // } // } // //删除物品 // RemoveItem(i, "ITU", GameLog::clTimeupItem, true); // } // } // } } unsigned int CUserBag::GetItemLeftTime(CUserItem *pUserItem) { return 0; } //添加物品 VOID CUserBag::OnAddItem(const CStdItem * pStdItem, INT_PTR nItemCount,INT_PTR nLogIdent,const CUserItem *pUserItem) { if(pStdItem ==NULL) return; if(pStdItem->isEquipment()) { /*if( pUserItem ) { NotifyItemChange(pUserItem); //获得装备,下发此装备的消息 } */ return; //装备不处理,只处理普通物品 } //数据发生了改变 SendBagItemChangeTipmsg(pStdItem->m_nIndex ,nItemCount,pUserItem,nLogIdent); // if( pStdItem->m_btType == Item::itExpBox ) //经验魔盒 // { // AssignExpItem(); //指定一个经验盒子作为当前吸收经验的盒子 // } } VOID CUserBag::OnAddItemById(int itemId, INT_PTR nItemCount, INT_PTR nLogIdent,const CUserItem *pUserItem) { // 为什么装备和普通物品区分开来发tipmsg??? const CStdItem *pItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(itemId); if (!pItem) return; if(m_pEntity ==NULL || m_pEntity->IsInited() ==false) return; if (pItem->isEquipment()) { /*if( pUserItem ) { NotifyItemChange(pUserItem); //获得装备,下发此装备的消息 } */ return; } SendBagItemChangeTipmsg(itemId, nItemCount, pUserItem, nLogIdent); // if( pItem->m_btType == Item::itExpBox ) //经验道具(经验盒子) // { // AssignExpItem(); //指定一个经验盒子作为当前吸收经验的盒子 // } } void CUserBag::SendBagItemChangeTipmsg(INT_PTR nItemID,INT_PTR nCount,const CUserItem * pUserItem,INT_PTR nLogIndex, int nMsgId) const { if ( GetHandle().GetType() != enActor || nCount ==0 ) { return; } //获得actorID unsigned int nActorID = m_pEntity->GetProperty(PROP_ENTITY_ID); if(nCount >0) //获得物品 { //脱下装备和合并,放到仓库不提示获得物品 if (nLogIndex != GameLog::clTakeOffItem && nLogIndex != GameLog::clEquipSplit && nLogIndex != GameLog::clDeport2Bag && nLogIndex != GameLog::clHeroTakeOffEquip ) { ((CActor*)m_pEntity)->SendOldTipmsgFormatWithId(tpItemBagGetItem,ttTipmsgWindow, CUserBag::GetItemLink((int)nItemID,pUserItem),nCount); //这里的功能是用于提示客户端新获得了一件装备或者源泉,不是从身上脱下来的,仓库拿到的,或 const CStdItem * pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(nItemID); if(pStdItem ==NULL) return; if (pUserItem) { bool isEquipment = pStdItem->isEquipment(); CActorPacket pack; CDataPacket &data= ((CActor *)m_pEntity)->AllocPacket(pack); data << (BYTE)enBagSystemID << (BYTE)enBagSystemsBagGetNewItem << (pUserItem->series) <<(WORD)nItemID<<(WORD)nCount; pack.flush(); } } else { return; } } else //失去 { //背包到仓库,合并和穿上不提示失去物品 if (nLogIndex != GameLog::clTakeOnItem && nLogIndex != GameLog::clItemMerge && nLogIndex != GameLog::clBag2Deport && nLogIndex != GameLog::clHeroTakeOnEquip ) { if (nMsgId == 0) { nMsgId = tpItemBagLostItem; } ((CActor*)m_pEntity)->SendOldTipmsgFormatWithId(nMsgId,ttTipmsgWindow, CUserBag::GetItemLink((int)nItemID,pUserItem),-nCount); } else { return ; } } if(nCount <0) return; //拾取物品不需要广播 //if(nLogIndex == GameLog::clKillMonsterItem) //只有杀怪掉落的物品才广播 //{ // CTeam *pTeam = ((CActor*)m_pEntity)->GetTeam(); // if( pTeam) // { // char * pTips = CUserBag::GetItemLink((int)nItemID,pUserItem); // if(pTips ==NULL) return; // const TEAMMEMBER* pMember= pTeam->GetMemberList() ; // for(INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT ; i++) // { // if(pMember[i].pActor && pMember[i].nActorID !=nActorID ) // { // pMember[i].pActor->SendOldTipmsgFormatWithId(tpLootItem,ttTipmsgWindow, // ((CActor*)m_pEntity)->GetEntityName(),pTips); // } // } // } //} } VOID CUserBag::LogNewItem(const CUserItem *pUserItem, const CStdItem *pStdItem, LPCSTR lpSender, const INT_PTR nLogIdent) const { if(pUserItem ==NULL || !pStdItem )return; if ( GetHandle().GetType() == enActor ) { } } VOID CUserBag::LogItemCountChange(const CUserItem *pUserItem, const CStdItem *pStdItem, const INT_PTR nCountChg, LPCSTR lpSender, const INT_PTR nLogIdent) const { if ( m_pEntity->GetHandle().GetType() == enActor ) { } } VOID CUserBag::SendAddItem(const CUserItem *pUserItem,INT_PTR nLogIdent, BYTE bBatchUseShow,BYTE bNotice) const { if(m_pEntity ==NULL || pUserItem ==NULL ) return; //数据发生了改变 if ( m_pEntity->GetHandle().GetType() == enActor ) { CActorPacket pack; CDataPacket &data= ((CActor *)m_pEntity)->AllocPacket(pack); data << (BYTE)enBagSystemID << (BYTE)enBagSystemsAddItem <<(BYTE)0; (CUserItem)(*pUserItem)>> data; data<< bBatchUseShow << bNotice; pack.flush(); const CStdItem * pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem) { if ( pStdItem->isEquipment() ) //装备需要发提示 { (( CUserBag*)this)->SendBagItemChangeTipmsg(pUserItem->wItemId,pUserItem->wCount,(CUserItem*)pUserItem,nLogIdent ); //装备肯定是一件 } //如果是任务物品或物品需要作为任务物品处理,这里脚本的事件通知 if (pStdItem->m_btType == Item::itQuestItem || pStdItem->m_Flags.asQuestItem) { INT_PTR nItCount = ((CActor*)m_pEntity)->GetBagSystem().GetItemCount(pUserItem->wItemId); // ((CActor *)m_pEntity)->GetQuestSystem()->OnQuestEvent(CQuestData::qtCollect,pUserItem->wItemId, nItCount,FALSE); } } } } //物品的叠加数量发生改变的时候发消息给玩家 //isGetNewCount=true 是获得新的物品数量,非整理或合并导致的数量变化 VOID CUserBag::SendItemCountChange(const CUserItem *pUserItem, bool isGetNewCount, BYTE bBatchUseShow) const { if ( m_pEntity->GetHandle().GetType() == enActor ) { if(m_pEntity->IsInited()) { CActorPacket pack; CDataPacket &data= ((CActor *)m_pEntity)->AllocPacket(pack); data << (BYTE)enBagSystemID << (BYTE)enBagSystemsItemCountChange << (LONG64)pUserItem->series.llId << (WORD)pUserItem->wCount << isGetNewCount << bBatchUseShow; pack.flush(); //如果是任务物品或物品需要作为任务物品处理,这里脚本的事件通知 const CStdItem * pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if (pStdItem && pStdItem->m_btType == Item::itQuestItem || pStdItem->m_Flags.asQuestItem) { INT_PTR nItCount = ((CActor*)m_pEntity)->GetBagSystem().GetItemCount(pUserItem->wItemId); // ((CActor *)m_pEntity)->GetQuestSystem()->OnQuestEvent(CQuestData::qtCollect,pUserItem->wItemId,nItCount,FALSE); } } } } //删除物品 VOID CUserBag::OnDeleteItem(const CStdItem * pStdItem, INT_PTR nItemCount,INT_PTR nLogIdent, int nMsgId,const CUserItem *pUserItem) { if(!pStdItem->isEquipment()) { SendBagItemChangeTipmsg(pStdItem->m_nIndex,-nItemCount,pUserItem,nLogIdent, nMsgId); } } void CUserBag::SendItemChangeLog(int nType, int nCount, int nItemId, int nLogId, LPCSTR sDes) { if(nLogId) { // int nType = 1; //add // if(nCount < 0) // nType = 2; //del if(nType == 1 && GameLog::Log_Deport2Bag != nLogId) ((CActor*)m_pEntity)->GetQuestSystem()->OnQuestEvent(CQuestData::qtGetItem,nCount, nItemId); const CStdItem *pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(nItemId); if (pStdItem && pStdItem->m_Flags.recordLog) { GetLogicServer()->SendItemLocalLog(nLogId,(CActor*)m_pEntity,nItemId, pStdItem->m_btType,nCount,nType); char logs[1024] = {0}; if(sDes && strlen(sDes) > 0) { sprintf_s(logs,1024,"%s|%s",pStdItem->m_sName,sDes); }else { sprintf_s(logs,1024,"%s",pStdItem->m_sName); } logs[1023] = 0; GetLogicServer()->GetLogClient()->SendItemLocalLog(nType, (WORD)nLogId, (unsigned int)((CActor *)m_pEntity)->GetId(), (unsigned int)((CActor *)m_pEntity)->GetAccountID(), ((CActor *)m_pEntity)->GetAccount(), ((CActor *)m_pEntity)->GetEntityName(), (WORD)nItemId, (int)nCount, logs,((CActor *)m_pEntity)->getOldSrvId()); } } } VOID CUserBag::SendDeleteItem(const CUserItem *pUserItem,INT_PTR nLogIdent) const { if(m_pEntity ==NULL) return; if ( m_pEntity->GetHandle().GetType() == enActor && m_pEntity->IsInited() ) { CActorPacket pack; CDataPacket &data= ((CActor *)m_pEntity)->AllocPacket(pack); data << (BYTE)enBagSystemID << (BYTE)enBagSystemsDelItem <<(LONG64) pUserItem->series.llId; pack.flush(); const CStdItem * pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem && ( pStdItem->isEquipment() ) ) //装备需要发提示 { //删除装备的,基本都是-1 INT_PTR nCount = -pUserItem->wCount; if(nCount ==0) { nCount =-1; } SendBagItemChangeTipmsg(pUserItem->wItemId,nCount,(CUserItem*)pUserItem,nLogIdent ); //装备肯定是一件 } } } //db返回 VOID CUserBag::OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader ) { if(m_pEntity ==NULL) { OutputMsg(rmError,_T("装载背包的数据出错,实体指针为MULL")); return; } //CUserItem data; //装载物品数据 if(nCmd == jxInterSrvComm::DbServerProto::dcLoadBagItem && nErrorCode == jxInterSrvComm::DbServerProto::reSucc) //返回物品的列表 { //需要判断是否重复装载玩家的数据,避免出现装载复制 if(HasDbDataInit()) { OutputMsg(rmError,_T("db return bag item repeated,actorid=%d "),m_pEntity->GetProperty(PROP_ENTITY_ID)); return; } int nCount =0; reader >> nCount; CUserItem userItem; CLogicEngine *pEngineer = GetLogicServer()->GetLogicEngine(); OutputMsg(rmTip,_T("玩家 %s 装载背包数据count=%d"),m_pEntity->GetEntityName(), nCount); for (INT_PTR i=0 ; i < nCount; i++ ) { userItem << reader; // INT_PTR nReadSize = reader.readBuf(&userItem,sizeof(CUserItem)); // if( sizeof(CUserItem) != nReadSize) //读取内存 // { // OutputMsg(rmError,"[%s] read net io error,size=%d ",__FUNCTION__,(int) nReadSize); // continue; // } if(availableCount(userItem.wPackageType)) { CUserItem *pUerItem = pEngineer->CopyAllocUserItem(false,&userItem); //不申请序列号 if(pUerItem) { AddItem(pUerItem,m_pEntity->GetEntityName(),0,false, false); //不需要记录日志的,不需要通知客户端 //addCostCount(pUerItem->wPackageType); } } else { OutputMsg(rmError,_T("玩家%s的物品数据出现错误, 背包类型%d 不足"),m_pEntity->GetEntityName(), userItem.wPackageType); //数据错误需要查看什么问题 return; } // if(i < capacity()) // { // INT_PTR nReadSize = reader.readBuf(&userItem,sizeof(CUserItem)); // if( sizeof(CUserItem) != nReadSize) //读取内存 // { // OutputMsg(rmError,"[%s] read net io error,size=%d ",__FUNCTION__,(int) nReadSize); // continue; // } // CUserItem *pUerItem = pEngineer->CopyAllocUserItem(false,&userItem); //不申请序列号 // if(pUerItem) // { // AddItem(pUerItem,m_pEntity->GetEntityName(),0,false); //不需要记录日志的,不需要通知客户端 // } // } // else // { // OutputMsg(rmError,_T("玩家%s的物品数据出现错误,个数超过了%d,被丢弃"),m_pEntity->GetEntityName(),capacity()); // } } OnDbInitData(); //标记DB的数据初始化完毕 //重置收集类的任务的进度值 // if (m_pEntity->GetType() == enActor) // ((CActor*)m_pEntity)->GetQuestSystem()->ResetQuestValues(); AssignExpItem(); //指定一个经验盒子作为当前吸收经验的盒子 return; } //zac switch(nCmd) { //存储db的数据成功 case jxInterSrvComm::DbServerProto::dcSaveBagItem: { //保存的数据成功了,表明没有数据没有保存成功 if(nErrorCode == jxInterSrvComm::DbServerProto::reSucc) { //SetDataOnWayFlag(false); } } break; case jxInterSrvComm::DbServerProto::dcLoadActiveBag: { if (nErrorCode != jxInterSrvComm::DbServerProto::reSucc) { OutputMsg(rmError,_T("load user active bag item error!")); return; } SendActiviItemByMail(reader); //返回活动背包列表,发送给客户端 //SendActiveItem(reader,ACTORITEM); break; } case jxInterSrvComm::DbServerProto::dcGetActiveItem: { if (nErrorCode != jxInterSrvComm::DbServerProto::reSucc) { ((CActor *)m_pEntity)->SendOldTipmsgFormatWithId(tpActivityBagGetItemFail,ttDialog); return; } GetActiveItem(reader,ACTORITEM); break; } case jxInterSrvComm::DbServerProto::dcDeleteActiveItem: { if (nErrorCode != jxInterSrvComm::DbServerProto::reSucc) { OutputMsg(rmError,_T("remove active bag item fail!error=%d"),nErrorCode); } break; } } } //背包系统接收来自于会话服进程的数据 VOID CUserBag::OnSsRetData( INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader ) { if (!m_pEntity || m_pEntity->GetType() != enActor) return; switch(nCmd) { case sUserItemList: { if (nErrorCode != jxInterSrvComm::SessionServerProto::neSuccess) { OutputMsg(rmError,_T("load user active bag item error!")); return; } //返回活动背包列表,发送给客户端 SendActiveItem(reader,ACCOUNTITEM); break; } case sGetUserItem: { if (nErrorCode != jxInterSrvComm::SessionServerProto::neSuccess) { ((CActor *)m_pEntity)->SendOldTipmsgFormatWithId(tpActivityBagGetItemFail,ttDialog); return; } GetActiveItem(reader,ACCOUNTITEM); break; } case sDeleteUserItem: { if (nErrorCode != jxInterSrvComm::SessionServerProto::neSuccess) { OutputMsg(rmError,_T("remove active bag item fail!error=%d"),nErrorCode); } break; } case sAddValueCard: { if (nErrorCode != jxInterSrvComm::SessionServerProto::neSuccess) { OnUseSACardResult(op_Failed, (int)nErrorCode, 0, 0, 0, true); return; } OnGetSACardInfo(reader, false); break; } case sQueryAddValueCard: { if (nErrorCode != jxInterSrvComm::SessionServerProto::neSuccess) { OnUseSACardResult(op_Failed, (int)nErrorCode, 0, 0, 0, false); return; } OnGetSACardInfo(reader, true); break; } } } VOID CUserBag::Destroy() { /* CList::Iterator it(m_sellUserList); CList::NodeType *pNode; CUserItem *pItem; //回收内存 for (pNode=it.first(); pNode; pNode = it.next()) { pItem = *pNode; it.remove(pNode); GetGlobalLogicEngine()->DestroyUserItem(pItem); } */ for(INT_PTR i= m_sellUserList.count() -1; i>=0; i--) { if(m_sellUserList[i]) { GetGlobalLogicEngine()->DestroyUserItem(m_sellUserList[i]); } } m_sellUserList.clear(); Clear(NULL, 0); InheritedSybSystem::Destroy(); } //添加一个卖给商店的物品,如果成功返回true bool CUserBag::AddSellItem(CUserItem * itemPtr) { /* CList::Iterator it(m_sellUserList); CList::NodeType *pNode; CUserItem *pItem; for (pNode=it.first(); pNode; pNode = it.next()) { pItem = * pNode; if(pItem== itemPtr) //已经存在了 { return false; } } m_sellUserList.linkAtLast(itemPtr); */ for(INT_PTR i=0; i< m_sellUserList.count(); i++) { if(m_sellUserList[i] == itemPtr) return false; } m_sellUserList.add(itemPtr); return true; } //删除一个卖给物品的指针,如果成功返回true bool CUserBag::DelSellItem(CUserItem *pUserItem) { /* CList::Iterator it(m_sellUserList); CList::NodeType *pNode; CUserItem *pItem; for (pNode=it.first(); pNode; pNode = it.next()) { pItem = * pNode; if(pItem== pUserItem) //已经存在了 { it.remove(pNode); return true; } } */ for(INT_PTR i=0; i< m_sellUserList.count(); i++) { if(m_sellUserList[i] == pUserItem) { m_sellUserList.remove(i); return true; } } return false; } //获得卖给商店的物品的指针 CUserItem * CUserBag::GetSellItem(unsigned long long guid) { /* CList::Iterator it(m_sellUserList); CList::NodeType *pNode; CUserItem *pItem; for (pNode=it.first(); pNode; pNode = it.next()) { pItem = * pNode; if(pItem->series.llId == guid) { return pItem; } } */ for(INT_PTR i= m_sellUserList.count() -1; i > -1 ; i--) { if(m_sellUserList[i] && m_sellUserList[i]->series.llId == guid) { return m_sellUserList[i]; } } return NULL; } void CUserBag::HandActiveBagList( CDataPacketReader &packet ) { ReqActiveBagData(); } void CUserBag::ReqActiveBagData() { if (!m_pEntity || m_pEntity->GetType() != enActor) return; unsigned int nAccountId = ((CActor*)m_pEntity)->GetAccountID(); unsigned int nActorId = m_pEntity->GetProperty(PROP_ENTITY_ID); //向会话服务器请求活动背包数据 CLogicSSClient* pSSClient = GetLogicServer()->GetSessionClient(); CDataPacket &data = pSSClient->allocProtoPacket(cUserItemList); //分配一个 网络包 data << (unsigned int)nAccountId; data << (unsigned int)nActorId; pSSClient->flushProtoPacket(data); //向数据服务器发送活动背包数据 CDataClient* pDbClient = GetLogicServer()->GetDbClient(); CDataPacket &data1 = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadActiveBag); //分配一个 网络包 data1 << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex(); data1 << (unsigned int)nAccountId; data1 << (unsigned int)nActorId; pDbClient->flushProtoPacket(data1); } void CUserBag::HandGetActiveBagItem( CDataPacketReader &packet ) { if (!m_pEntity || m_pEntity->GetType() != enActor) return; if(m_bGetActiveItemFlag) { OutputMsg(rmError,_T("Actor GetActiveItem err")); return; } unsigned int nAccountId = ((CActor*)m_pEntity)->GetAccountID(); unsigned int nActorId = m_pEntity->GetProperty(PROP_ENTITY_ID); INT64 nId = 0; BYTE nType = 0; packet >> nId; packet >> nType; if (nType == ACCOUNTITEM) { CLogicSSClient* pSSClient = GetLogicServer()->GetSessionClient(); CDataPacket &data = pSSClient->allocProtoPacket(cGetUserItem); //分配一个 网络包 data << (unsigned int)nAccountId; data << (unsigned int)nActorId; data << (INT64)nId; pSSClient->flushProtoPacket(data); m_bGetActiveItemFlag = true; } else { CDataClient* pDbClient = GetLogicServer()->GetDbClient(); CDataPacket &data = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcGetActiveItem); //分配一个 网络包 data << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex(); data << (unsigned int)nAccountId; data << (unsigned int)nActorId; data << (INT64)nId; pDbClient->flushProtoPacket(data); m_bGetActiveItemFlag = true; } } void CUserBag::SendActiveItem( CDataPacketReader &reader,INT_PTR nType ) { int nCount = 0; reader >> nCount; CMailSystem::MAILATTACH stMailAtach[MAILATTACHCOUNT]; int nMailItemCount = 0, nAllCount = nCount; byte nBindFlag = 0; unsigned int nMyId = m_pEntity->GetId(); LPCSTR sTitle = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpActivityMailTitle); LPCSTR sContent = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpActivityMailContent); for (INT_PTR i = 0; i < nCount; i++) { INT64 nId = 0; int nItemId = 0; BYTE bBind = 0,bStrong = 0, bQuality = 0; int nItemCount = 0; reader >> nId; reader >> nItemId; reader >> bBind; reader >> bStrong; reader >> bQuality; reader >> nItemCount; nAllCount--; if (bBind > 0) { nBindFlag = bBind; } CMailSystem::MAILATTACH & oneItem = stMailAtach[nMailItemCount++]; oneItem.item.wCount = nItemCount; if (nItemId >= MAXITEMID) { int nType = nItemId - MAXITEMID; switch(nType) { case mtBindCoin: oneItem.nType = qatBindMoney; break; case mtCoin: oneItem.nType = qatMoney; break; case mtBindYuanbao: oneItem.nType = qatBindYb; break; case mtYuanbao: oneItem.nType = qatYuanbao; break; default: oneItem.nType = qatBindMoney; break; } } else { oneItem.nType = qatEquipment; oneItem.item.wItemId = nItemId; } if (nMailItemCount >= MAILATTACHCOUNT || nAllCount <= 0) { CMailSystem::SendMail(nMyId, sTitle, sContent, stMailAtach); memset(stMailAtach, 0, sizeof(stMailAtach)); nMailItemCount = 0; } //删除物品 if (nType == ACCOUNTITEM) { CDataPacket &data = GetLogicServer()->GetSessionClient()->allocProtoPacket(cDeleteUserItem); //通知数据库删除这个物品 data << (int)nMyId; data << (INT64)nId; GetLogicServer()->GetSessionClient()->flushProtoPacket(data); } else { CDataClient* pDbClient = GetLogicServer()->GetDbClient(); CDataPacket &data = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcDeleteActiveItem); // data << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex(); data << (int)nMyId; data << (INT64)nId; pDbClient->flushProtoPacket(data); } } if (nCount > 0 && m_pEntity->GetType() == enActor)//有活动背包物品,提示 { ((CActor*)m_pEntity)->SendOldTipmsgFormatWithId(tpActivityItemNotity,ttDialog); } } void CUserBag::OnGetSACardInfo(CDataPacketReader &reader, bool bQuery) { if (m_pEntity->GetType() != enActor) return; CActor *pActor = (CActor *)m_pEntity; UINT64 nSN = 0; int nType = 0, nSubType = 0; char szCreateTime[32] = {0}; reader >> nSN >> nType >> nSubType; reader.readString(szCreateTime, ArrayCount(szCreateTime)); OnUseSACardResult(op_Succ, 0, nSN, nType, nSubType, bQuery); OutputMsg(rmNormal, _T("Query SACard OK! SN=%llu, type=%d, subType=%d card createtime:%s"), nSN, nType, nSubType, szCreateTime); } void CUserBag::OnUseSACardResult(int nResult, int nErrorCode, UINT64 nSN, int nType, int nSubType, bool bQuery) { SACardInfo info; info.m_nSN = nSN; info.m_nType = nType; info.m_nSubType = nSubType; info.m_nErrorCode = nErrorCode; info.m_bQuery = bQuery; CActor *pActor = (CActor *)m_pEntity; pActor->GetAsyncOpCollector().NotifyAsyncOpResult(asop_useSACard, nResult, &info); } void CUserBag::UseServicesAddedCard(UINT64 nCardSeries, bool bQueryOrUse) { if (m_pEntity->GetType() != enActor) return; CActor *pActor = (CActor *)m_pEntity; unsigned int nUID = pActor->GetAccountID(); unsigned int nCID = pActor->GetId(); if (nCardSeries < MinSeriesLmt) { //暂时屏蔽 //OnUseSACardResult(op_Failed, op_ParamError, nCardSeries, 0, 0, bQueryOrUse); //return; } if (pActor->GetAsyncOpCollector().StartAsyncOp(asop_useSACard, 10000, 0, true)) { CLogicSSClient *pSSClient = GetLogicServer()->GetSessionClient(); jxSrvDef::INTERSRVCMD cmd = cAddValueCard; if (bQueryOrUse) cmd = cQueryAddValueCard; CDataPacket &pack = pSSClient->allocProtoPacket(cmd); pack << nUID << nCID << nCardSeries; pack.writeString(m_pEntity->GetEntityName()); pack.writeString( ((CActor*)m_pEntity)->GetAccount()); pSSClient->flushProtoPacket(pack); } } void CUserBag::GetActiveItem( CDataPacketReader &reader,INT_PTR nType ) { //int nItemId = 0; //int nItemCount = 0; //INT64 nId = 0; //CUserItemContainer::ItemOPParam ItemPara; //LPCSTR sMemo = NULL; //reader >> nId; //reader >> nItemId; //reader >> ItemPara.btBindFlag; //reader >> ItemPara.btStrong; //reader >> ItemPara.btQuality; //reader >> nItemCount; //reader >> ItemPara.nSmith1 >> ItemPara.nSmith2 >> ItemPara.nSmith3 >> ItemPara.nBestSmith; //reader >> sMemo; // //if (nItemId == 0) //{ // ((CActor *)m_pEntity)->SendOldTipmsgFormatWithId(tpActivityBagGetItemFail,ttDialog); // return; //} //BYTE nItemType = (nItemId >= MAXITEMID)? (nItemId-MAXITEMID):10; //bool boGetSucc = true;//是否成功领取 //if (nItemType == 10) //{ // ItemPara.wCount = (BYTE)nItemCount; // ItemPara.wItemId = (WORD)nItemId; // if (CanAddItem(ItemPara)) // { // AddItem(ItemPara,sMemo,GameLog::clServerGiveItem);//背包添加物品 // } // else // { // ((CActor *)m_pEntity)->SendOldTipmsgFormatWithId(tpBagIsFull,ttDialog); // boGetSucc = false; // } //} //else //{ // ((CActor *)m_pEntity)->ChangeMoney(nItemType,nItemCount,GameLog::clServerGiveMoney,0,sMemo);//金钱类 //} //if (boGetSucc) //{ // unsigned int nActorId = m_pEntity->GetProperty(PROP_ENTITY_ID); // if (nType == ACCOUNTITEM) // { // CDataPacket &data = GetLogicServer()->GetSessionClient()->allocProtoPacket(cDeleteUserItem); //通知数据库删除这个物品 // data << (unsigned int)nActorId; // data << (INT64)nId; // GetLogicServer()->GetSessionClient()->flushProtoPacket(data); // } // else // { // CDataClient* pDbClient = GetLogicServer()->GetDbClient(); // CDataPacket &data = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcDeleteActiveItem); // // data << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex(); // data << (unsigned int)nActorId; // data << (INT64)nId; // pDbClient->flushProtoPacket(data); // } // //通知客户端 // CActorPacket AP; // ((CActor *)m_pEntity)->AllocPacket(AP); // AP << (BYTE)enBagSystemID << (BYTE)sUpdateActiveBag << (INT64)nId << (BYTE)1 << (BYTE)nType; // AP.flush(); // m_bGetActiveItemFlag = false; //} } VOID CUserBag::LogChangeItemCount(const CUserItem *pUserItem, const CStdItem *pStdItem, const INT_PTR nCountChg, LPCSTR lpSender, const INT_PTR nTgtId, LPCSTR sTargetName, const INT_PTR nLogIdent, LPCSTR sTargetAccount) { //TODO:实现记录获得物品并叠加到现有物品的日志,日志号是nLogIdent,物品给予者是lpSender,物品变更的数量为nCountChg if(pUserItem ==NULL || !pStdItem) return; char sSeries[64]; sprintf(sSeries,"%lld",pUserItem->series.llId); //序列号 if(GetLogicServer()->GetLocalClient() && pStdItem->m_Flags.recordLog) { } } VOID CUserBag::SendItemTimeUp(CActor *pActor, const CUserItem *pUserItem, INT_PTR nPos) { CActorPacket ap; pActor->AllocPacket(ap); ap << (BYTE)enBagSystemID << (BYTE)enBagSystemsItemTimeUp << (Uint64)pUserItem->series.llId << (BYTE)nPos; ap.flush(); } void CUserBag::OnEnterScene() { if (m_pEntity->GetType() != enActor) return; CActor *pActor = (CActor *)m_pEntity; CFuBen *pFb = pActor->GetFuBen(); if (!pFb) return; CScene *pScene = pActor->GetScene(); if (!pScene) return; int fbId = pFb->GetFbId(); int sceneId = pScene->GetSceneId(); const CStdItemProvider &itemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider(); for (INT_PTR i = count()-1; i >= 0; i--) { CUserItem *pItem = (*this)[i]; if(pItem) { const CStdItem *pStdItem = itemProvider.GetStdItem(pItem->wItemId); if (pStdItem) { if (pStdItem->needDelWhenExitScene(sceneId)) { //记录日志 if (pStdItem && pStdItem->m_Flags.recordLog) { CUserBag::LogChangeItemCount(pItem, pStdItem, -pItem->wCount, "Exit scene destroy", pActor->GetProperty(PROP_ENTITY_ID), pActor->GetEntityName(), GameLog::clLeftSceneRemoveItem, pActor->GetAccount()); } RemoveItem(i, "scene destroy", GameLog::clLeftSceneRemoveItem, true); } } } } } INT_PTR CUserBag::RemoveItemByType(int nType, const char * sComment, int nLogId) { const CStdItemProvider &itemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider(); for (INT_PTR i = 0; i < count(); i++) { CUserItem *pItem = (*this)[i]; if(!pItem)continue; const CStdItem *pStdItem = itemProvider.GetStdItem(pItem->wItemId); if (pStdItem && pStdItem->m_btType == nType) { RemoveItem(i, sComment, nLogId); return 1; } } return 0; } CUserItem* CUserBag::GetItemByType(int nType) { const CStdItemProvider &itemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider(); for (INT_PTR i = 0; i < count(); i++) { CUserItem *pItem = (*this)[i]; if(!pItem)continue; const CStdItem *pStdItem = itemProvider.GetStdItem(pItem->wItemId); if (pStdItem && pStdItem->m_btType == nType) { return pItem; } } return NULL; } bool CUserBag::IsStrongLevel( INT_PTR nStrong ) { for(INT_PTR i=0; i< count(); i ++) { CUserItem *pItem = (*this)[i]; if(pItem !=NULL && pItem->btStrong >= nStrong) { return true; } } return false; } /*ZGame不使用 bool CUserBag::IsForgeItem() { for(INT_PTR i=0; i< count(); i ++) { CUserItem *pItem = (*this)[i]; if(pItem !=NULL && pItem->btSmithCount > 0) { return true; } } return false; } */ CUserItem* CUserBag::GetDuraFullItemById( INT_PTR nItemId ) { // for(INT_PTR i=0; i< count(); i ++) // { // CUserItem *pItem = (*this)[i]; // if(pItem !=NULL && pItem->wItemId == nItemId) // { // const CStdItem * pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pItem->wItemId); // if(pStdItem ==NULL) continue; // int nMax =pStdItem->m_dwDura; //最大的耐久 // int nCurrent =MAKELONG(pItem->wDura,pItem->wDuraMax); //当前玩家的耐久 // if(nCurrent != nMax )continue; // return pItem; // } // } return NULL; } void CUserBag::BagQuestTarget( INT_PTR propId ) { // INT_PTR nValue = 0; // switch(propId) // { // case Item::ipItemStrong: // nValue = CQuestData::qstEquipStrong; // break; // case Item::ipItemHole1IsOpen: // case Item::ipItemHole2IsOpen: // case Item::ipItemHole3IsOpen: // case Item::ipItemHole4IsOpen: // nValue = CQuestData::qstEquipHole; // break; // case Item::ipItemHole1Item: // case Item::ipItemHole2Item: // case Item::ipItemHole3Item: // case Item::ipItemHole4Item: // nValue = CQuestData::qstEquipInjay; // break; // default: // break; // } // if(nValue) // ((CActor*)m_pEntity)->GetQuestSystem()->OnQuestEvent(CQuestData::qtStrengthen, nValue, 1); } void CUserBag::HandGetUpgradeCfg(CDataPacketReader &packet) { /* CScriptValueList paramList; ((CActor*)m_pEntity)->InitEventScriptVaueList(paramList,aeGetCanUpGrdConfig); ((CActor*)m_pEntity)->OnEvent(paramList,paramList); */ } INT_PTR CUserBag::GetAllItemCount() { INT_PTR nAllCount = 0; for(INT_PTR i=0; i< count(); i ++) { CUserItem *pItem = (*this)[i]; if(pItem !=NULL ) { nAllCount += pItem->wCount; } } return nAllCount; } void CUserBag::ClearEquipSharp(bool boCast) { INT_PTR nCount = count(); for (INT_PTR i = 0; i < nCount; i++) { CUserItem * pItem = (*this)[i]; if (pItem != NULL && pItem->btSharp > 0) { pItem->btSharp = 0; if (boCast) { NotifyItemChange(pItem); } } } } CUserItem* CUserBag::GetItemByIdx( INT_PTR nIdx ) { if( nIdx < 0 || nIdx > count()) return NULL; return (*this)[nIdx]; } int CUserBag::GetBagItemIndex(CUserItem * itemPtr) { if(itemPtr ==NULL) return -1; const CStdItem * pstdItem=NULL; CStdItemProvider &provider =GetLogicServer()->GetDataProvider()->GetStdItemProvider(); size_t count = Inherited::count(); for (int i=0; iwItemId); if(pstdItem ==NULL)continue; return i; } return -1; } INT_PTR CUserBag::RemoveItemDura(CUserItem * pUserItem,INT_PTR nCount,LPCSTR sComment,INT_PTR nLogID,bool bNeedFreeMemory) { // bool bNeedDelete = false; // const CStdItem *pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); // if(pStdItem ==NULL) return 0; // INT_PTR nChgValue = (INT_PTR)(nCount * pStdItem->m_dwUseDurDrop); // if (nChgValue > 0) // { // if (pUserItem->wDura < nChgValue) // { // return 0; // } // if (!SetItemProperty(pUserItem, Item::ipItemDua, (INT_PTR)pUserItem->wDura-nChgValue)) // { // return 0; // } // if (pUserItem->wDura <= 0) // bNeedDelete = true; // } // if (bNeedDelete) // { // DeleteItem(pUserItem, 1, sComment, nLogID, bNeedFreeMemory); // } // return nChgValue; } CUserItem * CUserBag::GetEquipItemPtr(const CUserItem::ItemSeries itemGuid, int &nItemPos, int &nHeroId, int nEntityId) { CUserItem* pUserItem = NULL; if (nEntityId <= 0) //如果是人物则先找背包再找装备 { //背包 pUserItem = Inherited::FindItemByGuid(itemGuid); if (pUserItem) { nItemPos = 1; //背包 nHeroId = 0; return pUserItem; } //玩家装备 pUserItem = ((CActor*)m_pEntity)->GetEquipmentSystem().GetEquipByGuid(itemGuid); if (pUserItem) { nItemPos = 2; //玩家身上 nHeroId = 0; return pUserItem; } //遍历英雄 CVector &heros = ((CActor*)m_pEntity)->GetHeroSystem().GetHeroList(); for (INT_PTR i = 0; i < heros.count(); i++) { CHeroEquip *pEquips = &(heros[i].equips); if (pEquips) { pUserItem = pEquips->GetEquipByGuid(itemGuid); if (pUserItem) { nItemPos = 3; //英雄身上 nHeroId = heros[i].data.bID; //英雄ID return pUserItem; } } } } else //如果是英雄 则 nEntityId为英雄ID { const CHeroSystem::HERODATA *pHero = ((CActor*)m_pEntity)->GetHeroSystem().GetHeroData(nEntityId); if (pHero) { CHeroEquip equips = pHero->equips; pUserItem = equips.GetEquipByGuid(itemGuid); if (pUserItem) { nItemPos = 3; //英雄身上 nHeroId = pHero->data.bID; return pUserItem; } } } nItemPos = 0; nHeroId = 0; return NULL; } void CUserBag::SendActiviItemByMail( CDataPacketReader & reader ) { //应该不使用,没维护代码 int nCount = 0; reader >> nCount; unsigned int nMyId = m_pEntity->GetId(); LPCSTR sTitle = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpActivityMailTitle); LPCSTR sContent = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpActivityMailContent); for (INT_PTR i = 0; i < nCount; i++) { byte nMailItemCount = 0; CMailSystem::MAILATTACH stMailAtach[MAILATTACHCOUNT]; INT64 nId = 0; int nItemId = 0; BYTE bBind = 0,bStrong = 0, bQuality = 0; int nItemCount = 0; int nSmith[CUserItem::MaxSmithAttrCount], nInitSmith; int nRever1, nRever2; reader >> nId; reader >> nItemId; reader >> bBind; reader >> bStrong; reader >> bQuality; reader >> nItemCount; reader >> nSmith[0] >> nSmith[1] >> nSmith[2] >> nSmith[3] >> nSmith[4] >> nInitSmith >> nRever1 >> nRever2; CMailSystem::MAILATTACH & oneItem = stMailAtach[nMailItemCount++]; oneItem.item.wCount = nItemCount; if (nItemId >= MAXITEMID) { int nType = nItemId - MAXITEMID; switch(nType) { case mtBindCoin: oneItem.nType = qatBindMoney; break; case mtCoin: oneItem.nType = qatMoney; break; case mtBindYuanbao: oneItem.nType = qatBindYb; break; case mtYuanbao: oneItem.nType = qatYuanbao; break; default: oneItem.nType = qatBindMoney; break; } } else { CMailSystem::AddMailAttach(oneItem, oneItem.nType, nItemId, bQuality, bStrong, bBind > 0? true:false, nSmith); CMailSystem::SendMail(nMyId, sTitle, sContent,stMailAtach); } CDataClient* pDbClient = GetLogicServer()->GetDbClient(); CDataPacket &data = pDbClient->allocProtoPacket(jxInterSrvComm::DbServerProto::dcDeleteActiveItem); // data << ((CActor *)m_pEntity)->GetRawServerIndex() << GetLogicServer()->GetServerIndex(); data << (int)nMyId; data << (INT64)nId; pDbClient->flushProtoPacket(data); } if (nCount > 0 && m_pEntity->GetType() == enActor)//有活动背包物品,提示 { ((CActor*)m_pEntity)->SendOldTipmsgFormatWithId(tpActivityItemNotity,ttDialog); } } void CUserBag::HandUseStrongItem(CDataPacketReader &packet) { } void CUserBag::HandSmashGoldEgg(CDataPacketReader &packet) { } void CUserBag::HandLuckAwardOpt(CDataPacketReader &packet) { } void CUserBag::HandGetPerfectCompTimes(CDataPacketReader &packet) { } void CUserBag::HandUseFiveAttrItem(CDataPacketReader &packet) { } void CUserBag::HandUseItemRecoverEx(CDataPacketReader &packet) { } void CUserBag::BatchUseItemAtOnce(WORD wItemId, WORD wCount) { CUserItem* pUserItem = Inherited::FindItem(wItemId, -1, -1, wCount); if( !pUserItem || pUserItem->wCount < wCount ) { return; } if (wCount == 1) { const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) return; CScene* pScene = m_pEntity->GetScene(); int x,y; m_pEntity->GetPosition(x,y); if (pScene && pScene->HasMapAttribute(x,y,aaNotItemId,pStdItem->m_nIndex)) { //((CActor *)m_pEntity)->SendOldTipmsgWithId(tpItemRegionCanNotUseItem,ttFlyTip + ttTipmsgWindow); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemRegionCanNotUseItem, tstUI); return; } if (m_pEntity->HasState(esStateStall)) { ((CActor *)m_pEntity)->SendOldTipmsgWithId(tpStallNoUseItem, ttFlyTip); return; } if (pStdItem->isEquipment()) //如果是装备的话 { ((CActor*)m_pEntity)->GetEquipmentSystem().TakeOn(pUserItem); //穿上装备 } else { INT_PTR nTipmsgID =CUserEquipment::CheckTakeOnCondition(m_pEntity,pStdItem, pUserItem); if (nTipmsgID) { ((CActor *)m_pEntity)->SendOldTipmsgWithId(nTipmsgID,ttFlyTip + ttTipmsgWindow); return; //不能使用 } OnUseItem(pUserItem, pStdItem); } } else BatchUseItem(pUserItem, wCount); } /* 批量使用物品,注意根据物品作用不同,批量处理的逻辑是不一样的 协议(8,8) */ void CUserBag::HandBatchUseItem(CDataPacketReader &packet) { if (!m_pEntity || m_pEntity->GetType() != enActor) { return; } int itemId = 0; int wCount = 0; CUserItem::ItemSeries itemGuid; packet >> itemId >> wCount >> itemGuid.llId; CUserItem* pUserItem = Inherited::FindItemByGuid(itemGuid); if(pUserItem == NULL) return; if(pUserItem->wCount < wCount) return; const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) return; CScene* pScene = m_pEntity->GetScene(); int x,y; m_pEntity->GetPosition(x,y); if (pScene && pScene->HasMapAttribute(x,y,aaNotItemId,pStdItem->m_nIndex)) { //((CActor *)m_pEntity)->SendOldTipmsgWithId(tpItemRegionCanNotUseItem,ttFlyTip + ttTipmsgWindow); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemRegionCanNotUseItem, tstUI); return; } if (m_pEntity->HasState(esStateStall)) { ((CActor *)m_pEntity)->SendOldTipmsgWithId(tpStallNoUseItem, ttFlyTip); return; } if (pStdItem->isEquipment()) //如果是装备的话 { return; // ((CActor*)m_pEntity)->GetEquipmentSystem().TakeOn(itemGuid); //穿上装备 } for(int i = 0 ; i < wCount; i++) { INT_PTR nTipmsgID =CUserEquipment::CheckTakeOnCondition(m_pEntity,pStdItem, pUserItem); if (nTipmsgID) { if(m_pEntity->GetHandle().GetType() ==enActor) { // 通知客户端使用物品失败 CActorPacket pack ; CDataPacket &data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE) (enBagSystemID) << (BYTE) (enBagSystemsUseItemResult); data << (WORD)(pStdItem->m_nIndex); data << (BYTE) 0; pack.flush(); ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmItemCanNotUse, tstUI); } return; //不能使用 } bool result = OnUseItem(pUserItem, pStdItem, 1, true); if(!result) break; } CActorPacket pack ; CDataPacket &data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE) (enBagSystemID) << (BYTE) (enBagSystemsUseItemResult); data << (WORD)(pUserItem->wItemId); data << (BYTE) (1); pack.flush(); } void CUserBag::BatchUseItem(CUserItem* pUserItem, WORD wCount) { // if( !pUserItem || pUserItem->wCount < wCount ) // { // return; // } // const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); // if (!pStdItem) // { // return; // } // BYTE btBacthType = pStdItem->m_btBatchType; // int nBatchValue = pStdItem->m_nBatchValue; // if ( btBacthType <= 0 || btBacthType >= batMAx || nBatchValue == 0 ) // { // return; // } // CActor* pActor = (CActor*)m_pEntity; // CScene* pScene = m_pEntity->GetScene(); // int x,y; // m_pEntity->GetPosition(x,y); // if (pScene && pScene->HasMapAttribute(x,y,aaNotItemId,pStdItem->m_nIndex)) // { // //pActor->SendOldTipmsgWithId(tpItemRegionCanNotUseItem,ttFlyTip + ttTipmsgWindow); // pActor->SendTipmsgFormatWithId(tmItemRegionCanNotUseItem, tstUI); // return; // } // if (m_pEntity->HasState(esStateStall)) // { // pActor->SendOldTipmsgWithId(tpStallNoUseItem, ttFlyTip); // return; // } // INT_PTR nTipmsgID =CUserEquipment::CheckTakeOnCondition(m_pEntity,pStdItem, pUserItem); // if (nTipmsgID) // { // pActor->SendOldTipmsgWithId(nTipmsgID,ttFlyTip + ttTipmsgWindow); // return; // } // /* // //技能熟练度物品特殊处理 // if( btBacthType == batSkillExpItem) // { // pActor->GetSkillSystem().BatchUseSkillExpItem(pUserItem,pStdItem,wCount); // return; // } // */ // if( btBacthType == batNormalItem ) // { // /*for( int i=0; iGetQuestSystem()->OnQuestEvent(CQuestData::qtUseItem, 会在OnUseItem()中触发 // OnUseItem(pUserItem, pStdItem, wCount); // //} // return; // } // /*判断该道具是否有使用次数限制 // 相关配置:ItemUseCountCfg // */ // int nLastCount = 0; //该道具可使用的剩余次数 // int nMaxCount = 0; //该道具可使用的最大次数 // CNpc * pNpc = GetGlobalLogicEngine()->GetGlobalNpc(); // if (pNpc != NULL) // { // CScriptValueList paramList, retParamList; // paramList << pActor; // paramList << pUserItem->wItemId; // if( !pNpc->GetScript().Call("getItemUseCount", paramList, retParamList) ) //检查该道具是否有使用次数限制 // { // const RefString & s = pNpc->GetScript().getLastErrorDesc(); // return; // } // if( retParamList.count() > 2 ) // { // nLastCount = (int)retParamList[1]; //这里是1、2 // nMaxCount = (int)retParamList[2]; // // } // if( nMaxCount > 0 ) //该道具有使用限额 // { // if( nLastCount <= 0 ) //今日已经没有可以使用的次数 // { // ((CActor *)m_pEntity)->SendOldTipmsgWithId(tpItemNoDuraCanNotUseItem,ttFlyTip + ttTipmsgWindow); // return; // } // if( wCount > nLastCount ) //如果大于剩余次数,则取剩余次数 // { // wCount = nLastCount; // } // } // } // INT_PTR nCount = DeleteItem(pUserItem, wCount, "batch use item",GameLog::clUserItem); // if ( nCount < wCount ) // { // return; // } // if( nMaxCount > 0 ) // { // CScriptValueList paramList2, retParamList2; // paramList2 << pActor; // paramList2 << pUserItem->wItemId; // paramList2 << nCount; // if( !pNpc->GetScript().Call("AddDailyItemUseCount", paramList2, retParamList2) ) // { // const RefString & s = pNpc->GetScript().getLastErrorDesc(); // return; // } // } // bool boUse = false; // INT_PTR nTotalValue = (INT_PTR)nBatchValue * wCount; // INT_PTR nTotalValueAdd = nTotalValue; //实际增加的数值 // switch(btBacthType) // { // case batExp: // { // pActor->AddExp((INT_PTR)nTotalValue,GameLog::clBatchUseItem); // boUse = true; // break; // } // case batBindCoin: // { // pActor->ChangeMoney(mtBindCoin, nTotalValue, GameLog::clBatchUseItem, 0, "batch use item"); // boUse = true; // break; // } // case batCoin: // { // pActor->ChangeMoney(mtCoin, nTotalValue, GameLog::clBatchUseItem, 0, "batch use item"); // boUse = true; // break; // } // case batCirclePower: // { // pActor->ChangeCircleSoul((int) nTotalValue ); // boUse = true; // break; // } // case batGuildCoin: // { // CGuild* pGuild = pActor->GetGuildSystem()->GetGuildPtr(); // if (!pGuild) // { // return; // } // pGuild->ChangeGuildCoin((int)nTotalValue,GameLog::clBatchUseItem, "batch use item"); // boUse = true; // break; // } // case batDragonSoulItem: // { // //pActor->ChangePropertyValue(PROP_ACTOR_DRAGONSOUL_VALUE, nTotalValue, tpAddDragonSoulValue, tpReduceDragonSoulValue ); // boUse = true; // break; // } // case batBindGold: // { // pActor->ChangeMoney(mtBindYuanbao, nTotalValue, GameLog::clBatchUseItem, 0, "batch use item"); // boUse = true; // break; // } // case batBossJifen: // { // pActor->ChangeMoney(mtBossJiFen, nTotalValue, GameLog::clBatchUseItem, 0, "batch use item"); // boUse = true; // break; // } // default:break; // } // if ( boUse ) // { // // pActor->GetQuestSystem()->OnQuestEvent(CQuestData::qtUseItem, pStdItem->m_nIndex, wCount); // if( nMaxCount > 0 ) //有最大使用次数限制 // { // CScriptValueList paramList3, retParamList3; // paramList3 << pActor; // paramList3 << pUserItem->wItemId; // paramList3 << nCount; // paramList3 << nTotalValueAdd; // paramList3 << (int)(nLastCount-nCount); // if( !pNpc->GetScript().Call("OnBatchUseItem", paramList3, retParamList3) ) // { // const RefString & s = pNpc->GetScript().getLastErrorDesc(); // return; // } // } // } } void CUserBag::HandArrangeItemList(CDataPacketReader & packet) { if (!m_pEntity || m_pEntity->GetType() != enActor) { return; } ArrangeItemList(GameLog::Log_ItemMerge); CActorPacket pack; CDataPacket &data= ((CActor *)m_pEntity)->AllocPacket(pack); data << (BYTE)enBagSystemID << (BYTE)enBagSystemsArrangeBagOver; pack.flush(); } /* 道具合并叠加(绑定感染) 两方道具允许绑定->非绑或非绑->绑定 */ void CUserBag::HandMergeItemBindInfect(CDataPacketReader &packet) { if (!m_pEntity || m_pEntity->GetType() != enActor) { return; } CActor* pActor = (CActor*)m_pEntity; CUserItem::ItemSeries itemSrcGuid; //源道具 CUserItem::ItemSeries itemDesGuid; //目标道具 packet >> itemSrcGuid.llId >> itemDesGuid.llId ; CUserItem* pUserItemSrc = Inherited::FindItemByGuid(itemSrcGuid); CUserItem* pUserItemDes = Inherited::FindItemByGuid(itemDesGuid); if( !pUserItemSrc || !pUserItemDes ) { return; } WORD nDesOldCount = pUserItemDes->wCount; //目标道具的原数量 if( Inherited::MergeItem(itemSrcGuid, itemDesGuid,true) ) //道具合并,绑定感染 { //绑定污染,记录日志 if (GetLogicServer()->GetLocalClient()) { } } } /* 指定一个经验道具作为当前吸收经验道具 */ void CUserBag::AssignExpItem() { // size_t count = Inherited::count(); // m_pExpItem =NULL; // unsigned int nMaxExp =0; // const CStdItem * pStdItem=NULL; // CStdItemProvider &provider =GetLogicServer()->GetDataProvider()->GetStdItemProvider(); // //找一个经验最满的作为经验盒子 // for( UINT_PTR i=0; i < count; i++ ) // { // CUserItem *pUserItem =(CUserItem*) (*this)[i]; // if( pUserItem ==NULL ) // { // continue; // } // pStdItem =provider.GetStdItem( pUserItem->wItemId ); // if( pStdItem == NULL ) // { // continue; // } // if( pStdItem->m_btType == Item::itExpBox ) // { // unsigned int newDura = MAKELONG( pUserItem->wDura, pUserItem->wDuraMax ); //当前的经验 // if( newDura < pStdItem->m_dwDura && newDura >= nMaxExp ) //经验的前提是没有满 // { // m_pExpItem = pUserItem; // nMaxExp = newDura; // } // } // } } /* 在背包中获取一个指定类型的物品指针 有特殊搜索条件,需要另行处理 */ CUserItem* CUserBag::GetOneItemByItemTypeInBag(BYTE nItemType) { return NULL; //没有符合条件的物品 } /* 增加经验道具(或类似功能道具)吸收的经验 通过装备耐久 */ void CUserBag::ChangeHpPotValue(CUserItem *pEquip,int nValue) { // if(pEquip == NULL) return; // const CStdItem * pStdItemd = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pEquip->wItemId); // if(pStdItemd == NULL) return; // if( Item::itExpBox == pStdItemd->m_btType ) // { // unsigned int nEquipValue = MAKELONG( pEquip->wDura, pEquip->wDuraMax); //高低位合并后,才是当前经验(耐久度) // if( nEquipValue >= pStdItemd->m_dwDura ) // { // return ; //已经满了 // } // /* // byte nVipRate = ((CActor *)m_pEntity)->GetVipPrivile(ExpItemCollectRate); //VIP比率 // if (nVipRate > 0) // { // nValue = (int)(nValue * nVipRate/100 + nValue); // } // */ // nEquipValue += nValue; // if(nEquipValue <0) nEquipValue =0; // 最小是0 // bool flag =false; // if(nEquipValue >= pStdItemd->m_dwDura) // { // nEquipValue = pStdItemd->m_dwDura; // flag =true; // } // pEquip->wDura = LOWORD(nEquipValue); //低16位 // pEquip->wDuraMax = HIWORD(nEquipValue); //高16位 // if(flag) // { // AssignExpItem(); // } // SetDataModifyFlag(true); // } } CUserItem* CUserBag::GetItemPtrHighestStar(WORD nItemId) { const CStdItem * pStdItemd = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(nItemId); if(pStdItemd == NULL || !pStdItemd->isEquipment()) return NULL; CUserItem* pUserItem = NULL; CUserItem *pItem = NULL; for (INT_PTR i = count()-1; i >= 0; --i) { pItem = (*this)[i]; if(pItem && pItem->wItemId == nItemId) { if(pUserItem == NULL) { pUserItem = pItem; }else { if(pItem->wStar > pUserItem->wStar) { pUserItem = pItem; } } } } return pUserItem; } bool CUserBag::HasItemIdentifyAttrs( CUserItem* pUserItem ) { if( !pUserItem ) { return false; } for( INT_PTR i = 0; i < CUserItem::MaxSmithAttrCount; i++ ) { if( pUserItem->smithAttrs[i].nValue ) //存在鉴定属性 { return true; } } return false; } /* 装备鉴定属性转移 */ void CUserBag::TransferItemIdentifyAttrs( CUserItem* pSrcUserItem, CUserItem* pDesUserItem ) { } void CUserBag::TestAddItem(int itemid, int itemNum) { CUserItemContainer::ItemOPParam iParam; iParam.wItemId = itemid; iParam.wCount = (WORD)itemNum; iParam.btQuality = 1; iParam.btStrong = 1; iParam.btBindFlag = 1; AddItem(iParam,m_pEntity->GetEntityName(),GameLog::clGMAddItem); CUserItem* pUserItem = Inherited::FindItem(266, -1, -1, 1); if( pUserItem==NULL) return ; //找不到这个物品 const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(pStdItem ==NULL) return; OnUseItem(pUserItem,pStdItem,1,true, 0); } bool CUserBag::AddItemByItemId(INT_PTR nItemID, INT_PTR nCount, INT_PTR nStar, INT_PTR nLostStar,INT_PTR nBind, INT_PTR bInSourceType, INT_PTR nAreaId,INT_PTR nTime) { const CStdItem *pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(nItemID); if (pStdItem == NULL) { return false ;//参数错误 } if (nCount <=0 ) { return false; } if (pStdItem->m_wDupCount <= 1) { for (WORD i = 0; i < (WORD)nCount; i++ ) { CUserItem* pUserItem = GetLogicServer()->GetLogicEngine()->AllocUserItem(true); pUserItem->wItemId = (WORD)nItemID; pUserItem->wCount = (WORD)1; pUserItem->wStar = (WORD)nStar; pUserItem->bLostStar = (BYTE)nLostStar; //TODO pUserItem->bInSourceType = (BYTE)bInSourceType; pUserItem->nAreaId = (int)nAreaId; pUserItem->btFlag = (BYTE)nBind; pUserItem->btQuality = (BYTE)0; CStdItem::AssignInstance (pUserItem,pStdItem); if(nTime > 0) { pUserItem->nCreatetime = (unsigned int)nTime; pUserItem->nCreatetime.startRecord(GetLogicServer()->GetLogicEngine()->getMiniDateTime()); } INT_PTR nAddItemCount = 0; nAddItemCount = AddItem(pUserItem,m_pEntity->GetEntityName(),GameLog::clAddItem); if( nAddItemCount <=0) { return false; } } } else { CUserItemContainer::ItemOPParam itemData; itemData.wItemId = (WORD)nItemID; itemData.btQuality = (BYTE)0; itemData.wCount = (WORD)nCount; itemData.wStar = (WORD)nStar; itemData.bLostStar = (BYTE)nLostStar; itemData.bInSourceType = (BYTE)bInSourceType; itemData.nAreaId = (int)nAreaId; itemData.btBindFlag = (BYTE)nBind; INT_PTR nAddItemCount = 0; nAddItemCount = AddItem(itemData,m_pEntity->GetEntityName(),GameLog::clGMAddItem); if( nAddItemCount >0) { return true; } else { return false; } } return true; } void CUserBag::HandleExChangeMoney(CDataPacketReader &packet) { int nCount = 0; BYTE nType = 0; packet >> nType; packet >> nCount; if(nType == 1) { int nCoin = ((CActor *)m_pEntity)->GetProperty(PROP_ACTOR_COIN); if(nCoin < nCount) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmCoinNotEnough, tstUI); return; } ((CActor *)m_pEntity)->ChangeCoin(-nCount, GameLog::Log_MoneyExChange, 0, ""); ((CActor *)m_pEntity)->ChangeBindCoin(nCount, GameLog::Log_MoneyExChange, 0, ""); } else { int nCoin = ((CActor *)m_pEntity)->GetProperty(PROP_ACTOR_YUANBAO); if(nCoin < nCount) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmNomoreYubao, tstUI); return; } int nBYb = ((CActor *)m_pEntity)->GetProperty(PROP_ACTOR_BIND_YUANBAO); unsigned int nMax = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nBindYuanbaoLimit; if(nBYb + nCount > nMax) { ((CActor *)m_pEntity)->SendTipmsgFormatWithId(tmBindYuanbaoFull, tstUI); return; } ((CActor *)m_pEntity)->ChangeMoney(mtYuanbao, -nCount, GameLog::Log_MoneyExChange, 0, ""); ((CActor *)m_pEntity)->ChangeMoney(mtBindYuanbao, nCount, GameLog::Log_MoneyExChange, 0, ""); } } void CUserBag::HandleRecoverItem(CDataPacketReader &packet) { int nType = 0; packet >> nType; bool isSuccess = true; int nRecoveCount = 0; if(nType >= 0) //一键 { CUserItem::ItemSeries itemSrcGuid; //源道具 packet >> itemSrcGuid.llId ; char nNormal[1024] = {0}; // int nBest = 0; packet.readString(nNormal); std::bitset<1024> nNormalId(nNormal); char nBest[1024] = {0}; // int nBest = 0; packet.readString(nBest); std::bitset<1024> nBestId(nBest); // packet >> nBest ; int nCount = Inherited::count(); // CUserItem** pItems = Inherited::operator CUserItem**(); for(int i = nCount-1; i > -1; --i) { CUserItem* pItem = m_pUserItemList[i]; if(!pItem || pItem->wCount <= 0) continue; const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pItem->wItemId); if(!pStdItem) { continue; } bool recoverBest = false; if(nType < 100 && strlen(pItem->cBestAttr) != 0 ) continue; if (nType < 100 ) //锻造回收的逻辑 { if(pStdItem->m_nItemlvl > nType) continue; //一键回收 if(nType == 4 && !pStdItem->nRecycling ) continue; } else if(nType >= 1000000) //一键回收 { if(pStdItem->nItemlevel <= 0) continue; int localType = nType%1000000; recoverBest = true; // if(strlen(pItem->cBestAttr)) // { // int nRes = nBestId[pStdItem->nItemlevel-1];//nBest & (1<<(pStdItem->nItemlevel-1)); // if(nRes) // recoverBest = true; // }else { int nFlag = nNormalId[pStdItem->nItemlevel-1];//localType & (1<<(pStdItem->nItemlevel-1)); if(!nFlag) continue; } } else { break; } if(strlen(pItem->cBestAttr) != 0 && !recoverBest) continue; if(!bagIsEnough(BagRecover)) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmRecoverNoBagNum, tstUI); break; } isSuccess = RecoverItem(pItem, pStdItem,recoverBest); if(!isSuccess) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmItemNotExist, tstUI); } nRecoveCount++; } } else { CUserItem::ItemSeries itemSrcGuid; //源道具 packet >> itemSrcGuid.llId ; CUserItem* pCuserItem = Inherited::FindItemByGuid(itemSrcGuid); if(!pCuserItem) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmItemNotExist, tstUI); return; } const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pCuserItem->wItemId); if(!pStdItem) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmItemNotExist, tstUI); return; } if(!bagIsEnough(BagRecover)) { ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmRecoverNoBagNum, tstUI); return; } isSuccess = RecoverItem(pCuserItem, pStdItem); nRecoveCount++; } // DealUserItem(); ((CActor*)m_pEntity)->GetAchieveSystem().ActorAchievementComplete(nAchieveRecover, nRecoveCount); ((CActor*)m_pEntity)->GetQuestSystem()->OnQuestEvent(CQuestData::qtRecover, nRecoveCount); CActorPacket pack; CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE)(enBagSystemID) << (BYTE)enBagSystemsRecoverResult; data << isSuccess << (BYTE)nType; pack.flush(); } bool CUserBag::RecoverItem(CUserItem* pItem, const CStdItem* pStdItem, bool IsreCoverBast) { if(!pItem || !pStdItem) { return false; } if(pStdItem->m_nRecoverId) { int wCount = pItem->wCount; std::string nExtraAttr = pItem->cBestAttr; int nResult = DeleteItem(pItem, pItem->wCount, "self_del_item", GameLog::Log_Recover, true); if(nResult == 0 || nResult != wCount) { return false; } int nValue = 0; if(nExtraAttr.length() > 0) { std::vector results = SplitStr(nExtraAttr, "|"); int nCount = results.size(); for (int i = 0; i < nCount; i++) { std::vector temp_res = SplitStr(results[i], ","); if (temp_res.size() >= 2) { if(atoi(temp_res[0].c_str()) == 5) //体力按照10点1次算 { nValue += (atoi(temp_res[1].c_str()))/10; }else { nValue += atoi(temp_res[1].c_str()); } } } } // int nRecoverPoint = std::max((nValue-5), 0)*10 +std::max((nValue-2), 0)*3+ nValue; // if(nRecoverPoint > 0) // { // ((CActor*)m_pEntity)->GiveAward(qaIntegral, qaIntegral, nRecoverPoint,0,0,0,0,GameLog::Log_Recover); // } if(pItem->wStar > 0) { ItemUpStarCfg* cfg = GetLogicServer()->GetDataProvider()->GetUpStar().getItemUpStarCfg(pItem->wItemId, pItem->wStar); if(cfg) { for(auto it : cfg->recoverys) { ((CActor*)m_pEntity)->GiveAward(it.btType, it.wId, it.wCount*wCount,0,0,0,0,GameLog::Log_Recover); } } } std::vector info; GetLogicServer()->GetDataProvider()->GetDropCfg().GetGiftDropInfoByDropGroupId(pStdItem->m_nRecoverId, info); int nNum = info.size(); for(int i = 0; i < nNum; i++) { DROPGOODS& award = info[i]; int notherGet = 0; notherGet = ((CActor*)m_pEntity)->GetMiscSystem().GetRecoverGetGold(award.info.nType, award.info.nId); if(notherGet > 0) notherGet = award.info.nCount*(notherGet/100.0); ((CActor*)m_pEntity)->GiveAward(award.info.nType, award.info.nId, (award.info.nCount+notherGet)*wCount,0,0,0,0,GameLog::Log_Recover); } } return true; } void CUserBag::DealUserItem() { int nCount = Inherited::count(); // CUserItem** pItems = Inherited::operator CUserItem**(); for(int i = nCount-1; i > -1; --i) { CUserItem* pItem = m_pUserItemList[i]; if(!pItem) continue; printf("DealUserItem:%d\n",pItem->wCount); } } //暂时先这样处理 后续找到问题在还原 void CUserBag::DebugRevoceItem(int nType) { int nCount = Inherited::count(); // CUserItem** pItems = Inherited::operator CUserItem**(); std::vector recoveLists; recoveLists.clear(); for(int i = nCount-1; i > -1; --i) { CUserItem* pItem = m_pUserItemList[i]; if(!pItem || pItem->wCount <= 0) continue; const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pItem->wItemId); if(!pStdItem) { continue; } if(strlen(pItem->cBestAttr) != 0 ) continue; if(pStdItem->m_nItemlvl > nType) continue; if(pStdItem->m_nRecoverId) recoveLists.push_back(pItem->series.llId); } if(recoveLists.size() > 0) { int nSize = recoveLists.size(); for(int k = 0; k < nSize ; k++) { CUserItem::ItemSeries itemGuid; itemGuid.llId = recoveLists[k]; CUserItem *pUserItem = Inherited::FindItemByGuid(itemGuid); if(pUserItem ==NULL) { continue; } const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId); if(!pStdItem) { continue; } RecoverItem(pUserItem, pStdItem); } recoveLists.clear(); } // DealUserItem(); } void CUserBag::OnEnterGame() { if (((CActor*)m_pEntity)->m_isFirstLogin) { int nVocation = ((CActor*)m_pEntity)->GetProperty(PROP_ACTOR_VOCATION); std::vector& itemList = GetLogicServer()->GetDataProvider()->GetFirstLoginAwards(nVocation); for (size_t i = 0; i < itemList.size(); i++) { ItemAward one = itemList[i]; const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(one.nId); if(pStdItem && pStdItem->m_nPackageType == 0) { ((CActor*)m_pEntity)->GetGameSetsSystem().AutoGameSetSkill(0, one.nId); ((CActor*)m_pEntity)->GetGameSetsSystem().AutoGameSetSkillApp(0, one.nId); } ((CActor*)m_pEntity)->GiveAward(one.nType, one.nId, one.nCount,0,0,0,0,GameLog::Log_FirstLogin); } } } //跨服数据 void CUserBag::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 << ((CActor*)m_pEntity)->GetCrossActorId(); packet << ((CActor*)m_pEntity)->GetAccountID(); size_t count = Inherited::count(); packet << (int)count ; //玩家物品的数量 for (UINT_PTR i=0; i> packet; } pCrossClient->flushProtoPacket(packet); } VOID CUserBag::OnCrossInitData(std::vector& vUseBags) { if(m_pEntity ==NULL) { OutputMsg(rmError,_T("装载玩家装备的数据出错,实体指针为MULL")); return; } //物品的列表 { //需要判断是否重复装载玩家的数据,避免出现装载复制 if(HasDbDataInit()) { OutputMsg(rmError,_T("OnCrossInitData return bag item repeated,actorid=%d "),m_pEntity->GetProperty(PROP_ENTITY_ID)); return; } int nCount = vUseBags.size(); // reader >> nCount; CUserItem userItem; CLogicEngine *pEngineer = GetLogicServer()->GetLogicEngine(); OutputMsg(rmTip,_T("玩家 %s 装载背包数据count=%d"),m_pEntity->GetEntityName(), nCount); for (INT_PTR i=0 ; i < nCount; i++ ) { userItem = vUseBags[i]; if(availableCount(userItem.wPackageType)) { CUserItem *pUerItem = pEngineer->CopyAllocUserItem(false,&userItem); //不申请序列号 if(pUerItem) { AddItem(pUerItem,m_pEntity->GetEntityName(),0,false, false); //不需要记录日志的,不需要通知客户端 } } else { OutputMsg(rmError,_T("玩家%s的物品数据出现错误, 背包类型%d 不足"),m_pEntity->GetEntityName(), userItem.wPackageType); //数据错误需要查看什么问题 return; } } ((CActor*)m_pEntity)->OnCrossFinishOneInitStep(MSG_CUSEBAG); //完成一个步骤 OnDbInitData(); //标记DB的数据初始化完毕 return; } }