游戏服务器设计之NPC系统

简介

NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验。NPC在游戏中有如下作用:

  1. 引导玩家体验游戏内容,一般游戏内有很多主线、支线任务,而任务的介绍、接取、领取奖励等操作都是通过NPC的操作,一般会有几个核心NPC,再不停的任务引导中,玩家会对核心npc印象深刻,强化了游戏代入感。
  2. 核心功能的展示和操作。游戏大部分功能都会放到游戏主界面,但是全部功能都放进去是不现实的,其他功能则以NPC的方式提供,比如进入某副本的入口等。
  3. 一些运营活动,比如道具秒杀,打折促销等,过年过节也可以制作一些应景的NPC形象。

NPC的设计

NPC跟角色怪物等相似是一个实体,所谓实体指的是必须有唯一ID,可通过ID索引到且可以在地图动态添加,本文实现的NPC的ID由配置文件指定,其他基本属性如名字、地图坐标、外形、朝向等都可配置。

当与NPC对话时一般都是显示文字和一些引导操作的按钮。这些都是需要可配置。另外NPC的文字除了静态描述文字,还需要一些动态数据,比如显示玩家活动分数,排名次序等。如何定义服务器和客户端的协议才能满足上述要求呢?首先必须是文字协议并且可扩展,这样才对配置友好,Json是一种,但是json够紧凑但是对配置不是很友好尤其是对文字描述这种。xml相比更好一点,扩展性强,可读性也好,在文字长度不大的情况下效率也可以接受。本人推荐用xml的格式NPC的显示协议。NPC至少有两个元素文字和按钮,怎么用xml来表示呢?我首先想到了html。常规文字显示就参考html的格式,特殊的ui组件,扩展一下xml就可以了,这种情况甚至不需要重启服务器。为了客户端解析方便,我们只需要使用html的子集即可,比如:

过年好!<br/>
<font color="red">狗年大吉!</font> <a href="showPage">旺旺旺</a>
<br/>
<button type="button" onclick="showPage">OK</button>

使用html格式的配置有如下好处:

  1. html大家都比较熟悉,无论是服务器客户端都对html有一定了解,甚至策划也不陌生,接受起来非常容易。
  2. html编写虽说需要一定的程序能力,但是这种在线编辑器一抓一大把,所见即所得的配置方式非常方便配置人员。

    比如使用http://www.w3school.com.cn/tiy/t.asp?f=html_basic 这个在线html编辑工具可以所见即所得的编辑文字内容。结果示例如下:



    使用这种格式的好处是,策划事先可以在在线编辑器上编辑好npc相关的文字,颜色、排版等都处理好,一些显示错误可以一开始就发现。

关于超链接和按钮

上图显示了一个有超链和按钮的npc面板,那么点击了超链和按钮后程序如何处理呢?这时正时脚本排上用场的地方了。一个超链或按钮对应一个脚本的函数,而整个脚本正好是对应了脚本的全部功能。另外超链是可以传参数的,那么参数会被带到脚本函数中,如下例所示:

查看成绩

def showScore(player, npcid, param):
sortCondition = param['sort']
#do something
return

第一次点击npc因为没有指定超链,那么默认调用脚本的main函数。时序图如下:

def main(player, npcid):
msg = '''
过年好!<br/>
<font color="red">狗年大吉!</font> <a href="showPage">旺旺旺</a>
<br/>
<button type="button" onclick="showPage">OK</button>
'''
return msg

关于安全性

思考下如果有外挂没有点击main直接发消息点击showScore会怎么样?正常情况下角色必须点击当前看到的页面包含的超链,否则会出现安全性问题,必须加以限制。npc系统每次发送npc面板内容给客户端时,都会记录下当前的npc面板内容,当玩家点击超链,首先验证一下是否是本次面板内的超链,否则拒绝,安全性大大提高。时序图如下:

