diff --git a/README.md b/README.md index 22db9d4..759bdbd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# 消极怠工中,相信你们可以自己写出更好用的!:) - # FZ生存数据包 为FZ服务器写的Minecraft生存辅助数据包 @@ -24,7 +22,6 @@ 6. (可选)从数据包 `zip` 文件的 `scripts` 目录中解压 `.sc` 文件,将其放入 `world/scripts` 中(在客户端位于 `.minecraft/saves/<存档名>/scripts` ) 7. 执行 `reload` 指令(或重新打开存档;在一些第三方服务端中可能需要改为`/minecraft:reload`) - # FZ生存数据包 3.0 [![数据包版本](https://img.shields.io/badge/正式版-3.0.5-blue.svg)](https://gitee.com/harvey-husky/FZ-sDatapack/releases) [![MC版本](https://img.shields.io/badge/Minecraft-1.19+-blue.svg)](https://minecraft.net/) @@ -61,6 +58,21 @@ | :------: | :----------------------------------------------: | | 破基岩榜 |fzsd.module.scoreboard.display.bedrock_broken_count| +- 系统总榜计分板:`fzsd.module.scoreboard.assign.general` + - 可以在在此记分板修改总分数据,下次加分时会刷新显示分数 + - 总计分项名称对照表: + + | 默认名称 | 计分板ID | + | :------: | :----------------------------------------------: | + | 总活跃时间 | fzsd.module.scoreboard.total.activation | + | 总飞行距离 | fzsd.module.scoreboard.total.aviating_distance | + | 总受伤害量 | fzsd.module.scoreboard.total.damage_taken | + | 总死亡数 | fzsd.module.scoreboard.total.death_count | + | 总挖掘量 | fzsd.module.scoreboard.total.dig_count | + | 总钓鱼数 | fzsd.module.scoreboard.total.fishing_count | + | 总击杀数 | fzsd.module.scoreboard.total.kill_count | + | 总放置方块数 | fzsd.module.scoreboard.total.placement_count | + | 总交易量 | fzsd.module.scoreboard.total.trade_count | ### 地毯脚本 @@ -95,4 +107,5 @@ - 见游戏内交互器按钮 ## 开发者相关 -- 参见[开发文档](/DEVDOC.md) \ No newline at end of file + +- 参见[开发文档](/DEVDOC.md) diff --git a/data/fzsd.extra.bbl/tags/functions/display/set_text.json b/data/fzsd.extra.bbl/tags/functions/display/set_text.json index af1fc52..e21b375 100644 --- a/data/fzsd.extra.bbl/tags/functions/display/set_text.json +++ b/data/fzsd.extra.bbl/tags/functions/display/set_text.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "fzsd.extra.bbl:display/set_text/black" + "fzsd.extra.bbl:display/set_text/dark_gray" ] } \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/activation.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/activation.mcfunction index e54f505..b051a3d 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/activation.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/activation.mcfunction @@ -1,2 +1,4 @@ scoreboard players add @s fzsd.module.scoreboard.display.activation 1 -scoreboard players add fzsd.module.scoreboard.total.activation fzsd.module.scoreboard.assign.general 1 \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.activation matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.activation 2147483647 +scoreboard players add fzsd.module.scoreboard.total.activation fzsd.module.scoreboard.assign.general 1 +execute if score fzsd.module.scoreboard.total.activation fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.activation fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/aviating_distance.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/aviating_distance.mcfunction index 947d199..3cc0542 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/aviating_distance.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/aviating_distance.mcfunction @@ -1,2 +1,4 @@ scoreboard players operation @s fzsd.module.scoreboard.display.aviating_distance += fzsd.var.score fzsd.variable.integer -scoreboard players operation fzsd.module.scoreboard.total.aviating_distance fzsd.module.scoreboard.assign.general += fzsd.var.score fzsd.variable.integer \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.aviating_distance matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.aviating_distance 2147483647 +scoreboard players operation fzsd.module.scoreboard.total.aviating_distance fzsd.module.scoreboard.assign.general += fzsd.var.score fzsd.variable.integer +execute if score fzsd.module.scoreboard.total.aviating_distance fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.aviating_distance fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/damage_taken.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/damage_taken.mcfunction index 69052e6..1c87bd6 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/damage_taken.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/damage_taken.mcfunction @@ -1,2 +1,4 @@ scoreboard players operation @s fzsd.module.scoreboard.display.damage_taken += fzsd.var.score fzsd.variable.integer -scoreboard players operation fzsd.module.scoreboard.total.damage_taken fzsd.module.scoreboard.assign.general += fzsd.var.score fzsd.variable.integer \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.damage_taken matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.damage_taken 2147483647 +scoreboard players operation fzsd.module.scoreboard.total.damage_taken fzsd.module.scoreboard.assign.general += fzsd.var.score fzsd.variable.integer +execute if score fzsd.module.scoreboard.total.damage_taken fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.damage_taken fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/death_count.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/death_count.mcfunction index b85a113..6479280 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/death_count.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/death_count.mcfunction @@ -1,2 +1,4 @@ scoreboard players add @s fzsd.module.scoreboard.display.death_count 1 -scoreboard players add fzsd.module.scoreboard.total.death_count fzsd.module.scoreboard.assign.general 1 \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.death_count matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.death_count 2147483647 +scoreboard players add fzsd.module.scoreboard.total.death_count fzsd.module.scoreboard.assign.general 1 +execute if score fzsd.module.scoreboard.total.death_count fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.death_count fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/dig_count.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/dig_count.mcfunction index d3c828c..08a8951 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/dig_count.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/dig_count.mcfunction @@ -1,2 +1,4 @@ scoreboard players operation @s fzsd.module.scoreboard.display.dig_count += fzsd.var.score fzsd.variable.integer -scoreboard players operation fzsd.module.scoreboard.total.dig_count fzsd.module.scoreboard.assign.general += fzsd.var.score fzsd.variable.integer \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.dig_count matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.dig_count 2147483647 +scoreboard players operation fzsd.module.scoreboard.total.dig_count fzsd.module.scoreboard.assign.general += fzsd.var.score fzsd.variable.integer +execute if score fzsd.module.scoreboard.total.dig_count fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.dig_count fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/fishing_count.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/fishing_count.mcfunction index 378516b..8f01eec 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/fishing_count.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/fishing_count.mcfunction @@ -1,2 +1,4 @@ scoreboard players add @s fzsd.module.scoreboard.display.fishing_count 1 -scoreboard players add fzsd.module.scoreboard.total.fishing_count fzsd.module.scoreboard.assign.general 1 \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.fishing_count matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.fishing_count 2147483647 +scoreboard players add fzsd.module.scoreboard.total.fishing_count fzsd.module.scoreboard.assign.general 1 +execute if score fzsd.module.scoreboard.total.fishing_count fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.fishing_count fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/kill_count.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/kill_count.mcfunction index 0972370..8aad16c 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/kill_count.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/kill_count.mcfunction @@ -1,2 +1,4 @@ scoreboard players add @s fzsd.module.scoreboard.display.kill_count 1 -scoreboard players add fzsd.module.scoreboard.total.kill_count fzsd.module.scoreboard.assign.general 1 \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.kill_count matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.kill_count 2147483647 +scoreboard players add fzsd.module.scoreboard.total.kill_count fzsd.module.scoreboard.assign.general 1 +execute if score fzsd.module.scoreboard.total.kill_count fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.kill_count fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/placement_count.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/placement_count.mcfunction index 422f254..7264127 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/placement_count.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/placement_count.mcfunction @@ -1,2 +1,4 @@ scoreboard players add @s fzsd.module.scoreboard.display.placement_count 1 -scoreboard players add fzsd.module.scoreboard.total.placement_count fzsd.module.scoreboard.assign.general 1 \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.placement_count matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.placement_count 2147483647 +scoreboard players add fzsd.module.scoreboard.total.placement_count fzsd.module.scoreboard.assign.general 1 +execute if score fzsd.module.scoreboard.total.placement_count fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.placement_count fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/functions/module/scoreboard/assign/scoreboard/trade_count.mcfunction b/data/fzsd/functions/module/scoreboard/assign/scoreboard/trade_count.mcfunction index 35ba2df..c370c16 100644 --- a/data/fzsd/functions/module/scoreboard/assign/scoreboard/trade_count.mcfunction +++ b/data/fzsd/functions/module/scoreboard/assign/scoreboard/trade_count.mcfunction @@ -1,2 +1,4 @@ scoreboard players add @s fzsd.module.scoreboard.display.trade_count 1 -scoreboard players add fzsd.module.scoreboard.total.trade_count fzsd.module.scoreboard.assign.general 1 \ No newline at end of file +execute if score @s fzsd.module.scoreboard.display.trade_count matches ..-1 run scoreboard players set @s fzsd.module.scoreboard.display.trade_count 2147483647 +scoreboard players add fzsd.module.scoreboard.total.trade_count fzsd.module.scoreboard.assign.general 1 +execute if score fzsd.module.scoreboard.total.trade_count fzsd.module.scoreboard.assign.general matches ..-1 run scoreboard players set fzsd.module.scoreboard.total.trade_count fzsd.module.scoreboard.assign.general 2147483647 \ No newline at end of file diff --git a/data/fzsd/tags/functions/module/join_message/default_message.json b/data/fzsd/tags/functions/module/join_message/default_message.json deleted file mode 100644 index d419905..0000000 --- a/data/fzsd/tags/functions/module/join_message/default_message.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "fzsd:module/join_message/default_message" - ] -} \ No newline at end of file diff --git a/data/fzsd/tags/functions/module/join_message/send_message.json b/data/fzsd/tags/functions/module/join_message/send_message.json index 64ce7fd..d419905 100644 --- a/data/fzsd/tags/functions/module/join_message/send_message.json +++ b/data/fzsd/tags/functions/module/join_message/send_message.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "#fzsd:module/join_message/default_message" + "fzsd:module/join_message/default_message" ] } \ No newline at end of file diff --git a/scripts/fzsd_score.sc b/scripts/fzsd_score.sc index 491a5b8..56d3f2e 100644 --- a/scripts/fzsd_score.sc +++ b/scripts/fzsd_score.sc @@ -19,41 +19,11 @@ require_not_null(value) -> ( ); require_version(requirement) -> ( - req_0 = slice(requirement, 0, 1); - req_1 = slice(requirement, 1, 2); - if(req_0 == '>', - if(req_1 == '=', - req_ver = split('>=|\\.', requirement); - print(player('all'), req_ver); - cur_ver = split('\\.', global_carpet_version); - return(number(req_ver:1) >= number(cur_ver:0) - && number(req_ver:2) >= number(cur_ver:1) - && number(req_ver:3) >= number(cur_ver:2)); - ); - req_ver = split('>|\\.', requirement); - print(player('all'), req_ver); - cur_ver = split('\\.', global_carpet_version); - return(number(req_ver:1) > number(cur_ver:0) - && number(req_ver:2) > number(cur_ver:1) - && number(req_ver:3) > number(cur_ver:2)); - ); - if(req_0 == '<', - if(req_1 == '=', - req_ver = split('<=|\\.', requirement); - print(player('all'), req_ver); - cur_ver = split('\\.', global_carpet_version); - return(number(req_ver:1) <= number(cur_ver:0) - && number(req_ver:2) <= number(cur_ver:1) - && number(req_ver:3) <= number(cur_ver:2)); - ); - req_ver = split('<|\\.', requirement); - print(player('all'), req_ver); - cur_ver = split('\\.', global_carpet_version); - return(number(req_ver:1) < number(cur_ver:0) - && number(req_ver:2) < number(cur_ver:1) - && number(req_ver:3) < number(cur_ver:2)); - ); - return(false); + req_ver = split('\\.', requirement); + cur_ver = split('\\.', global_carpet_version); + return(number(cur_ver:0) >= number(req_ver:0) + && number(cur_ver:1) >= number(req_ver:1) + && number(cur_ver:2) >= number(req_ver:2)); ); //** 主要逻辑 **// @@ -145,22 +115,7 @@ __config() -> { }; __on_start() -> ( - // 读取配置文件 - global_config = read_file('config', 'json'); - if(global_config == null, // carpet 1.4.69 兼容 - global_config = {}; - ); - if(length(global_config) == 0, // 读取失败或不存在 - delete_file('config', 'json'); // 避免一些意外的问题 - global_config:'config_version' = '1.0.0'; // 占位用,无实际作用 - if(require_version('>=1.99.99'), // 等待新功能支持 - global_config:'allow_spawn_whitelist_player' = false; - write_file('config', 'json', global_config); - , - // else - write_file('config', 'json', global_config); - ); - ); + reload_configs(); global_team_cache = read_file('team_cache', 'json'); if(global_team_cache == null, // carpet 1.4.69 兼容 global_team_cache = {}; @@ -173,12 +128,14 @@ __on_close() -> ( write_file('team_cache', 'json', global_team_cache); ); -if(require_version('>=1.99.99'), // 等待新功能支持 - __on_player_command(player, message) -> ( - print(player('all'), 'command!'); - if(length(message) > 7 - && slice(message, 0, 7) == '/player' - && !(global_config:'allow_spawn_whitelist_player'), +if(require_version('1.4.112'), // 新功能支持 + __on_player_command(player, command) -> ( + l = length(command); + if(l > 13 + && slice(command, 0, 6) == 'player' + && slice(command, l - 5, l) == 'spawn' + && !(global_config:'allow_spawn_whitelist_player') + && contains(get_server_whitelist(), slice(command, 7, l - 6)), return('cancel'); ); ); @@ -186,11 +143,11 @@ if(require_version('>=1.99.99'), // 等待新功能支持 __on_player_connects(player) -> ( player_type = player ~ 'player_type'; - player_team = player ~ 'team'; - player_name = player ~ 'name'; if(player_type == 'fake', ( + player_team = player ~ 'team'; if(player_team != 'fzsd.module.scoreboard.fake', + player_name = player ~ 'name'; global_team_cache:player_name = player_team; ); team_add('fzsd.module.scoreboard.fake', player); @@ -198,7 +155,9 @@ __on_player_connects(player) -> ( ), player_type == 'shadow', ( + player_team = player ~ 'team'; if(player_team != 'fzsd.module.scoreboard.shadow', + player_name = player ~ 'name'; global_team_cache:player_name = player_team; ); team_add('fzsd.module.scoreboard.shadow', player); @@ -222,6 +181,35 @@ __on_player_disconnects(player, reason) -> ( try_restore_team_from_cache(player); ); +// 获取服务器白名单 +get_server_whitelist() -> ( + return(keys(system_info('server_whitelist'))); +); + +// 重载配置文件 +reload_configs() -> ( + // 读取配置文件 + global_config = read_file('config', 'json'); + if(global_config == null, // carpet 1.4.69 兼容 + global_config = {}; + ); + config_changed = false; + // 读取失败或不存在 + if(length(global_config) == 0, + global_config:'config_version' = '1.0.0'; // 占位用,无实际作用 + config_changed = true; + ); + // 新功能支持 + if(require_version('1.4.112') && !contains(global_config, 'allow_spawn_whitelist_player'), + global_config:'allow_spawn_whitelist_player' = false; + config_changed = true; + ); + if(config_changed == true, + delete_file('config', 'json'); // 避免一些意外的问题 + write_file('config', 'json', global_config); + ); +); + // 获取所有计分板下的所有玩家列表 get_scoreboard_player_list() -> ( set = m(); @@ -395,20 +383,14 @@ merge_score(from, to, fzsd_version) -> ( // 获取承载总榜数据的玩家名 // 因为新计分板允许玩家自定义显示的总榜名称,故做复杂判断才能使脚本确定用来承载总榜数据的玩家名 get_total_score_name_new(scoreboard) -> ( - INT_MIN = -2147483648; - // 获取系统总榜id - system_total_name = replace(scoreboard, 'display', 'total'); + // 系统总榜id + sys_total_name = replace(scoreboard, 'display', 'total'); + // 当前总分 + current_score = scoreboard('fzsd.module.scoreboard.assign.general', sys_total_name); - // 将系统总榜分数加上最小int值,使其成为最低分 - scoreboard( - 'fzsd.module.scoreboard.assign.general', - system_total_name, - scoreboard( - 'fzsd.module.scoreboard.assign.general', - system_total_name - ) + INT_MIN - ); + // 将系统总榜分数设为INT_MIN,使其成为最低分 + scoreboard('fzsd.module.scoreboard.assign.general', sys_total_name, -2147483648); // 将总分赋值到显示计分板上 display_total_score(scoreboard); @@ -427,14 +409,7 @@ get_total_score_name_new(scoreboard) -> ( ); // 恢复总榜分数 - scoreboard( - 'fzsd.module.scoreboard.assign.general', - system_total_name, - scoreboard( - 'fzsd.module.scoreboard.assign.general', - system_total_name - ) - INT_MIN - ); + scoreboard('fzsd.module.scoreboard.assign.general', sys_total_name, current_score); display_total_score(scoreboard); // 返回榜内最低分的玩家名(承载总榜数据的玩家名) @@ -452,7 +427,15 @@ command_recalculate_total_score(scoreboard) -> ( total_score = 0; for(scoreboard(scoreboard), if(_ != total_score_name_new, - total_score += scoreboard(scoreboard, _); + current_player_score = scoreboard(scoreboard, _); + if(current_player_score < 0, // 避免溢出 + current_player_score = 2147483647; + scoreboard(scoreboard, _, 2147483647); + ); + total_score += current_player_score; + ); + if(total_score < 0, // 避免溢出 + total_score = 2147483647; ); ); // 赋值总分到系统总分计分板 @@ -529,7 +512,7 @@ restore_score(player_name, scoreboard) -> ( require_not_null(player_name); if(scoreboard == null, for(global_current_scoreboard_list, restore_score(player_name, _)); - return(); + return(true); ); player = player(player_name); player_is_offline = false;