Icy_Mint
本帖最后由 Icy_Mint 于 2020-4-30 22:19 编辑
Magic插件的搬运帖:
https://www.mcbbs.net/thread-633695-1-1.html

以下内容来自wiki,在翻译的基础上略有改动
制作自定义技能
众所周知,Magic插件的技能是可以高度自定义的。如果你很喜欢某个技能,想基于这个技能制作你自己的技能,那是完全可行的。
Magic的技能类似于脚本事件(和SkillAPI类似),多种多样的方式和结构能够使技能发挥出无限可能!

制作技能的一些帮助
1.官方的网页编辑器
这个编辑器提供一个编辑config的工具,并且具有错误检查,语法高亮和自动补全的功能。(个人认为十分管用)并且这个编辑器可以通过登录来实现保存。关于登录方式,只需要登录一次插件作者的服务器输入给定指令即可,具体请参考编辑器网页。
2.技能的引用列表
这里包含了技能的各种属性,比如参数,行为,效果等等,每一项内容都有完整的说明。
3.默认的技能列表
这里有插件自带的技能,适合在制作技能的时候模仿学习
4.github上的技能文件列表

技能制作教学
在这个教程中,我们将分析Magic的奥术飞弹技能。

技能内容
一般来说,我们每个技能都包含了五个部分
1.基础属性,比如技能的名字,图标,技能点消耗,以及其他不会随着技能升级而改变的东西
2.技能行为,在这里就是技能释放的时候会发生的事
3.特效,技能自然少不了炫酷的特效
4.参数,参数是从技能行为中分离出来的,这些参数决定了技能释放时发生的事的细节,比如具体造成多少伤害。在升级,施法杖或者指令释放的时候可以通过特殊方式被新的值覆盖,以便于测试。
5.消耗,技能自然有消耗,包括法力值,物品,生命值,金钱等等。

基础属性
首先我们来看看奥术飞弹,完整的配置文件在这里
如果网络不够好可以看这里


  1. missile:
复制代码
这个就是技能的关键词了, 释放技能的时候就是通过/cast 关键词 释放,关键词是不能重复的。
  1.     icon: diamond_axe:160
  2.     icon_disabled: diamond_hoe:160
  3.     icon_url: http://textures.minecraft.net/texture/2ba95570c7b712713632d4c0d2fc66906613d3850a596a0267c6d763fe741ac
复制代码
技能的图标是技能用于在游戏内展示的。比如作为一个物品放在施法杖里,商店里等等。
第一行是技能可用时候的图标,Magic插件自带的材质包里 diamond_axe:160 是有一个独立材质的。

第二行就是技能因为法力值不足,还在冷却等原因不可用时候的图标。
当然,技能的图标也能够显示为玩家的头颅,如果 url_icons_enabled 这一项在config文件中被设置成了true,那么技能就会用第三行的地址来加载指定的头颅作为图标。
但是头颅图标不支持技能不可用时的区别显示。
在Magic自带的材质包里,每一个自带技能都有对应的不可用的图标。

技能时可以升级的,比如 missile|2 就表示2级的奥术飞弹,这个技能继承 missile 的全部内容,当然可以对一部分参数进行修改。
  1.     upgrade_required_path: beginner
  2.     upgrade_required_casts: 40
复制代码
我们回到missile,这两行就表示了升级这个技能需要满足的前提条件,path是Magic插件的一个设定,表示玩家一步步使用技能,学习技能的成长的阶段,这两行加起来就表明,如果要升级技能,你必须处于Beginner阶段,并且至少成功释放了40**术飞弹,关于成功释放,会在后面介绍。
  1.     category: combat
复制代码
技能可以选择添加目录,是不错的整理技能的方式,比如奥术飞弹是战斗技能,就把它加到战斗目录里面
  1.     worth: 150
  2.     earns_sp: 8
  3.     earns_cooldown: 10000
复制代码
worth表示在技能商店购买学习这一技能时需要花费的技能点。
第二行表示成功释放这一技能会给予玩家多少技能点。
第三行表示获取技能点的冷却,当然这并不表示在冷却结束前不再能获得技能点,只是获得的技能点会被减少,以防玩家太快获得太多的技能点。

关于游戏内文本
为了让本地化简单一些,Magic插件把游戏内的提示文字都放到了messages.yml里面。每一个技能都可以在那里编辑游戏内的信息。
当然,为了方便起见,你也可以直接在技能文件内部使用 name 和 description 标签来设置技能的名字和描述。
关于如何在messages.yml内部添加
  1. spells:
  2.   missile:
  3.     name: 奥术飞弹
  4.     description: 我释放奥术飞弹
  5.   missile|2:
  6.     name: 强化奥术飞弹
  7.     description: 我释放强化奥术飞弹
复制代码
技能的类文件
某些旧的技能还在使用这种方式,此处不再展开

技能行为
现在大多数技能都使用 actions 来实现,这一部分决定了技能释放时会做些什么。
让我们再来看奥术飞弹技能
  1.     actions:
  2.         cast:
  3.         - class: CustomProjectile
  4.           actions:
  5.           - class: Damage
  6.           - class: BreakBlock
  7.             ignore_result: true
