From 4625636ed40fb26d9b442d17317047343fc9b211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BB=B6=E7=9A=93?= <1214946206@qq.com> Date: Thu, 29 Sep 2022 22:57:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E8=AE=A1=E5=88=86=E6=9D=BF?= =?UTF-8?q?=E6=97=B6=E4=BC=9A=E5=8F=AC=E5=94=A4=E5=81=87=E4=BA=BA=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=9C=A8=E5=AE=8C=E6=88=90=E5=90=8E=E5=B0=86=E5=85=B6?= =?UTF-8?q?=E6=94=BE=E5=9C=A8=E5=87=BA=E7=94=9F=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++- scripts/fzsd_score.sc | 103 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 063da54..6c9a3cd 100644 --- a/README.md +++ b/README.md @@ -68,13 +68,20 @@ - 脚本: - `fzsd_score.sc`(**开发中!此处列举目前已完成的**): - 可避免Carpet假人污染计分板 - - 执行 `reload` 指令后自动生效 + - 可以标记哪些玩家是假人 + - *注:请不要使用为假人名添加“bot”前缀的carpet扩展,本插件不支持此类假人!* - 子命令( `/fzsd_score <子命令>` ): - `updateFrom `:用于从给定的数据包版本恢复计分板数据(需要测试!) - `recalculate`:重新计算所有计分板总分 - `recalculate `:重新计算该计分板总分 + - `set `:设置该玩家该计分板的分数 - `reset `:重置该玩家的所有分数 - `reset `:重置该玩家该计分板的分数 + - `restore player <玩家名> <计分板ID>`:恢复该玩家的该计分板分数 + - `restore player <玩家名>`:恢复该玩家的所有计分板分数 + - `restore whitelist <玩家名> <计分板ID>`:恢复所有白名单玩家的该计分板分数 + - `restore whitelist <玩家名>`:恢复所有白名单玩家的所有计分板分数 + - *副作用:恢复完成后玩家会被放置在出生点,请确保出生点完全安全* - `commandPlayer `:设置player命令权限类型 ### 其他 diff --git a/scripts/fzsd_score.sc b/scripts/fzsd_score.sc index 38d7be0..152493e 100644 --- a/scripts/fzsd_score.sc +++ b/scripts/fzsd_score.sc @@ -1,7 +1,7 @@ // 计分板模块扩展插件 // 忽略假人分数 // **请勿修改文件名!!** -global_app_version = '1.0-beta.12'; +global_app_version = '1.0-beta.13'; global_current_scoreboard_list = [ 'fzsd.module.scoreboard.display.activation', 'fzsd.module.scoreboard.display.damage_taken', @@ -103,21 +103,37 @@ __on_player_connects(player) -> ( player_type = player ~ 'player_type'; player_team = player ~ 'team'; player_name = player ~ 'name'; - if(player_type == 'fake' && player_team != 'fzsd.module.scoreboard.fake', + if(player_type == 'fake', ( - global_team_cache:player_name = player_team; + if(player_team != 'fzsd.module.scoreboard.fake', + global_team_cache:player_name = player_team; + ); team_add('fzsd.module.scoreboard.fake', player); + print(player('all'), '↑假的'); ), - player_type == 'shadow' && player_team != 'fzsd.module.scoreboard.shadow', + player_type == 'shadow', ( - global_team_cache:player_name = player_team; + if(player_team != 'fzsd.module.scoreboard.shadow', + global_team_cache:player_name = player_team; + ); team_add('fzsd.module.scoreboard.shadow', player); + print(player('all'), '↑挂机'); ), try_restore_team_from_cache(player); ); ); __on_player_disconnects(player, reason) -> ( + player_type = player ~ 'player_type'; + if(player_type == 'fake' && player_team != 'fzsd.module.scoreboard.fake', + ( + print(player('all'), '↓假的'); + ), + player_type == 'shadow' && player_team != 'fzsd.module.scoreboard.shadow', + ( + print(player('all'), '↓挂机'); + ) + ); try_restore_team_from_cache(player); ); @@ -377,27 +393,68 @@ display_total_score(scoreboard) -> ( // 恢复计分板分数,player == null 时恢复所有玩家分数,scoreboard == null 时恢复所有计分板分数 command_restore(player, scoreboard) -> ( if(player == null, - for(keys(system_info('server_whitelist')), restore_score(_, scoreboard)); + i = 0; + for(keys(system_info('server_whitelist')), + i += 1; + if(i > 10, + game_tick(50); + i = 0; + ); + restore_score(_, scoreboard); + ); if(scoreboard == null, - print('已恢复所有玩家的所有分数') - , - print('已恢复所有玩家的' + scoreboard + '分数'); + ( + print('重置交易榜会丢失猪灵交易分数,请输入\n“/' + global_app_name + ' restore confirm whitelist fzsd.module.scoreboard.display.trade_count”继续执行'); + print('无法还原破基岩榜,已忽略'); + print('已恢复所有玩家的所有分数'); + ), + if(scoreboard == 'fzsd.module.scoreboard.display.trade_count', + print('重置交易榜会丢失猪灵交易分数,请输入\n“/' + global_app_name + ' restore confirm whitelist fzsd.module.scoreboard.display.trade_count”继续执行'); + , + scoreboard == 'fzsd.module.scoreboard.display.bedrock_broken_count', + print('无法还原破基岩榜,已忽略'); + , + print('已恢复所有玩家的' + scoreboard + '分数'); + ); ); return(); ); if(scoreboard == null, for(global_current_scoreboard_list, restore_score(player, _)); + print('重置交易榜会丢失猪灵交易分数,请输入\n“/' + global_app_name + ' restore confirm player fzsd.module.scoreboard.display.trade_count”继续执行'); + print('无法还原破基岩榜,已忽略'); print('已恢复' + player + '的所有分数'); return(); ); if(restore_score(player, scoreboard), print('已恢复' + player + '的' + scoreboard + '分数'); + , + if(scoreboard == 'fzsd.module.scoreboard.display.trade_count', + print('重置交易榜会丢失猪灵交易分数,请输入\n“/' + global_app_name + ' restore confirm whitelist fzsd.module.scoreboard.display.trade_count”继续执行'); + , + scoreboard == 'fzsd.module.scoreboard.display.bedrock_broken_count', + print('无法还原破基岩榜,已忽略'); + ); ); return(); ); // 恢复玩家的计分板分数 -restore_score(player, scoreboard) -> ( +restore_score(player_name, scoreboard) -> ( + require_not_null(player_name); + if(scoreboard == null, + for(global_current_scoreboard_list, restore_score(player_name, _)); + return(); + ); + player = player(player_name); + player_is_offline = false; + if(player == null, + ( + run('player ' + player_name + ' spawn at ~ ~ ~ facing 0 0 in minecraft:overworld in survival'); + player_is_offline = true; + player = player(player_name); + ) + ); if(scoreboard == 'fzsd.module.scoreboard.display.activation', ( play_ticks = statistic(player, 'custom', 'play_time'); @@ -405,7 +462,7 @@ restore_score(player, scoreboard) -> ( scoreboard(scoreboard, player, play_ticks/72000); ), scoreboard == 'fzsd.module.scoreboard.display.damage_taken', - restore_from_stat(scoreboard, player, 'custom', 'damage_taken'); + scoreboard(scoreboard, player, statistic(player, 'custom', 'damage_taken')/10); , scoreboard == 'fzsd.module.scoreboard.display.death_count', restore_from_stat(scoreboard, player, 'custom', 'deaths'); @@ -428,15 +485,11 @@ restore_score(player, scoreboard) -> ( ); ), scoreboard == 'fzsd.module.scoreboard.display.trade_count', - ( - print('此操作会丢失猪灵交易分数,请输入\n“/' + global_app_name + ' restore confirm whitelist fzsd.module.scoreboard.display.trade_count”或\n“/' + global_app_name + ' restore confirm player fzsd.module.scoreboard.display.trade_count”继续执行'); - return(false); - ), + return(false); + , scoreboard == 'fzsd.module.scoreboard.display.bedrock_broken_count', - ( - print('无法还原破基岩榜,已忽略'); - return(false); - ), + return(false); + , scoreboard == 'fzsd.module.scoreboard.display.aviating_distance', scoreboard(scoreboard, player, statistic(player, 'custom', 'aviate_one_cm')/200); , @@ -447,10 +500,15 @@ restore_score(player, scoreboard) -> ( append_from_stat(scoreboard, player, 'used', _); ); ), - print('未识别的计分板ID!'); + print('未识别的计分板ID!' + scoreboard); return(false); ); recalculate_total_score(scoreboard); + if(player_is_offline, + world_spawn = system_info('world_spawn_point'); + run('spreadplayers ' + world_spawn:0 + ' ' + world_spawn:2 + ' 0 10 false ' + player); + run('player ' + player + ' kill'); + ); return(true); ); @@ -504,3 +562,8 @@ debug(msg) -> ( logger('debug', msg); return(); ); + +require_not_null(value) -> ( + if(value == null, throw('空指针异常!')); + return(value); +); \ No newline at end of file