Przeglądaj źródła

土豆算法重构

HerobrineXia 6 lat temu
rodzic
commit
b04dbc58e0

+ 5 - 3
data/lib/functions/random.mcfunction

@@ -1,5 +1,7 @@
-# 输入:$random_min 最小值,$random_max 最大值
-# 输出:$random 结果
+#> lib:random
+# @input score $random_min mem 最小值
+# @input score $random_max mem 最大值
+# @output score $random 结果
 
 summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["random"],Duration:1}
 execute store result score $random mem run data get entity @e[tag=random,limit=1] UUID[0]
@@ -7,4 +9,4 @@ kill @e[tag=random]
 scoreboard players operation $random_max mem -= $random_min mem
 scoreboard players add $random_max mem 1
 scoreboard players operation $random mem %= $random_max mem
-scoreboard players operation $random mem += $random_min mem
+scoreboard players operation $random mem += $random_min mem

+ 4 - 0
data/ltw/functions/main/get_max_score.mcfunction

@@ -1,2 +1,6 @@
+#> ltw:main/get_max_score
+# @input score @a[tag=!max_uncounted,tag=!watcher] total_score 进行统计的分数
+# @output score #score_max mem 最高分
+
 scoreboard players set #score_max mem -2147483648
 scoreboard players operation #score_max mem > @a[tag=!max_uncounted,tag=!watcher] total_score

+ 14 - 0
data/mini/functions/hotpm/game/pm_check.mcfunction

@@ -0,0 +1,14 @@
+# 计算应有土豆数量
+execute if score $player_alive mem matches 6..8 run scoreboard players set $potato_count mem 3
+execute if score $player_alive mem matches 4..5 run scoreboard players set $potato_count mem 2
+execute if score $player_alive mem matches 2..3 run scoreboard players set $potato_count mem 1
+
+# 计算当前土豆数量
+execute store result score $current_potato mem if entity @a[tag=pm_holding]
+
+# 计算需求土豆数量
+scoreboard players operation $new_potato_count mem = $potato_count mem
+scoreboard players operation $new_potato_count mem -= $current_potato mem
+
+# 生成土豆
+execute if score $new_potato_count mem matches 1.. run function mini:hotpm/game/pm_init

+ 19 - 0
data/mini/functions/hotpm/game/pm_give.mcfunction

@@ -0,0 +1,19 @@
+# 计算权重
+scoreboard players reset @a temp
+execute as @a run scoreboard players operation @s temp = @s mini_heart
+execute as @a run scoreboard players operation @s temp *= #const_100 mem
+execute as @a run scoreboard players operation @s temp += @s total_score
+scoreboard players add @a[tag=pm_explode_last] temp 10000
+
+# 寻找最高分
+tag @a[tag=!mini_running] add max_uncounted
+tag @a[tag=!pm_holding] add max_uncounted
+function mini:main/get_max_temp
+
+# 给予土豆
+execute as @a[tag=!max_uncounted,sort=random,limit=1] if score @s temp = #score_max mem run function mini:hotpm/game/pm_get
+
+# 处理tag与分数
+tag @a[tag=max_uncounted] remove max_uncounted
+scoreboard players remove $new_potato_count mem 1
+execute if score $new_potato_count mem matches 1.. run function mini:hotpm/game/pm_give

+ 4 - 7
data/mini/functions/hotpm/game/pm_init.mcfunction

@@ -1,13 +1,10 @@
-# 刷新自己土豆
-function mini:hotpm/game/pm_get
+# 刷新对应人数的土豆
+function mini:hotpm/game/pm_give
 
 # 告知玩家
-tellraw @a ["",{"text":">> ","color":"red","bold": true},{"selector":"@s","color":"red"}," 获得了炸弹!"]
+tellraw @a ["",{"text":">> ","color":"red","bold": true},{"selector":"@a[tag=pm_holding]","color":"red"}," 获得了炸弹!"]
 
 # 土豆爆炸时间 = 存活人数 * 2 + 5(秒)
 scoreboard players set $countdown_fast mem 50
 execute as @a[tag=mini_running] run scoreboard players add $countdown_fast mem 20
-scoreboard players operation $countdown_max mem = $countdown_fast mem
-
-# 删除效果云
-kill @s[type=area_effect_cloud,tag=pm_boom]
+scoreboard players operation $countdown_max mem = $countdown_fast mem

+ 0 - 7
data/mini/functions/hotpm/game/pm_init_first.mcfunction

