大大的咸鱼
本帖最后由 大大的咸鱼 于 2021-1-7 21:35 编辑

· 前言

        承接上文,做抽奖插件的想法其实在我还没帮 A1 摸完 护甲修复 (ArmorFix) 的时候就萌生了的,只不过当时新建了个文件夹就放那了。这两天我做完 护甲修复 重新上手 抽奖箱 (LuckyBox) 的时候发现不少代码都能从上个项目直接 copy 过来,包括整个文件系统和指令系统,因而这个插件的开发整体上是比较快的。和 护甲修复 一样 这是一个非常轻量级的插件,没有 GUI 也没有其它多余功能。指令和文件系统沿袭自 护甲修复,依旧支持简写、自动补全以及热更改保存。另外我不能保证这个插件能在 1710 以外的版本上跑,因为我只测过 1710;如果各位有在其它版本上跑该插件的需要建议先进行较为完整的测试。

· 正文

章节1:数据文件
- 因为支持更改热保存所以我不再建议各位通过直接编辑数据文件来更改内容。当然如果你希望这么做的话也是可以的,数据文件格式只需要一些基本的英文基础就能看懂,这里也不再赘述。

章节2:实现原理
#在讲解如何设置一个抽奖箱之前你需要先简单了解一下这个插件是怎么运作的。

1.1 抽奖箱与奖品的层级结构
        基础的奖品单元是 award,每个 award 包含一个物品 id 和一个物品数量 (相当于这个奖品的物品 id 和奖励的数量);奖品的高一级单元是 award group,也就是 奖励组,每个 award group 包含了一个或多个 award。抽奖箱的基础单元是 box,每个 box 包含了一个或者多个 award group 和其对应的权。当你打开一个箱子的时候你获得某个 award group 的概率为 该 award group 的权 / 该 box 内所有 award group 的总权。举个例子:有一个 box 里面有 3 个 award group,分别为 group1、group2、group3,它们的权为 3、5、8,那么打开一个这样的 box 获得 group1 的概率为 3 / (3 + 5 + 8) = 3/16,获得 group2 的概率为 5 / (3 + 5 + 8) = 5/16,获得 group3 的概率为 8 / (3 + 5 + 8) = 1/2。

1.2 物品与箱子的映射
        上面讲了箱子与奖品的结构以及开箱时的概率计算,现在我们还需要给箱子绑定一个物品 id 作为这个箱子的本体,因而我们需要添加从 箱子 到 物品 id 的映射,准确的讲是从 物品 id 到 箱子 的映射,比如 307 (铁胸甲的物品 id) → box1,这样我们拿着 铁胸甲 并输入 /open 的时候就会打开 box1 对应的箱子了。我们也可以让多个 物品 id 指向同一个 箱子,比如 307 → box1,55 → box1,这样我们拿着 307 或者 55 对应的物品输入 /open 时都会打开 box1。

