MMO:道具系统

本篇三部分:

道具分类

道具系统的接口设计(C/S)

道具系统的组成(各种小方法)

 配置表,协议,数据库

//Array:打开宝箱获得多种道具

tables同目录下:Excel2Json.cmd生成表格

Common.Data放配置表字段

namespace Common.Data
{public enum ItemFunction{RecoverHP,RecoverMP,AddBuff,AddExp,AddMoney,AddItem,AddSkillPoint,}public class ItemDefine{public int ID {  get; set; }public string Name { get; set; }    public string Description { get; set; }//未来会将某种道具通过网络发到客户端中,把类型的定义放在协议中public ItemType Type { get; set; }public string Category { get; set; }public bool CanUse {  get; set; }   public float UseCD {  get; set; }   public int Price { get; set; }  public int SellPrice { get; set; }  public ItemFunction Function { get; set; }public int Param {  get; set; } public List<int> Params { get; set; }   } 
}

协议;

 //若需要同步信息,可以通过NCharacterInfo一次同步多种信息给服务端

点击 genproto.cmd生成协议

在GameServer:Entities中加道具表TCharacterItem

 

建立关联

根据模型生成数据库

是是是

并执行sql文件:选择对应得数据库和true

//重新生成数据库模型和执行sql文件数据库中得数据会被清空

GameServer:Item.cs

构造:传入基本参数

增加,删除,使用,显示基本字段

class Item
{TCharacterItem characterItem;public int ItemID;public int Count;public Item(TCharacterItem characterItem){this.characterItem = characterItem;this.ItemID=(short)characterItem.ItemID;this.Count=(short)characterItem.ItemCount;}public void Add(int count){this.Count += count;characterItem.ItemCount=this.Count;}public void Remove(int count){this.Count-=count;characterItem.ItemCount = this.Count;}public bool Use(int count=1){//return false;}public override string ToString(){//重载简化输出return string.Format("ID:{0},Count:{1}",this.ItemID,this.Count);}
}

GameServer:ItemManager.cs

获取角色身上所有的道具

使用道具

判断道具是否存在

获取某个道具

增加道具

删除道具

把内存数据转到网络数据

class ItemManager
{Character Owner;//字典维护角色身上的所有道具public Dictionary<int,Item> Items=new Dictionary<int, Item>();  public ItemManager(Character owner){this.Owner = owner;foreach(var item in owner.Data.Items){//取得character上的所有道具this.Items.Add(item.ItemID, new Item(item));}}public bool UserItem(int itemId,int count=1){//使用道具Log.InfoFormat("[{0}] UseItem[{1}:{2}]", this.Owner.Data.ID, itemId, count);Item item = null;//判断有无这个道具,再取出if(this.Items.TryGetValue(itemId, out item)){if (item.Count < count)return false;item.Remove(count);return true;    }//没有道具return false;   }public bool HasItem(int itemId){//判断道具是否存在Item item = null;if(this.Items.TryGetValue(itemId,out item))return item.Count > 0;return false;   }public Item GetItem(int itemId){//获取道具Item item = null;this.Items.TryGetValue(itemId, out item);Log.InfoFormat("[{0}]GetItem[{1}:{2}]", this.Owner.Data.ID, itemId, item);return item;    }public bool AddItem(int itemId,int count){//增加道具,若列表中没有,要新建Item item = null;if(this.Items.TryGetValue(itemId,out item))item.Add(count);else{//在DB中插入新数据TCharacterItem characterItem = new TCharacterItem();characterItem.CharacterID=Owner.Data.ID;characterItem.Owner = Owner.Data;characterItem.ItemID = itemId;characterItem.ItemCount = count;Owner.Data.Items.Add(characterItem);//插进字典item=new Item(characterItem);this.Items.Add(itemId, item);}Log.InfoFormat("[{0}]AddItem[{1}] addCount:{2}",this.Owner.Data.ID,item,count);DBService.Instance.Save();return true;    }public bool RemoveItem(int itemId,int count){if (!this.Items.ContainsKey(itemId)) return false;Item item = this.Items[itemId];if (item.Count < count) return false;item.Remove(count);Log.InfoFormat("[{0}]RemoveItem[{1}] removeCount:{2}",this.Owner.Data.ID,item,count);DBService.Instance.Save();return true;    }public void GetItemInfos(List<NItemInfo> list){//在协议中有NItemInfo;这里为了把内存数据转为网络数据foreach (var item in this.Items)list.Add(new NItemInfo() { Id = item.Value.ItemID, Count = item.Value.Count });}
}

DService.save

//回档float time = 0;//每隔一定时间 就自动保存public void Save(){//异步保存:函数会立刻返回;游戏逻辑和服务器的调用是同时进行的//if (DateTime.Now.Ticks - time > 10f)//{//这样一次save会间隔至少十秒//    entities.SaveChangesAsync();//    time = DateTime.Now.Ticks;//}entities.SaveChangesAsync();    }

给角色加上道具管理器:

加上这两句:

//为这个角色构建道具管理器:
this.ItemManager=new ItemManager(this);
//把网络数据填充上
this.ItemManager.GetItemInfos(this.Info.Items);

OnGameEnter->AddCharacter->Character()->Character中的构造方法

在OnGameEnter中,我们要填充 完整UserGameEnterResponse协议(在前面新加了一个字段NCharacterInfo)

加上这一句

