@@ -1,7 +1,20 @@
/ / 计分板模块扩展插件
/ / 忽略假人分数
/ / * * 请勿修改文件名 ! ! * *
global_app_version = ' 1.0-beta.8 ' ;
global_app_version = ' 1.0-beta.13 ' ;
global_current_scoreboard_list = [
' fzsd.module.scoreboard.display.activation ' ,
' fzsd.module.scoreboard.display.damage_taken ' ,
' fzsd.module.scoreboard.display.death_count ' ,
' fzsd.module.scoreboard.display.dig_count ' ,
' fzsd.module.scoreboard.display.fishing_count ' ,
' fzsd.module.scoreboard.display.kill_count ' ,
' fzsd.module.scoreboard.display.trade_count ' ,
' fzsd.module.scoreboard.display.bedrock_broken_count ' ,
' fzsd.module.scoreboard.display.aviating_distance ' ,
' fzsd.module.scoreboard.display.placement_count '
] ;
global_app_name = system_info ( ' app_name ' ) ;
__config ( ) - > {
' scope ' - > ' global ' ,
@@ -9,21 +22,51 @@ __config() -> {
' carpet ' - > ' >=1.4.45 ' ,
' minecraft ' - > ' >=1.17 '
} ,
' command_permission ' - > 4 ,
' command_permission ' - > 2 ,
' commands ' - > {
' ' - > ' help ' ,
' help ' - > ' help ' ,
' delete_old <delete_old > ' - > ' delete_old ' ,
' update_from <update_from > ' - > ' update_from ' ,
' restore_from_stats ' - > ' restore_from_stats ' ,
' recalculate_total ' - > ' recalculate_total_scores ' ,
' commandPlayer <boolean >' - > ' command_player '
' delete <version > ' - > ' command_delete ' ,
' update <version > ' - > ' command_update ' ,
' restore whitelist ' - > [ ' command_restore ' , null , null ] ,
' restore whitelist <scoreboardID> ' - > _ ( scoreboardID ) - > command_restore ( null , scoreboardID ) ,
' restore player <playerName >' - > [ ' command_restore ' , null ] ,
' restore player <playerName> <scoreboardID> ' - > ' command_restore ' ,
' restore <custom> whitelist <trade_count> ' - > _ ( custom , trade_count ) - > command_restore_trade_count_confirm ( custom , null , trade_count ) ,
' restore <custom> player <playerName> <trade_count> ' - > ' command_restore_trade_count_confirm ' ,
' recalculate <scoreboardID> ' - > ' recalculate_total_score ' ,
' recalculate ' - > [ ' recalculate_total_score ' , null ] ,
' commandPlayer <permissionType> ' - > ' carpet_command_player ' ,
' reset <scoreboardPlayer> <scoreboardID> ' - > ' command_reset ' ,
' reset <scoreboardPlayer> ' - > [ ' command_reset ' , null ] ,
' set <playerName> <scoreboardID> <score> ' - > ' command_set '
} ,
' arguments ' - > {
' boolean ' - > {
' type ' - > ' bool '
' trade_count ' - > {
' type ' - > ' term ' ,
' suggest ' - > [ ' fzsd.module.scoreboard.display.trade_count ' ]
} ,
' update_from ' - > {
' playerName ' - > {
' type ' - > ' term ' ,
' suggester ' - > _ ( args ) - > player ( ' all ' )
} ,
' scoreboardID ' - > {
' type ' - > ' term ' ,
' suggest ' - > global_current_scoreboard_list
} ,
' scoreboardPlayer ' - > {
' type ' - > ' term ' ,
' suggester ' - > _ ( args ) - > get_scoreboard_player_list ( )
} ,
' permissionType ' - > {
' type ' - > ' term ' ,
' suggest ' - > [
' true ' ,
' false ' ,
' ops '
]
} ,
' version ' - > {
' type ' - > ' term ' ,
' suggest ' - > [
' 2.x ' ,
@@ -32,14 +75,13 @@ __config() -> {
' 3.0-beta.10 '
]
} ,
' delete_old ' - > {
' score ' - > {
' type ' - > ' int ' ,
' suggest ' - > [ ]
} ,
' custom ' - > {
' type ' - > ' term ' ,
' suggest ' - > [
' 2.x ' ,
' 3.0-beta.4 ' ,
' 3.0-beta.9 ' ,
' 3.0-beta.10 '
]
' suggest ' - > [ ]
}
}
} ;
@@ -61,24 +103,70 @@ __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 ) ;
) ;
/ / 获取所有计分板下的所有玩家列表
get_scoreboard_player_list ( ) - > (
set = m ( ) ;
for ( global_current_scoreboard_list ,
for ( scoreboard ( _ ) ,
if ( _ ~ ' \\ w ' ,
put ( set : _ , null ) ;
) ;
) ;
) ;
return ( keys ( set ) ) ;
) ;
/ / 重置玩家计分板分数
command_reset ( player , scoreboard ) - > (
if ( scoreboard == null ,
for ( scoreboard ( ) ,
scoreboard_remove ( _ , player ) ;
) ;
recalculate_total_score ( null ) ;
print ( ' 已重置 ' + player + ' 的所有分数 ' ) ;
return ( ) ;
) ;
scoreboard_remove ( scoreboard , player ) ;
recalculate_total_score ( scoreboard ) ;
print ( ' 已重置 ' + player + ' 的 ' + scoreboard + ' 分数 ' ) ;
return ( ) ;
) ;
/ / 尝试从缓存恢复玩家队伍 , 玩家 / 假人上下线时执行
try_restore_team_from_cache ( player ) - > (
player_team = player ~ ' team ' ;
player_name = player ~ ' name ' ;
@@ -100,7 +188,8 @@ help() -> (
return ( ) ;
) ;
delete_old ( fzsd_version ) - > (
/ / 删除旧版的计分板
command_delete ( fzsd_version ) - > (
if ( fzsd_version == ' 3.0-beta.10 ' ,
(
scoreboard_remove ( ' fzsd.module.scoreboard.display.bedrock_broke_count ' ) ;
@@ -130,17 +219,19 @@ delete_old(fzsd_version) -> (
return ( ) ;
) ;
update_from ( fzsd_version ) - > (
/ / 从某一旧版升级
command_update ( fzsd_version ) - > (
if ( fzsd_version == ' 3.0-beta.10 ' ,
(
merge_score ( ' fzsd.module.scoreboard.display.bedrock_broke_count ' , ' fzsd.module.scoreboard.display.bedrock_broken_count ' , fzsd_version ) ;
delete_old ( fzsd_version ) ;
command_delete ( fzsd_version ) ;
scoreboard_remove ( ' fzsd.module.scoreboard.display.placement_count ' , ' 总放置方块数 ' ) ;
scoreboard_remove ( ' fzsd.module.scoreboard.display.general ' , ' 总放置方块数 ' ) ;
) ,
fzsd_version == ' 3.0-beta.9 ' ,
(
merge_score ( ' fzsd.extra.bbl.display ' , ' fzsd.module.scoreboard.display.bedrock_broken_count ' , fzsd_version ) ;
delete_old ( fzsd_version ) ;
command_delete ( fzsd_version ) ;
) ,
fzsd_version == ' 2.x ' ,
(
@@ -156,7 +247,7 @@ update_from(fzsd_version) -> (
[ ' fz.aviate1m ' , ' fzsd.module.scoreboard.display.aviating_distance ' ]
] ;
for ( params , merge_score ( . . . _ , fzsd_version ) ) ;
delete_old ( fzsd_version ) ;
command_delete ( fzsd_version ) ;
) ,
fzsd_version == ' 3.0-beta.4 ' ,
(
@@ -173,16 +264,17 @@ update_from(fzsd_version) -> (
[ ' fz.module.scoreboard.display.placement_count ' , ' fzsd.module.scoreboard.display.placement_count ' ]
] ;
for ( params , merge_score ( . . . _ , fzsd_version ) ) ;
delete_old ( fzsd_version ) ;
command_delete ( fzsd_version ) ;
) ,
print ( ' 参数错误! ' ) ;
return ( ) ;
) ;
recalculate_total_scores ( ) ;
recalculate_total_score ( null ) ;
print ( ' 已从 ' + fzsd_version + ' 升级! ' ) ;
return ( ) ;
) ;
/ / 将两计分板分数合并到后者
merge_score ( from , to , fzsd_version ) - > (
/ / 如果目标计分板不存在则创建
if ( scoreboard ( ) ~ to == null , scoreboard_add ( to ) ) ;
@@ -215,7 +307,8 @@ merge_score(from, to, fzsd_version) -> (
return ( ) ;
) ;
/ / 因为新计分板允许玩家自定义显示的总榜名称 , 故续做复杂判断才能使脚本确定之
/ / 获取承载总榜数据的玩家名
/ / 因为新计分板允许玩家自定义显示的总榜名称 , 故做复杂判断才能使脚本确定用来承载总榜数据的玩家名
get_total_score_name_new ( scoreboard ) - > (
INT_MIN = - 2147483648 ;
/ / 获取系统总榜id
@@ -235,7 +328,7 @@ get_total_score_name_new(scoreboard) -> (
/ / 将总分赋值到显示计分板上
display_total_score ( scoreboard ) ;
/ / 查找榜内最低分
/ / 查找显示计分板内的最低分玩家名
last_min_player = null ;
for ( scoreboard ( scoreboard ) ,
if ( last_min_player == null ,
@@ -259,29 +352,17 @@ get_total_score_name_new(scoreboard) -> (
) ;
display_total_score ( scoreboard ) ;
/ / 返回榜内最低分的名称
/ / 返回榜内最低分的玩家名 ( 承载总榜数据的玩家名 )
return ( last_min_player ) ;
) ;
recalculate_total_scores ( ) - > (
scoreboards = [
' fzsd.module.scoreboard.display.activation ' ,
' fzsd.module.scoreboard.display.damage_taken ' ,
' fzsd.module.scoreboard.display.death_count ' ,
' fzsd.module.scoreboard.display.dig_count ' ,
' fzsd.module.scoreboard.display.fishing_count ' ,
' fzsd.module.scoreboard.display.kill_count ' ,
' fzsd.module.scoreboard.display.trade_count ' ,
' fzsd.module.scoreboard.display.bedrock_broken_count ' ,
' fzsd.module.scoreboard.display.placement_count ' ,
' fzsd.module.scoreboard.display.aviating_distance '
] ;
for ( scoreboards , recalculate_total_score ( _ , get_total_score_name_new ( _ ) ) ) ;
print ( ' 已重新计算总分! ' ) ;
return ( ) ;
) ;
recalculate_total_score ( scoreboard , total_score_name_new ) - > (
/ / 重算总分 , scoreboard == null 时重算所有总分
recalculate_total_score ( scoreboard ) - > (
if ( scoreboard == null ,
for ( global_current_scoreboard_list , recalculate_total_score ( _ ) ) ;
return ( ) ;
) ;
total_score_name_new = get_total_score_name_new ( scoreboard ) ;
/ / 计算总分
total_score = 0 ;
for ( scoreboard ( scoreboard ) ,
@@ -299,6 +380,7 @@ recalculate_total_score(scoreboard, total_score_name_new) -> (
return ( ) ;
) ;
/ / 使用数据包函数标签将总分赋值到显示计分板上
display_total_score ( scoreboard ) - > (
/ / 获取计算总榜的函数标签名
str_1 = split ( ' \\ . ' , scoreboard ) ;
@@ -308,18 +390,166 @@ display_total_score(scoreboard) -> (
return ( ) ;
) ;
restore_from_stats ( ) - > (
print ( ' 暂未开发 ' ) ;
/ / 恢复计分板分数 , player == null 时恢复所有玩家分数 , scoreboard == null 时恢复所有计分板分数
command_restore ( player , scoreboard ) - > (
if ( player == null ,
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 ( ' 重置交易榜会丢失猪灵交易分数,请输入 \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 <playerName> 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 ( ) ;
) ;
merge_stat ( scoreboard , . . . stats ) - > (
print ( ' 暂未开发 ' ) ;
/ / 恢复玩家的计分板分数
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 ' ) ;
scoreboard ( ' fzsd.event.play_ticks ' , player , play_ticks % 72000 ) ;
scoreboard ( scoreboard , player , play_ticks / 72000 ) ;
) ,
scoreboard == ' fzsd.module.scoreboard.display.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 ' ) ;
,
scoreboard == ' fzsd.module.scoreboard.display.dig_count ' ,
(
scoreboard ( scoreboard , player , 0 ) ;
for ( block_list ( ) ,
append_from_stat ( scoreboard , player , ' mined ' , _ ) ;
) ;
) ,
scoreboard == ' fzsd.module.scoreboard.display.fishing_count ' ,
scoreboard ( scoreboard , player , statistic ( player , ' custom ' , ' fish_caught ' ) ) ;
,
scoreboard == ' fzsd.module.scoreboard.display.kill_count ' ,
(
scoreboard ( scoreboard , player , 0 ) ;
for ( entity_types ( ' living ' ) ,
append_from_stat ( scoreboard , player , ' killed ' , _ ) ;
) ;
) ,
scoreboard == ' fzsd.module.scoreboard.display.trade_count ' ,
return ( false ) ;
,
scoreboard == ' fzsd.module.scoreboard.display.bedrock_broken_count ' ,
return ( false ) ;
,
scoreboard == ' fzsd.module.scoreboard.display.aviating_distance ' ,
scoreboard ( scoreboard , player , statistic ( player , ' custom ' , ' aviate_one_cm ' ) / 200 ) ;
,
scoreboard == ' fzsd.module.scoreboard.display.placement_count ' ,
(
scoreboard ( scoreboard , player , 0 ) ;
for ( block_list ( ) ,
append_from_stat ( scoreboard , player , ' used ' , _ ) ;
) ;
) ,
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 ) ;
) ;
/ / 确定恢复交易榜
command_restore_trade_count_confirm ( confirm , player , trade_count ) - > (
if ( confirm != ' confirm ' | | trade_count != ' fzsd.module.scoreboard.display.trade_count ' ,
print ( ' 命令格式错误! ' ) ;
return ( ) ;
) ;
if ( player == null ,
for ( keys ( system_info ( ' server_whitelist ' ) ) ,
restore_from_stat ( scoreboard , _ , ' custom ' , ' traded_with_villager ' ) ;
) ;
return ( ) ;
) ;
restore_from_stat ( scoreboard , player , ' custom ' , ' traded_with_villager ' ) ;
return ( ) ;
) ;
command_player ( boolean ) - > (
print ( run ( ' carpet setDefault commandPlayer ' + str ( boolean ) ) : 1 : 0 ) ;
restore_from_stat ( scoreboard , player , category , entry ) - > (
scoreboard ( scoreboard , player , statistic ( player , category , entry ) ) ;
) ;
append_from_stat ( scoreboard , player , category , entry ) - > (
scoreboard ( scoreboard , player ,
statistic ( player , category , entry ) + scoreboard ( scoreboard , player )
) ;
) ;
/ / 修改地毯假人规则
carpet_command_player ( level ) - > (
print ( run ( ' carpet setDefault commandPlayer ' + level ) : 1 : 0 ) ;
return ( ) ;
) ;
/ / 设置玩家的计分板分数
command_set ( player , scoreboard , score ) - > (
i = scoreboard ( scoreboard , player , score ) ;
print ( ' 玩家 ' + player + ' 修改前的分数为: ' + i ) ;
recalculate_total_score ( scoreboard ) ;
return ( i ) ;
) ;
/ / 工具函数
@@ -331,4 +561,9 @@ contains(list, value) -> (
debug ( msg ) - > (
logger ( ' debug ' , msg ) ;
return ( ) ;
) ;
require_not_null ( value ) - > (
if ( value == null , throw ( ' 空指针异常! ' ) ) ;
return ( value ) ;
) ;