本帖最后由 Mini_Ye 于 2022-3-6 14:00 编辑
>> 全球商店V2 现已发布!
>> 更多的功能 √ >> 更好的界面 √ >> 便捷的操作 √ >> 更多的bug √(不是) >> ……
>> 三大功能
>> 全球商品 - 10 个子功能 >> 出售商店 - 无限购买,实时编辑 >> 回收商店 - 回收物品,兑换金钱
>> 附加功能
>> 金钱 <=> 物品 >> 为什么选择全球商店?
>> 多种功能将满足原版生存服务器玩家间的一切交易需求 >> V2 的更新加入了出售商店和回收商店,让你足不出户买遍全世界 >> 支持自定义,简单的操作即可让全球商店使用你自己的金钱记分板
>> 它安全吗?
>> 支持nbt:所有经过全球商店的交易物品在交付和取得后都保持一致 >> 操作保护:关键操作会检测周围玩家,当且仅当周围有 1 名玩家时,操作通过 >> 防止刷取:商店界面的物品都携带特殊标记,玩家不能把它们正常地转移到任何容器 商店(矿车)无敌,非创造玩家不能杀死,不会被用于刷矿车和箱子 >> 防止漏斗:当周围有漏斗和漏斗矿车时,商店不能存在 >> 占用优化:多种机制抵抗玩家不正常操作,不对服务器运行造成威胁
>> 食用方法
>> 各个界面以及功能:
![]()
![]()
![]()
![]()
![]()
![]()
>> 在使用全球商店前,我还需要知道些什么?
>> 全球商店不喜欢可以偷东西的漏斗,它的检测范围是 ~-1 ~-1 ~-1 到 ~1 ~ ~1,即一个 3x3x2H 的空间。
>> 相比起以前的版本,全球商店V2 没有再分为“使用金钱记分板作为货币”和“使用原版物品作为货币”的版本,我为了把它做到尽可能地方便,将两种货币方式合二为一。交易上采用金钱记分板,而采用 金钱 <=> 物品 的方式,方便你进行兑换。
请注意!金钱记分板默认是 money,兑换的物品和比率默认是 1金钱 <=> 1绿宝石。
金钱能否和物品兑换是可开关的,但默认是关闭的,因为我不认为 1金钱 <=> 1绿宝石 是合理的,因此我将它默认关闭,直到你修改了兑换物品和比率,并手动开启它。
>> 目前这个商店对物品的处理都是完整的一格。例如一位玩家上架了 64 个红石(整组),标价 64 金钱,
那么你只能向Ta支付 64 金钱来购买这 64 个红石,而不能支付 1 金钱来购买 1 个红石。
>> 所有经过这个商店的物品回到玩家手中时,都将保持原有的nbt;不仅如此,商店也将严格地判断nbt。
例如,管理员规定兑换的物品和比率默认是 100金钱 <=> 1张纸,但纸的名称底下还有文字(即 Lore 列表里的字符串),那么你用金钱兑换纸时不可能得到普通的纸,商店也不接受普通的纸兑换金钱。
>> 在你向回收商店提交物品时,或者使用物品兑换金钱时,商店会获取你的背包里该种物品的数量来判断是否足够进行一次交易,但你的副手和 4 个装备栏位的物品将不会被商店更改。换句话说,回收钻石裤时你不必脱下裤子(不是 >> 上架商品的操作对每个玩家都有 6 秒的冷却时间,这是为了防止玩家恶意填充商店。 >> 当一个商品上架后,系统将记录它在售货架上的时间。默认情况下,商品经过 72 个游戏日( 1 游戏日 ≈ 20 分钟) 会被退回到原玩家处,在“退回的物品”中可以取回这些物品。管理员可以更改这个保持时长。 出售商店和回收商店中的商品的时长是无限的,只有管理员能移除它们。
>> 管理员自定义选项: - /scoreboard players set #GLBStimer GLBSinfo <物品上架时间上限>
- 修改物品上架时间上限(单位:游戏日 = 20分钟 默认是 72 游戏日 ≈ 1 现实日)
- /function glbshop:instant_timer
- /* 立刻度过 1 个游戏日的商品上架时间统计周期
- * 系统以 1 游戏日为 1 个周期处理商品的上架时间上限
- * 执行该函数将立刻进行一次处理,不会影响游戏内的实际时间
- */
- /function glbshop:delete
- /* 抹去本数据包的全部存储信息
- * 回到首次载入这个数据包时它的状态,非必要慎用
- */
- /function glbshop:function/order
- /* 快速设置 - 禁止时间流逝、禁止天气变化、
- * 禁止命令方块发送消息、死亡不掉落、
- * 时间调整为正午,天气调整为晴天(测试专用)
- */
复制代码
>> 自定义禁用物品:
在原版中,生存玩家能获得的对商店构成威胁的仅有漏斗,它能从中吸走物品而无法被检测。 但我考虑到你可能会和其他模组一起使用,也许会有类似漏斗一样的方块需要防范。 鉴于这点,我在写防漏斗机制时并不是单一地使用漏斗,而是引用了一个方块标签, 它位于:<数据包文件夹>/GLBShopV2/data/glbshop/tags/blocks/ban_block.json 文件中 将你的希望和漏斗作同样处理的方块 ID 添加进这个方块标签,让全球商店更加安全! 正确的添加格式是在 values 数组中继续添加字符串,也可以添加具有下列形式的对象: {
"id": "<namespace>:<id>",
"required": false
}
>> 技术性信息与防止冲突:
>> 命名空间:glbshop
>> 记分板前缀:GLBS
>> 实体标签前缀:GLBS
>> 默认金钱记分板:money
>> 单次连锁的命令上限(原版默认是 65536 ,我把它扩大到 8 倍):524280
![]()
>> 下载之前先看看小业的话吧~
>> V2 版本的开发时长大概是 50 个小时,写了差不多 5 天,虽然是个适合多人的数据包,但始终只有我一个玩家在测试。
它一定是不完美的,但我相信它能经得起考验,因为它的功能有如今这般强大也令我自己感到意外。
>> 这个数据包是我第一个在 mcbbs 发布的作品,我得到了很多熟悉的人的关照、大家的关注鼓励,还有宝贵的建议。
如果你发现了 bug 或者有宝贵的建议,请务必告诉我,我在这里等着大家。
>> 下载地址:
>> V2.0 存在漏斗矿车能吸走商店物品的 bug,在 V2.1 中修复
>> 在 1.17.1 下开发,其在 1.18 中的表现需要验证
![]()
>> 杂谈(在写了在写了~)
>> 开发过程中的困难和解决:
物品被商店读入时,会在 Lore 列表中写入注释。有一种特殊的情况是,物品本来就没有注释。在把物品交付给玩家时,商店把注释去除后可能留下空列表,如果物品原来没有名字,那么还可能留下 tag:{ void } 这样的空复合标签。这导致了物品无法和同类型的物品堆叠。原本我以为这个问题是无解的,因为 Lore 列表是否为空可以通过: /execute if data storage ....tag.display.Lore[0] run function ... 来判断,也就是检查 Lore 列表是否存在首个子元素来判断,而复合标签不能直接用 if data 判空 后来我自己想到一个办法:写一个空标签,然后将现有标签和空标签执行 merge from 操作(set from 应该也可以) 然后用 execute store success score #... ... run ... 接收返回值,如果合并失败说明 tag 为空 这当然是个解决问题的办法,但是当我去查了一下 wiki 发现只要用 data get 获取复合标签就会返回下一级子标签的数量时 我想说我就是个呆瓜,其实是不是空就 data get 一下然后用记分板存一下返回值,分数为 0 就是空复合标签了 然后把空的 tag 去掉,物品就是原来的样子,不留痕迹,可以正常堆叠 我还发现如果用 data modify storage ... ... append from ... 向列表插入元素时,如果列表不存在,那么游戏会根据给出的路径先创建这个列表,然后再往里面插入元素。有一次也是无缘无故多了东西,检查来检查去发现是这个问题,气死我了www
>> 一些思考和心得:
在当初计划写下这个数据包的时候,其实并没有这么多功能,只是想简单地实现玩家间的交易,没有考虑有些人要用记分板作为金钱系统也没有考虑一些人更喜欢用原版物品作为货币,也没有类似查询的功能。 在开发过程中我想到了这些机制,就把它们添加了进去,这离不开我的朋友们的帮助,谢谢你们。
因为这个数据包没有玩法,就是物品之间的交易,数据包的绝大多数指令都是关于 storage、entity 的修改,例如在大多数的情况下需要从列表中找到某个元素。这就不得不谈一谈目前的 data 指令对列表的查询不能引用变量的缺点。 例如我想在列表 shop 中查找一个复合标签,这个复合标签里面的标签 uid 的值由记分板 A 指定。 那么我是这样找到这个复合标签的: ================ 入口↓ ①shop 复制到 copy ②删除 shop ③copy[0].uid 存储到记分板 B ④if A == B: #此时 copy[0] 就是要找的复合标签 执行另一个函数修改 copy[0],并把 if_found 标志置 1 ⑤if A != B: #没找到 执行另一个函数把 copy[0] 尾插到 shop ⑥if if_found == 1: copy[] 尾插到 shop ⑦if if_found != 1 && if copy[0]: 函数调用自身 出口↓ 移除 if_found ================ 如果能够类似地直接通过 shop[{uid:*{"type":"score","name":"?","objective":""}}] 找到符合条件的子元素, 那这个商店能减少 1/3 的体量和 1/2 的运算,mojang 你听见了吗?!!
还有一些原版指令不能做到的,或者说不能很方便地做到的: 1. 凭空为玩家打开某个交互界面 2. 修改玩家的血量 ...... 有很多看似不可能的机制、难以完成的机制,都在很多大佬的双手下完成了(大佬用的可能是单手) 明明数据包的功能还有很多空缺,但我们确实做到了, 在这种前提下,我们完成了许多。 但我有时候会思考,是否真的有必要在这一点上无限地突破, mojang 没有提供的功能,就用玩家们的聪明才智去弥补, 这种弥补是多代的、集很多玩家的智慧的。例如修改原版血量, 我见证了从需要间隔 6t,到只需要间隔 3t,到现在有 cber 做到了仅需 1t 就能完成修改。 以前我总会说,数据包拥有无限的可能,就像这个商店数据包, 在制作它之前,我也没有想到它的功能也会让我如此满意。 但真的是数据包拥有无限可能吗? 其实我更想说的是,是玩家的创造性拥有无限的可能, mc的乐趣来自于我们的热爱和创造。 ——小业
来自群组: VoidCreatureWorkShop |