总结

  1. xml作为npc显示协议具有非常强的扩展性,比如显示文字,控制文字大小,显示图标等都可以通过扩展xml标记实现。
  2. xml与脚本结合实现npc的功能,会大大利用脚本的已修改、热更新的优势,一些运营活动不停机上线这是最基本的要求了,如果有bug,可以下发正确的脚本覆盖后重新载入脚本即可。
  3. 这种格式易理解,好配置,对于策划这种弱程序的也是可以接受,当然基于html做个配置工具也是非常的容易。
  4. 实现显示协议后,npc的外放、删除,外形配置、文字配置等,都是策划可以搞定的,这也是团队都希望的。
  5. 再考虑到扩展性前提下,保证了npc的安全性,有的时候写代码的人经常会写这样的代码,如判断一个人可以领奖,然后显示可以领按钮,点击了领取按钮的对应函数有可能忘了判断有效性,在这种npc的方式下,就不太会出现重复领奖的bug,因为每次领奖,都会npc提示领奖成功,然后把player上的当前npc文字冲掉,这样假如外挂再发领奖请求会被npc系统自动拦调,大大提高系统安全性。
  6. npc的点击频率限制,npc距离限制,这写基本的安全性逻辑也要有,这个不在赘述,详情看github代码。
  7. GitHub地址: https://github.com/fanchy/h2engine
  8. 关于属性管理器:http://www.cnblogs.com/zhiranok/p/h2engine_propmgr.html
  9. 关于游戏服务器引擎h2engine:http://www.cnblogs.com/zhiranok/p/ffengine.html

    更多精彩文章 http://h2cloud.org/

游戏服务器设计之NPC系统的更多相关文章

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

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

  2. H2Engine游戏服务器设计之属性管理器

    游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点, ...

  3. h2engine游戏服务器设计之聊天室示例

    游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...

  4. FPS游戏服务器设计的问题 【转】

    一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...

  5. (转)FPS游戏服务器设计的问题

    FPS游戏服务器设计的问题出处:http://www.byteedu.com/thread-20-1-1.html一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击 ...

  6. 游戏服务器菜鸟之C#初探四游戏服务

    经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...

  7. 开源服务器设计总计(plain framework2020年总计)

    2020年注定会被历史铭记,世界遭受着一场前所未有的灾难,这种灾难到现在还在持续.还记得19年末的时候,那时候听到一点点消息,哪里想得到年关难过,灾难来的让人猝不及防.由于疫情防控,2020年感觉转瞬 ...

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

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

  9. 基于内存,redis,mysql的高速游戏数据服务器设计架构

    转载请注明出处,欢迎大家批评指正 1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的: ...

随机推荐

  1. 应用fstream格式化输出

    我举一个我应用的例子 file.open("shoroud.jrf" ,ios_base::trunc); //打开文件,清空文件内容 if(!file.good()) { pri ...

  2. [国嵌笔记][011][Linux密码破解]

    破解步骤 1.在系统启动时进入grub选项菜单 2.在grub选项菜单中按e进入编辑模式 3.编辑kernel行,添加 /init 1 (表示进入单用户启动模式,在单用户启动模式中不会要求输入密码) ...

  3. React Native学习(七)—— FlatList实现横向滑动列表效果

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  4. Oracle_复杂查询综合

    Oracle_复杂查询综合 -- 1.列出所有员工的年工资,按年薪从低到高排序. select,) income from emp order by income;   -- 2.列出薪金比" ...

  5. 从零开始学习前端开发 — 1、HTML基础

    一.web标准 web标准-网页制作的标准,它是由一系列标准组成的,主要包含三个方面:结构(html,xhtml),表现(css),行为(javascript) 注:结构和表现的标准由w3c(万维网联 ...

  6. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务

    一.引言 今天本来没有打算写这篇文章,当初我感觉使用这个工具应该很简单,下载的过程也不复杂,也没有打算记录下来.但是在使用的过程中还是出现了一些问题,为了给第一次使用Redis Desktop Man ...

  7. wamp apache无法启动的解决方法

    作者 grunmin 2014.03.12 14:44* 字数 535 阅读 22167评论 9喜欢 5 如题,近日在安装wamp的时候出现了apache无法启动的情况.wamp图标一直显示橙色.网上 ...

  8. 如何把本地项目上传到Github

    作为一个有追求的程序员,需要撸点自己的开源项目,虽然我现在只是在学着造轮子,但这并不影响我成为大神的心. Github是基于git实现的代码托管,很多程序员在上面托管自己的开源项目,我使用Github ...

  9. wamp配置虚拟机步骤

    1.首先修改C:\Windows\System32\drivers\etc下的hosts文件      添加一行 127.0.0.1       myblog.org    //映射到本机 2.然后修 ...

  10. Linux中rpm命令用法听语音

    rpm 是红帽(RedHat)软件包管理工具,实现类似于 Windows 中的添加/删除程序功能.下面,就来向大家介绍 rpm 命令的用法. 工具/原料 CentOS 一.rpm常用参数 1 rpm ...