游戏服务器设计之NPC系统

游戏服务器设计之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

原文地址:https://www.cnblogs.com/zhiranok/p/npc.html

时间: 2024-08-01 16:14:53

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

2016年netty/mina/java nio视频教程java游戏服务器设计教程

2016年netty/mina/Javanio视频教程Java游戏服务器设计教程 需要的加qq:1225462853,备注:程序员学习视频 其他视频都可以索要(Netty   NET    C++ 等等) 互联网架构师教程:http://blog.csdn.net/pplcheer/article/details/71887910 netty录制时间为2015.11-2016.2月份  netty教程为加密视频!      netty12个课程已全部录制完成,相信通过这12节课的分析能让大家对n

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

一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:[email protected] 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就

当我设计游戏服务器时,我在想些什么?(1)

机缘巧合的机会,我有幸能够从头开始设计一个游戏的服务器.中间遇到很多欢声笑语和悲伤泪水,这里分享一下. 我之前所在项目组的游戏服务器架构如下图: 这款游戏是一款MMO的端游,GateWay网关的任务是接受客户端的连接,然后通过分发策略,把玩家丢进GameSvr上去,之后玩家的所有请求都直接发给GameSvr,由GameSvr处理了.当然这里的分发策略跟一般的web服务器是不同的,web服务器一般会做成无状态的服务器,也就是对于客户端来说请求到达哪一个服务器都没有关系,都能够被处理,但是游戏服务器

游戏服务器解决的3个问题

写游戏服务器有一段时间了,在我看来一个游戏服务器设计得好不好,可以从以下三个方面: 1.配置读取问题 配置读取直接决定了策划改表是否方便. 2.消息处理问题 消息处理决定了服务器业务逻辑处理是否方便 3.数据落地 数据落地为最关键的一条,游戏数据最终是否能落地. 原文地址:https://www.cnblogs.com/LittleLee/p/11334942.html

棋牌游戏服务器架构设计

转载自:简书一位同行的文章 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群

简论游戏服务器架构设计

一.QIPAI类服务器的特点 1,QIPAI类不分区不分服 一般来说,QIPAI游戏都是不分区不分服的.所以QIPAI类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为QIPAI类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集

当我设计游戏服务器时,我在想些什么?(2)

半年前我参与了一个手游项目,第一次能够主导整个游戏的设计,这篇文章单说服务器的架构,客户端就不提了. 对于服务端,我想从之前的端游服务器改过来肯定是走不通的(详见:),因为手游的开发周期比端游短很多,上面那一套架构开发了5年不止,当然,期间推翻重做了很多次.而这个手游项目只有快则6个月,慢则10个月的时间. 既然决定不用端游的架构,一切从0开始,那么快速搭建起一个可用的服务器是我考虑的第一个原则,第二点就是我做为程序员的一点私心,尽量使用以前没有用过的技术,这样自己能够接触更广阔的世界. 首先当

MMO 游戏服务器引擎设计

一. 网络游戏开发的基本流程 ◆ 项目文档 ◆ 开发的进行和文档准备流程 ◆ 技术人员文档 二. MMO游戏架构 ◆ MMO游戏特点 ◆ MMO架构的特有内容 三. 策划文档 ◆ 考虑示例游戏的题材 ◆ 详细设计文档 ◆ MMO庞大的游戏设定 ◆ 5种设计文档 系统的基本结构图 进程关系图 资源评估文档 协议定义文档 数据库设计图 ◆ 设计上的重要判断 四. 系统基本结构图 ◆ 系统基本结构图的基础 ◆ 服务器必须具有可扩展性 ---- 商业模式的确认 ◆ 各瓶颈 ---- 扩展方式的选择 ◆ 

微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计

题目:微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计 今天向大家介绍一下游戏服务器的设计,着重讲解一下微信房卡麻将棋牌架设(aqiulian.com)的服务器搭建,如果有什么不懂得可以咨询我Q_212303635,欢迎大家的咨询.那么我们开始进去主题吧. 内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: 图1  IService接口 Start方法用来启动服务. Stop 方法用来关闭服务. IsService 方法用于查询当前服务是否正在工作. 内核中