游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12965|回复: 6

MMORPG游戏服务器技能系统设计:表格字段与技能程序框架

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2015-11-26 14:12:47 | 显示全部楼层 |阅读模式
  本文主要从一个程序员的角度阐述一下mmorpg服务器技能系统的程序框架设计,最近在做这个,就当做一个总结吧,其中某些概念可能没有解释清楚,欢迎大家拍砖讨论~

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

  1. 表格属性字段的设计

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

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

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

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

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

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

  skill表字段设计:

1.jpg

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

  技能id:技能id值

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

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

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

  CD时间:cd时间

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

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

2.jpg

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

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

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

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

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

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

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

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

3.jpg

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

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

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

  Buffer1:技能触发的buffer1

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

  Buffer2:技能触发的buffer2

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

4.jpg

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

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

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

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

  cast表字段设计:

5.jpg

  名称:cast表对应技能名称

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

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

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

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

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

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

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

6.jpg

  吟唱时间:吟唱时间

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

  技能命中:技能命中率

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

  buffer表字段设计:

7.jpg

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

  Id:buffer id

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

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

  是否有益:是否有益处

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

  伤害效果:buffer的伤害

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

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

8.jpg

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

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

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

  影响范围:buffer影响的范围

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

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

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

9.jpg

  覆盖类型:大的覆盖小的

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

  status表字段设计:

10.jpg

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

  状态id:角色状态的id号

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

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

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

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

  2.技能程序框架

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

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

11.jpg

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

  需要立即同步的。

  1. hp,众所周知;

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

  不需要同步的。

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

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

  代码的结构设计

12.jpg

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

  文/游戏开发主席,欢迎加入游戏开发群:44727718共同探讨~

3

主题

173

帖子

747

积分

高级会员

Rank: 4

积分
747
发表于 2015-11-26 19:40:14 | 显示全部楼层
用表处理技能不太好,到了后期为了添加某一项属性,就得在表中开辟一个字段,结果这个字段大部分都是0,少数几个技能有值。会造成表太大,也太膨胀。

0

主题

33

帖子

427

积分

中级会员

Rank: 3Rank: 3

积分
427
发表于 2015-11-28 16:42:30 | 显示全部楼层
gotcsq 发表于 2015-11-26 19:40
用表处理技能不太好,到了后期为了添加某一项属性,就得在表中开辟一个字段,结果这个字段大部分都是0,少 ...

那用什么处理比较好?

2

主题

240

帖子

1239

积分

金牌会员

Rank: 6Rank: 6

积分
1239
发表于 2015-12-1 16:17:55 | 显示全部楼层
haibin0918 发表于 2015-11-28 16:42
那用什么处理比较好?

我们项目把那些通用性不高的字段都扔到一个叫做info的字段里,以字符串的形式配置。有些手写

0

主题

1

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2015-12-1 22:05:32 | 显示全部楼层
开辟一个引用脚本ID的字段,挂一个脚本,很实用。。。端游的老方法了

0

主题

33

帖子

427

积分

中级会员

Rank: 3Rank: 3

积分
427
发表于 2015-12-2 10:01:43 | 显示全部楼层
sd57830 发表于 2015-12-1 16:17
我们项目把那些通用性不高的字段都扔到一个叫做info的字段里,以字符串的形式配置。有些手写 ...

感谢回复

0

主题

24

帖子

192

积分

注册会员

Rank: 2

积分
192
发表于 2015-12-21 09:36:12 | 显示全部楼层
开一个 特定字段,针对不同的技能,字段的含义不同。

每个技能每个脚本,是绝对绝对行不通的!太老旧的做法了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 14:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表