游戏内物件

我们需要明白游戏内物品,如实体(entity)、方块(block)、物品(Item)以及显示的用处及大致特点,才能写出优秀的命令系统。它们就是我们的主要操作目标。
我们不需要严格定义它们,只需要根据它们对我们的用处来分辨它们就好了。

实体

能被目标选择器(target selector)中的@e选择到的,我们就会当作是实体处理了。
一般来说实体能够和其他物件互动、有坐标,并且需要储存大量资讯。比如玩家、生物、矿车等等都是一个实体。
而大部分方块也不是实体,因为它们储存的数据有限。但部分储存大量数据的方块,如箱子,则属于方块和实体的范畴,我们称之为方块实体,那些方块将会在下一部分详细讨论。

实体数据

一般来说实体都有三种数据:ID、UUID以及其他数据。

ID:实体都有它们的种类,如playerarea_effect_cloud等。(从1.11之前的版本过来的朋友请注意,1.11把实体名称修改为以下划线(_)分开单词、全部小写。然而也有部分实体名称出现严重更改,如FallingSand被改为falling_block,请自行查阅wiki)

注意,有两个特例。
闪电有实体ID,但它不是实体。
鱼钩没有实体ID,但它是实体。(我们一般从名字检测,名字和语言有关,英文时为unknown,中文时为未知)


UUID: 就是一个实体的标识(Minecraft除了实体之外也有部分地方使用UUID),在游戏内应该是独一无二的。UUID是游戏追踪实体的主要方法,因为实体名称可能会重复。
UUID其实就是一个128bit,32个16进制的数字。
假设我们有一个UUID为50CB2286-33E6-90F6-598C-510538629432
其UUIDMost就是50CB2286-33E6-90F6,转为十进制就是5821784903098208502
其UUIDLeast就是598C-510538629432,转为十进制就是6452621448977749042

注意:不是直接转,我们得考虑补码的概念(甚至需要补零)。因为十进制的时候容许负数,十六进制的时候不容许负数。
如果不是特别需要的话其实可以使用生成器...这些东西就让编程的去头疼吧√

如果UUID发生碰撞(出现的几率微乎其微,一般为人手造成的),会导致很严重并且难以靠游戏自行修复的Bug,如无法找到重复UUID的实体等,需要玩家自行使用外部软件修改游戏存档才能解决。


实体的其他资料都储存在其NBT内(其实全部数据都储存在NBT内,就是这些比较特殊特别提醒。)

实体特点

  • 优点
    • 能轻易被选择、根据特定条件过滤(这是最重要的,能使用选择器)
    • 能储存大量信息(NBT、记分板变量、Tag、队伍)
    • 坐标较精确(小数,即使该实体本来是自动调整到方块位置也可以通过骑乘的方式绕过该特性)
    • 能在同一点放置大量实体
    • 坐标限制较少(可以在Y为负数或大于256的地方生成实体,不过还是比较少在Y为负数的地方生成,因为可能会掉入虚空死掉)
  • 缺点
    • 一般实体太多会导致严重卡顿(特别是该实体能被看见时)
    • 没法修改模型

分类

实体下还有很多不同分类的,那些分类大多都有特别的数据或表现

  • 实体
    • 生物(Mob)
      • 可繁殖
      • 可驯化
      • 怪物
        • 不死类怪物
        • Boss(或许同时是不死类怪物)
    • 移动中方块/可移动方块(平滑移动,如掉落方块及TNT)
    • 投射物
    • 其他...

对于生物,它们能够有状态效果(Status effect)及属性(Attribute)。

不死类怪物、Boss这些一般指影响实体的行为,而不影响其数据。然而行为对实体来说也是很重要的,比如不死类怪物的治疗、伤害效果是完全相反的。

状态效果

状态效果能给予一些一只生物不同效果。

