本帖最后由 白羊羊 于 2020-2-22 14:53 编辑
—— 欢迎各位开发者来到VexView的世界 ——
(高级篇)

简介:VexView是一款能够制作自定义界面的插件,它由插件和MOD配合完成全部的显示任务。它的高强度自定义性赢得了当下不少服主的青睐,VexView从出生至今,已超过一年时间,通过期间的不断更新,现在的界面体制已非常完善,当然,在以后的更新中,我们会继续开发更多的实用内容。虽然VexView曾经是付费插件,但是现在已经免费开放使用,我们也欢迎各位开发者使用VexView为自己的插件增添色彩!

此教程为VexView附属插件开发高级篇,如果你还没看过我们的基础篇,请先查阅后再来哦:https://www.mcbbs.net/thread-895196-1-1.html
本教程目录:
  • 第一章 - 高级GUI组件介绍
  • 第二章 - 动态操作已打开的GUI
  • 第三章 - 更加高级的InventoryGui类
  • 第四章 - 背包侧边栏和自定义计分板
  • 第五章 - 自定义药水效果和特效显示
  • 第六章 - 自定义聊天频道和高级物品提示
  • 第七章 - 使用VexEventCallable接口
  • 第八章 - 更多高级操作
第一章 - 高级GUI组件介绍

注意:本章建议配合https://www.vexview.net/docs/index.html顺便查看一下相关组件的构造方法。
除了基础篇介绍的几个组件外,在 lk.vexview.gui.components 包下,还包含着非常丰富的组件:
  • VexCheckBox - 勾选框组件
  • VexTextField - 文本框组件
  • VexSlot - 物品框组件
  • VexPlayerDraw - 玩家模型绘制
我们来看看官方JavaDoc文档对于这些类的描述:
VexCheckBox:
VexCheckBox 勾选框,支持动态获取勾选状态, 只有两种勾选状态(未选/已选)

在代码中实现大概是这样的:

它类似于VexButton按钮组件,也有两种状态,你可以设置它的默认勾选状态,也就是最后的那个参数。
当然,仅仅是显示肯定是无法达到我们所希望的那样,我们需要判断玩家操作的勾选状态,所以说我们就需要用到OpenedVexGui进行当前Gui的动态操作(动态操作在下一章)

VexTextField:

VexTextField 自定义文本框 允许玩家自由输入文本内容,允许限制最大输入字数,可以实时获取输入的文本内容。

这个组件的用处就非常之大,我们知道,如果使用箱子GUI显示界面,是完全没办法让玩家实时输入内容的(只能靠一些带有文本框的原版容器替代,比如网易的嗨皮咳嗽就是用的铁毡的界面当做输入框)这样的实现的确很灵活,但是美观性就不尽人意了,而VexView直接提供文本框组件添加到GUI中,弥补了很多的不足。
同上,此组件需要动态操作才能完全发挥它的能力!

VexSlot:

物品槽 继承VexComponents类,属于组件,在GUI中生成一个固定大小的物品槽(18*18)

此组件并不是在VexView诞生初期就添加的,直到VexView 1.8版本问世后才被加入,可见操作难度是要比其他组件困难的。不过VexView已经帮助各位开发者简化了很多工序,现在的VexSlot可以直接被添加入VexGui中,可以预设物品,操作起来也非常方便。
使用此类需要注意的是:
参数:
id - 物品槽的ID(一个GUI的物品槽ID必须从0开始按顺序依次增大,不同物品槽不能相同)

这是关键,物品槽的id必须从0开始按顺序增加,否则就嘿嘿嘿...
此外,在VexGui中的VexSlot是无法进行拖拽操作的!想要实现拖拽效果,InventoryGui将会是你的不二之选,它会在第三章介绍。

VexPlayerDraw:

VexPlayerDraw - 玩家实体绘制 继承VexComponents类,属于组件,在GUI中生成一个玩家实体绘制(就是那种玩家模型,脑壳跟着鼠标动的那种)

如果你还是没看懂这个到底是个什么组件,我就用一句话来描述吧:玩家生存模式背包里面的那个第二人称样貌。
不过这个组件目前还有一定的瑕疵,官方建议是仅用作显示玩家自己的模型,待VexView更加成熟的一天到来,它说不定能够显示生物模型甚至是自定义模型。
小故事:之前在VexView开发群听到一个很不错的创意,既然组件都这么齐全,直接自己伪造个E键背包吧,可以穿戴更多RPG的物品,我仔细一想,的确,配合 InventoryGui 完全可以做到!