章节3:指令集
/open <password> - 打开手中的箱子,password 为可选,依据对应箱子需不需要密码
/lb help - 显示所有可用指令列表
/lb debug <true|false> - 启用/关闭 debug 模式
/lb enable <true|false> - 热禁用插件 #热禁用不是卸载插件,而是暂时不允许非 op 玩家打开箱子;当你发现箱子设置有问题时可以先热禁用并热修复问题,之后重新开启
/lb getitemstate - 显示手上物品的 Material 和 id 信息
/lb link list - 显示当前所有 link
/lb link new <itemID> <box> - 新建 itemID 与指定 box 间的映射 #当对应 itemID 已经存在映射时该指令将会覆盖原有映射
/lb link delete <itemID> <itemID> ... - 删除指定的一个或多个 itemID 的映射
/lb link check id <itemID> - 检查指定的 itemID 是否存在映射
/lb link check box <box> - 检查指定的 box 是否存在映射
/lb link get <itemID> <itemID> ... - 若 itemID 存在 link 则获取对应物品
/lb box list - 显示当前所有 box
/lb box new <boxName> <awardGroup1> <weight1> <awardGroup2> <weight2> ... - 新建一个 box 并添加一个或多个 award group 及其对应权
/lb box delete <box> <box> ... - 删除一个或多个 box
/lb box rename <box> <newName> - 重命名指定的 box
/lb box showcondition <box> <boxName> ... - 显示一个或多个 box 的开启条件
/lb box setpassword <box> <password> - 为指定 box 设置 password,如果不填 password 就移除对应 box 的 password 需求
/lb box setkey <box> <keyItemID> <true|false> - 为指定 box 设置 key 并设置开启该 box 是否会消耗指定的 key,key 的物品 id 填 -1 取消该 box 的 key 需求
/lb box listcontent <box> <box> ... - 显示一个或多个 box 的内容
/lb box addawardgroup <box> <awardGroup1> <weight1> <awardGroup2> <weight2> ... - 为指定的 box 添加一个或多个 award group 及其对应权
/lb box removeawardgroup <box> <awardGroup> <awardGroup> ... - 删除指定 box 中的一个或多个 award group
/lb box setweight <boxName> <awardGroup> <newWeigth> - 为指定的 box 中的指定 award group 重新设置权
/lb box check <boxName> - 检查指定的 box 是否存在
/lb box get <box> <box> ... - 获取指定 box 所 link 的物品,若指定 box 有多个 link 物品则全部获得
/lb box getcontent <box> <box> ... - 获取指定 box 内所有的奖品
/lb awardgroup list - 显示当前所有 award group
/lb awardgroup new <awardGroupName> <award> <award> ... - 新建一个 award group 并向其添加一个或多个 award
/lb awardgroup delete <awardGroup> <awardGroup> ... - 删除一个或多个指定的 award group
/lb awardgroup rename <awardGroup> <newName> - 重命名指定的 award group
/lb awardgroup listcontent <awardGroup> <awardGroup> ... - 显示一个或多个 award group 的内容
/lb awardgroup addaward <awardGroup> <award> <award> ... - 为指定的 award group 添加一个或多个 award
/lb awardgroup removeaward <awardGroup> <award> <award> ... - 删除指定的 award group 中的一个或多个 award
/lb awardgroup check <awardGroupName> - 检查指定的 award group 是否存在
/lb awardgroup get <awardGroup> <awardGroup> ... - 获得指定 award group 内的所有奖品
/lb award list - 显示当前所有 award
/lb award new <awardName> <itemId> <amount> | <awardName> <amount> - 新建一个 award 并设置奖励的物品 id 和数量 #后一种形式保存手上的物品及其 nbt 数据(非必要建议使用前者,数据量更小)
/lb award delete <award> <award> ... - 删除一个或多个指定的 award
/lb award rename <award> <newName> - 重命名指定的 award
/lb award set <award> <itemID> <amount> | <awardName> <amount> - 设置指定的 award 的奖励内容 #同上后一种形式保存手上的
/lb award showcontent <award> <award> ... - 显示一个或多个 award 的奖励内容
/lb award check <awardName> - 检查指定 award 是否存在
/lb award get <award> <award> ... - 获取指定 award 储存的物品
/lb file create - 创建 data file 文件
/lb file reload - 从 data file 重新载入数据
/lb file save - 保存 data file 文件
/lb file autosave <true|false> - 热开启/关闭自动更改保存

