奖励宝箱

奖励宝箱

为游戏添加类似战利品盒的功能。此模组旨在供其他模组使用,但也可独立使用。

实用

Hytale 模组 - 随机奖励箱

这是一个 Hytale 模组。

该模组增加了创建随机"奖励箱"的功能。

独立使用时仅提供命令功能,但作为 API 使用时,它可以触发自定义事件来用"奖励箱"奖励玩家。

使用方法:

以下所有命令均以“/RewardBox”开头 {例如:“/RewardBox create example”}

命令 描述 权限
list_boxes list 列出所有箱子及其中包含的物品数量,可用“–rewardbox ExampleBox”列出指定奖励箱中的所有物品
roll_box <RewardBox_Name> roll, pull 如果玩家拥有对应奖励箱的“钥匙”,则打开箱子并将奖励放入玩家背包。如果背包空间不足,物品会掉落在地。
create 创建一个新的奖励箱 rewardboxes.admin
remove_box rem_box, rb 删除整个奖励箱 rewardboxes.admin
add_item <RewardBox_name> add, a 向奖励箱添加一个物品。同一物品可多次添加。ItemID 可以是任意物品,例如:{"Tool_Pickaxe_Crude"}。概率表示为:{该物品概率 / 奖励箱内所有物品概率之和} rewardboxes.admin
remove_item <RewardBox_name> rem, r 移除所有匹配 ItemID 的物品。例如:如果箱子中有两个“Tool_Pickaxe_Crude”,它会同时删除这两个条目 rewardboxes.admin
grant_item_roll <player_name> <RewardBox_Name> optional_arg: add_roll, ar 为目标玩家添加“钥匙”,允许他们打开指定箱子次。当未指定时,默认为 1 rewardboxes.admin

给服务器管理员与模组制作者

JSON 配置

模组首次启动时会创建 {服务器根目录}/config/KatsiLib/RewardBoxes.json 文件,该文件存储服务器上所有奖励箱的信息。命令会动态保存到此文件,因此你也可以在游戏内直接设置奖励箱。

首次启动模组时,如果文件不存在,会生成一个包含示例的默认配置。

创建奖励箱配置的默认及示例:

{  
    "is_enabled": true,  
    "reward_boxes": [  
        {  
            "box_creator": "Katsi",  
            "box_name": "DefaultRewardBox",  
            "items": [  
                {  
                    "item_id": "Tool_Pickaxe_Crude",  
                    "pull_chance": 0.5,  
                    "quantity": 1  
                },  
                {  
                    "item_id": "Tool_Hatchet_Crude",  
                    "pull_chance": 0.5,  
                    "quantity": 1  
                }  
            ],  
            "total_chance": 1.0  
        },  
        {  
            "box_creator": "Katsi",  
            "box_name": "ExampleRewardBox",  
            "items": [  
                {  
                    "item_id": "Weapon_Daggers_Crude",  
                    "pull_chance": 35.0,  
                    "quantity": 1  
                },  
                {  
                    "item_id": "Weapon_Daggers_Bone",  
                    "pull_chance": 30.0,  
                    "quantity": 1  
                },  
                {  
                    "item_id": "Weapon_Daggers_Bronze",  
                    "pull_chance": 20.0,  
                    "quantity": 1  
                },  
                {  
                    "item_id": "Weapon_Daggers_Copper",  
                    "pull_chance": 10.0,  
                    "quantity": 1  
                },  
                {  
                    "item_id": "Weapon_Daggers_Iron",  
                    "pull_chance": 5.0,  
                    "quantity": 1  
                }  
            ],  
            "total_chance": 100.0  
        }  
    ]  
}  

注意:“total_chance”只需是一个数字,它在启动时计算,因此其具体数值无关紧要。

模组 API

一个使用本模组 API 的示例模组是我的“每日登录奖励”。源代码可在 GitHub 上获取以供进一步参考。

要与本模组 API 交互,请使用 Hytale 内置的事件系统。本模组绑定了两个事件:GrantRollEvent() 和 ConsumeRollEvent(),这两个事件具有相同的签名:"new GrantRollEvent(PlayerRef targetted_player, String RewardBoxName, int Number_Keys_To_Give);"

GrantRollEvent 会向目标玩家授予“钥匙”,使其能够打开指定的奖励箱。 ConsumeRollEvent 会导致目标玩家尝试打开奖励箱 X 次。注意:玩家会消耗钥匙来打开箱子,当钥匙用完时停止。{例如:我有 4 把钥匙 -> Event(Me, ExampleBox, 6) -> 会进行 4 次抽奖,我将剩余 0 把钥匙。}

分发事件的典型代码如下:

IEventDispatcher<GrantRollEvent, GrantRollEvent> dispatcher = HytaleServer.get().getEventBus().dispatchFor(GrantRollEvent.class); if (dispatcher.hasListener()) { GrantRollEvent event = new GrantRollEvent(playerRef, reward_box, num_keys_to_give); dispatcher.dispatch(event); }