滚动列表 VexScorllingList 组件
emmm,说到这个组件,它也是很晚才被加入,在VexView2.0版本中,它以一个全新的交互方式和所有人见面。滚动列表中的各种操作绝不输GUI,我们进行了非常多的测试、修改,才将其简化到易于理解和使用。说了这么多,那么,它到底是一个什么样的存在呢?
它可以让你的GUI看起来像这样:

通过鼠标滚轮或者向下拉动右边的滑块,就可以滚动显示列表里面的内容。
包括Minecraft客户端的一些设置界面、创造模式物品栏,都是滚动列表的实现。
官方JavaDoc对于它的介绍是这样的:
VexScrollingList 滚动列表等同于一个组件容器 类似于VexGui,它同样可以包含一些组件,需要 组件实现ScrollingListComponent接口。 一个Gui中只允许含有一个滚动列表。 需要注意的是,组件的坐标将以该滚动列表的左上角开始重新计算坐标,而不是Gui。

简而言之:它是一个能容纳其他组件的组件。
和GUI一样通过addComponent方法直接添加组件:

可以说它的使用非常方便。

介绍的好帮手 -> VexHoverText
首先要声明,它不是组件!不知道这样你是否能理解:它是组件的组件(就像你有个身体,你的身体上还穿着洛丽塔...),HoverText能够为这个组件提供描述,它和物品描述是一样的,当你将鼠标放在物品上时,能够显示lore信息,它让VexView的Gui组件也能够这样显示信息,就像这样:

它的官方JavaDoc介绍为:
当鼠标放在组件上方时,会显示相关介绍信息

添加一个HoverText的方法也很简单:

所有实现了HoverTextComponent接口的组件,都可以添加一个HoverText

扩展型组件
在包lk.vexview.gui.components.expand下,就是我们提供的扩展型组件,在本篇教程中,我们只进行大致介绍,如果有需要或是感兴趣的话可以在我们的JavaDoc查看具体用法:
  • VexBase64Image - 以Base64形式直接传输的图片,直接读取输入流,存在传输大小限制,为了防止服务器的网络占用过高,非必须情况下不建议使用。
  • VexClickableButton - 可点击型按钮,除了普通按钮具有的两种状态外,它还有不可点击状态(需要第三张贴图),不可点击状态下,玩家无法操作此按钮,此组件支持动态操作(设置可点击性)。
  • VexColorfulTextField - 彩色文本框,允许自定义16进制颜色代码,甚至可以透明,用一张VexImage做底图实现自定义样式的文本框,其他用法和普通的文本框一致。
  • VexGifImage - 顾名思义,它支持显示GIF图片,继承自VexImage,你甚至可以设置每一帧之间的播放间隔。
  • VexSplitImage - 切割型图片,继承自VexImage,支持对一张图片的裁剪操作。
  • VexMcImage - 它用于显示其他MOD或是原版的材质贴图,继承自VexSplitImage,支持图形切割,URL的填写方式不同于普通的图片,具体使用方法参见doc
第二章 - 动态操作已打开的GUI
VexView开发初期,总有人提出需要动态操作组件的想法,我们就很纳闷,既然一个GUI已经完成配置并展现给了玩家,还需要动态操作做什么?

在VexTextField文本框组件推出后,我们开始意识到动态操作的必要性。比如实时获取文本框内容,在很早的版本中,需要你进行大量复杂的工序来实现;还有无法动态更新按钮和图片,只能以重新打开GUI的方式刷新界面,这些都极大地降低了开发效率,也使得逻辑偏离了正常的轨道,这绝不是我们希望看到的。

终于,在1.9.5版本中,OpenedVexGui问世了。OpenedVexGui是一个用于动态操作已展示GUI的类,官方介绍:
你可以把它看作是玩家已经打开的一个GUI 该类用于实现对已打开的类进行动态操作 请不要以任何形式创建该类的新对象,该 类对象可在VexViewAPI中进行实时获取

获取方法很简单:

使用此类,你可以进行以下操作:
  • 动态删减或是添加已实现 DynamicComponent 接口的组件。
  • 动态获取文本框、勾选框、物品槽并获取玩家更改的内容。
  • 直接为此GUI设置文本框、勾选框的内容。
  • 直接获取VexGui对象。
