Browse Source

TNT Run 游戏初始化与开始

LTCatt 6 years ago
parent
commit
ea876198dc

+ 3 - 1
data/ltw/functions/clock/tick1.mcfunction

@@ -1,4 +1,6 @@
 # 每 1 Tick 执行一次
 
 # 调用其他模块
-function mini:main/tick1
+function mini:main/tick1
+execute if score $state mem matches 3 run function ltw:state/3/tick1
+execute if score $state mem matches 5 run function ltw:state/5/tick1

+ 6 - 0
data/ltw/functions/clock/tick20.mcfunction

@@ -1,3 +1,9 @@
 # 每秒执行一次
 schedule function ltw:clock/tick20 20t replace
 
+# 调用其他模块
+execute if score $state mem matches 3 run function ltw:state/3/tick20
+execute if score $state mem matches 4 run function ltw:state/4/tick20
+
+# 全局倒计时
+scoreboard players remove $countdown mem 1

+ 0 - 1
data/ltw/functions/clock/tick4.mcfunction

@@ -1,3 +1,2 @@
 # 每 0.2s 执行一次
 schedule function ltw:clock/tick4 4t replace
-

+ 12 - 3
data/ltw/functions/init.mcfunction

@@ -1,12 +1,21 @@
 # 全局初始化
 
-# 全局变量初始化
+# 游戏数据
+time set noon
+weather clear
+gamerule doDaylightCycle false
+gamerule doFireTick false
+gamerule doMobSpawning false
+gamerule keepInventory true
+gamerule doWeatherCycle false
+
+# 全局变量
 scoreboard objectives remove mem
 scoreboard objectives add mem dummy ["全局变量"]
 
-# 时钟初始化
+# 时钟
 schedule function ltw:clock/tick4 4t replace
 schedule function ltw:clock/tick20 20t replace
 
-# 其他模块的初始化
+# 其他模块
 function mini:main/init

+ 9 - 1
data/ltw/functions/state/3/player_enter.mcfunction

@@ -1 +1,9 @@
-# 玩家进入状态 3
+# 对单个玩家的处理(如果玩家中途加入就会执行此函数)
+title @s clear
+gamemode spectator @s
+
+# 状态效果
+effect clear @s
+effect give @s saturation 1000000 0 true
+effect give @s instant_health 10 0 true
+effect give @s blindness 1000000 0 true

+ 5 - 1
data/ltw/functions/state/3/state_enter.mcfunction

@@ -1,5 +1,9 @@
 # 要求系统进入状态 3(主要阶段结束,初始化小游戏)
 scoreboard players set $state mem 3
+execute as @a run function ltw:state/3/player_enter
+
+# 初始化倒计时
+scoreboard players set $countdown mem 3
 
 # 决定进行哪个小游戏
 # 1 跑酷;2 TNT Run;3 热土豆
@@ -7,4 +11,4 @@ scoreboard players set $state mem 3
 scoreboard players set $mini_type mem 2
 
 # 初始化小游戏
-function mini:main/game_init
+function mini:main/game_init

+ 3 - 0
data/ltw/functions/state/3/tick1.mcfunction

@@ -0,0 +1,3 @@
+# 固定旁观
+execute as @a run spectate
+tp @a ~ 10000 ~ 0 0

+ 7 - 0
data/ltw/functions/state/3/tick20.mcfunction

@@ -0,0 +1,7 @@
+# 显示倒计时
+title @a times 3 14 2
+title @a subtitle {"score":{"name":"$countdown","objective":"mem"}}
+title @a title ["准备小游戏"]
+
+# 退出状态
+execute if score $countdown mem matches 0 run function ltw:state/4/state_enter

+ 12 - 0
data/ltw/functions/state/4/player_enter.mcfunction

@@ -0,0 +1,12 @@
+# 对单个玩家的处理(如果玩家中途加入就会执行此函数)
+title @s clear
+gamemode spectator @s
+
+# 状态效果
+effect clear @s
+effect give @s saturation 1000000 0 true
+effect give @s instant_health 10 0 true
+effect give @s night_vision 1000000 0 true
+
+# 显示小游戏介绍
+function mini:main/player_intro