每个效果由三部分组成:

  • 效果ID,决定效果的作用。
  • 效果倍率(=等级-1),决定效果的强度。然而如果是128-255,则会当作等级 -127 - 0。故此128开始的效果可能会出现反效果(但也不一定),需要多加小心。而250开始的效果可能是非常弱的某些效果,也可以多加测试。
  • 时间,以秒为单位。注意如果时间很长的话会显示为**:**,然而这并不代表无限长时间,时间还是一样只是显示不了而已。

一只生物能同时拥有多个效果,即使那些效果是完全相反的。
然而,它不可能同时拥有多个相同效果(即使是不同等级),如果新的效果倍率大于等于当前效果倍率,将会把当前效果覆盖(比如新的效果是255倍率,时间为0,则会消除当前的那个效果)。

注意,虽然实体有ActiveEffects的NBT,然而我们并不建议向那个NBT进行赋值,因为部分效果是和属性相关的,修改ActiveEffects对那些效果并无任何作用。

参考:https://minecraft.gamepedia.com/Status_effect

属性

属性定义了生物的不同属性,如攻击强度、检测敌人范围、血量等。
属性由两部分组成,包括属性基础(base)及修改器(modifier)。

属性基础就是生物基础的属性,直接写一个数字(浮点数)决定。
至于属性修改器则可以修改属性(增减属性数值)而不需要修改基础属性,并且能够通过物品为生物加上。修改器包括以下几个数据:

  • 名称。基本上是没用的
  • AttributeName。修改啥属性
  • Amount。修改的数值。
  • Operation。如何修改。
    • 0为直接加上指定数值,最先计算所有Operation为0的modifier
    • 1为乘法,把属性数值(经过Operation为0的modifier的修改后的数值)* (1+n),而n为所有对此属性的Operation为1的modifier的数值的总数(类似计算单利息)。这在计算完所有Operation为0的modifier之后计算。
    • 2为乘法,每个modifier都会把属性 * (1 + k),k为当前modifier的数值(类似计算复息)。这在计算完所有Operation为1的modifier之后计算。
  • UUIDLeast及UUIDMost。识别每个modifier的UUID。参见上方UUID部分。冲突了也会出问题。
  • Slot。准确来说这不算是modifier一部分,这是物品里面的AttributeModifiers里会决定的。指定后,只有当物品被放进某个格子才会触发modifier。

参考:https://minecraft.gamepedia.com/Attribute
注意,和血量有关的一般都比较多bug。

方块

资料

ID,指定方块的种类


方块状态(block state),储存方块的一些额外资料,如活塞的朝向facing=top、活塞是否已经伸出extended=false等。一个方块可以同时有几个方块状态(这也是很常见的情况),之间以,间隔,如facing=top,extended=false
检测的时候可以以*代表不检测方块状态。

我们不建议使用方块元数据(Metadata)


NBT。部分方块,如箱子等容器,需要储存额外的资料(因为方块状态不足以储存大量资料)。它们就是方块实体(block-entity),会使用NBT来储存那额外的资料。

特点

  • 不能与其他方块处于同一个坐标(两块台阶会变为一块双台阶,故不算两个方块占据同一个坐标,其他特殊方块亦如是)
  • 不能横跨多个坐标(活塞推出后,推出的部分为活塞头,分别为两个方块,只是破坏一个会导致另一个同时被破坏)
  • 从y=0到y=255之间(并且在世界边界,即worldborder,之内)都是方块("没有方块"其实就是空气方块)
  • 能够通过资源包修改方块模型(Block model), 来修改方块的样子(实体无法做到)。相应的,模型越复杂就需要越多时间渲染该方块,因此过多复杂模型的方块会导致卡顿。
  • 方块也会对方块更新作出反应,如检查自己能不能在这环境存在、维持原貌等(如沙子在下方没有支撑方块时会掉下)。这方面相信红石玩家会有更多研究,请查阅红石教程,本文就不多讲了。
  • 优缺点基本上就是实体的相反...

方块更新