例如,我们需要获取文本框的内容:

通过动态操作,一切都只需要一行代码即可,不仅减少了工作量,还提升了运行效率。
当然,此类的动态操作还有很多,你可以直接查阅我们的JavaDoc。
第三章 - 更加高级的InventoryGui类
InventoryGui继承于VexGui,它在VexSlot问世后,相继而来,此类实现了很多人需要的物品拖拽功能,本章将进行详细介绍。

官方对此类是这样介绍的:
这是基于VexGui的强化版界面,它允许开发者在普通 VexGui 的基础上,实现玩家背包物品查看、拖拽,并结合我们的VexSlot组件开发新的功能性容器界面。 唯一需要注意的是,所有的VexSlot在此GUI中,全部变为空物品槽(2.3.3版本中已移除此机制)关于玩家背包栏阵列,是为了显示玩家背包栏特别增加 的36格、4行、9列阵列,同原版排列顺序相同,宽度为 18*9、高度为18*4

简而言之,它能实现你做高级的合成台、强化台的想法!
使用此类之前,我们需要进行解读,首先我们从基本的开始,如果要实现自己造个强化台、合成台,是必须要和背包物品进行交互的,玩家需要将他背包中的物品放上合成台才可以进行合成,这是肯定的,因此,第一个概念就很容易理解了,为什么此类会多出一个玩家背包阵列相关参数,这正是为了放置玩家背包的全部槽位所设计的。

此类的VexSlot全部允许进行拖拽操作,解除了普通VexGui的限制,让许多的合成、强化插件能够使用新的操作界面。
就像这样:


本章开头提到的风险又是什么呢?
VexView并没有进行物品操作校验的流程,这会导致一个什么问题呢?如果玩家使用某些背包编辑器、作弊MOD等,私自修改了物品槽的原有物品,在VexSlot动态获取的内容就会变成这些被恶意修改的物品,严重干扰物品操作的正常判断,不过不用担心,解决办法很简单,在进行任何物品删减操作时,你只需要多加一个判断玩家背包中是否真的包含此物品(使用Player类的Inventory获取真实的内容),千万不能相信客户端的任何数据!
(2.5.2版本后开始同步操作)
第四章 - 背包侧边栏和自定义计分板
什么是背包侧边栏?请看:

它相当于玩家背包的扩展,在右侧开辟了一个新的区域,它比GUI要稍微低级一点,它只能显示自定义文本、自定义图片、自定义按钮。
当然,如果不是什么定制内容,一般是不需要开发者自定义侧边栏的,服务端的配置文件就能轻松搞定,但是本教程默认开发者需要定制内容。

开发者只能使用VexViewAPI的addSideBarPage方法来添加自己的一页(侧边栏分很多页,可以通过下面的按钮切换)

一个VexPage对象,就是一页,添加的三个List分别是VexText、VexImage、VexButton,可以为空列表。
这些组件的坐标计算是从侧边栏的左上角开始的,而不是玩家背包界面的左上角,请注意。


快说说怎么自定义计分板吧,我看2.3.8背包好像对计分板进行重大更新,我都等不及了!
好的,马上就开始介绍新的自定义计分板API,直接上代码吧:

我们都知道计分板必须要刷新才可以动态显示内容,但是你可能会疑惑为什么每次刷新用的计分板处理类是BiFunction,我来解释一下,首先提供的两个参数,一个是这个计分板的名称、还有一个是刷新这个计分板的玩家,在处理时,这两个参数会很实用,相信我。然后就是BiFunction的返回类为什么一个VexText,因为计分板也是支持x,y轴坐标的,你可以自由调整文本位置,非常方便。

在创建好计分板之后,还没有完成,我们首先需要注册我们的计分板、然后再为指定世界设置我们的计分板,就像上面那样。

那我不想显示我自定义的计分板了怎么办?我想切换回配置文件里面默认的那个。

我们早就考虑到这种情况,你可以直接像上面这样将指定世界的计分板调回默认计分板。
第五章 - 自定义药水效果和特效显示
在2.3.8版本,我们推出了一项重磅功能 —— 自定义药水效果。
这绝对是做自定义状态的最佳选择,请看效果图:

药水效果的图片、名称完全自定义,并且直接在GUI和HUD显示,让原版也能有MOD服的体验。
那么它难不难操作呢?直接上代码,不解释:

上面的操作就是为玩家添加一个1级、1分钟的愤怒药水效果。
非常轻松简单的操作,即可添加你的自定义药水效果!

这还不够,我们既然能添加,当然也能获取剩余时间:

直接获取得到此药水效果的剩余时间。

自定义特效
自定义特效?听起来很厉害诶,快让我康康!
VexView在2.3.8版本新增自定义特效,部分改编自原版的特效、以及我们的一些原创的特效(后续版本会不断扩充),他们都继承于VexEffect类,目前已添加的有自定义彩色闪电:

你可以自定义它的RGB值,从此以后,黄金之雷不再是MOD的专属了!
我们直接上代码:

同样是非常简单的两步,快速完成自定义特效播放。
如果你对VexView特效感兴趣,可以实时关注我们官网的更新哦!
第六章 - 自定义聊天频道和自定义物品高级提示
对,自定义聊天频道来了,在2.4这个跨越性版本中,自定义聊天频道首次出现!
那么,它长啥样我们得先知道:

玩家可以自由切换聊天频道,并在对应频道聊天,不过,目前此套API还不够成熟,只能单方面处理聊天内容。
目前的聊天频道添加方法为:

默认是一个公共频道,处理聊天内容你可以在VexChannelChatEvent中处理,它实现了Cancellable接口,允许取消玩家本次发言。
当然,在后续版本中,我们会推出白名单和黑名单机制,用于分离聊天频道的玩家,敬请期待!

自定义物品高级提示框
2.4版本最备受瞩目的就是高级物品提示框,它高级在哪里?我们直接用宣传图吧:

自定义模型预览、自定义提示框背景,滚动显示Lore,这就是自定义高级物品提示框。
我们用链式安排它,我儿豁:

进游戏体验一下这把钻石剑吧,玩家看了就想氪。
什么?支持MOD物品吗?
当然!
第七章 - 使用VexEventCallable接口
在2.6.10版本更新后,为了简化附属项目的结构,我们推出了VexEventCallable接口用于直接在Gui对象中编写事件处理逻辑。它的作用是,任何实现了VexEventCallable接口的VexGui(包括子类)都会在事件触发时,自动调用接口中的方法,此接口中包含以下方法:
  • onKeyPressed - 当此GUI中触发KeyBoardHoldEvent时自动调用
  • onSlotClick - 当此GUI中触发VexSlotClickEvent时自动调用
  • onGuiOpened - 当此GUI触发GuiOpenEvent时自动调用
  • ...
更多方法可以前往我们的JavaDoc查阅。

一个标准的实现可以像这样编写:

这也是我们之前基础篇推荐使用的继承式写法,它的操作更加灵活。

实现此接口后,我们就可以直接在对应方法中编写我们的逻辑,而不需要再去进行监听操作:

大幅度提升了开发效率。
第八章 - 更多高级操作
关于HUD的图层遮罩:
有些插件可能需求更加高级一些,它们需要通过HUD的图层遮罩来实现一些功能,在2.4版本,HUD被赋予了z轴这一概念。
什么是z轴?有什么用?
z轴越大,此HUD越置于顶端,若使用原来的无z轴构造方法,则默认为0,当出现HUD重叠时,可能会出现闪烁、交换遮挡等问题,因此在处理HUD图层遮罩时,请使用新增的带z轴的构造方法。

HUD的永久显示:
HUD的显示时间是以秒为单位,但是如果希望永远显示,请讲时间设置为0。

移除Minecraft原版HUD内容:
需要移除Minecraft原版的HUD?当然可以!VexViewAPI直接提供了相关静态方法,请查阅我们的JavaDoc。


关于进服Gui操作与PlayerJoinEvent事件:
当玩家进入服务器触发PlayerJoinEvent时,可能VexView并没有完成与客户端的握手操作(此时进行VexView任何操作都可能造成无法预估的后果)
那么,怎么才能确认一切准备就绪呢?我们提供了VerificationFinishEvent事件用于针对此类操作进行处理。
当一切准备就绪时,就会触发VerificationFinishEvent事件,与PlayerJoinEvent一样,它只在玩家进入服务器时触发一次。
[groupid=1330]PluginsCDTribe[/groupid]