章节4:一个实例
目标需求:创建一个箱子,使用金块和青金石块作为本体,有 20% 的概率抽到铁甲 4 件套,有 35% 的概率抽到钻石剑 x2,有 45% 的概率什么都得不到,需要拥有铁胸甲作为钥匙,但开箱过程不消耗铁胸甲。
创建步骤:
/lb award new ironhelmet 306 1 #新建一个 award 并设置其内容为 一个铁头盔
/lb award new ironchestplate 307 1
/lb award new ironleggings 308 1
/lb award new ironboots 309 1
/lb awardgroup new ironsuit ironhelmet ironchestplate ironleggings ironboots #新建一个 award group 并将 4 件套加入其中
/lb award new diamondsword 276 2 #新建一个 award,内容为两个钻石剑
/lb awardgroup new sword diamondsword #新建一个 award group 并将钻石剑奖品加入其中
/lb awardgroup new nothing #新建一个名为 nothing 的 award group,它不包含任何奖品
/lb box new testbox ironsuit 20 sword 35 nothing 45 #新建一个 box,将上述 award group 加入其中,并分别设置它们的权为 20、35、45
/lb box setkey testbox 307 false #设置 testbox 的 key 为 铁胸甲,且开箱过程不消耗 铁胸甲
/lb link new 41 testbox #创建从 金块 到 testbox 的映射
/lb link new 22 testbox #创建从 青金石块 到 testbox 的映射
#完成

章节5:下载地址及更新日志
下载链接 > https://pan.baidu.com/s/1boGIg6The6rOBWkMx1Cl8g 提取码:re6z
更新日志

· 后记

        这波算是完成了一个想做的插件,下个应该就是 A1 人指定的 交易插件了。

· 题外话

        如果各位有兴致的话不如再支持下我的其它作品:
ArmorFix[护甲修复插件] > https://www.mcbbs.net/thread-1129471-1-1.html
ItemExchange[物品交换插件] > https://www.mcbbs.net/thread-1140586-1-1.html
EXPExchange[经验兑换] > https://www.mcbbs.net/thread-1144506-1-1.html
Octangle Weapons[Flan 枪械扩展包] > https://www.mcbbs.net/thread-1104500-1-1.html



2021.12 数据,可能有更多内容· 前言


  承接上文,做抽奖插件的想法其实在我还没帮 A1 摸完 护甲修复 (ArmorFix) 的时候就萌生了的,只不过当时新建了个文件夹就放那了。这两天我做完 护甲修复 重新上手 抽奖箱 (LuckyBox) 的时候发现不少代码都能从上个项目直接 copy 过来,包括整个文件系统和指令系统,因而这个插件的开发整体上是比较快的。和 护甲修复 一样 这是一个非常轻量级的插件,没有 GUI 也没有其它多余功能。指令和文件系统沿袭自 护甲修复,依旧支持简写、自动补全以及热更改保存。另外我不能保证这个插件能在 1710 以外的版本上跑,因为我只测过 1710;如果各位有在其它版本上跑该插件的需要建议先进行较为完整的测试。


· 正文


章节1:数据文件
- 因为支持更改热保存所以我不再建议各位通过直接编辑数据文件来更改内容。当然如果你希望这么做的话也是可以的,数据文件格式只需要一些基本的英文基础就能看懂,这里也不再赘述。


章节2:实现原理
#在讲解如何设置一个抽奖箱之前你需要先简单了解一下这个插件是怎么运作的。


1.1 抽奖箱与奖品的层级结构
  基础的奖品单元是 award,每个 award 包含一个物品 id 和一个物品数量 (相当于这个奖品的物品 id 和奖励的数量);奖品的高一级单元是 award group,也就是 奖励组,每个 award group 包含了一个或多个 award。抽奖箱的基础单元是 box,每个 box 包含了一个或者多个 award group 和其对应的权。当你打开一个箱子的时候你获得某个 award group 的概率为 该 award group 的权 / 该 box 内所有 award group 的总权。举个例子:有一个 box 里面有 3 个 award group,分别为 group1、group2、group3,它们的权为 3、5、8,那么打开一个这样的 box 获得 group1 的概率为 3 / (3 + 5 + 8) = 3/16,获得 group2 的概率为 5 / (3 + 5 + 8) = 5/16,获得 group3 的概率为 8 / (3 + 5 + 8) = 1/2。


