这里是服务端任务数据的读取 这里我只是写了一个简短的,读取方式这个的看你们自己项目策划的要求是什么类型的任务,这里读取的也只是一个静态数据xml表,#ifndef __BRUCE_GAME_QUESTXMLVO__HEADER__
#define __BRUCE_GAME_QUESTXMLVO__HEADER__#include <typedef.hpp>GAME_NS_BEGIN//常量任务读取字段;
class QuestXmlVo
{public://  任务ID;BRUCE_SYNTHESIZE_PASS_BY_REF(int, m_nQuestID, QuestID);//任务线;BRUCE_SYNTHESIZE_PASS_BY_REF(int, m_nQuestGroup, QuestGroup);//  任务类型;BRUCE_SYNTHESIZE_PASS_BY_REF(int, m_nQuestType, QuestType);//  任务次数;BRUCE_SYNTHESIZE_PASS_BY_REF(int, m_nQuestCoin, QuestCoin);};APP_NS_END

“QuestSystem.h”
这个文件 还有这个文件的cpp 是获取服务端那边过来的任务的数据,比如完成的,或者没完成的提交的信息或到数据库中去查询,任务的处理这些;这些都是我将自己做的然后自己写的一个简单的实例出来。掌握这样做运行的起来,不吭坑你们这些初学者的 坑你们我又得不到什么.注释也写的比较详细.我还是那句话师傅领进门 修行靠自己。

ifndef __BRUCE_GAME_QUEST_SYSTEM_HEADER__
#define __BRUCE_GAME_QUEST_SYSTEM_HEADER__#include "typedef.hpp"
#include <Network.hpp>
#include <GameServer/Quest.hpp>
#include "QuestCommon.hpp"
#include "Character.hpp"
#include <vector>
#include "QuesXmlVo.hpp"GAME_NS_BEGIN//任务类型;
enum
{QUEST_MISSION_ORDINARY,                         //关卡的类型任务类型;QUEST_MISSION_ELITE,                            //精英关卡任务类型;QUEST_TIME_ORDINARY,                            //时光之穴的任务类型;QUEST_TIME_ELITE};class QuestSystem
{
public:QuestSystem();~QuestSystem();int         initialize();void            finalize();//接收客户端到服服务端的任务请求信息;void handleClientToSeverQuestInfoReq(Message::Ptr& message);//去寻找当前提交的任务信息是否与与关卡中的相匹配;void QueryMissionInfo(C2GS_QuestSubmitReq xQuestSubmitReq, int n_QusetType);//关卡获取的任务是否达到次数条件的信息与当前提交的任务的信息进行比较,如果条件达到就删除该数据,如果没有达到就返回Reuct=1;void QuestJudgeInfoAck(Message::Ptr &message);//删除任务信息的返回;void QuestDeleteInfoAck(Message::Ptr &message);//保存已完成的任务;void QuestSeaveCurrentlyInfo(Message::Ptr &message);public:QuestXmlVo* getQuestXmlVo(int n_QuestId);// 容器共有;
public:typedef std::map<int, QuestXmlVo*> TaskInof;TaskInof n_TaskInfo;private://  Xml信息加载;void QuestVoInof();BRUCE_SYNTHESIZE(QuestIdVec, m_questVec,QusetId)
};APP_NS_END#endif // !__BRUCE_GAME_QUEST_SYSTEM_HEADER__

“QuestSystem.cpp”

#include "QuestSystem.hpp"
#include "ServerData.hpp"
#include "CharMgr.hpp"
#include <tinyxml/tinyxml.h>GAME_NS_BEGINQuestSystem::QuestSystem()
{QuestVoInof();
}QuestSystem::~QuestSystem()
{}int QuestSystem::initialize()
{//接收从DB中查询角色任务的结果;//DEFREG_MESSAGE(ID_DS2GS_QuestSqlAck, QuestSystem, handleDBToGameSeverQuestInfoAck)//DEFREG_MESSAGE(ID_DS2GS_QuestSqlAck, QuestSystem, handleClientToSeverQuestInfoReq)//接收过来的任务请求;DEFREG_MESSAGE(ID_C2GS_QuestSubmitReq, QuestSystem, handleClientToSeverQuestInfoReq)DEFREG_MESSAGE(ID_DS2GS_QuestGetMissonCountInfoAck, QuestSystem, QuestJudgeInfoAck)DEFREG_MESSAGE(ID_DS2GS_QuesDeleteSqlInfoAck, QuestSystem, QuestDeleteInfoAck)DEFREG_MESSAGE(ID_DS2GS_QuestDeltAndSeaveInfoAck, QuestSystem, QuestSeaveCurrentlyInfo)return 0;
}void QuestSystem::finalize()
{//QuestVoInof();
} //接收提交任务请求;handleCommitQuest
void QuestSystem::handleClientToSeverQuestInfoReq(Message::Ptr& message)
{//任务提交请求解包;C2GS_QuestSubmitReq xQuestSubmitReq;message->unpack(xQuestSubmitReq);//向DB发送任务是否存在请求;Character* pCharacter = g_charMgr.findCharByUserId(xQuestSubmitReq.userID);if (pCharacter == nullptr){return;}QuestIdVec m_questVec = pCharacter->getCharInfo().QuestToClientInfo;QuestIdVec::iterator itor = m_questVec.begin();QuestIdVec::iterator end = m_questVec.end();for (; itor != end; itor++){if (*itor == xQuestSubmitReq.nQuestID){QuestXmlVo* mQusetXmlVo = getQuestXmlVo(xQuestSubmitReq.nQuestID);if (mQusetXmlVo == nullptr){std::cout << " this  quest id  can't find  on the xml";return;}{// 转化成各个数据库表中的对应类型,方便查询;int ChangeType = 0;/*switch 用来判断 该任务ID对应的 任务类型{关卡普通,关卡精英,关卡团队,英雄试炼,时光之穴,砖石抽,等。。。。此时只是 任务的类型,但是具体各个表中的数据,所对应的类型,可能不是一样的,所以,要转化成各个表中的数据--对应的类型example:任务ID: 10002  任务type: 1   --->>>配置表中这个任务是描述 时光之穴打了多少次-----时光之穴数据表中,类型为 3;此时就要把 查询的局部变量type 赋值为3,以方便查询case 3:{SqlType = 3;}break;..}赋值后的类型,传递给DB 那边,根据对应的类型,去对应的表中查询对应的数据。*///根据关卡类型的表中去寻找;switch (mQusetXmlVo->getQuestType()){case 1:ChangeType = 1;break;case 2:ChangeType = 2;break;case 3:ChangeType = 3;break;case 4:ChangeType = 4;break;case 5:ChangeType = 5;break;case 6:ChangeType = 6;break;case 7:ChangeType = 7;break;default:break;}QueryMissionInfo(xQuestSubmitReq, ChangeType);}}}}//去寻找当前提交的任务信息是否与与关卡中的相匹配;
//QueryMissionInfo
void QuestSystem::QueryMissionInfo(C2GS_QuestSubmitReq xQuestSubmitReq, int n_QuestType)
{//查询关卡数据库里面是有有信息与当前提交的任务匹配;GS2DS_QuestGetMissonCountInfoReq questGetMissonCountInfoReq;questGetMissonCountInfoReq.userID = xQuestSubmitReq.userID;questGetMissonCountInfoReq.seq = xQuestSubmitReq.seq;questGetMissonCountInfoReq.mQuestID = xQuestSubmitReq.nQuestID;questGetMissonCountInfoReq.mQuestType  = n_QuestType;Message::Ptr sendMsg(new Message());sendMsg->pack(questGetMissonCountInfoReq);g_sessionManager.send(g_serverData.getDBProxyMgr()->getDBProxySID(), sendMsg);
}//关卡获取的任务是否达到次数条件的信息与当前提交的任务的信息进行比较,如果条件达到就删除该数据,如果没有达到就返回Reuct=1;
void QuestSystem::QuestJudgeInfoAck(Message::Ptr &message)
{DS2GS_QuestGetMissonCountInfoAck questGetMissonCountInfoAck;message->unpack(questGetMissonCountInfoAck);QuestXmlVo* mQusetXmlVos = getQuestXmlVo(questGetMissonCountInfoAck.mQuestID);if (questGetMissonCountInfoAck.mQuestCount == mQusetXmlVos->getQuestCoin()){//判断是删除那个数据元素;QuestXmlVo* cQuestXmlVo = getQuestXmlVo(questGetMissonCountInfoAck.mQuestID);Character* pCharacter = g_charMgr.findCharByUserId(questGetMissonCountInfoAck.userID);if (pCharacter == nullptr){return;}//提交请求任务的限制于关卡中的任务条件相等以后删除该条数据并保存到Save表中;QuestIdVec pQuestIdVec = pCharacter->getCharInfo().QuestToClientInfo;QuestIdVec::iterator ite = pQuestIdVec.begin();QuestIdVec::iterator ender = pQuestIdVec.end();for (; ite != ender; ite++){                                                           if (*ite == questGetMissonCountInfoAck.mQuestID){pQuestIdVec.erase(ite);break;}}}else{questGetMissonCountInfoAck.Result = 1;  }//删除数据表中的任务;GS2DS_QuesDeleteSqlInfoReq sQuesDeleteSqlInfoReq;sQuesDeleteSqlInfoReq.userID = questGetMissonCountInfoAck.userID;sQuesDeleteSqlInfoReq.seq = questGetMissonCountInfoAck.seq;sQuesDeleteSqlInfoReq.dQuestID = questGetMissonCountInfoAck.mQuestID;Message::Ptr sendMsg(new Message());sendMsg->pack(sQuesDeleteSqlInfoReq);g_sessionManager.send(g_serverData.getDBProxyMgr()->getDBProxySID(), sendMsg);}//完成任务信息的返回;
void QuestSystem::QuestDeleteInfoAck(Message::Ptr &message)
{DS2GS_QuesDeleteSqlInfoAck sQuesDeleteSqlInfoAck;message->unpack(sQuesDeleteSqlInfoAck);// 保存任务数据;QuestXmlVo* mQusetXmlVs = getQuestXmlVo(sQuesDeleteSqlInfoAck.dQuestID);Character* pCharacter = g_charMgr.findCharByUserId(sQuesDeleteSqlInfoAck.userID);if (pCharacter == nullptr){return;}GS2DS_QuestDeltAndSeaveInfoReq sQuestDeltAndSeaveInfoReq;sQuestDeltAndSeaveInfoReq.userID = sQuesDeleteSqlInfoAck.userID;sQuestDeltAndSeaveInfoReq.seq = sQuesDeleteSqlInfoAck.seq;sQuestDeltAndSeaveInfoReq.QuestSeaveDleID = sQuesDeleteSqlInfoAck.dQuestID;if (sQuestDeltAndSeaveInfoReq.QuestSeaveDleID == mQusetXmlVs->getQuestID()){//  sQuestDeltAndSeaveInfoReq.QuestSeaveDleID = /*= mQusetXmlVos->getQuestID() */ sQuesDeleteSqlInfoAck.mQuestID;sQuestDeltAndSeaveInfoReq.QuestSeaveDleType = mQusetXmlVs->getQuestType();sQuestDeltAndSeaveInfoReq.QuestSeaveDleGroups = mQusetXmlVs->getQuestGroup();sQuestDeltAndSeaveInfoReq.QuestSeaveDleCount = mQusetXmlVs->getQuestCoin();}Message::Ptr sendMsg(new Message());sendMsg->pack(sQuestDeltAndSeaveInfoReq);g_sessionManager.send(g_serverData.getDBProxyMgr()->getDBProxySID(), sendMsg);}//保存到数据库完成的任务信息;
void QuestSystem::QuestSeaveCurrentlyInfo(Message::Ptr &message)
{DS2GS_QuestDeltAndSeaveInfoAck sQuestDeltAndSeaveInfoAck;message->unpack(sQuestDeltAndSeaveInfoAck);GS2C_ListQuestCommitAck mListQuestCommitAck;mListQuestCommitAck.userID = sQuestDeltAndSeaveInfoAck.userID;mListQuestCommitAck.seq = sQuestDeltAndSeaveInfoAck.seq;mListQuestCommitAck.nQuestID = sQuestDeltAndSeaveInfoAck.QuestSeaveDleID;mListQuestCommitAck.Result = sQuestDeltAndSeaveInfoAck.sRsuit;Message::Ptr sendMsg(new Message());Character* pCharacter = g_charMgr.findCharByUserId(mListQuestCommitAck.userID);if (pCharacter == nullptr){return;}//打包发送给客户端;sendMsg->pack(mListQuestCommitAck);g_sessionManager.send(pCharacter->getAgentSeq(), sendMsg);}//  读取Xml信息配置表;
void QuestSystem::QuestVoInof()
{TiXmlDocument* pXmlDoc = new TiXmlDocument();if (pXmlDoc == nullptr){return;}pXmlDoc->LoadFile("./Data/QuestX.xml");TiXmlElement* xmlElement = pXmlDoc->RootElement();TiXmlElement* pConNtfig = xmlElement->FirstChildElement();//循环遍历子节点while (pConNtfig){QuestXmlVo* pQuestXmlVo = new QuestXmlVo();//Task ID;int nQuestID = 0;pConNtfig->Attribute("QuestID", &nQuestID);pQuestXmlVo->setQuestID(nQuestID);//Task Typeint m_nQuestType = 0;pConNtfig->Attribute("QuestType", &m_nQuestType);pQuestXmlVo->setQuestType(m_nQuestType);//Task Group;int m_nQuestGroup = 0;pConNtfig->Attribute("QuestGroup", &m_nQuestGroup);pQuestXmlVo->setQuestGroup(m_nQuestGroup);//Task count;int m_nQuestCoin = 0;pConNtfig->Attribute("Questcoin", &m_nQuestCoin);pQuestXmlVo->setQuestCoin(m_nQuestCoin);n_TaskInfo.insert(map<int, QuestXmlVo*>::value_type(nQuestID, pQuestXmlVo));pConNtfig = pConNtfig->NextSiblingElement();}
}QuestXmlVo* QuestSystem::getQuestXmlVo(int n_QuestId)
{map<int, QuestXmlVo*>::iterator iter = n_TaskInfo.find(n_QuestId);if (iter != n_TaskInfo.end()){return iter->second;}else{std::cout << "Do't find this MissionId's information" << n_QuestId << endl;}}APP_NS_END

任务系统之服务端部分相关推荐

  1. 架设◆ 惊天动地◆ 数据库、服务端、虚拟机、Linux、等方面疑问全面解答◆

    我分几个方面和大家探讨.都是我自己尝试并验证多次的. 数据库方面: 问:到底如何检测我的物理机(比如我使用的XP)是和Linux联通而且惊天动地的服务链接成功?两者有区别吗? 问:我想把所有已经导入的 ...

  2. 赤壁 mysql纯端_赤壁服务端与客户端高手进阶详解

    我也是刚接触赤壁不久,端熟悉比较快,但是游戏还得慢慢去体验(不是很喜欢这类的,画面比较差,内容是不错).下面是我的一些个人看法: 织梦内容管理系统 服务端部分: 1.建议使用纯净端,用MYSQL的,很 ...

  3. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  4. kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享

    CORS通信过程,都是浏览器或http插件自动完成,不需要 用户/开发人员 参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码是完全一样的.浏览器一旦发现AJAX请求跨源,就会自动添 ...

  5. JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

    一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...

  6. RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例

    1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...

  7. Go 学习笔记(78)— Go 标准库 net/http 创建服务端(接收 GET、POST 请求)

    使用 net/http 标准库创建一个 http 的 restful api 的服务端,用来处理 GET.POST 等请求. 源代码如下: package mainimport ("enco ...

  8. OpenResty搭建高性能服务端

    Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提供的I/O复用方式,自从Linux2.6 ...

  9. JAVA实现ftp服务端_用 java 实现FTP SERVER(附源码)

    前面用 PYTHON 实现了一个 ftp server(参考这里) ,有朋友问有没有java版本的,其实说白了,ftp 也就是 tcp/ip 协议的一个应用而已,而tcp/ip 基本都是通过socke ...

最新文章

  1. C#教程5:操作算子(1)
  2. 安卓手机指纹解锁linux电脑,【果核干货应用篇-06】使用手机指纹解锁电脑
  3. SAP UI5 函数节流和异步完成令牌的应用
  4. Java使用TCP实现群聊 聊天室(多线程和tcp的使用)
  5. 关于WKWebView高度的问题的解决
  6. leetcode组队学习——查找(一)
  7. 全向移动机器人参数校准对比及流程分析
  8. Python Tricks(十一)—— 阶乘的实现
  9. static_cast、dynamic_cast、const_cast和reinterpret_cast总结(转)
  10. MRI_Made_Easy 磁共振成像原理-物理基础5
  11. Vue中使用axio跨域请求外部WebService接口
  12. Android 系列 5.13添加简单光栅动画
  13. 二、网络编程之协议及协议格式详解
  14. python模块化 面向对象,Python学习记录4-面向对象,,OOP思想以模块化思
  15. mysql怎么写外键支持级联删除_MySQL外键级联删除不起作用,完全难倒
  16. QQ不能远程控制的解决办法
  17. 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误
  18. oracle 根据sid psid,windows 获取当前用户的sid
  19. 我们一起聊聊数据库的可观测性
  20. ttserver B+tree参数及VS TCH

热门文章

  1. C# Tryparse的使用说明
  2. 负载转矩观测器的设计与仿真实现(二)
  3. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) J 夺宝奇兵 暴力 贪心
  4. python做灰色关联度分析_python实现灰色关联
  5. 科技必须为人服务,才能得以生存
  6. 什么是重写?重写的作用?
  7. 博士论文——基于卷积神经网络的人脸识别研究 __张燕红
  8. MySQL中字符串比较大小(日期字符串比较问题)
  9. Android LibJpeg图片压缩
  10. 用 MSER 算法提取特征区域