diff --git a/DEVDOC.md b/DEVDOC.md index d9cf107..dbe4f58 100644 --- a/DEVDOC.md +++ b/DEVDOC.md @@ -25,11 +25,6 @@ - 函数调用尽量不要使用`function`命令,应改在标签中按顺序调用! -## 未来计划 -- 细化版本管理,提供不同版本之间的升级函数,由`update_manager`控制。*务必仔细测试再发布,一旦升级无法降级!* -- playerdata相关功能 - - ## 系统模块 ### 频繁使用的计算单元 diff --git a/README.md b/README.md index d9e82a2..7600adb 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,12 @@ - 可避免Carpet假人污染计分板 - 执行 `reload` 指令后自动生效 - 子命令( `/fzsd_score <子命令>` ): - - `update_from `:用于从给定的数据包版本恢复计分板数据(需要测试!) - - `recalculate_total`:重新计算总分 + - `updateFrom `:用于从给定的数据包版本恢复计分板数据(需要测试!) + - `recalculate`:重新计算所有计分板总分 + - `recalculate `:重新计算该计分板总分 + - `reset `:重置该玩家的所有分数 + - `reset `:重置该玩家该计分板的分数 + - `commandPlayer `:设置player命令权限类型 ### 其他 - 见游戏内交互器按钮 diff --git a/scripts/fzsd_score.sc b/scripts/fzsd_score.sc index 218da82..38d7be0 100644 --- a/scripts/fzsd_score.sc +++ b/scripts/fzsd_score.sc @@ -1,7 +1,7 @@ // 计分板模块扩展插件 // 忽略假人分数 // **请勿修改文件名!!** -global_app_version = '1.0-beta.10'; +global_app_version = '1.0-beta.12'; global_current_scoreboard_list = [ 'fzsd.module.scoreboard.display.activation', 'fzsd.module.scoreboard.display.damage_taken', @@ -14,6 +14,7 @@ global_current_scoreboard_list = [ 'fzsd.module.scoreboard.display.aviating_distance', 'fzsd.module.scoreboard.display.placement_count' ]; +global_app_name = system_info('app_name'); __config() -> { 'scope' -> 'global', @@ -21,20 +22,34 @@ __config() -> { 'carpet' -> '>=1.4.45', 'minecraft' -> '>=1.17' }, - 'command_permission' -> 4, + 'command_permission' -> 2, 'commands' -> { '' -> 'help', 'help' -> 'help', - 'deleteOld ' -> 'delete_old', - 'updateFrom ' -> 'update_from', - 'restoreFrom' -> 'restore_from', + 'delete ' -> 'command_delete', + 'update ' -> 'command_update', + 'restore whitelist' -> ['command_restore', null, null], + 'restore whitelist ' -> _(scoreboardID) -> command_restore(null, scoreboardID), + 'restore player ' -> ['command_restore', null], + 'restore player ' -> 'command_restore', + 'restore whitelist ' -> _(custom, trade_count) -> command_restore_trade_count_confirm(custom, null, trade_count), + 'restore player ' -> 'command_restore_trade_count_confirm', 'recalculate ' -> 'recalculate_total_score', - 'recalculate' -> 'recalculate_total_scores', - 'commandPlayer ' -> 'command_player', - 'reset ' -> 'reset', - 'reset ' -> ['reset', null] + 'recalculate' -> ['recalculate_total_score', null], + 'commandPlayer ' -> 'carpet_command_player', + 'reset ' -> 'command_reset', + 'reset ' -> ['command_reset', null], + 'set ' -> 'command_set' }, 'arguments' -> { + 'trade_count' -> { + 'type' -> 'term', + 'suggest' -> ['fzsd.module.scoreboard.display.trade_count'] + }, + 'playerName' -> { + 'type' -> 'term', + 'suggester' -> _(args) -> player('all') + }, 'scoreboardID' -> { 'type' -> 'term', 'suggest' -> global_current_scoreboard_list @@ -43,10 +58,15 @@ __config() -> { 'type' -> 'term', 'suggester' -> _(args) -> get_scoreboard_player_list() }, - 'boolean' -> { - 'type' -> 'bool' + 'permissionType' -> { + 'type' -> 'term', + 'suggest' -> [ + 'true', + 'false', + 'ops' + ] }, - 'updateFrom' -> { + 'version' -> { 'type' -> 'term', 'suggest' -> [ '2.x', @@ -55,14 +75,13 @@ __config() -> { '3.0-beta.10' ] }, - 'deleteOld' -> { + 'score' -> { + 'type' -> 'int', + 'suggest' -> [] + }, + 'custom' -> { 'type' -> 'term', - 'suggest' -> [ - '2.x', - '3.0-beta.4', - '3.0-beta.9', - '3.0-beta.10' - ] + 'suggest' -> [] } } }; @@ -102,8 +121,8 @@ __on_player_disconnects(player, reason) -> ( try_restore_team_from_cache(player); ); +// 获取所有计分板下的所有玩家列表 get_scoreboard_player_list() -> ( - // 获取所有计分板下的所有玩家列表 set = m(); for(global_current_scoreboard_list, for(scoreboard(_), @@ -115,24 +134,23 @@ get_scoreboard_player_list() -> ( return(keys(set)); ); -reset(player, scoreboard) -> ( +// 重置玩家计分板分数 +command_reset(player, scoreboard) -> ( if(scoreboard == null, - ( - for(global_current_scoreboard_list, - scoreboard_remove(_, player); - ); - recalculate_total_scores(); - print('已重置' + player + '的所有分数'); - ), - ( - scoreboard_remove(scoreboard, player); - recalculate_total_score(scoreboard); - print('已重置' + player + '的' + scoreboard + '分数'); - ) + 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'; @@ -154,7 +172,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'); @@ -184,18 +203,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', ( @@ -211,7 +231,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', ( @@ -228,16 +248,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)); @@ -270,7 +291,8 @@ merge_score(from, to, fzsd_version) -> ( return(); ); -// 因为新计分板允许玩家自定义显示的总榜名称,故续做复杂判断才能使脚本确定之 +// 获取承载总榜数据的玩家名 +// 因为新计分板允许玩家自定义显示的总榜名称,故做复杂判断才能使脚本确定用来承载总榜数据的玩家名 get_total_score_name_new(scoreboard) -> ( INT_MIN = -2147483648; // 获取系统总榜id @@ -290,7 +312,7 @@ get_total_score_name_new(scoreboard) -> ( // 将总分赋值到显示计分板上 display_total_score(scoreboard); - // 查找榜内最低分 + // 查找显示计分板内的最低分玩家名 last_min_player = null; for(scoreboard(scoreboard), if(last_min_player == null, @@ -314,17 +336,16 @@ get_total_score_name_new(scoreboard) -> ( ); display_total_score(scoreboard); - // 返回榜内最低分的名称 + // 返回榜内最低分的玩家名(承载总榜数据的玩家名) return(last_min_player); ); -recalculate_total_scores() -> ( - for(global_current_scoreboard_list, recalculate_total_score(_)); - print('已重新计算总分!'); - return(); -); - +// 重算总分,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; @@ -343,6 +364,7 @@ recalculate_total_score(scoreboard) -> ( return(); ); +// 使用数据包函数标签将总分赋值到显示计分板上 display_total_score(scoreboard) -> ( // 获取计算总榜的函数标签名 str_1 = split('\\.', scoreboard); @@ -352,21 +374,126 @@ display_total_score(scoreboard) -> ( return(); ); -restore_from() -> ( - print('暂未开发'); +// 恢复计分板分数,player == null 时恢复所有玩家分数,scoreboard == null 时恢复所有计分板分数 +command_restore(player, scoreboard) -> ( + if(player == null, + for(keys(system_info('server_whitelist')), restore_score(_, scoreboard)); + if(scoreboard == null, + print('已恢复所有玩家的所有分数') + , + print('已恢复所有玩家的' + scoreboard + '分数'); + ); + return(); + ); + if(scoreboard == null, + for(global_current_scoreboard_list, restore_score(player, _)); + print('已恢复' + player + '的所有分数'); + return(); + ); + if(restore_score(player, scoreboard), + print('已恢复' + player + '的' + scoreboard + '分数'); + ); return(); ); -merge_stat(scoreboard, ...stats) -> ( - print('暂未开发'); +// 恢复玩家的计分板分数 +restore_score(player, scoreboard) -> ( + 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', + restore_from_stat(scoreboard, player, 'custom', 'damage_taken'); + , + 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', + ( + 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); + ), + scoreboard == 'fzsd.module.scoreboard.display.bedrock_broken_count', + ( + print('无法还原破基岩榜,已忽略'); + 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!'); + return(false); + ); + recalculate_total_score(scoreboard); + 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); +); + // 工具函数 contains(list, value) -> ( @@ -376,4 +503,4 @@ contains(list, value) -> ( debug(msg) -> ( logger('debug', msg); return(); -); \ No newline at end of file +);