复制代码
actions里面可能包含多个部分,但是大多数技能只有 cast 部分,也就是说这些动作是技能被释放时发生的。
可以看到,这些动作可以是嵌套的,也就是说动作可以有它的子动作,在自己释放成功后才会执行它的子动作。
每一个动作必须包含一个 class 文件,这决定了这是个什么技能,所有可用的class可以在这里找到。
奥术飞弹是从CustomProjectile开始执行的,执行过程如下:
(分层通过缩进实现)

技能释放,运行到cast这一行,按顺序执行 cast 下一层的所有class,这里只有- class: CustomProjectile这一项
当这一项命中目标时,按顺序执行 - class: CustomProjectile 的 actions 下一层的所有class, 这里就有- class: Damage 和 - class: BreakBlock两项了,其中后者还跟着一行参数。
接下来依次执行 Damage 和 BreakBlock ,也就是对被命中物造成伤害和破坏方块。
由于这两项没有子动作了,技能执行结束。

这个分层结构可能让你感到迷惑,在这里举个例子
  1.   actions:
  2.     cast:
  3.     - class: A
  4.       A的其他内容
  5.       actions:
  6.       - class: AA
  7.       - class: AB
  8.         actions:
  9.         - class: ABA
  10.     - class: B
  11.       B的其他内容
  12.       actions:
  13.       - class: BA
复制代码
和cast左端对齐的 - 共有两个,分别是class A 和 B,从第一行到第二个 - 所在行的前一行都是A的内容,从第二个 - 所在行开始到结尾都是B的内容。也就是说,开头的 - 表示一个新的列表项的开始。

动作参数
每一个动作都有参数来具体决定这个动作的行为,这些参数可以直接加在上例中 “A的其他内容” 这里,也可以加到上文提到过的第四部分,参数里面
在奥术飞弹的例子中,可以看到 - class: BreakBlock 有一个ignore_result = true 的参数。
每一个动作都会返回执行结果,通常是成功,失败,没有目标中的一个。如果想要通过释放技能获得技能点(前面提到过),那么至少要有一个动作返回了成功。对于奥术飞弹,我们不希望仅通过破坏方块就能够成功执行技能,所以class: BreakBlock的返回结果会被忽略,也就是说,要想通过奥术飞弹获得技能点,你只能使class: Damage返回成功来实现,也就是攻击其他生物。

特效
这里决定了技能释放的时候会产生的效果,特效下面必须有一个cast才能够在释放的时候产生出一些效果。
让我们再次来看奥术飞弹:
  1.         cast:
  2.         -  class: EffectSingle
  3.            sound: magic.zap_crack
  4.            location: origin
  5.            color_override: color
  6.            effectlib:
  7.              class: ConeEffect
  8.              iterations: 10
  9.              particle: redstone
  10.              lengthGrow: 0.1
  11.              radiusGrow: 0.003
  12.              updateLocations: false
  13.              updateDirections: false
复制代码
cast这部分就会在技能释放的时候执行。cast 实际上是一个列表,也就是说你能够同时执行多个粒子效果,列表的实现同上,靠开头的 - 表示一个新的列表项。
class 表示效果的执行方式,似乎这一项已经过时了,作者现在建议使用 EffectLib 来实现粒子效果。
sound 表示执行时播放的音效,可以使用 sound_pitch 和 sound_volume 来进一步细化
location 表示执行的位置, origin表示释放者, target表示目标,both表示两者。
color_override 施法杖时有颜色数据的,每个施法杖的颜色都不一样,这一项就在告诉后面的 effectlib,粒子要使用施法杖的颜色,只对 redstone 和 mob_spell 这两种粒子有效。
effectlib 表示要执行的 EffectLib 特效
(在未安装EffectLib的情况下我依然能看到特效,Magic可能已经包含了该插件)

你可能不止希望在释放的时候制造特效,Magic也能满足你
  1.         tick:
  2.         - particle: redstone
  3.           location: target
复制代码
tick的左端和上面的cast对齐,表明这也是effects的子项,tick包含的内容会在技能执行期间的每一个服务器刻执行一次。


技能参数
  1.     parameters:
  2.         allow_max_range: true
  3.         velocity: 200
  4.         range: 24
  5.         hitbox: true
  6.         target_type: Damageable
  7.         player_damage: 2
  8.         entity_damage: 4
  9.         target_breakables: 1
  10.         cooldown: 1000
  11.         reorient: false
  12.         destructible: solid
  13.         destructible_durability: 50
  14.         break_durability: 2
  15.         undo: 10000
复制代码
所有这些参数都会作用到上面的三个class中(如果它能发生作用),关于这些参数的具体作用以及还要哪些可用的参数,请在这里找到所用的Action,Action里包含了它的全部可用参数。

爆头修正
  1.     headshot_parameters:
  2.       damage_multiplier: 1.5
复制代码
CustomProjectile是可以检测你是否实现了爆头,当爆头实现的时候,就会使用这里所包含的参数(这里为伤害x1.5)。


消耗
技能消耗通过列表实现,通常使用mana
  1.     costs:
  2.         mana: 15
复制代码
技能要求
Magic支持玩家需要满足要求才能使用技能,当前只有对SkillAPI的
  1.     requirements:
  2.         -  type: skillapi
  3.         -  skill: enchanting
复制代码
表示玩家需要学会skillapi中名为enchanting的技能才能释放此技能。


放在最后的话

我最近正在研究此插件(毕竟是自己搬运插件开的坑),将一点点分享我对这个插件的研究成果,如果觉得对你有帮助,还请希望留下人气和金粒。



第一页 上一页 下一页 最后一页