+ 6 - 0
data/ltw/functions/state/4/state_enter.mcfunction

@@ -0,0 +1,6 @@
+# 要求系统进入状态 4(展示小游戏)
+scoreboard players set $state mem 4
+execute as @a run function ltw:state/4/player_enter
+
+# 初始化倒计时
+scoreboard players set $countdown mem 10

+ 7 - 0
data/ltw/functions/state/4/tick20.mcfunction

@@ -0,0 +1,7 @@
+# 显示倒计时
+title @a times 3 14 2
+title @a subtitle {"score":{"name":"$countdown","objective":"mem"}}
+title @a title [""]
+
+# 退出状态
+execute if score $countdown mem matches 0 run function ltw:state/5/state_enter

+ 7 - 0
data/ltw/functions/state/5/player_enter.mcfunction

@@ -0,0 +1,7 @@
+# 对单个玩家的处理(如果玩家中途加入就会执行此函数)
+
+# 重置 HUD
+title @s clear
+
+# 使用小游戏的其他项目
+function mini:main/player_enter

+ 3 - 0
data/ltw/functions/state/5/state_enter.mcfunction

@@ -0,0 +1,3 @@
+# 要求系统进入状态 5(小游戏进行中)
+scoreboard players set $state mem 5
+execute as @a run function ltw:state/5/player_enter

+ 1 - 0
data/ltw/functions/state/5/tick1.mcfunction

@@ -0,0 +1 @@
+function mini:main/tick1

+ 2 - 7
data/mini/functions/main/game_init.mcfunction

@@ -1,7 +1,2 @@
-# 初始化 TNT Run 地图
-forceload add 1000 2000 1050 2050
-
-setblock 1000 10 2000 minecraft:structure_block{mode:"LOAD",name:"mini:tntrun"}
-setblock 1000 11 2000 minecraft:redstone_block
-
-forceload remove 1000 2000 1050 2050
+# 初始化单个小游戏
+execute if score $mini_type mem matches 2 run function mini:tntrun/game_init

+ 2 - 0
data/mini/functions/main/player_enter.mcfunction

@@ -0,0 +1,2 @@
+# 单个玩家开始小游戏时执行
+execute if score $mini_type mem matches 2 run function mini:tntrun/player_enter

+ 2 - 0
data/mini/functions/main/player_intro.mcfunction

@@ -0,0 +1,2 @@
+# 向单个玩家展示小游戏时执行
+execute if score $mini_type mem matches 2 run function mini:tntrun/player_intro

+ 1 - 1
data/mini/functions/main/tick1.mcfunction

@@ -1 +1 @@
-function mini:tntrun/tick1
+execute if score $mini_type mem matches 2 run function mini:tntrun/tick1

+ 8 - 2
data/mini/functions/tntrun/game_init.mcfunction

@@ -1,2 +1,8 @@
-# 初始化单个小游戏
-execute if score $mini_type mem matches 2 run function mini:tntrun/game_init
+# 初始化 TNT Run 地图
+forceload add 1000 2000 1050 2050
+
+# 生成地图
+setblock 1000 10 2000 minecraft:structure_block{mode:"LOAD",name:"mini:tntrun"}
+setblock 1000 11 2000 minecraft:redstone_block
+# 清理残余实体
+kill @e[tag=tntrun_block]

+ 20 - 0
data/mini/functions/tntrun/player_enter.mcfunction

@@ -0,0 +1,20 @@
+# 单个玩家开始小游戏时执行
+title @s clear
+gamemode adventure @s
+
+# 状态效果
+effect clear @s
+effect give @s saturation 1000000 0 true
+effect give @s instant_health 10 0 true
+effect give @s night_vision 1000000 0 true
+effect give @s resistance 1000000 4 true
+
+# 传送玩家
+spreadplayers 1011.5 2011.5 7 7 false @a
+schedule function mini:tntrun/player_enter2 1t
+# schedule: tp @a ~ ~-3 ~
+
+# 三秒后才开始 TNT 掉落
+tag @a remove tntrun_pc
+schedule function mini:tntrun/player_enter3 3s
+# schedule: tag @a add tntrun_pc