因为方块的某些性质会受到相邻方块的影响,于是方块被替换时(方块ID或方块状态的变化,NBT变化不包括在内),会引发相邻6个方块的更新,如果某个方块在更新中产生了变化,会把更新传递下去。

这特性在系统里有时候也十分重要,比如我们不能以fill命令填充一大片地狱传送门,因为fill命令是逐个方块进行替换,替换多个连续方块时会产生方块更新,而地狱传送门不能独立存在,故此会马上消失。但是我们能够通过setblock命令放置一个独立的地狱传送门,因为我们只放置一个方块是只会更新旁边的方块,而不会更新自身的(如果旁边的方块没有因此而发生状态改变)。

相应的,有时候我们希望手动触发更新,这情况下我们会使用范围clone命令,使用force模式,强制替换到原地,触发方块更新的同时亦不更改任何一个方块。

如果希望知道更多有关方块更新的知识,请自行寻找红石方面的教程或者是相关玩家询问,他们对此比较多研究。

物品

物品只会存在于实体/方块NBT(也就是存在于背包/储存格内),或者是以掉落物形式存在(这是一种实体)。

资料

ID,即物品种类,如minecraft:stoneminecraft:stone_sword。部分方块的物品状态ID与方块ID相同,然而也有部分是不同的,因此得小心分辨。也有部分方块是没有物品的,请小心。


数量(Count),因为相同物品能够堆叠,因此数量是十分重要的。不同物品最大堆叠数也不同,有些是1个,有些是16,有些是64,不能一概而论。不过通过修改NBT可以一次过弄超过最大堆叠数量的物品。


数据值(Damage Value/Data Value),范围为-32,768至32,767,整数。最初用于记录工具的磨损程度(0为全新,数据值+1为耐久度-1),但已经被用于储存别的数值(一般是物品种类),如羊毛颜色、铁砧耐久等。
然而需要注意的是,即使该物品是方块的物品状态,这数据值的目的也是储存方块的不同状态,数据值也未必与方块元数据一样,如铁砧便是一个好例子。故此,必须区分数据值及方块元数据两个概念。

简单点理解就是,数据值和方块元数据不同。


格子编号(Slot ID)。这个数值用作储存物品所在的格子编号,掉落物状态时物品不存在此数值。


至于小箱子则从左上开始为0,右一格为1,如此类推。
大箱子则为两个小箱子的组合,一个负责上半部分物品,一个负责下半部分物品。和小箱子的表现类似,但是得分别设置两个方块才可以修改上半及下半。


其余数据。其实物品所有数据都会放在NBT里(tag里,详细可以回去看看NBT实战部分),其余数据亦如是,可以储存物品的其他资料,如显示的名称、介绍、附魔等。

用途

  • 常见游戏内物品的功能,如药水、装备等等
  • 为玩家添加buff (基于附魔或Attribute Modifier)
  • 容器内GUI (界面),因为命令能检测物品所在的格子。 此外,亦能通过修改物品模型(Item model)的显示(display)中的gui选项,让物品看起来更像一个控件(control)。
  • 自定义显示。 物品模型能分别对不同数据值的工具设置模型,故此能自定义大量模型。 通过如刷怪笼等方法甚至更能做到大量的自定义方块材质。

注意: 不是只有物品才能让生物手持的。如末影人手持的实际上是方块。

显示

本文说的显示,就是一些只有玩家才能看到、听到,并且无法与游戏内其他东西进行互动的物件(GUI的话倒是能和玩家互动的,不过那也算作显示了)。

类型

  • 聊天栏信息(不算clickEvent的话)
  • Title信息(在屏幕中央的或快捷栏上方)
  • 声音
  • 粒子(particle)
  • 模型
  • 用户界面等等...

用途

这些显示元素主要在地图及原版模组内会大量使用,以提高用户体验。由于用处十分广泛,可以参考后方资源包部分,以及询问有地图制作经验的玩家。

results matching ""

    No results matching ""