/** * \brief 触发一个技能[SKY技能触发] * \param rev 本次收到的客户端消息 * \param cmdLen 消息长度 * \return true 技能使用成功 false 技能使用失败 */ bool zSkill::action(const Cmd::stAttackMagicUserCmd *rev,const DWORD cmdLen) { if (_entry) { actionbase = getNewBase(); curRevCmd = rev; curRevCmdLen = cmdLen; //sky SKILLID_IMMOLATE 献祭技能的ID if(rev->wdMagicType == SKILLID_IMMOLATE && _entry->Immolate) { _entry->skillStatusM.clearSkill(rev->wdMagicType); return true; } // 消耗 if (this->istemp||_entry->needWeapon(curRevCmd->wdMagicType)) // 检查施放技能是否需要武器 { if (actionbase->ride==0) { if (_entry->checkMountHorse()) return false; } if (_entry->checkSkillCost(actionbase)) // 计算自身各种消耗 { if (_entry->checkPercent()) // 判断技能施放成功的几率 { std::vector<SkillStatus>::const_iterator iter; if (_entry->checkReduce(actionbase->objcost,actionbase->objnum)) { showMagicToAll(); switch(rev->wdMagicType) { case 226: // 食尸术 case 319: // 尸暴术 { SceneNpc *pNpc = SceneNpcManager::getMe().getNpcByTempID(rev->dwDefenceTempID); if (pNpc) { if (pNpc->getState() == zSceneEntry::SceneEntry_Death && !pNpc->isUse) { pNpc->isUse = true; Cmd::stRemoveMapNpcMapScreenUserCmd removeNpc; removeNpc.dwMapNpcDataPosition = rev->dwDefenceTempID; pNpc->scene->sendCmdToNine(pNpc->getPosI(),&removeNpc,sizeof(removeNpc),pNpc->dupIndex); } else { return false; } } else { return false; } } break; default: break; } _entry->doSkillCost(actionbase); for(iter = actionbase->skillStatus.begin(); iter != actionbase->skillStatus.end(); iter ++) { // 处理依赖消耗物品型技能对物品的消耗,目前此接口未启用,两个参数分别是物品ID和消耗数量 { SkillStatus *pSkillStatus = (SkillStatus *)&*iter; doOperation(pSkillStatus); } } _entry->reduce(actionbase->objcost,actionbase->objnum); return true; } } } } } else { Zebra::logger->error("学习的技能中_entry指针为空"); } return false; }
/** * \brief 执行挑战指令 * * * \param rev 挑战指令 * \param cmdLen 消息长度 * \return 是否成功 */ bool SceneUser::doNpcDareCmd(const Cmd::stDareUserCmd *rev,DWORD cmdLen) { #ifdef _DEBUG Zebra::logger->debug("doNpcDareCmd处理[%d]号消息",rev->byParam); #endif switch (rev->byParam) { case Cmd::QUESTION_NPCDARE_INFO_PARA: { Cmd::Session::t_questionNpcDare_SceneSession send; Cmd::stQuestionNpcDareInfo* ptCmd = (Cmd::stQuestionNpcDareInfo*)rev; send.dwUserID = this->id; send.dwCountryID = this->scene->getCountryID(); send.dwMapID = this->scene->getRealMapID(); send.dwNpcID = ptCmd->dwNpcID; send.byType = ptCmd->byType; sessionClient->sendCmd(&send,sizeof(send)); return true; } break; case Cmd::NPCDARE_DARE_PARA: { Cmd::stDareNpcDare * pCmd = (Cmd::stDareNpcDare *) rev; SceneNpc *pNpc = SceneNpcManager::getMe().getNpcByTempID(pCmd->dwNpcID); if (pNpc) { if (scene->checkTwoPosIInNine(getPosI(),pNpc->getPosI())) { if (scene->getCountryID() == this->charbase.country) { if (this->charbase.septid !=0) { /* NpcDareObjectCompare found; found.dwObjectID = CREATE_NPCDARE_NEED_ITEM; zObject *itemobj = packs.uom.getObject(found);// 查找道具 if (itemobj) { packs.removeObject(itemobj); //notify and delete Cmd::Session::t_NpcDare_Dare_SceneSession send; send.dwCountryID = scene->getCountryID(); send.dwMapID = scene->getRealMapID(); send.dwNpcID = pNpc->npc->id; send.dwUserID = this->id; sessionClient->sendCmd(&send,sizeof(send)); return true; } else { Channel::sendSys(this,Cmd::INFO_TYPE_FAIL,"缺少挑战发起道具!"); } */ if (this->packs.checkMoney(4000)) { Cmd::Session::t_NpcDare_Dare_SceneSession send; send.dwCountryID = scene->getCountryID(); send.dwMapID = scene->getRealMapID(); send.dwNpcID = pNpc->npc->id; send.dwUserID = this->id; sessionClient->sendCmd(&send,sizeof(send)); return true; } else { Channel::sendSys(this,Cmd::INFO_TYPE_FAIL,"缺少足够的钱来发起挑战!"); } } else { Channel::sendSys(this,Cmd::INFO_TYPE_FAIL,"你还没有家族不能发起挑战!"); } } else { Channel::sendSys(this,Cmd::INFO_TYPE_FAIL,"不在自己国家无法发起挑战!"); } } else { Channel::sendSys(this,Cmd::INFO_TYPE_FAIL,"距离太远,无法对话!"); } } return true; } break; case Cmd::NPCDARE_GETGOLD_PARA: { Cmd::stDareNpcDare * pCmd = (Cmd::stDareNpcDare *) rev; Cmd::Session::t_NpcDare_GetGold_SceneSession send; send.dwUserID = this->id; send.dwNpcID = pCmd->dwNpcID; send.dwCountryID = this->scene->getCountryID(); send.dwMapID = this->scene->getRealMapID(); sessionClient->sendCmd(&send,sizeof(send)); return true; } break; default: break; } return false; }