问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

小白入门《求生之路2》插件开发:三大核心概念详解

创作时间:
作者:
@小白创作中心

小白入门《求生之路2》插件开发:三大核心概念详解

引用
1
来源
1.
https://m.bilibili.com/opus/939787656704819236

鉴于国内在写求生之路2插件方面的教学内容资源甚少,本文结合作者的实际经验,为对求生之路2插件感兴趣的初学者分享一些基础概念。

首先,需要澄清一些关于编写插件的常见误区:

  1. 编写插件并没有那么难,并不需要你提前拥有多么厉害的编程技术。
  2. 学习的过程并没有那么的无趣枯燥,带着兴趣的尝试编写,其过程也很有趣。

那么从哪里开始学起了?首先了解sourcemod里一些有关求生2这个游戏底层的三个重要概念,这部分我觉得有必要优先详细介绍下,虽然非常基础,但是能避免后面少走弯路。

实体(Entity/Edict)

实体就像游戏里的对象。按钮、触发器、武器、生成点、玩家本身、灯光等等这些都是实体。我们就是通过写代码来处理实体,让实体呈现出我们想要的效果。

比如你要写一个插件,插件功能很简单:张三进服务器后,给张三发送一条欢迎消息,“欢迎张三进入我的坐牢服务器”。那么你就需要在游戏里找到代表张三的实体,并对这个实体(张三)发送欢迎消息,这里张三就是一个游戏对象,即一个实体。

索引(Index)

游戏里每个实体都有一个编号,这个编号就是实体的索引。为了准确无误的找到张三,给张三而不是王五发送欢迎消息,我们需要用实体的索引来区别张三和王五,比如有2个实体,分别代表了张三和王五,索引1的实体是张三,索引2的实体是王五。

唯一编码(Userid/Reference)

这个唯一编码并不是标准概念,为了统一理解,就当做是实体的身份证号码(唯一编码)吧。众所周知身份证号码是唯一的,不会重复的,一个号码对应一个人。同理,实体的唯一编码也是如此。

为了更生动形象的理解实体和索引的关系,我画了一个图:

我们把每个实体都看作成一个格子,给每个格子都编上号(索引)。因为求生2实体的最大数量为2049,但是上图只有2048个,那么编号(索引)为0的格子呢?所有小格子组成的这个长方大格子的编号就是0,它就是服务器本身。

接着我们看下面这个图:

你可能会注意到一个MaxClients的特殊格子,这个词在代码里很重要,记住它。它代表的索引是多少呢?它是动态变化的,在求生2里MaxClients的最大值为32,也就是说MaxClients可以是1到32中的任意一个数。

求生2这个游戏对实体的索引分成了3类,我也用颜色区别出来:

  • 绿色的长方大格子:索引0-永远指服务器本身
  • 蓝色部分:索引1到MaxClients-指幸存者、特感
  • 绿色部分:MaxClients到2048-指妹子、小僵尸、武器、按钮、灯光等

这里特别注意两点:

  1. 服务器本身也是一个实体,其索引永远是0
  2. 妹子和小僵尸一样,它们的实体索引范围在MaxClients到2048

似乎忘了说第三个概念唯一编码(Userid/Reference),它又是用来干嘛的呢?我们通过游戏里的一个具体情况,来简单理解实体、实体的索引、实体的唯一编码这三个概念之间的关系。

假设我们有一个求生2服务器,当前服务器为无人状态:

  • 玩家A加入游戏并获得空闲的索引1唯一编码(Userid)1
  • 玩家B加入游戏并获得空闲的索引2唯一编码(Userid)2
  • 玩家C加入游戏并获得空闲的索引3唯一编码(Userid)3

然后B不想玩了,离开了服务器,索引2空闲出来,索引2代表的实体为无效状态

然后玩家D、E分别加入游戏。

  • 玩者D加入游戏并获得空闲的索引2唯一编码(Userid)4
  • 玩者E加入游戏并获得空闲的索引4唯一编码(Userid)5

目前信息如下:

对比发现,B的索引2被D继承了,但B的唯一编码2(身份证号码),没有被D继承。D的唯一编码沿用了最小的未被使用过的数字4。

唯一编码的作用就是为了区分不同时间下,同一个索引所表示的实体是否是同一个实体。举个例子,你为张三(索引1)设置了每秒闪现张三的角色的轮廓,第10秒时,张三离开了游戏,后面王五加入了游戏,继承了张三的(索引1),那么王五也会继承每秒闪现他的角色的轮廓,这不是我们预期的效果,所以必须用唯一编码来细分张三和王五。

总结

  1. 索引是重复利用的, 并非唯一,且顺序不会打乱
  2. 唯一编码, 具有唯一,且顺序可以打乱

下一篇会直接写插件,在写插件的过程中,来通俗易懂的说一下这个语言的语法。当然sourcemod网站链接的维基上也有语法介绍,不过我个人觉的,作为一个无任何编程基础的小白,生硬的先啃语法是效率低下的。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号