1.2 物品与箱子的映射
  上面讲了箱子与奖品的结构以及开箱时的概率计算,现在我们还需要给箱子绑定一个物品 id 作为这个箱子的本体,因而我们需要添加从 箱子 到 物品 id 的映射,准确的讲是从 物品 id 到 箱子 的映射,比如 307 (铁胸甲的物品 id) → box1,这样我们拿着 铁胸甲 并输入 /open 的时候就会打开 box1 对应的箱子了。我们也可以让多个 物品 id 指向同一个 箱子,比如 307 → box1,55 → box1,这样我们拿着 307 或者 55 对应的物品输入 /open 时都会打开 box1。


章节3:指令集
/open &lt;password&gt; - 打开手中的箱子,password 为可选,依据对应箱子需不需要密码
/lb help - 显示所有可用指令列表
/lb debug &lt;true|false&gt; - 启用/关闭 debug 模式
/lb enable &lt;true|false&gt; - 热禁用插件 #热禁用不是卸载插件,而是暂时不允许非 op 玩家打开箱子;当你发现箱子设置有问题时可以先热禁用并热修复问题,之后重新开启
/lb getitemstate - 显示手上物品的 Material 和 id 信息
/lb link list - 显示当前所有 link
/lb link new &lt;itemID&gt; &lt;box&gt; - 新建 itemID 与指定 box 间的映射 #当对应 itemID 已经存在映射时该指令将会覆盖原有映射
/lb link delete &lt;itemID&gt; &lt;itemID&gt; ... - 删除指定的一个或多个 itemID 的映射
/lb link check id &lt;itemID&gt; - 检查指定的 itemID 是否存在映射
/lb link check box &lt;box&gt; - 检查指定的 box 是否存在映射
/lb link get &lt;itemID&gt; &lt;itemID&gt; ... - 若 itemID 存在 link 则获取对应物品
/lb box list - 显示当前所有 box
/lb box new &lt;boxName&gt; &lt;awardGroup1&gt; &lt;weight1&gt; &lt;awardGroup2&gt; &lt;weight2&gt; ... - 新建一个 box 并添加一个或多个 award group 及其对应权
/lb box delete &lt;box&gt; &lt;box&gt; ... - 删除一个或多个 box
/lb box rename &lt;box&gt; &lt;newName&gt; - 重命名指定的 box
/lb box showcondition &lt;box&gt; &lt;boxName&gt; ... - 显示一个或多个 box 的开启条件
/lb box setpassword &lt;box&gt; &lt;password&gt; - 为指定 box 设置 password,如果不填 password 就移除对应 box 的 password 需求
/lb box setkey &lt;box&gt; &lt;keyItemID&gt; &lt;true|false&gt; - 为指定 box 设置 key 并设置开启该 box 是否会消耗指定的 key,key 的物品 id 填 -1 取消该 box 的 key 需求
/lb box listcontent &lt;box&gt; &lt;box&gt; ... - 显示一个或多个 box 的内容
/lb box addawardgroup &lt;box&gt; &lt;awardGroup1&gt; &lt;weight1&gt; &lt;awardGroup2&gt; &lt;weight2&gt; ... - 为指定的 box 添加一个或多个 award group 及其对应权
/lb box removeawardgroup &lt;box&gt; &lt;awardGroup&gt; &lt;awardGroup&gt; ... - 删除指定 box 中的一个或多个 award group
/lb box setweight &lt;boxName&gt; &lt;awardGroup&gt; &lt;newWeigth&gt; - 为指定的 box 中的指定 award group 重新设置权
/lb box check &lt;boxName&gt; - 检查指定的 box 是否存在
/lb box get &lt;box&gt; &lt;box&gt; ... - 获取指定 box 所 link 的物品,若指定 box 有多个 link 物品则全部获得
/lb box getcontent &lt;box&gt; &lt;box&gt; ... - 获取指定 box 内所有的奖品
/lb awardgroup list - 显示当前所有 award group
/lb awardgroup new &lt;awardGroupName&gt; &lt;award&gt; &lt;award&gt; ... - 新建一个 award group 并向其添加一个或多个 award
/lb awardgroup delete &lt;awardGroup&gt; &lt;awardGroup&gt; ... - 删除一个或多个指定的 award group
/lb awardgroup rename &lt;awardGroup&gt; &lt;newName&gt; - 重命名指定的 award group
/lb awardgroup listcontent &lt;awardGroup&gt; &lt;awardGroup&gt; ... - 显示一个或多个 award group 的内容
/lb awardgroup addaward &lt;awardGroup&gt; &lt;award&gt; &lt;award&gt; ... - 为指定的 award group 添加一个或多个 award
/lb awardgroup removeaward &lt;awardGroup&gt; &lt;award&gt; &lt;award&gt; ... - 删除指定的 award group 中的一个或多个 award
/lb awardgroup check &lt;awardGroupName&gt; - 检查指定的 award group 是否存在
/lb awardgroup get &lt;awardGroup&gt; &lt;awardGroup&gt; ... - 获得指定 award group 内的所有奖品
/lb award list - 显示当前所有 award
/lb award new &lt;awardName&gt; &lt;itemId&gt; &lt;amount&gt; | &lt;awardName&gt; &lt;amount&gt; - 新建一个 award 并设置奖励的物品 id 和数量 #后一种形式保存手上的物品及其 nbt 数据(非必要建议使用前者,数据量更小)
/lb award delete &lt;award&gt; &lt;award&gt; ... - 删除一个或多个指定的 award
/lb award rename &lt;award&gt; &lt;newName&gt; - 重命名指定的 award
/lb award set &lt;award&gt; &lt;itemID&gt; &lt;amount&gt; | &lt;awardName&gt; &lt;amount&gt; - 设置指定的 award 的奖励内容 #同上后一种形式保存手上的
/lb award showcontent &lt;award&gt; &lt;award&gt; ... - 显示一个或多个 award 的奖励内容
/lb award check &lt;awardName&gt; - 检查指定 award 是否存在
/lb award get &lt;award&gt; &lt;award&gt; ... - 获取指定 award 储存的物品
/lb file create - 创建 data file 文件
/lb file reload - 从 data file 重新载入数据
/lb file save - 保存 data file 文件
/lb file autosave &lt;true|false&gt; - 热开启/关闭自动更改保存


