会员登录 立即注册

搜索

墨山游侠之ATM机

[复制链接]
崎山小鹿 发表于 2025-2-24 14:13:10 | 显示全部楼层 |阅读模式
崎山小鹿
2025-2-24 14:13:10 17596 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   公司:深圳市金双石科技有限公司
回复

使用道具 举报

  • 您可能感兴趣
  • 墨山游侠-墨山降魔药水
    墨山游侠-墨山降魔药水
    有没有一种药水,能将敌方单位变成我方单位呢?墨山降魔药水就是能将劫掠兽、掠夺者、
    06-17
  • 墨山游侠的NPC
    墨山游侠的NPC
    NPC的好处是比较亲切,信息容量大,可以安排任务也可以做交易,NPC相对于建筑来说它占
    03-27
  • 墨山游侠-墨山写字笔
    墨山游侠-墨山写字笔
    墨山写字笔 很多时候玩家想在某地做一个标记,或者留下一段感悟写字笔就非常有用了。
    06-30
  • 墨山游侠之ATM机
    墨山游侠之ATM机
    ### 在 Minecraft 基岩版 里,你可以使用 命令方块 来制作一个 ATM 机,实现绿宝石
    02-24
  • 墨山游侠-墨山炼魔塔
    墨山游侠-墨山炼魔塔
    有了这个在保证村庄安全的同时给村庄带来源源不断的收入!塔的影响范围半径150格,附
    07-23
您需要登录后才可以回帖 登录 | 立即注册 |

本版积分规则 返回列表

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

查看:17596 | 回复:6

  • 墨山游侠-墨山炼魔塔

    有了这个在保证村庄安全的同时给村庄带来源源不断的收入!塔的影响范围半径150格,附

    阅读:220|2025-07-23
  • 墨山游侠部门规划

    NPC设计: 使用预设零件架构编程实现了对话和任务功能,可通过配置零件快速搭建NPC

    阅读:335|2025-07-18
  • 墨山游侠墨子模型

    网上有很多很优秀的墨子照片: 我们能否使用AI生存模型呢?

    阅读:315|2025-07-17
  • 墨子图书馆III

    这是第三座墨子图书馆,由墨山游侠团队超级英雄小安创作。如果你也喜欢墨子,关注我们

    阅读:383|2025-07-13
  • 墨山游侠-圣安大教堂

    圣安大教堂是由墨山游侠团队超级英雄小安所做,圣安大教堂以其极高的艺术价值让世人惊

    阅读:371|2025-07-13
  • 墨山游侠-聚贤山庄

    中国古代建筑群,历时三个月倾情打造 视频: 下载地址:

    阅读:348|2025-07-12
  • MiniSNS是什么

    MiniSNS是一款支持多端(App、小程序、H5、PC)的社区程序,基于 Laravel框架 开发,

    阅读:313|2025-07-11
  • SDGun社区是用什么语言开发的,是什么架构

    SDGun社区是一个聚集了射击竞技、射击娱乐和军事潮流爱好者的平台。它提供了新品爆料

    阅读:387|2025-07-07
  • 墨山游侠-墨山写字笔

    墨山写字笔 很多时候玩家想在某地做一个标记,或者留下一段感悟写字笔就非常有用了。

    阅读:638|2025-06-30
  • 墨山游侠-自定义画

    方法1: 找到 textures/painting 文件夹中的 kz.png(早期)或多个 painting 图(

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

手机APP

官方微博

官方微信

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