 此时如果身上有道具,登录游戏后,客户端可以通过这一句收到数据

测试用例

在OnGameEnter的UserGameEnterResponse协议填充完毕之后,添加测试类

//道具系统测试
int itemId = 1;
bool hasItem=character.ItemManager.HasItem(itemId);
Log.InfoFormat("hasItem:[{0}]{1}", itemId, hasItem);
if (hasItem)character.ItemManager.RemoveItem(itemId, 1);//删除1个1号道具
else character.ItemManager.AddItem(itemId, 2);//加两个
//取得道具
Models.Item item=character.ItemManager.GetItem(itemId);Log.InfoFormat("Item:[{0}][{1}]",itemId, item); 

结果:

退出再选同一个角色进入:

把协议考到客户端

 

Client:Item.cs

 

 

public class Item
{public int Id;public int Count;public Item(NItemInfo nItem){//客户端不接触DB,使用得是网络协议中得itemthis.Id = nItem.Id;this.Count = nItem.Count;}public override string ToString(){return string.Format(" Id:{0},Count:{1} ",this.Id,this.Count);}
}
ItemManager.cs

填充items

public class ItemManager:Singleton<ItemManager>
{//客户端每个人管理自己得道具;就不需要先拿到角色,直接ItemManager.Instancepublic Dictionary<int,Item>Items=new Dictionary<int, Item>();   internal void Init(List<NItemInfo> items){//从网络协议填充过来this.Items.Clear();foreach (var iteminfo in items){Item item=new Item(iteminfo);this.Items.Add(item.Id, item);UnityEngine.Debug.LogFormat("ItemManager:Init[{0}]", item);}}//后面的逻辑是从服务端发送权限给客户端才能使用public ItemDefine GetItem(int itemId){return null;}public bool UseItem(int itemId){return false;}public bool UseItem(ItemDefine itemDefine){return false ;}
}

在UserService的OnGameEnter:

 

演示:

这里是服务端UserOnGameEnter先给客户端消息,再add,remove item操作

因此Item:[1] [ID:1,count:2]的结果在一次进入主城才能在日志上看到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/420689.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python报错已解决】 SyntaxError: invalid syntax

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;修复缺失的括号或引号2.…

Redis相关命令详解

目录 一、认识Redis 二、string 1、重要知识 2、基础命令 3、Key值的设置 三、list 1、重要知识 2、存储结构 3、基础命令 4、list的应用场景 四、hash 1、重要知识 2、基础命令 五、set 1、重要知识 2、基础命令 3、具体应用 六、zset 1、重要知识 2、…

【保姆级教程】如何创建一个vitepress项目?

文章目录 安装前的准备工作项目安装创建文件初始化文件安装依赖遇到了 missing peer deps 警告&#xff1f;命令行设置向导 完成 安装前的准备工作 Node.js 18 及以上版本。通过命令行界面 (CLI) 访问 VitePress 的终端。支持 Markdown 语法的编辑器。推荐 VSCode 及其官方 Vu…

gpt plus获取指南

随着AI技术的发展&#xff0c;越来越多的人开始依赖GPT来提高工作效率。市场上有多个平台提供GPT服务&#xff0c;如何选择最适合自己的&#xff1f;本文将详细对比两个热门平台&#xff1a;「银河」和「环球」&#xff0c;帮助你快速决策。 环球链接 银河链接 结论先行&#…

Windows10 如何配置python IDE

Windows10 如何配置python IDE 前言Python直接安装&#xff08;快速上手&#xff09;Step1.找到网址Step2.选择版本&#xff08;非常重要&#xff09;Step3. 安装过程Step4. python测试 Anaconda安装&#xff08;推荐&#xff0c;集成了Spyder和Pycharm的安装&#xff09;Step1…

【人工智能】枢纽:数据驱动洞察引领未来智能系统

目录 第一部分&#xff1a;人工智能概述 1.1 人工智能的定义 1.2 人工智能的历史发展 1.3 未来发展趋势 第二部分&#xff1a;机器学习 2.1 机器学习的概念 2.2 监督学习的算法与应用 2.2.1 线性回归&#xff08;Linear Regression&#xff09; 2.2.2 决策树&#xff…

Bonree ONE 3.0 助力企业加速驶入“全域可观测”新时代

发展新质生产力是我国目前推动高质量发展的内在要求和重要着力点。在这一背景下&#xff0c;基于信息技术及关键生产要素数据&#xff0c;推进企业数智化转型&#xff0c;成为形成新质生产力的关键路径。当前&#xff0c;随着企业业务的不断扩展和复杂化&#xff0c;企业对数据…

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…

[产品管理-3]:NPDP新产品开发 - 1 - 愿景、使命、价值观,看似很虚,实际上指明正确的方向; 战略、方案、方法,指明正确的方法。

目录 前言&#xff1a;用正确的方法做正确的事 做正确的事&#xff1a;&#xff08;愿景、使命、价值观&#xff09; 用正确的方法&#xff1a;&#xff08;战略、方案、方法&#xff09; 总结 一、什么是战略 1.1 概述 1.2 企业战略的分层 1.3 什么是组织&#xff0c;…

Nginx之日志切割,正反代理,HTTPS配置

1 nginx日志切割 1.1 日志配置 在./configure --prefixpath指定的path中切换进去&#xff0c;找到log文件夹&#xff0c;进去后找到都是对应的日志文件 其中的nginx.pid是当前nginx的进程号&#xff0c;当使用ps -ef | grep nginx获得就是这个nginx.pid的值 在nginx.conf中…

瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导

本文OpenHarmony标准系统应用兼容性测试指导&#xff0c;适用鸿蒙系统软件开发测试的新手入门学习课程。设备为触觉智能的瑞芯微RK3566开发板&#xff0c;型号Purple Pi OH。是Laval官方社区主荐的一款鸿蒙开发主板。支持Openharmony、安卓Android、Linux的Debian、Ubuntu系统。…

【Flutter】Flutter安装和配置(mac)

1、准备工作 升级Macos系统为最新系统安装最新的Xcode电脑上面需要安装brew https://brew.sh/安装chrome浏览器&#xff08;开发web用&#xff09; 2.、下载flutter https://docs.flutter.dev/release/archive?tabmacos 大家网页后&#xff0c;选择对应的版本【Tips&#x…

【STM32 HAL库】IIC通信与CubeMX配置

【STM32 HAL库】IIC通信与CubeMX配置 前言理论IIC总线时序图IIC写数据IIC读数据 应用CubeMX配置应用示例AHT20初始化初始化函数读取说明读取函数 前言 本文为笔者学习 IIC 通信的总结&#xff0c;基于keysking的视频内容&#xff0c;如有错误&#xff0c;欢迎指正 理论 IIC总…

[网络]从零开始的计算机网络基础知识讲解

一、本次教程的目的 本次教程我只会带大叫了解网络的基础知识&#xff0c;了解网络请求的基本原理&#xff0c;为后面文章中可能会用到网络知识做铺垫。本次我们只会接触到网络相关的应用层&#xff0c;并不涉及协议的具体实现和数据转发的规则。也就是说&#xff0c;这篇教程是…

第四届长城杯部分wp

还是太菜了&#xff0c;要经常练了 1.BrickGame 读源码可以看到时间的值是由js设定的&#xff0c;所以控制台将timeleft的时间改成999999 通过游戏就可以得到flag 2.SQLUP 一道文件上传的题目&#xff0c;在登陆页面我用admin和1登陆成功了&#xff0c;但是按照正常的应该是…

Android 语言国际化三步

1.罗列: 可以多罗列几个 不需要全部实现 res下创建这个文件:locale-config <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"zh" /><locale android:name"en" /><lo…

Proteus仿真综合实例(1)

分享一些基于Proteus的仿真实例&#xff0c;供大家学习参考。 1、51单片机230个Proteus仿真实例 包含基于51单片机的230个仿真实例&#xff0c;涉及定时器、中断、LCD显示、DS18B20温度测量、DS1621温度测量、PWM生成等充足电路模型案例。 2、51交通灯 模拟实现基于51单片机…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…

灭火器目标检测数据集 3700张 灭火器 带标注 voc yolo

数据集名称&#xff1a; 灭火器目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;3700张标注类型&#xff1a;灭火器检测格式兼容性&#xff1a;支持VOC和YOLO标注格式 数据集内容&#xff1a; 该数据集旨在用于训练和评估计算机视觉模型&#xff0c;特别是针对灭…

7个最佳实践的潜在客户捕获登录页面案例

什么是线索捕获页面&#xff1f; 线索捕获页面是一个着陆页&#xff0c;它向潜在客户提供某种回报以换取他们的电子邮箱地址或其他信息。任何带表单的页面&#xff0c;包括电子书下载页面、演示请求页面或新闻通讯注册页面&#xff0c;都可以视为线索捕获页面。 与您网站上的…