章节4:一个实例
目标需求:创建一个箱子,使用金块和青金石块作为本体,有 20% 的概率抽到铁甲 4 件套,有 35% 的概率抽到钻石剑 x2,有 45% 的概率什么都得不到,需要拥有铁胸甲作为钥匙,但开箱过程不消耗铁胸甲。
创建步骤:
/lb award new ironhelmet 306 1 #新建一个 award 并设置其内容为 一个铁头盔
/lb award new ironchestplate 307 1
/lb award new ironleggings 308 1
/lb award new ironboots 309 1
/lb awardgroup new ironsuit ironhelmet ironchestplate ironleggings ironboots #新建一个 award group 并将 4 件套加入其中
/lb award new diamondsword 276 2 #新建一个 award,内容为两个钻石剑
/lb awardgroup new sword diamondsword #新建一个 award group 并将钻石剑奖品加入其中
/lb awardgroup new nothing #新建一个名为 nothing 的 award group,它不包含任何奖品
/lb box new testbox ironsuit 20 sword 35 nothing 45 #新建一个 box,将上述 award group 加入其中,并分别设置它们的权为 20、35、45
/lb box setkey testbox 307 false #设置 testbox 的 key 为 铁胸甲,且开箱过程不消耗 铁胸甲
/lb link new 41 testbox #创建从 金块 到 testbox 的映射
/lb link new 22 testbox #创建从 青金石块 到 testbox 的映射
#完成


章节5:下载地址及更新日志
下载链接 &gt; https://pan.baidu.com/s/1boGIg6The6rOBWkMx1Cl8g 提取码:re6z
更新日志&gt; v2020-1-7
- 查看 box 内容时现在可以按照概率的升序和降序进行排列然后显示
&gt; v2020-12-19
- 添加 get 指令来直接获取某个对象的实体
- box listcontent 指令显示物品被抽中的百分概率,约至小数点后两位
- 增补命令参数自动补全功能
- 修复若干 bug
&gt; v2020-12-2
- 修复如果 data folder 文件夹不存的情况下 data file 创建失败的问题
&gt; v2020-11-27
- 改用 Material 储存 id 类奖励- 添加对 nbt 物品的支持
- 修复若干小 bug
· 后记


  这波算是完成了一个想做的插件,下个应该就是 A1 人指定的 交易插件了。


