本文主要从一个程序员的角度阐述一下mmorpg服务器技能系统的程序框架设计,最近在做这个,就当做一个总结吧,其中某些概念可能没有解释清楚,欢迎大家拍砖讨论~

技能其实是战斗系统的一个组成部分,战斗基本上都可以由技能触发,技能系统实际上就是一套完整的逻辑,我们用表格来设计,将技能的逻辑用属性字段抽象出来,然后依据属性字段来控制逻辑,策划人员可以通过更改属性字段来配置出不同的逻辑属性。

1. 表格属性字段的设计

为了减少冗余,我们将技能属性字段设计在4个不同的表中:

Skill表:技能表的入口表,包括cast表,buffer表,op表,技能的释放需求,伤害

Cast表: 技能的释放过程表,包括技能吟唱时间,技能命中距离等等

Buffer表:各种人物状态,静态和动态的光环,效果等等

Status表:角色状态表,角色在状态下能使用或被使用的技能或者buffer

op表: 技能的伤害计算公式

skill表字段设计:

 

名称:技能名称,如火球术

技能id:技能id值

技能名称id:技能系,id一样表示一个系技能

技能类型:加血、物理攻击、魔法攻击、buffer、地图技能

公共CD时间:多个技能可以共cd,比如所有吃药技能

CD时间:cd时间

CD保存类型:cd时间在人物下线后是否保存数据库

需要角色等级:角色等级需求

 

角色状态限制:使用技能的角色状态限制,这个字段需要斟酌以后重新设计成一个表格

需要武器:技能释放需要的武器类型,如弓,刀,剑等等

消耗类型:需要消耗,如hp,mp,xp等等

消耗数量:hp,mp,xp的消耗数量

是否有益:是否是有益技能

技能属于:生活技能、装备技能、职业技能等等

升级技能:改技能的升级技能

调用cast表:调用cast表的id号

 

调用describe表:调用技能描述表id号

影响形状:范围技能的影响范围,直线、圆、扇形

影响个数:范围技能影响的npc个数

Buffer1:技能触发的buffer1

概率1:技能触发buffer1的概率

Buffer2:技能触发的buffer2

概率2:技能触发buffer2的概率

 

伤害效果:技能产生的伤害

调用op表计算效果:op表中数值计算的公式

是否产生伤害仇恨:是否产生仇恨值

携带仇恨:技能产生的仇恨值

cast表字段设计:

 

名称:cast表对应技能名称

是否对地释放:是否对地释放

是否对他人释放:是否可以对他人释放该技能

是否对自己释放:是否可以对自己释放该技能

是否前摇打断:前腰是否可以打断

前摇时间:动画前摇的时间

飞行时间:魔法的飞行时间

持续施法时间:技能的施法时间

 

吟唱时间:吟唱时间

释放距离:释放技能距离目标的距离

技能命中:技能命中率

命中最大距离:指向型技能当目标出了fire区域就不受攻击了

buffer表字段设计:

 

名称:对应skill表中的技能名称

Id:buffer id

效果nameID:表示一个系列的buffer

类型:静态、动态、状态buffer

是否有益:是否有益处

角色状态:加了buffer后角色处于的状态,如沉默,天神下凡,嗜血等等

伤害效果:buffer的伤害

调用op表:指向op表中的公式id

动态次数:对应动态buffer生效次数,对静态buffer无效

 

生效间隔:对应动态buffer每次生效的间隔时间,静态buffer无效

持续时间:对应静态buffer的持续时间,-1表示永久buffer

产生buffer:某些 buffer可以给队友或敌人加

影响范围:buffer影响的范围

是否可以移除:对应驱散技能

移除类型:对应驱散技能等级

是否可以覆盖:同类型buffer是否可以覆盖,还是效果叠加

 

覆盖类型:大的覆盖小的

是否需要from:计算效果时是否需要buffer来源。

status表字段设计:

 

状态名称:角色的状态名称,如沉默,死亡,天神下凡等等。

状态id:角色状态的id号

角色动作最大值:在该状态下可以使用或者被使用的技能的最大值,如无敌不能受伤害;

角色动作最小值:在该状态下可以使用或者被使用的技能的最小值,如无敌不能受伤害;

状态最大值:在该状态下,可以被使用buffer的最大值;

状态最小值:在该状态下,可以被使用buffer的最小值。

2.技能程序框架

技能的表格属性字段我们已经设计好了,可以满足策划短期需求了,接下来我们来设计一下技能程序的框架。

技能系统服务器和客户端是有交互的,具体流程看下图:

 

服务器要通知客户端是否能释放技能,吟唱时间,技能命中结果,伤害数字,服务器还要广播技能释放结果,让同区域的玩家可以看到别人在释放技能。

需要立即同步的。

1. hp,众所周知;

2,角色状态,角色的各种状态,比如天神下凡,沉默,死亡。

不需要同步的。

角色属性改变,如力量,敏捷等角色属性。

ps:服务器和客户端同一套代码,客户端进行预判,除了血量和角色状态服务器向客户端发同步消息,其他属性改变可以不发消息,这样可减少服务器和客户都的消息数量。