+ 2 - 0
data/mini/functions/tntrun/player_enter2.mcfunction

@@ -0,0 +1,2 @@
+# spreadplayer 后不能立即传送,所以延迟 1tick
+tp @a ~ ~-3 ~

+ 1 - 0
data/mini/functions/tntrun/player_enter3.mcfunction

@@ -0,0 +1 @@
+tag @a add tntrun_pc

+ 3 - 0
data/mini/functions/tntrun/player_intro.mcfunction

@@ -0,0 +1,3 @@
+# 向单个玩家展示小游戏时执行
+tp @s 1011.5 28 2011.5
+tellraw @s [{"text":"\n>> TNT Run >>\n\n","color":"red","bold":true},{"text": "你脚下的方块会不断塌陷, 所以, 不要停下来啊!\n场地一共有三层, 掉到最下面则为失败!\n","color":"white","bold": false}]

+ 8 - 11
data/mini/functions/tntrun/tick1.mcfunction

@@ -1,18 +1,15 @@
-# 如果需要对玩家启用 TNT Run 模块,则给予其 tntrun_pc 标签
-tag @a add tntrun_pc
-
 # 以下为检测并控制方块消失的命令
 execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~ ~-1 ~ align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 run tag @e[tag=tntrun_edge,distance=..0.1] remove tntrun_edge
-execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~ ~-1 ~ align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_as,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_as"],Age: -2147483648, Duration: -1, WaitTime: -2147483648,}
-execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~0.31 ~-1 ~0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_as,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_as","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648,}
-execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~-0.31 ~-1 ~-0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_as,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_as","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648,}
-execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~0.31 ~-1 ~-0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_as,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_as","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648,}
-execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~-0.31 ~-1 ~0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_as,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_as","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648,}
+execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~ ~-1 ~ align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_block,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_block"],Age: -2147483648, Duration: -1, WaitTime: -2147483648}
+execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~0.31 ~-1 ~0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_block,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_block","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648}
+execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~-0.31 ~-1 ~-0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_block,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_block","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648}
+execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~0.31 ~-1 ~-0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_block,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_block","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648}
+execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~-0.31 ~-1 ~0.31 align xyz if block ~ ~ ~ #mini:tntrun_floor positioned ~0.5 ~ ~0.5 unless entity @e[tag=tntrun_block,distance=..0.1] run summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["tntrun_block","tntrun_edge"],Age: -2147483648, Duration: -1, WaitTime: -2147483648}
 execute as @a[tag=tntrun_pc,nbt={OnGround:1b}] at @s positioned ~ ~-1 ~ align xyz if block ~ ~ ~ minecraft:air positioned ~0.5 ~ ~0.5 run tag @e[tag=tntrun_edge,distance=..1.51] remove tntrun_edge
 
 # 修改下面这一行的数字以调整方块消失的延迟(刻)
 # tntrun_timer=12
-execute as @e[tag=tntrun_as,scores={tntrun_timer=12}] at @s run setblock ~ ~ ~ air
-scoreboard players add @e[tag=tntrun_as] tntrun_timer 1
-execute as @e[tag=tntrun_as] at @s unless block ~ ~ ~ #mini:tntrun_floor run kill @s
+execute as @e[tag=tntrun_block,scores={tntrun_timer=12}] at @s run setblock ~ ~ ~ air
+scoreboard players add @e[tag=tntrun_block] tntrun_timer 1
+execute as @e[tag=tntrun_block] at @s unless block ~ ~ ~ #mini:tntrun_floor run kill @s
 execute as @e[tag=tntrun_edge] at @s unless entity @a[tag=tntrun_pc,distance=..1.51] run kill @s