· 题外话


  如果各位有兴致的话不如再支持下我的其它作品:
ArmorFix[护甲修复插件] &gt; https://www.mcbbs.net/thread-1129471-1-1.html
ItemExchange[物品交换插件] &gt; https://www.mcbbs.net/thread-1140586-1-1.html
EXPExchange[经验兑换] &gt; https://www.mcbbs.net/thread-1144506-1-1.html
Octangle Weapons[Flan 枪械扩展包] &gt; https://www.mcbbs.net/thread-1104500-1-1.html



羽奕
插件下载链接呢,还有图片

大大的咸鱼
hmga 发表于 2020-10-27 13:14
插件下载链接呢,还有图片

马上码完😁

烧鸡腿小面包
指令有点多啊

结城希亚
艹,这指令不是一般的多

大大的咸鱼
结城希亚 发表于 2020-10-29 22:20
艹,这指令不是一般的多

头一次做插件 整指令的时候感觉就像在实现一个基础类,把所有可能的功能都实现了就会有一种满足感 [奇怪的快感增加了]

大大的咸鱼

指令的确很多 但是常用的只有几个 其它的都是辅助功能

结城希亚
大大的咸鱼 发表于 2020-10-30 08:31
头一次做插件 整指令的时候感觉就像在实现一个基础类,把所有可能的功能都实现了就会有一种满足感 [奇怪 ...

我也有做抽奖插件,但我觉得开发的时候应该以容易使用为基础
你这太硬核了,正常人直接劝退。。
不过有这心还是不错的

蜥蜴先生
插件不错,希望更加改进

asd76848234
谢谢咸鱼大大,太感谢了qwq!

鸽子安
来个图片介绍 然后弄高版本呗

小夏枫
建议做个自选箱子,GUI打开,然后玩家打开箱子,选择需要的物品,然后消耗掉手中的箱子
希望可以试试看

3061534651
有什么需要注意的点吗

大大的咸鱼
3061534651 发表于 2020-12-2 15:09
有什么需要注意的点吗

应该没什么特别要注意的,不过记得下最新版 v2020-12-2,之前的版本在没有数据文件夹的时候会有创建数据文件失败的问题

3061534651
大大的咸鱼 发表于 2020-12-2 23:56
应该没什么特别要注意的,不过记得下最新版 v2020-12-2,之前的版本在没有数据文件夹的时候会有创建数据 ...

好的,谢谢提醒

3061534651
感觉讲的不是很细,有图吗

大大的咸鱼
3061534651 发表于 2020-12-3 23:53
感觉讲的不是很细,有图吗

图的确没,因为这个插件没得 GUI,不过我觉得我讲的已经挺细了

3061534651
大大的咸鱼 发表于 2020-12-4 01:48
图的确没,因为这个插件没得 GUI,不过我觉得我讲的已经挺细了

好吧,我在看看,研究研究

hamster_cat
感谢版主提供插件就是有点太复杂了

岁月静好、
没有动画么

大大的咸鱼

没有做 整这个插件主要就是和基友玩生存用的 花里胡哨的都没整

1347473112
很好正好需要一个抽奖插件

1347473112
但是这个版本太低了我用不了太可惜了

a48742913
6666666666666666

a48742913

6666666666666666666


1038308160
插件不好 好贴 mcbbs有你更精彩

丿丶乐山
记得之前好像看过这个帖子现在又回来找了哈哈哈,不过帖子有点太久了? 然后还有指令啥的多了点,不过功能挺好的,感谢大佬的制作分享啦~ BBS 有你更精彩~

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