@@ -1,7 +0,0 @@
-# 第一次初始化土豆
-tag @a[tag=!mini_running] add max_uncounted
-function ltw:main/get_max_score
-tag @a[tag=max_uncounted] remove max_uncounted
-execute as @a[tag=mini_running] if score @s total_score = #score_max mem run tag @s add mini_hotpm_top
-execute as @a[tag=mini_hotpm_top,limit=1,sort=random] run function mini:hotpm/game/pm_init
-tag @a[tag=mini_hotpm_top] remove mini_hotpm_top

+ 0 - 3
data/mini/functions/hotpm/game_start.mcfunction

@@ -1,6 +1,3 @@
-# 2秒后给予土豆
-schedule function mini:hotpm/game/pm_init_first 2s replace
-
 # HUD
 execute if score $mini_type mem matches 3 run scoreboard objectives setdisplay list mini_heart_disp
 execute if score $mini_type mem matches 3 run scoreboard objectives setdisplay belowName mini_heart

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

@@ -18,6 +18,8 @@ function mini:main/player_max_health
 tag @s remove pm_holding
 tag @s remove pm_damage_dealt
 tag @s remove pm_damage_taken
+tag @s remove pm_explode_last
+
 
 # 传送玩家
 tp @s[tag=!watcher,tag=!rejoining,tag=!debug] 1023 25 3021

+ 2 - 2
data/mini/functions/hotpm/player_leave.mcfunction

@@ -1,4 +1,4 @@
 # 玩家下线时检测重新生成土豆
 
-execute unless entity @a[tag=pm_holding] run tellraw @a ["",{"text":">> ","color":"red","bold": true},"由于有玩家带着炸弹跑路了, 正在为炸弹选择更适合它的拥有者!"]
-execute unless entity @a[tag=pm_holding] run function mini:hotpm/game/pm_init_first
+# execute unless entity @a[tag=pm_holding] run tellraw @a ["",{"text":">> ","color":"red","bold": true},"由于有玩家带着炸弹跑路了, 正在为炸弹选择更适合它的拥有者!"]
+# execute unless entity @a[tag=pm_holding] run function mini:hotpm/game/pm_init_first

+ 5 - 5
data/mini/functions/hotpm/player_lose_heart.mcfunction

@@ -3,15 +3,15 @@
 tellraw @a ["",{"text":">> ","color":"red","bold": true},{"selector":"@s","color":"red"}," 爆炸了!"]
 # 玩家失去土豆
 function mini:hotpm/game/pm_lost
+
+# 增加tag
+tag @s add pm_explode_last
+
+
 # 特效
 summon minecraft:creeper ~ ~-1 ~ {ignited:1,ExplosionRadius:1,Fuse:0,Invulnerable:1}
 particle minecraft:explosion ~ ~1 ~ 0.4 0.4 0.4 0 5
-# 记录位置
-summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["pm_boom"]}
 # 减少生命
 function mini:main/player_lose_heart
-# 最远的人新土豆
-execute if score $player_alive mem matches 2.. as @e[type=area_effect_cloud,tag=pm_boom] at @s as @a[sort=furthest,tag=mini_running,tag=!watcher,limit=1] run function mini:hotpm/game/pm_init
-
 # 强制观战
 # execute at @s as @a[gamemode=spectator,distance=..0.1] run spectate @p[tag=pm_holding]

+ 3 - 0
data/mini/functions/hotpm/tick2.mcfunction

@@ -1,6 +1,9 @@
 # 爆炸
 execute if score $countdown_fast mem matches 0 as @a[tag=pm_holding] at @s run function mini:hotpm/player_lose_heart
 
+# 检测土豆
+function mini:hotpm/game/pm_check
+
 # HUD
 scoreboard players set $bossbar_color mem 0
 scoreboard players set @a[tag=pm_holding] bossbar_color 1

+ 3 - 0
data/mini/functions/main/get_max_score.mcfunction

@@ -1,2 +1,5 @@
+#> mini:main/get_max_score
+# @input score @a[tag=!max_uncounted,tag=!watcher] mini_score 进行统计的分数
+# @output score #score_max mem 最高分
 scoreboard players set #score_max mem -2147483648
 scoreboard players operation #score_max mem > @a[tag=!max_uncounted,tag=!watcher] mini_score

+ 6 - 0
data/mini/functions/main/get_max_temp.mcfunction

@@ -0,0 +1,6 @@
+#> mini:main/get_max_temp
+# @input score @a[tag=!max_uncounted,tag=!watcher] temp 进行统计的分数
+# @output score #score_max mem 最高分
+
+scoreboard players set #score_max mem -2147483648
+scoreboard players operation #score_max mem > @a[tag=!max_uncounted,tag=!watcher] temp