代码的结构设计

 

这里只画一个简单结构,将每个table抽象为一个table_data,然后在game_char中组合起来。

【转】MMORPG游戏服务器技能系统设计:表格字段与技能程序框架的更多相关文章

  1. 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

    使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?和C Socket服务器比起来有什么优劣?可行性怎么样? 从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方 ...

  2. GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

    GoWorld代码:https://github.com/xiaonanln/goworld Golang具有运行效率高.内存安全等优良特性,因此是非常适合用来进行服务器开发.使用Golang开发游戏 ...

  3. MOBA 游戏技能系统设计 2.0

    随着游戏开发的完整度提升,技能系统的设计复杂性也越来越高,导致了用模板方式的配置方法和处理方法会导致以下几个问题: 代码冗余 排错困难 配置项冗余 熟悉业务流程时间长 扩展性低 经过我思考决定重写之. ...

  4. Unity3d&C#分布式游戏服务器ET框架介绍-组件式设计

    前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...

  5. Java游戏服务器成长之路——感悟篇

    又是一个美好的周末啊,现在一到周末,早上就起得晚,下午困了又会睡一两个小时,上班的时候,早上起来喝一杯咖啡,然后就能高效的工作一整天,然而到了周末人就懒散了,哈哈. 最近刚跳槽,到新公司已经干了有两周 ...

  6. unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计

    unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计 最近做玩票性质的游戏项目,客户端技术是 unity3d 和 android. ...

  7. c++游戏服务器编程学习笔记(一)TCP/IP

    1. c++游戏服务器编程c++运行效率非常高2. TCP传输控制协议IP网际协议Socket 3.Linux 乌班图开源第三方库BOOST 4.80%游戏服务器端用C++工作量最大的地方是具体的游戏 ...

  8. 游戏服务器ID生成器组件

    游戏服务器程序中,经常需要生成全局的唯一ID号,这个功能很常用,本文将介绍一种通用ID生成组件.游戏服务器程序中使用此组件的场景有: 创建角色时,为其分配唯一ID 创建物品时,每个物品需要唯一ID 创 ...

  9. 游戏服务器:到底使用UDP还是TCP

    http://blog.jobbole.com/64638/ 在编写网络游戏的时候,到底使用UDP还是TCP的问题迟早都要面对. 一般来说你会听到人们这样说:“除非你正在写一个动作类游戏,否则你就用T ...

随机推荐

  1. windows自带的netsh 端口转发

    netsh interface portproxy show v4tov4 (3)添加“端口映射” netsh interface portproxy add v4tov4 listenaddress ...

  2. Learning by doing——获黄色领骑衫之感

    获奖感言 能拿到这件黄色的领骑衫,心里真的非常高兴.仔细看了一下,扣子.领子.各种图案各种细节十分精致.可以说这件领骑衫既有纪念意义,又有实用意义,真的很棒. 背后的故事 其实开始接触博客的时候,我是 ...

  3. OC和C语言比较

    说明:比较记忆相对来说更容易熟练记得牢固,理解了C语言相对来说OC也不太难,OC是C语言的扩展,向下兼容C语言. 源文件后缀名比较 1.C语言源文件 .h:头文件 .c:源文件 .o:目标文件 .ou ...

  4. 清除IE8/IE9/IE10/IE11浏览器缓存文件 100%有效

    不管你是哪个版本的IE浏览器,按照下面指示操作,都能清除掉你使用浑身解数也清不掉的缓存文件! 第一步,打开IE浏览器——工具——Internet选项 有的IE浏览器的Internet选项藏在右上角一个 ...

  5. js和jquery对象的相互转换

    在使用jquery的过程中发现很多需要将jquery对象转成js对象的例子. Query 对象是通过 jQuery 包装DOM 对象后产生的对象.jQuery 对象是 jQuery 独有的,其可以使用 ...

  6. Unity 游戏框架搭建 (二十二) 简易引用计数器

    引用计数是一个很好用的技术概念,不要被这个名字吓到了.首先来讲讲引用计数是干嘛的. 引用计数使用场景 有一间黑色的屋子,里边有一盏灯.当第一个人进屋的时候灯会打开,之后的人进来则不用再次打开了,因为已 ...

  7. IF()判断变量是否为空

    一 变量是字符串,判断为空 第一种:strs == null string strs = "test"; if (strs == null) { //这里是为空的字符串,返回你指定 ...

  8. js常用共同方法

    var uh_rdsp = (function(){ //获取根目录 var getContextPath = function(){ var pathName = document.location ...

  9. 20181030NOIP模拟赛T3

    2017种树 2017共有N棵树从0到N-1标号.现要把这些树种在一条直线上,第i棵树的种植位置X[i]如下确定: X[0] = X[0] MOD L: X[i] = (X[i-1]*A+B) MOD ...

  10. webpack-dev-server 多入口自动刷新,支持对象

    万物的来源~webpack 本身 watch webpack watch 传送门 webpack 可以监听文件变化,当它们修改后会重新编译 watch boolean 启用 Watch 模式.这意味着 ...