会员登录 立即注册

搜索

    墨山游侠之ATM机

    [复制链接]
    崎山小鹿 发表于 2025-2-24 14:13:10 | 显示全部楼层 |阅读模式
    崎山小鹿
    2025-2-24 14:13:10 18621 6 看全部
    微信截图_20250224212711.png ###

    在 Minecraft 基岩版 里,你可以使用 命令方块 来制作一个 ATM 机,实现绿宝石存取功能。以下是完整的实现步骤:

    实现思路
    存款:玩家将绿宝石存入 ATM,系统会记录数量,并从玩家物品栏移除绿宝石。
    取款:玩家可以取出之前存入的绿宝石,系统会返还等量的绿宝石。
    显示存款余额:ATM 会显示玩家的绿宝石存款余额。
    所需物品
    命令方块(/give @p command_block)
    按钮或拉杆(用于触发存款/取款)
    命令执行者(@p 或 @a)
    计分板(用于存储玩家余额)
    第一步:创建计分板
    在聊天框输入以下命令,创建一个计分板来存储绿宝石余额:


    /scoreboard objectives add money dummy 绿宝石存款


    ### **🌟 解决方案逻辑**
    1. **先用 `/clear` 仅检测是否有 64 颗绿宝石**(不移除)。
    2. **如果检测通过**,才真正移除绿宝石并增加存款。
    3. **如果检测失败**,则不会移除绿宝石,也不会增加存款,直接显示存款失败消息。

    ---

    ## **🛠️ 具体命令**
    ### **🔹 1️⃣ 先检测玩家是否有 ≥64 颗绿宝石(脉冲命令方块,需要红石)**
    ```mcfunction
    /execute if entity @p[hasitem={item=minecraft:emerald,quantity=64}] run tag @p add can_deposit
    ```
    - **作用**:
      - 检查玩家**是否至少有 64 颗绿宝石**。
      - 如果玩家**有** 64 颗绿宝石,则给玩家**添加 `can_deposit` 标签**。
      - **如果没有绿宝石,不会添加标签**。

    ---

    ### **🔹 2️⃣ 真的移除 64 颗绿宝石(链命令方块,保持开启)**
    ```mcfunction
    /execute if entity @p[tag=can_deposit] run clear @p minecraft:emerald 0 64
    ```
    - **作用**:
      - **只有当 `can_deposit` 标签存在**时,才会执行 `/clear` 移除绿宝石。

    ---

    ### **🔹 3️⃣ 增加存款余额(链命令方块,保持开启)**
    ```mcfunction
    /execute if entity @p[tag=can_deposit] run scoreboard players add @p money 64
    ```
    - **作用**:
      - **仅在绿宝石被成功清除后** 才会增加 `money` 余额。

    ---

    ### **🔹 4️⃣ 存款成功提示(链命令方块,保持开启)**
    ```mcfunction
    /execute if entity @p[tag=can_deposit] run tellraw @p {"rawtext":[{"text":"✅ 存款成功!你的余额已增加 64 颗绿宝石!"}]}
    ```

    ---

    ### **🔹 5️⃣ 存款失败提示(链命令方块,保持开启)**
    ```mcfunction
    /execute unless entity @p[tag=can_deposit] run tellraw @p {"rawtext":[{"text":"❌ 存款失败!你至少需要 64 颗绿宝石!"}]}
    ```
    - **作用**:
      - **只有当玩家没有 `can_deposit` 标签**时,才会触发失败提示。

    ---

    ### **🔹 6️⃣ 清除 `can_deposit` 标签(链命令方块,保持开启)**
    ```mcfunction
    /tag @p remove can_deposit
    ```
    - **作用**:
      - 确保下次存款时,不会误触 `can_deposit` 标签,防止错误。

    ---

    ## **📌 最终效果**
    ✅ **玩家有 64 颗绿宝石** → **存款成功,扣除 64 颗绿宝石,余额增加 64**  
    ✅ **玩家少于 64 颗绿宝石** → **不会移除绿宝石,不会增加余额,仅显示失败提示**  
    ✅ **不会同时出现成功和失败消息** 🚀  
    ✅ **`/clear` 不会导致余额错误增加** 🎉  
    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

     楼主| 崎山小鹿 发表于 2025-2-24 14:13:25 | 显示全部楼层
    崎山小鹿
    2025-2-24 14:13:25 看全部
    ### **🛠️ 取款系统命令方块**
    #### **🔹 1️⃣ 先检测余额(脉冲命令方块,需红石)**
    ```mcfunction
    /execute if score @p money matches 64.. run tag @p[r=2] add can_withdraw
    ```
    - **作用**:  
      - 如果 `money ≥ 64`,给玩家添加 `can_withdraw` 标签。
      - 这样,我们可以在后续命令中 **仅对有该标签的玩家执行取款操作**。

    ---

    #### **🔹 2️⃣ 执行扣款(链命令方块,保持开启)**
    ```mcfunction
    /execute if entity @p[tag=can_withdraw] run scoreboard players remove @p[tag=can_withdraw] money 64
    ```
    - **作用**:
      - **仅** 对 `can_withdraw` 组的玩家扣 64 余额。
      - **如果余额 < 64**,这个命令不会执行。

    ---

    #### **🔹 3️⃣ 给予绿宝石(链命令方块,保持开启)**
    ```mcfunction
    /execute if entity @p[tag=can_withdraw] run give @p[tag=can_withdraw] minecraft:emerald 64
    ```
    - **作用**:
      - **仅** 对 `can_withdraw` 组的玩家给予 64 颗绿宝石。

    ---

    #### **🔹 4️⃣ 成功取款提示(链命令方块,保持开启)**
    ```mcfunction
    /execute if entity @p[tag=can_withdraw] run tellraw @p[tag=can_withdraw] {"rawtext":[{"text":"✅ 取款成功!当前余额:"},{"score":{"name":"@p","objective":"money"}}]}
    ```

    ---

    #### **🔹 5️⃣ 取款失败提示(链命令方块,保持开启)**
    ```mcfunction
    /execute unless entity @p[tag=can_withdraw] run tellraw @p {"rawtext":[{"text":"❌ 取款失败!你的存款不足 64 颗绿宝石!"}]}
    ```
    - **作用**:
      - 只有**没有** `can_withdraw` 标签的玩家(余额 < 64)才会看到失败提示。
      - 这样就不会让 **成功和失败提示同时出现**。

    ---

    #### **🔹 6️⃣ 清除 `can_withdraw` 标签(链命令方块,保持开启)**
    ```mcfunction
    /tag @p remove can_withdraw
    ```
    - **作用**:
      - 确保下次运行时不会残留 `can_withdraw` 标签,防止错误。

    ---

    ### **📌 最终效果**
    ✅ **余额 ≥ 64** → **正常取款、扣 64 余额、给 64 颗绿宝石、显示成功提示**  
    ✅ **余额 < 64** → **不会扣钱、不发绿宝石、仅显示失败提示**  
    ✅ **不会同时出现成功和失败消息** 🎯  

    ---

    ### **⚡ 为什么这样能解决问题?**
    - **通过 `tag` 先判断玩家是否能取款**,再执行后续操作,避免取款成功后仍然触发失败提示。  
    - **`unless entity @p[tag=can_withdraw]` 确保仅当余额不足时才显示失败提示**。  
    - **最后清除 `can_withdraw` 标签,防止影响下一次操作**。  

    这样,你的 ATM **绝对不会再同时出现成功和失败消息**!🎉
    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

     楼主| 崎山小鹿 发表于 2025-2-24 15:08:40 | 显示全部楼层
    崎山小鹿
    2025-2-24 15:08:40 看全部
    查询余额
    /execute as @p run tellraw @p {"rawtext":[{"text":"💰 你的余额是:"},{"score":{"name":"@p","objective":"money"}}]}

    使用 /title 显示余额,岩版 不支持 JSON 变量,所以要 用 /execute 搭配 scoreboard 来拼接文本,但是依然无法输出数字。

    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

     楼主| 崎山小鹿 发表于 2025-2-24 16:04:56 | 显示全部楼层
    崎山小鹿
    2025-2-24 16:04:56 看全部
    /execute if entity @p[hasitem={item=minecraft:emerald,quantity=64}] run tag @p add can_deposit
    这段代码被网易屏蔽,只能换个方法,用两个命令方块

    /clear @p minecraft:emerald 0 64 0
    这个代码也不能执行,
    提示语法错误,意外的0

    /clear @p minecraft:emerald 0 64
    这条命令如果玩家的绿宝石不足64个,依然会获得执行成功提示
    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

     楼主| 崎山小鹿 发表于 2025-2-24 18:33:16 | 显示全部楼层
    崎山小鹿
    2025-2-24 18:33:16 看全部
    利用循环扣除,存款增加的方法实现了存绿宝石

    移除一个绿宝石,循环,红石激活
    clear @p[r=1] minecraft:emerald 0 1

    如果成功则增加标签
    tag @p[r=1] add can_deposit

    账户增加
    execute if entity @p[tag=can_deposit,r=1] run scoreboard players add @p[tag=can_deposit,r=1] money 1

    提示
    execute if entity @p[tag=can_deposit] run tellraw @p {"rawtext":[{"text":"✅ 存款进行中... 您的余额:"},{"score":{"name":"@p[r=1]","objective":"money"}}]}

    存款完成:
    execute unless entity @p[tag=can_deposit] run tellraw @p {"rawtext":[{"text":"✅ 存款完成!您的余额:"},{"score":{"name":"@p[r=1]","objective":"money"}}]}

    重置
    tag @p[r=7] remove can_deposit

    距离要调整一下
    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

     楼主| 崎山小鹿 发表于 2025-7-25 08:43:54 | 显示全部楼层
    崎山小鹿
    2025-7-25 08:43:54 看全部
    /scoreboard objectives setdisplay sidebar xxx
    把计分板目标 xxx 的分数显示在屏幕右侧的 Sidebar 区域,所有玩家都能看到该排行榜。

    示例
    /scoreboard objectives add coins dummy 财富
    /scoreboard objectives setdisplay sidebar coins
    这两行代码的效果:
    创建了一个名为 coins 的“财富”计分板目标。
    并把它显示在右侧排行榜。

    关闭显示
    如果你想取消 Sidebar 显示,可以用:
    /scoreboard objectives setdisplay sidebar
    不带目标名,就会清除当前显示的目标
    创建了一个名为 coins 的“财富”计分板目标。
    并把它显示在右侧排行榜。
    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

     楼主| 崎山小鹿 发表于 2025-7-25 11:02:11 | 显示全部楼层
    崎山小鹿
    2025-7-25 11:02:11 看全部
            def getMoneyC(self):
                    def get_money_value(data):
                            for player in data:
                                    for score in player.get('scoreList', []):
                                            if score.get('name') == 'money':
                                                    return score.get('value')
                            return None  # 如果没找到,返回 None               

                    import mod.client.extraClientApi as clientApi
                    comp = clientApi.GetEngineCompFactory().CreateGame(clientApi.GetLevelId())
                    data = comp.GetAllPlayerScoreboardObjects()
                    # 使用:
                    money_value = get_money_value(data)
                    #print("money:", money_value)  # 输出: money: 63
                    return money_value       

            def getMoneyS(self):
                    def get_money_value(data):
                            for player in data:
                                    for score in player.get('scoreList', []):
                                            if score.get('name') == 'money':
                                                    return score.get('value')
                            return None  # 如果没找到,返回 None               

                    import mod.server.extraServerApi as serverApi
                    comp = serverApi.GetEngineCompFactory().CreateGame(serverApi.GetLevelId())
                    data = comp.GetAllPlayerScoreboardObjects()
                    # 使用:
                    money_value = get_money_value(data)
                    #print("money:", money_value)  # 输出: money: 63
                    return money_value       

            def checkScoreboardChange(self):
                    for playerId in self.onlinePlayers:
                            comp = self.CreateScoreboardComponent(playerId)
                            newValue = comp.GetScore("money")
                            oldValue = self.playerDict.get(playerId, {}).get("ranklistValue", 0)
                            if newValue != oldValue:
                                    print(f"玩家 {playerId} 的money变化了: {oldValue} -> {newValue}")
                                    self.playerDict[playerId]['ranklistValue'] = newValue
                                    self.dataChanged = True
    天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
    回复

    使用道具 举报

    • 您可能感兴趣
    您需要登录后才可以回帖 登录 | 立即注册 |

    本版积分规则 返回列表

    管理员给TA私信
    以墨运商,以商助墨。

    查看:18621 | 回复:6

      金双石科技,软件开发20年,技术行业领先,您的满意,就是我们的目标,认真负责,开拓进取,让成品物超所值
      关于我们
      公司简介
      发展历程
      联系我们
      本站站务
      友情链接
      新手指南
      内容审核
      商家合作
      广告合作
      商家入驻
      新闻合作

      手机APP

      官方微博

      官方微信

      联系电话:15876572365 地址:深圳市宝安区西乡街道宝民二路宝民花园 ( 粤ICP备2021100124号-1 ) 邮箱:qishanxiaolu@qq.com
      QQ|Powered by Discuz! X3.5 © 2001-2025 Discuz! Team.
      快速回复 返回顶部 返回列表