Compare commits

...

7 Commits
v0.2.0 ... main

Author SHA1 Message Date
3cdd7997d6
Add chinese translation
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-08 16:24:37 +08:00
7999bc1d7b
Fix i18n dump filename
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-07 11:57:51 +08:00
291a3e420e
Add locate button in player list
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-07 11:13:26 +08:00
b210ac6cc0
Fix typo
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-07 10:09:16 +08:00
0918848402
Add player list command
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-07 10:05:05 +08:00
16dd19ab7f
Fix i18n strings with format
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-07 08:23:22 +08:00
66b93b81cd
Fancy prints and i18n basics
Signed-off-by: szdytom <szdytom@qq.com>
2023-10-06 17:56:32 +08:00
10 changed files with 577 additions and 195 deletions

View File

@ -1,6 +1,6 @@
# icollect-alpha # icollect-alpha
ICollect-Alpha 是一个使用 Carpet 脚本的“物品收集x狼人杀 Minecraft小游戏”实现。 ICollect-Alpha 是一个使用 [Carpet 脚本](https://github.com/gnembon/fabric-carpet) 的“物品收集x狼人杀 Minecraft小游戏”实现。
## 规则 ## 规则
@ -17,22 +17,23 @@ ICollect-Alpha 是一个使用 Carpet 脚本的“物品收集x狼人杀 Minecra
3. 每10分钟会有一个投票环节投票为一人一票不记名投票后不可撤销。所有玩家都可以把票投给一个自己怀疑是狼人的玩家票数最高者出局。可以投弃权票如果票数最高者有多人得票数相同或票数最高者得票数不严格多于弃权票数量则该轮投票无人出局。 3. 每10分钟会有一个投票环节投票为一人一票不记名投票后不可撤销。所有玩家都可以把票投给一个自己怀疑是狼人的玩家票数最高者出局。可以投弃权票如果票数最高者有多人得票数相同或票数最高者得票数不严格多于弃权票数量则该轮投票无人出局。
4. 如果好人阵营没能在规定时间内完成收集任务则坏人阵营获胜。反之如果好人阵营成功完成6个物品的收集则好人阵营获胜。 4. 如果好人阵营没能在规定时间内完成收集任务则坏人阵营获胜。反之如果好人阵营成功完成6个物品的收集则好人阵营获胜。
5. 每个玩家只有一条生命,被杀死、票死或者因为环境而死的玩家将变成旁观者模式。在准备阶段内死亡不会变成旁观者,而是会正常复活。 5. 每个玩家只有一条生命,被杀死、票死或者因为环境而死的玩家将变成旁观者模式。在准备阶段内死亡不会变成旁观者,而是会正常复活。
6. 游戏过程中玩家获得持续的生命回复II和伤害吸收III20秒更新一次状态效果为30秒 6. 游戏过程中玩家获得持续的生命回复II和伤害吸收III10秒更新一次状态效果为20秒
【望远镜的特殊能力】 【望远镜的特殊能力】
1. 发射火球发射与TNT爆炸威力相同的恶魂火球。 1. 发射火球发射与TNT爆炸威力相同的恶魂火球。
2. 发射烟花:发射可以造成大量伤害的烟花火箭。 2. 发射烟花:发射可以造成大量伤害的烟花火箭。
3. 建筑烟花发射在其下方生成道路的烟花火箭道路建筑材料为_石化橡木台阶_ 3. 建筑烟花:发射在其下方生成道路的烟花火箭(道路建筑材料为 _石化橡木台阶_)。
【指令使用】 【指令使用】
1. `/ica`:列出物品收集目标和时限信息 1. `/ica`:列出物品收集目标、时限和玩家信息
2. `/ica submit <slot>`:递交一个目标要求的物品 2. `/ica submit <slot>`:递交一个目标要求的物品
3. `/ica me`:查看自己的身份 3. `/ica me`:查看自己的身份
4. `/ica seed`:查看地图种子 4. `/ica seed`:查看地图种子
5. `/ica refill`:刷新自己的烟花 5. `/ica refill`:刷新自己的烟花
6. `/ica locate <name>`:定位某一玩家位置,空手使用时可获得指向位置的指南针(不能跨维度定位) 6. `/ica locate <name>`:定位某一玩家位置,空手使用时可获得指向位置的指南针(不能跨维度定位)
7. `/ica spyglass <feature>`:切换望远镜的能力 7. `/ica spyglass <feature>`:切换望远镜的能力
7. `/ica ps`:查看玩家列表,狼人可看到队友
7. `/ica-vote`:查看当前投票状态信息 7. `/ica-vote`:查看当前投票状态信息
8. `/ica-vote abstain`:投弃权票 8. `/ica-vote abstain`:投弃权票
9. `/ica-vote sus <name>`:投票给某一玩家 9. `/ica-vote sus <name>`:投票给某一玩家
@ -41,16 +42,18 @@ ICollect-Alpha 是一个使用 Carpet 脚本的“物品收集x狼人杀 Minecra
## 管理员命令 ## 管理员命令
首先需要安装 Fabric 和 Fabric Carpet 模组,然后将 `src` 目录下的 `.sc` 代码复制到世界的 `script` 文件夹下。打开世界后,使用 `/script load ica-loader` 加载加载脚本,使用命令 `/ica-loader` 加载各个模块: 首先需要安装 [Fabric](https://fabricmc.net/)[Fabric Carpet](https://github.com/gnembon/fabric-carpet) 模组,然后将 `src` 目录下的 `.sc` 代码复制到世界的 `script` 文件夹下。打开世界后,使用 `/script load ica-loader` 加载加载脚本,使用命令 `/ica-loader` 加载各个模块:
- 使用 `/ica-setting career <career> <number>` 设置职业的玩家数量 - `/ica-setting career <career> <number>` 设置职业的玩家数量
- 使用 `/ica-setting add <item>` 设置一个未使用的收集目标 - `/ica-setting add <item>` 设置一个未使用的收集目标
- 使用 `/ica-setting set <slot> <item>` 设置一个指定的收集目标 - `/ica-setting set <slot> <item>` 设置一个指定的收集目标
- 使用 `/ica-admin confirm` 开始游戏,开始时请保证所有参与者在线 - `/ica-admin confirm` 开始游戏,开始时请保证所有参与者在线
## 调试命令 ## 调试命令
- 使用 `/ica-effect-applier enable` 强制启用状态效果广播 - `/ica-effect-applier enable` 强制启用状态效果广播
- 使用 `/ica-effect-applier enable` 强制禁用状态效果广播 - `/ica-effect-applier disable` 强制禁用状态效果广播
- 使用 `/ica-admin cancel` 终止游戏 - `/ica-admin reset` 终止游戏
- `/ica-i18n dump` 向 JSON 文件中写入本地化值
- `/bossbar set ica:prepare_counter value 20` 强制跳过准备阶段
- `/tick freeze` 冻结/解冻时间

View File

@ -2,14 +2,16 @@ __config() -> {
'scope' -> 'global', 'scope' -> 'global',
'command_permission' -> 'ops', 'command_permission' -> 'ops',
'commands' -> { 'commands' -> {
'' -> 'cmdList',
'list' -> 'cmdList', 'list' -> 'cmdList',
'confirm' -> 'cmdStart', 'confirm' -> 'cmdStart',
'reset clear' -> 'cmdResetClear', 'reset' -> 'cmdResetClear'
'reset schedule' -> 'cmdReschedule'
}, },
}; };
import('ica-libs', 'shuffleList', 'countCareer', 'playerListNbt', 'findVoteMax', 'resetVotes'); import('ica-libs', 'shuffleList', 'countCareer', 'playerListNbt'
, 'findVoteMax', 'resetVotes', 'getFirstUnsetGoal');
import('ica-i18n', 'getLocaleKey', 'useIcaInstead', 'startedReject');
__on_start() -> ( __on_start() -> (
if(nbt_storage('ica:data'):'Goals' == null, ( if(nbt_storage('ica:data'):'Goals' == null, (
@ -32,7 +34,8 @@ clearBossbars() -> (
cleanPlayerTags() -> ( cleanPlayerTags() -> (
for(player('all'), modify(_, 'clear_tag', ['ica.piggy' for(player('all'), modify(_, 'clear_tag', ['ica.piggy'
, 'ica.wolf', 'ica.hunter', 'ica.fireball_spyglasser', 'ica.spyglass_fireball' , 'ica.wolf', 'ica.hunter', 'ica.firework_hunter'
, 'ica.fireball_spyglasser', 'ica.spyglass_fireball'
, 'ica.voter', 'ica.flyer', 'ica.spyglasser_cooldown' , 'ica.voter', 'ica.flyer', 'ica.spyglasser_cooldown'
, 'ica.coordinator', 'ica.deceased', 'ica.participant' , 'ica.coordinator', 'ica.deceased', 'ica.participant'
, 'ica.firework_spyglasser', 'ica.build_spyglasser' , 'ica.firework_spyglasser', 'ica.build_spyglasser'
@ -103,47 +106,38 @@ endGameTitle(p, m, s) -> (
); );
endTimeout(iv) -> ( endTimeout(iv) -> (
endGameTitle(getPigPlayers(), 'Timeout!' endGameTitle(getPigPlayers(), getLocaleKey('pig.timeout.title')
, str('You didn\'t complete %d goals in time.', iv)); , str(getLocaleKey('pig.timeout.subtitle'), iv));
endGameTitle(getWolfPlayers(), 'You won!' endGameTitle(getWolfPlayers(), getLocaleKey('wolf.timeout.title')
, str('Those fools have failed, good job.', iv)); , str(getLocaleKey('wolf.timeout.subtitle'), iv));
endCleanup(); endCleanup();
); );
endFinish() -> ( endFinish() -> (
endGameTitle(getPigPlayers(), 'Congratulations!', 'You have completed all the goals.'); endGameTitle(getPigPlayers(), getLocaleKey('pig.complete.title')
endGameTitle(getWolfPlayers(), 'Oh no!' , getLocaleKey('pig.complete.subtitle'));
, str('They have completed all the goals.', iv)); endGameTitle(getWolfPlayers(), getLocaleKey('wolf.complete.title')
, getLocaleKey('wolf.complete.subtitle'));
endCleanup(); endCleanup();
); );
getFirstUnsetGoal() -> (
c_for(i = 0, i <= 5, i = i + 1, (
p = nbt_storage('ica:data'):str('Goals[{Slot: %db}]', i);
if(p == null, (
return(i);
))
));
return(6);
);
actionbarMessage(msg) -> ( actionbarMessage(msg) -> (
display_title(player('all'), 'actionbar', msg, 100, 100, 100); display_title(player('all'), 'actionbar', msg, 100, 100, 100);
); );
warnDeadline(dt) -> ( warnDeadline(dt) -> (
if (dt == 1200, ( if (dt == 1200, (
actionbarMessage('[WARN] Submission deadline in 1 minute.'); actionbarMessage(getLocaleKey('submit.ddl.1'));
)); ));
if (dt == 600, ( if (dt == 600, (
actionbarMessage('[WARN] Submission deadline in 30 seconds.'); actionbarMessage(str(getLocaleKey('submit.ddl.2'), 30));
)); ));
if (dt == 300, ( if (dt == 300, (
actionbarMessage('[WARN] Submission deadline in 15 seconds.'); actionbarMessage(str(getLocaleKey('submit.ddl.2'), 15));
)); ));
if (dt <= 200 && dt % 20 == 0, ( if (dt <= 200 && dt % 20 == 0, (
actionbarMessage(str('[WARN] Submission deadline in %d second%s!' actionbarMessage(str(getLocaleKey(if(dt > 20, 'submit.ddl.2'
, dt / 20, if(dt > 20, 's', ''))); , 'submit.ddl.3')), dt / 20));
)); ));
); );
@ -153,26 +147,27 @@ electionKill(pname) -> (
modify(p, 'tag', 'ica.deceased'); modify(p, 'tag', 'ica.deceased');
modify(p, 'gamemode', 'spectator'); modify(p, 'gamemode', 'spectator');
)); ));
print(player('all'), str('Election victim %s killed.', pname)) print(player('all'), str(getLocaleKey('election.kill'), pname))
); );
checkVotes(tm) -> ( checkVotes(tm) -> (
if(tm % 12000 == 3600, ( if(tm % 12000 == 3600, (
actionbarMessage('[WARN] Vote ends in 1 minute'); actionbarMessage(getLocaleKey('election.ddl'));
return(false); return(false);
)); ));
if(tm % 12000 == 2400, ( if(tm % 12000 == 2400, (
max_p = findVoteMax(); max_p = findVoteMax();
phint = if(max_p == null, ( phint = if(max_p == null, (
'nobody was elected' getLocaleKey('election.result.nobody')
), ( ), (
ele_p = player(max_p); ele_p = player(max_p);
schedule(200, 'electionKill', ele_p); schedule(200, 'electionKill', ele_p);
print(ele_p, '[WARN] You were elected! You will be killed in 10 seconds.'); print(ele_p, getLocaleKey('election.result.kill'));
str('elected player %s', max_p) max_p
)); ));
resetVotes(); resetVotes();
print(player('all'), str('Election result: %s.\nNew eletion round started.', phint)); print(player('all'), str(getLocaleKey('election.result'), phint));
print(player('all'), getLocaleKey('election.new'))
)); ));
); );
@ -196,8 +191,10 @@ startCollectStage() -> (
schedule(20, 'runUpdateCollect'); schedule(20, 'runUpdateCollect');
clearBossbars(); clearBossbars();
createBossbar('ica:time_counter', 'Time Left', tm_total(), 'notched_6'); createBossbar('ica:time_counter', format('b ' + getLocaleKey('bossbar.time.title'))
createBossbar('ica:collected', 'Collected', 6, 'notched_6'); , tm_total(), 'notched_6');
createBossbar('ica:collected', format('b ' + getLocaleKey('bossbar.progress.title'))
, 6, 'notched_6');
bossbar('ica:collected', 'value', 0); bossbar('ica:collected', 'value', 0);
for(player('all'), ( for(player('all'), (
@ -236,14 +233,6 @@ cmdResetClear() -> (
endCleanup(); endCleanup();
); );
cmdReschedule() -> (
if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.');
return(false)
));
schedule('runUpdateCollect', 20);
);
runUpdatePrepare() -> ( runUpdatePrepare() -> (
if(!nbt_storage('ica:data'):'Started', return()); if(!nbt_storage('ica:data'):'Started', return());
if(!nbt_storage('ica:data'):'Preparing', return()); if(!nbt_storage('ica:data'):'Preparing', return());
@ -259,12 +248,12 @@ runUpdatePrepare() -> (
cmdStart() -> ( cmdStart() -> (
missing_goal = getFirstUnsetGoal(); missing_goal = getFirstUnsetGoal();
if(missing_goal <= 5, ( if(missing_goal <= 5, (
print(str('Goal #%d is unset.', missing_goal)); print(str(getLocaleKey('reject.goal.missing'), missing_goal));
return(false) return(false)
)); ));
if(nbt_storage('ica:data'):'Started', ( if(nbt_storage('ica:data'):'Started', (
print('Already started, use /ica-admin reset clear to cancel.'); startedReject();
return(false) return(false)
)); ));
@ -275,7 +264,7 @@ cmdStart() -> (
builder_n = countCareer('builder') + hunter_n; builder_n = countCareer('builder') + hunter_n;
firework_hunter_n = countCareer('firework_hunter') + builder_n; firework_hunter_n = countCareer('firework_hunter') + builder_n;
if(firework_hunter_n > length(participants_list), ( if(firework_hunter_n > length(participants_list), (
print('Not enough players online.'); print(getLocaleKey('reject.leckplayer'));
return(false); return(false);
)); ));
@ -283,7 +272,8 @@ cmdStart() -> (
put(nbt_storage('ica:data'):'Preparing', '1b'); put(nbt_storage('ica:data'):'Preparing', '1b');
put(nbt_storage('ica:data'):'Goals[].Completed', '0b'); put(nbt_storage('ica:data'):'Goals[].Completed', '0b');
createBossbar('ica:prepare_counter', 'Preparing', tm_prepare(), null); createBossbar('ica:prepare_counter', format('b ' + getLocaleKey('bossbar.prepare.title'))
, tm_prepare(), null);
schedule(20, 'runUpdatePrepare'); schedule(20, 'runUpdatePrepare');
cleanPlayerTags(); cleanPlayerTags();
@ -292,7 +282,7 @@ cmdStart() -> (
for(participants_list, ( for(participants_list, (
modify(_, 'tag', ['ica.voter', 'ica.flyer', 'ica.participant']); modify(_, 'tag', ['ica.voter', 'ica.flyer', 'ica.participant']);
career_tag = 'ica.piggy'; career_tag = 'ica.piggy';
if(_i < firework_hunter_n, career_tag = ['ica.hunter_firework', 'ica.firework_spyglasser', 'ica.spyglasser_cooldown']); if(_i < firework_hunter_n, career_tag = ['ica.firework_hunter', 'ica.firework_spyglasser', 'ica.spyglasser_cooldown']);
if(_i < builder_n, career_tag = ['ica.builder', 'ica.build_spyglasser']); if(_i < builder_n, career_tag = ['ica.builder', 'ica.build_spyglasser']);
if(_i < hunter_n, career_tag = ['ica.hunter', 'ica.fireball_spyglasser', 'ica.spyglasser_cooldown']); if(_i < hunter_n, career_tag = ['ica.hunter', 'ica.fireball_spyglasser', 'ica.spyglasser_cooldown']);
if(_i < wolf_n, career_tag = ['ica.wolf', 'ica.fireball_spyglasser', 'ica.firework_spyglasser', 'ica.build_spyglasser', 'ica.coordinator']); if(_i < wolf_n, career_tag = ['ica.wolf', 'ica.fireball_spyglasser', 'ica.firework_spyglasser', 'ica.build_spyglasser', 'ica.coordinator']);
@ -308,10 +298,10 @@ cmdStart() -> (
run('gamerule keepInventory true'); run('gamerule keepInventory true');
run('gamerule playersSleepingPercentage 0'); run('gamerule playersSleepingPercentage 0');
run('gamerule randomTickSpeed 12'); run('gamerule randomTickSpeed 12');
run('worldborder set 10000'); run('worldborder set 20000');
); );
cmdList() -> ( cmdList() -> (
print('please use /ica instead'); useIcaInstead();
run('/ica'); run('/ica list');
); );

View File

@ -10,22 +10,24 @@ __config() -> {
}, },
}; };
import('ica-i18n', 'getLocaleKey');
getStatus() -> ( getStatus() -> (
if(global_enabled, ( if(global_enabled, (
print('effect-applier: on') print(getLocaleKey('effect-applier.on'));
), ( ), (
print('effect-applier: off') print(getLocaleKey('effect-applier.off'));
)) ))
); );
updateEffects() -> ( updateEffects() -> (
if(global_enabled, ( if(global_enabled, (
for(player('all'), ( for(player('all'), (
modify(_, 'effect', 'regeneration', 600, 1, false, true); modify(_, 'effect', 'regeneration', 400, 1, false, true);
modify(_, 'effect', 'absorption', 600, 2, false, true); modify(_, 'effect', 'absorption', 400, 2, false, true);
)); ));
)); ));
schedule(400, 'updateEffects'); schedule(200, 'updateEffects');
); );
setBlock(pos, use_upper_half) -> ( setBlock(pos, use_upper_half) -> (

308
src/ica-i18n.sc Normal file
View File

@ -0,0 +1,308 @@
__config() -> {
'scope' -> 'global',
'exports' -> ['getLocaleKey', 'useIcaInstead', 'startedReject', 'pendingReject'],
'command_permission' -> 'ops',
'commands' -> {
'dump' -> 'cmdDump',
},
};
global_TranslateKeysEnCN = {
'pig.timeout.title' -> 'Timeout!',
'pig.timeout.subtitle' -> 'You didn\'t complete %d goals in time',
'wolf.timeout.title' -> 'You won!',
'wolf.timeout.subtitle' -> 'Those fools have failed, good job',
'pig.complete.title' -> 'Congratulations!',
'pig.complete.subtitle' -> 'You have completed all the goals',
'wolf.complete.title' -> 'Oh no!',
'wolf.complete.subtitle' -> 'They have completed all the goals',
'submit.ddl.1' -> '[WARN] Submission deadline in 1 minute.',
'submit.ddl.2' -> '[WARN] Submission deadline in %d seconds.',
'submit.ddl.3' -> '[WARN] Submission deadline in %d second.',
'submit.success' -> 'OK.',
'submit.missing.before' -> 'Item ',
'submit.missing.after' -> ' not found.',
'submit.already.before' -> 'Item ',
'submit.already.after' -> ' has already been collected.',
'election.kill' -> 'Election victim %s killed.',
'election.ddl' -> '[WARN] Vote ends in 1 minute.',
'election.result.nobody' -> 'nobody was elected',
'election.result.kill' -> '[WARN] You were elected! You will be killed in 10 seconds.',
'election.new' -> 'New election round started.',
'election.result' -> 'Election result: %s.',
'hint.instead.before' -> 'Please use ',
'hint.instead.after' -> ' instead.',
'hint.allset.before' -> 'All goals are set, you can use ',
'hint.allset.after' -> ' to start.',
'goal.set.before' -> 'Goal #%d set to ',
'goal.set.after' -> '.',
'bossbar.prepare.title' -> 'Preparing',
'bossbar.time.title' -> 'Time Left',
'bossbar.progress.title' -> 'Collected',
'career.display.title' -> 'Career configs are:',
'career.display.wolf' -> ' - Wolf: %d participants.',
'career.display.hunter' -> ' - Hunter(Fireball): %d participants.',
'career.display.firework_hunter' -> ' - Hunter(Firework): %d participants.',
'career.display.builder' -> ' - Builder: %d participants.',
'career.display.piggy' -> ' - Piggies: whatever the rest.',
'career.set' -> 'Career %s set to %d participants.',
'career.title.bystander' -> 'Bystander',
'career.title.piggy' -> 'Piggy',
'career.title.hunter' -> 'Hunter(Fireball)',
'career.title.firework_hunter' -> 'Hunter(Firework)',
'career.title.builder' -> 'Builder',
'career.title.wolf' -> 'Wolf',
'career.help.bystander' -> 'You have nothing to do, just watch.',
'career.help.piggy' -> 'Complete all goals in time to win!',
'career.help.hunter' -> 'Protect piggies and kill the wolf.',
'career.help.firework_hunter' -> 'Protect piggies and kill the wolf.',
'career.help.builder' -> 'Build protections and complete the goals!',
'career.help.wolf' -> 'Hide yourself and stop them to complete the goals!',
'career.whoami' -> 'You are %s: %s',
'ablity.title.voter' -> 'Voter',
'ablity.title.flyer' -> 'Flyer',
'ablity.title.fireball_spyglasser' -> 'Shooter',
'ablity.title.firework_spyglasser' -> 'Launcher',
'ablity.title.build_spyglasser' -> 'Builder',
'ablity.title.coordinator' -> 'Coordinator',
'ablity.help.voter' -> 'You can vote.',
'ablity.help.flyer' -> 'You can fly with an elytra.',
'ablity.help.fireball_spyglasser' -> 'You can shoot fireballs with a spyglass(except prepare stage).',
'ablity.help.firework_spyglasser' -> 'You can launch fireworks with a spyglass(except prepare stage).',
'ablity.help.build_spyglasser' -> 'You can build paths with a spyglass(except prepare stage).',
'ablity.help.coordinator' -> 'You can locate other participants.',
'ablity.format' -> '[ablity] %s: %s',
'reject.pending.before' -> 'Not started, use ',
'reject.pending.after' -> ' to start.',
'reject.started.before' -> 'Already started, use ',
'reject.started.after' -> ' to cancel.',
'reject.leckplayer' -> 'Not enough players are online.',
'reject.goal.missing' -> 'Goal #%d is unset.',
'reject.goal.enough.before' -> 'All are goals set, please use ',
'reject.goal.enough.after' -> ' to replace.',
'reject.spyglass' -> 'Spyglass too hot, please wait another %.2f seconds to use again.',
'reject.unable' -> 'You don\'t have this ability.',
'reject.bystand' -> 'You can only bystand.',
'reject.reparing.submit' -> 'Currently preparing, please submit later.',
'reject.reparing.switch' -> 'Currently preparing, please switch later.',
'list.title.pending' -> 'Pending:',
'list.title.collecting' -> 'Collecting, %d seconds left, %d are goals done:',
'list.title.preparing' -> 'Perparing, %d seconds to collect stage:',
'list.item.unset' -> 'unset',
'list.item.submit' -> '[Click To Submit]',
'list.marker.0' -> ' - ',
'list.marker.1' -> ' + ',
'list.item.id' -> '#%d: ',
'vote.title' -> 'There are %d candidates:',
'vote.deceased' -> '[Deceased]',
'vote.amount.1' -> '[%02d vote] ',
'vote.amount.2' -> '[%02d votes] ',
'vote.footer' -> 'Current elected: ',
'vote.nobody' -> '(nobody)',
'vote.abstain' -> '(abstain)',
'vote.button.vote' -> '[Click To Vote]',
'vote.button.abstain' -> '[Click To Abstain]',
'vote.marker' -> ' - ',
'vote.already' -> 'You have already voted.',
'vote.notfound' -> 'Candidate %s not found.',
'vote.success' -> 'OK.',
'locate.notfound' -> 'Player %s not found.',
'locate.offline' -> 'Player %s is not online.',
'seed.title' -> 'Map Seed: ',
'ps.wolf' -> '[Wolf]',
'ps.button.locate' -> '[Click To Locate]',
'ps.marker' -> ' - ',
'ps.me' -> '[You]',
'ps.offline' -> '[Offline]',
'ps.title' -> 'There are %d participants:',
'misc.clipboard' -> 'Click To Copy',
'effect-applier.on' -> 'effect-applier status: enabled.',
'effect-applier.off' -> 'effect-applier status: disabled.',
'license.header' -> 'ICollect-Alpha, Copyright (C) 2023 %s\nICollect-Alpha comes with ABSOLUTELY NO WARRANTY;\nfor details type \'/ica-loader show w\'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type \'/ica-loader show c\' for details.'
};
global_TranslateKeysZhHans = {
'pig.timeout.title' -> '超时!',
'pig.timeout.subtitle' -> '%d 个收集目标超时',
'wolf.timeout.title' -> '取得胜利!',
'wolf.timeout.subtitle' -> '他们的收集任务失败了,做得好',
'pig.complete.title' -> '恭喜!',
'pig.complete.subtitle' -> '全部目标物品已集齐',
'wolf.complete.title' -> '失败',
'wolf.complete.subtitle' -> '他们已完成全部收集任务',
'submit.ddl.1' -> '[注意] 提交将在 1 分钟内结束。',
'submit.ddl.2' -> '[注意] 提交将在 %d 秒钟内结束。',
'submit.ddl.3' -> '[注意] 提交将在 %d 秒钟内结束。',
'submit.success' -> '提交成功。',
'submit.missing.before' -> '未找到',
'submit.missing.after' -> '',
'submit.already.before' -> '重复提交',
'submit.already.after' -> '',
'election.kill' -> '%s 已被票出。',
'election.ddl' -> '[注意] 本轮投票将在 1 分钟内结束。',
'election.result.nobody' -> '无人被票出',
'election.result.kill' -> '[注意] 你已被票出!你将在 10 秒内出局。',
'election.new' -> '新一轮投票已开始。',
'election.result' -> '票选结果:%s',
'hint.instead.before' -> '请使用命令 ',
'hint.instead.after' -> '',
'hint.allset.before' -> '全部目标已设置,你可以使用命令 ',
'hint.allset.after' -> ' 开始游戏',
'goal.set.before' -> '目标 %d 已设置为 ',
'goal.set.after' -> '',
'bossbar.prepare.title' -> '准备阶段',
'bossbar.time.title' -> '收集中',
'bossbar.progress.title' -> '收集进度',
'career.display.title' -> '身份职业配置为:',
'career.display.wolf' -> ' - 狼人:%d 个玩家。',
'career.display.hunter' -> ' - 火球猎人:%d 个玩家。',
'career.display.firework_hunter' -> ' - 烟花猎人:%d 个玩家。',
'career.display.builder' -> ' - 建筑师:%d 个玩家。',
'career.display.piggy' -> ' - 平民:其余全部玩家。',
'career.set' -> '%s已设为 %d 个玩家。',
'career.title.bystander' -> '旁观者',
'career.title.piggy' -> '平民',
'career.title.hunter' -> '火球猎人',
'career.title.firework_hunter' -> '烟花猎人',
'career.title.builder' -> '建筑师',
'career.title.wolf' -> '狼人',
'career.help.bystander' -> '你只能旁观。',
'career.help.piggy' -> '完成全部收集任务以取得胜利!',
'career.help.hunter' -> '保护平民,找出并杀死狼人,完成全部收集任务。',
'career.help.firework_hunter' -> '保护平民,找出并杀死狼人,完成全部收集任务。',
'career.help.builder' -> '建筑防御并完成全部收集任务。',
'career.help.wolf' -> '隐藏自己的身份,阻止他们完成收集目标。',
'career.whoami' -> '你是%s%s',
'ablity.title.voter' -> '投票',
'ablity.title.flyer' -> '飞行',
'ablity.title.fireball_spyglasser' -> '火球',
'ablity.title.firework_spyglasser' -> '烟花',
'ablity.title.build_spyglasser' -> '筑路',
'ablity.title.coordinator' -> '追踪',
'ablity.help.voter' -> '你可以投票。',
'ablity.help.flyer' -> '你可以使用鞘翅飞行。',
'ablity.help.fireball_spyglasser' -> '你可以使用望远镜发射恶魂火球(准备阶段除外)。',
'ablity.help.firework_spyglasser' -> '你可以使用望远镜发射烟花火箭(准备阶段除外)。',
'ablity.help.build_spyglasser' -> '你可以使用望远镜建筑道路(准备阶段除外)。',
'ablity.help.coordinator' -> '你可以定位其他玩家。',
'ablity.format' -> '[能力] %s%s',
'reject.pending.before' -> '游戏还未开始,请使用命令 ',
'reject.pending.after' -> ' 以开始游戏。',
'reject.started.before' -> '游戏已开始,请使用命令 ',
'reject.started.after' -> ' 以中断游戏。',
'reject.leckplayer' -> '在线玩家数不足,游戏无法开始。',
'reject.goal.missing' -> '%d 个收集目标尚未设置。',
'reject.goal.enough.before' -> '全部目标已设置,请使用命令 ',
'reject.goal.enough.after' -> ' 修改目标。',
'reject.spyglass' -> '冷却中,距离可再次使用剩余 %.2f 秒。',
'reject.unable' -> '你没有此能力。',
'reject.bystand' -> '你只能旁观。',
'reject.reparing.submit' -> '请在准备阶段结束后提交。',
'reject.reparing.switch' -> '请在准备阶段结束后切换。',
'list.title.pending' -> '等待游戏开始:',
'list.title.collecting' -> '收集阶段剩余 %d 秒,%d 个任务已完成:',
'list.title.preparing' -> '准备阶段剩余 %d 秒:',
'list.item.unset' -> '未设置',
'list.item.submit' -> '[点此提交]',
'list.marker.0' -> ' - ',
'list.marker.1' -> ' + ',
'list.item.id' -> '#%d',
'vote.title' -> '共有 %d 个玩家:',
'vote.deceased' -> '[已死亡]',
'vote.amount.1' -> '[%02d票] ',
'vote.amount.2' -> '[%02d票] ',
'vote.footer' -> '当前得票数最多的玩家:',
'vote.nobody' -> '(无)',
'vote.abstain' -> '(弃权)',
'vote.button.vote' -> '[点此投票]',
'vote.button.abstain' -> '[点此弃权]',
'vote.marker' -> ' - ',
'vote.already' -> '你已投过票了。',
'vote.notfound' -> '未找到玩家 %s',
'vote.success' -> '投票成功。',
'locate.notfound' -> '未找到玩家 %s',
'locate.offline' -> '玩家 %s 不在线。',
'seed.title' -> '地图种子:',
'ps.wolf' -> '[狼人]',
'ps.button.locate' -> '[点此定位]',
'ps.marker' -> ' - ',
'ps.me' -> '[你]',
'ps.offline' -> '[离线]',
'ps.title' -> '共有 %d 个玩家:',
'misc.clipboard' -> '点此复制',
'effect-applier.on' -> '状态效果广播器:已启用。',
'effect-applier.off' -> '状态效果广播器:已禁用。',
'license.header' -> 'ICollect-Alpha版权所有 (C) 2023 %s\nICollect-Alpha 绝对不附带任何保证;\n请输入 \'/ica-loader show w\' 查看详情。\n这是自由软件,你可以在特定条款下重分发它。\n请输入 \'/ica-loader show c\' 查看详情。'
};
global_TranslateKeysEnabled = global_TranslateKeysZhHans;
getLocaleKey(keyid) -> (
if(has(global_TranslateKeysEnabled:keyid), global_TranslateKeysEnabled:keyid, 'tkey:' + keyid)
);
useIcaInstead() -> (
print(format('d ' + getLocaleKey('hint.instead.before')
, 'mb /ica list', '?/ica list'
, 'd ' + getLocaleKey('hint.instead.after')));
);
startedReject() -> (
print(format(' ' + getLocaleKey('reject.started.before')
, 'mb /ica-admin reset', '?/ica-admin reset'
, ' ' + getLocaleKey('reject.started.after')));
);
pendingReject() -> (
print(format(' ' + getLocaleKey('reject.pending.before')
, 'mb /ica-admin confirm', '?/ica-admin confirm'
, ' ' + getLocaleKey('reject.pending.after')));
);
cmdDump() -> (
write_file('ica-i18n-table', 'shared_json', global_TranslateKeysEnabled);
);

View File

@ -1,7 +1,8 @@
__config() -> { __config() -> {
'scope' -> 'global', 'scope' -> 'global',
'exports' -> ['shuffleList', 'countCareer', 'findVoteMax', 'resetVotes' 'exports' -> ['shuffleList', 'countCareer', 'findVoteMax', 'resetVotes'
, 'playerListNbt', 'listContain', 'countVotes', 'countAbstainVotes'], , 'playerListNbt', 'listContain', 'countVotes', 'countAbstainVotes'
, 'getFirstUnsetGoal'],
}; };
shuffleList(list) -> ( shuffleList(list) -> (
@ -75,3 +76,13 @@ findVoteMax() -> (
resetVotes() -> ( resetVotes() -> (
put(nbt_storage('ica:voting'), 'Votes', '[]'); put(nbt_storage('ica:voting'), 'Votes', '[]');
); );
getFirstUnsetGoal() -> (
c_for(i = 0, i <= 5, i = i + 1, (
p = nbt_storage('ica:data'):str('Goals[{Slot: %db}]', i);
if(p == null, (
return(i);
))
));
return(6);
);

View File

@ -8,9 +8,7 @@ __config() -> {
}, },
}; };
licenseHeader() -> ( import('ica-i18n', 'getLocaleKey');
'ICollect-Alpha, Copyright (C) 2023 方而静\nICollect-Alpha comes with ABSOLUTELY NO WARRANTY;\nfor details type \'/ica-loader show w\'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type \'/ica-loader show c\' for details.'
);
WarrantyInfo() -> ( WarrantyInfo() -> (
'NO WARRANTY\n 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n' 'NO WARRANTY\n 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n'
@ -21,13 +19,14 @@ CopyrightInfo() -> (
); );
cmdLoad() -> ( cmdLoad() -> (
print(licenseHeader()); print(str(getLocaleKey('license.header'), '方而静'));
run('script load ica-admin'); run('script load ica-admin');
run('script load ica-effect-applier'); run('script load ica-effect-applier');
run('script load ica-spyglass'); run('script load ica-spyglass');
run('script load ica'); run('script load ica');
run('script load ica-vote'); run('script load ica-vote');
run('script load ica-settings'); run('script load ica-settings');
run('script load ica-i18n');
); );
cmdShowW() -> ( cmdShowW() -> (

View File

@ -2,6 +2,7 @@ __config() -> {
'scope' -> 'global', 'scope' -> 'global',
'command_permission' -> 'ops', 'command_permission' -> 'ops',
'commands' -> { 'commands' -> {
'' -> 'cmdList',
'list' -> 'cmdList', 'list' -> 'cmdList',
'set <slot> <item>' -> 'cmdSet', 'set <slot> <item>' -> 'cmdSet',
'add <item>' -> 'cmdSetAppend', 'add <item>' -> 'cmdSetAppend',
@ -18,26 +19,17 @@ __config() -> {
}, },
}; };
import('ica-libs', 'countCareer'); import('ica-i18n', 'getLocaleKey', 'useIcaInstead', 'startedReject', 'pendingReject');
import('ica-libs', 'countCareer', 'getFirstUnsetGoal');
getFirstUnsetGoal() -> (
c_for(i = 0, i <= 5, i = i + 1, (
p = nbt_storage('ica:data'):str('Goals[{Slot: %db}]', i);
if(p == null, (
return(i);
))
));
return(6);
);
cmdList() -> ( cmdList() -> (
print('please use /ica instead'); useIcaInstead();
run('/ica'); run('/ica list');
); );
cmdSet(slot_id, goal_item_tuple) -> ( cmdSet(slot_id, goal_item_tuple) -> (
if(nbt_storage('ica:data'):'Started', ( if(nbt_storage('ica:data'):'Started', (
print('Already started, use /ica-admin reset clear to cancel.'); startedReject();
return(false) return(false)
)); ));
pkey = str('Goals[{Slot: %db}]', slot_id); pkey = str('Goals[{Slot: %db}]', slot_id);
@ -45,7 +37,14 @@ cmdSet(slot_id, goal_item_tuple) -> (
if(nbt_storage('ica:data'):pkey != null, delete(nbt_storage('ica:data'):pkey)); if(nbt_storage('ica:data'):pkey != null, delete(nbt_storage('ica:data'):pkey));
put(nbt_storage('ica:data'), 'Goals', etag, -1); put(nbt_storage('ica:data'), 'Goals', etag, -1);
print(str('Goal #%d set to %s.', slot_id, goal_item_tuple:0)) print(format(' ' + str(getLocaleKey('goal.set.before'), slot_id)
, 'b ' + item_display_name(goal_item_tuple:0), '^ minecraft:' + goal_item_tuple:0
, ' ' + getLocaleKey('goal.set.after')));
if(getFirstUnsetGoal() > 5, (
print(format(' ' + getLocaleKey('hint.allset.before')
, 'mb /ica-admin confirm', '?/ica-admin confirm'
, ' ' + getLocaleKey('hint.allset.after')));
));
); );
cmdSetAppend(goal_item_tuple) -> ( cmdSetAppend(goal_item_tuple) -> (
@ -53,20 +52,23 @@ cmdSetAppend(goal_item_tuple) -> (
if(missing_goal <= 5, ( if(missing_goal <= 5, (
cmdSet(missing_goal, goal_item_tuple) cmdSet(missing_goal, goal_item_tuple)
), ( ), (
print('All are goals set, please use /ica-settings set <slot> <item>.') print(format(' ' + getLocaleKey('reject.goal.enough.before')
, 'mb /ica-settings set <slot> <item>', '?/ica-settings set '
, ' ' + getLocaleKey('reject.goal.enough.after')));
)); ));
); );
cmdListCareers() -> ( cmdListCareers() -> (
print('Career configs are:'); print(getLocaleKey('career.display.title'));
print(str(' - Wolf: %d participants.', countCareer('wolf'))); for(['wolf', 'hunter', 'firework_hunter', 'builder'], (
print(str(' - Hunter: %d participants.', countCareer('hunter'))); print(str(getLocaleKey('career.display.' + _), countCareer(_)));
print(' - Piggy: Whatever the rest.'); ));
print(getLocaleKey('career.display.piggy'));
); );
cmdConfigCareer(cartype, ccount) -> ( cmdConfigCareer(cartype, ccount) -> (
if(nbt_storage('ica:data'):'Started', ( if(nbt_storage('ica:data'):'Started', (
print('Already started, use /ica-admin reset clear to cancel.'); startedReject();
return(false) return(false)
)); ));
pkey = str('Config[{Type: "%s"}].Count', cartype); pkey = str('Config[{Type: "%s"}].Count', cartype);
@ -74,5 +76,5 @@ cmdConfigCareer(cartype, ccount) -> (
if(nbt_storage('ica:careers'):pkey != null, delete(nbt_storage('ica:careers'):pkey)); if(nbt_storage('ica:careers'):pkey != null, delete(nbt_storage('ica:careers'):pkey));
put(nbt_storage('ica:careers'), 'Config', etag, -1); put(nbt_storage('ica:careers'), 'Config', etag, -1);
print(str('Career %s set to %d participants.', cartype, ccount)) print(str(getLocaleKey('career.set'), cartype, ccount))
); );

View File

@ -1,3 +1,6 @@
import('ica-i18n', 'getLocaleKey');
global_lastUseSpyglass = -500; global_lastUseSpyglass = -500;
shootFireball(myself) -> ( shootFireball(myself) -> (
@ -47,8 +50,7 @@ checkCooldown(myself) -> (
if(query(myself, 'has_scoreboard_tag', 'ica.spyglasser_cooldown') if(query(myself, 'has_scoreboard_tag', 'ica.spyglasser_cooldown')
&& dt < 100, ( && dt < 100, (
display_title(player(), 'actionbar' display_title(player(), 'actionbar'
, str('spyglass too hot, please wait another %.2f seconds to shoot again.' , str(getLocaleKey('reject.spyglass'), (100 - dt) / 20.0));
, (100 - dt) / 20.0), 100, 100, 100);
return(true); return(true);
)); ));
global_lastUseSpyglass = nowTT; global_lastUseSpyglass = nowTT;

View File

@ -17,46 +17,61 @@ __config() -> {
}; };
import('ica-libs', 'listContain', 'countVotes', 'findVoteMax', 'countAbstainVotes'); import('ica-libs', 'listContain', 'countVotes', 'findVoteMax', 'countAbstainVotes');
import('ica-i18n', 'getLocaleKey', 'pendingReject');
cmdInfo() -> ( cmdInfo() -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates'); cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
cand_n = length(cand_names); cand_n = length(cand_names);
print(str('There are %d candidates:', cand_n)); print(str(getLocaleKey('vote.title'), cand_n));
for(cand_names, ( for(cand_names, (
p = player(_); p = player(_);
v_cnt = countVotes(_); v_cnt = countVotes(_);
print(str(' - [%02d vote%s] %s%s', v_cnt, if(v_cnt > 1, 's', ' ') if(query(p, 'has_scoreboard_tag', 'ica.deceased'), (
, _, if(query(p, 'has_scoreboard_tag', 'ica.deceased'), ' [deceased]', ''))); print(format(' ' + getLocaleKey('vote.marker')
+ str(getLocaleKey('vote.amount.' + if(v_cnt > 1, '2', '1')), v_cnt)
, 's ' + _
, 'n ') + getLocaleKey('vote.deceased'));
), (
print(format(' ' + getLocaleKey('vote.marker')
+ str(getLocaleKey('vote.amount.' + if(v_cnt > 1, '2', '1')), v_cnt)
, 'b ' + _
, 'mb ' + getLocaleKey('vote.button.vote')
, '!/ica-vote sus ' + _));
));
)); ));
abv_cnt = countAbstainVotes(); abv_cnt = countAbstainVotes();
print(str(' - [%2d vote%s] (abstain)', abv_cnt, if(abv_cnt > 1, 's', ' '))); print(format(' ' + getLocaleKey('vote.marker')
+ str(getLocaleKey('vote.amount.' + if(abv_cnt > 1, '2', '1')), abv_cnt)
, 'gb ' + getLocaleKey('vote.abstain')
, 'mb ' + getLocaleKey('vote.button.abstain')
, '!/ica-vote abstain'));
max_p = findVoteMax(); max_p = findVoteMax();
print(str('Current elected: %s', if(max_p == null, '(nobody)', max_p))); print(format(' ' + getLocaleKey('vote.footer')
, if(max_p == null, 'gi ' + getLocaleKey('vote.nobody'), 'b ' + max_p)));
); );
beforeVoteChecks() -> ( beforeVoteChecks() -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
myself = player(); myself = player();
if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), ( if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.'); print(getLocaleKey('reject.bystand'));
return(false); return(false);
)); ));
if(!query(myself, 'has_scoreboard_tag', 'ica.voter'), ( if(!query(myself, 'has_scoreboard_tag', 'ica.voter'), (
print('You don\'t have this ability'); print(getLocaleKey('reject.unable'));
return(false); return(false);
)); ));
myname = query(myself, 'command_name'); myname = query(myself, 'command_name');
if(has(nbt_storage('ica:voting'), str('Votes[{From: "%s"}]', myname)), ( if(has(nbt_storage('ica:voting'), str('Votes[{From: "%s"}]', myname)), (
print('You have already voted.'); print(getLocaleKey('vote.already'));
return(false); return(false);
)); ));
true true
@ -67,7 +82,7 @@ cmdVotePlayer(sus_name) -> (
cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates'); cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
if(!listContain(cand_names, sus_name), ( if(!listContain(cand_names, sus_name), (
print(str('Candidate %s not found.', sus_name)); print(str(getLocaleKey('vote.notfound'), sus_name));
return(false); return(false);
)); ));
@ -76,7 +91,7 @@ cmdVotePlayer(sus_name) -> (
etags = nbt(str('{From: "%s", To: "%s", Abstain: 0b}', myname, sus_name)); etags = nbt(str('{From: "%s", To: "%s", Abstain: 0b}', myname, sus_name));
put(nbt_storage('ica:voting'), 'Votes', etags, -1); put(nbt_storage('ica:voting'), 'Votes', etags, -1);
print('OK.'); print(getLocaleKey('vote.success'));
); );
cmdVoteAbstain() -> ( cmdVoteAbstain() -> (
@ -86,5 +101,5 @@ cmdVoteAbstain() -> (
etags = nbt(str('{From: "%s", To: "", Abstain: 1b}', myname)); etags = nbt(str('{From: "%s", To: "", Abstain: 1b}', myname));
put(nbt_storage('ica:voting'), 'Votes', etags, -1); put(nbt_storage('ica:voting'), 'Votes', etags, -1);
print('OK.'); print(getLocaleKey('vote.success'));
); );

View File

@ -1,6 +1,6 @@
__config() -> { __config() -> {
'commands' -> { 'commands' -> {
'' -> 'cmdList', '' -> 'cmdAllInfo',
'list' -> 'cmdList', 'list' -> 'cmdList',
'submit <slot>' -> 'cmdSubmit', 'submit <slot>' -> 'cmdSubmit',
'refill' -> 'cmdRefill', 'refill' -> 'cmdRefill',
@ -9,41 +9,44 @@ __config() -> {
'whoami' -> 'cmdMe', 'whoami' -> 'cmdMe',
'locate <participant>' -> 'cmdLocate', 'locate <participant>' -> 'cmdLocate',
'spyglass <spyglass_feature>' -> 'cmdSpyglassSwitch', 'spyglass <spyglass_feature>' -> 'cmdSpyglassSwitch',
'ps' -> 'cmdListPalyer',
'playerlist' -> 'cmdListPalyer',
}, },
'arguments' -> { 'arguments' -> {
'slot' -> { 'type' -> 'int', 'min' -> 0, 'max' -> 5 'slot' -> { 'type' -> 'int', 'min' -> 0, 'max' -> 5
, 'suggest' -> [0, 1, 2, 3, 4, 5] }, , 'suggest' -> [0, 1, 2, 3, 4, 5] },
'participant' -> { 'type' -> 'players' }, 'participant' -> { 'type' -> 'string', 'suggester' -> _(arg) -> (
if(nbt_storage('ica:data'):'Started',
parse_nbt(nbt_storage('ica:voting'):'Candidates'),
[]
)
)},
'spyglass_feature' -> { 'type' -> 'string', 'spyglass_feature' -> { 'type' -> 'string',
'options' -> [ 'builder', 'firework', 'fireball' ] } 'options' -> [ 'builder', 'firework', 'fireball' ] },
'message' -> { 'type' -> 'text' },
} }
}; };
import('ica-libs', 'listContain');
import('ica-i18n', 'getLocaleKey', 'startedReject', 'pendingReject');
global_capMarkerMap = { global_capMarkerMap = {
'builder' -> 'ica.build_spyglasser', 'builder' -> 'ica.build_spyglasser',
'fireball' -> 'ica.fireball_spyglasser', 'fireball' -> 'ica.fireball_spyglasser',
'firework' -> 'ica.firework_spyglasser', 'firework' -> 'ica.firework_spyglasser',
}; };
tm_total() -> (
72000
);
tm_per_goal() -> (
12000
);
lackOfAbilityReject() -> ( lackOfAbilityReject() -> (
display_title(player(), 'actionbar', 'You don\'t have this ability.'); print(getLocaleKey('reject.unable'));
); );
bystandReject() -> ( bystandReject() -> (
display_title(player(), 'actionbar', 'You can only bystand.'); print(getLocaleKey('reject.bystand'));
); );
cmdLocate(pname) -> ( cmdLocate(pname) -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
myself = player(); myself = player();
@ -56,9 +59,15 @@ cmdLocate(pname) -> (
return(false); return(false);
)); ));
p = player(pname:0); cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
if(!listContain(cand_names, pname), (
print(str(getLocaleKey('locate.notfound'), pname));
return(false);
));
p = player(pname);
if(p == null, ( if(p == null, (
print('Not found'); print(str(getLocaleKey('locate.offline'), pname));
return(false); return(false);
)); ));
@ -80,17 +89,19 @@ cmdLocate(pname) -> (
); );
cmdSeed() -> ( cmdSeed() -> (
print(str('%s: %d', system_info('world_name'), system_info('world_seed'))); seed_val = str(system_info('world_seed'));
print(format(' ' + getLocaleKey('seed.title')
, 'c ' + seed_val, '&' + seed_val, '^ ' + getLocaleKey('misc.clipboard')));
); );
cmdRefill() -> ( cmdRefill() -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
myself = player(); myself = player();
if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), ( if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.'); bystandReject();
return(false); return(false);
)); ));
if(query(myself, 'has_scoreboard_tag', 'ica.flyer'), ( if(query(myself, 'has_scoreboard_tag', 'ica.flyer'), (
@ -101,81 +112,72 @@ cmdRefill() -> (
cmdList() -> ( cmdList() -> (
if(nbt_storage('ica:data'):'Started', ( if(nbt_storage('ica:data'):'Started', (
if(!nbt_storage('ica:data'):'Preparing', ( if(!nbt_storage('ica:data'):'Preparing', (
print(str('Collecting, %d seconds left, %d are goals done:', print(str(getLocaleKey('list.title.collecting')
bossbar('ica:time_counter', 'value') / 20, , bossbar('ica:time_counter', 'value') / 20
bossbar('ica:collected', 'value'))); , bossbar('ica:collected', 'value')));
), ( ), (
print(str('Perparing, %d seconds to collect:' print(str(getLocaleKey('list.title.preparing')
, bossbar('ica:prepare_counter', 'value') / 20)); , bossbar('ica:prepare_counter', 'value') / 20));
)); ));
), ( ), (
print('Pending:'); print(getLocaleKey('list.title.pending'));
)); ));
c_for(i = 0, i <= 5, i = i + 1, ( c_for(i = 0, i <= 5, i = i + 1, (
p = nbt_storage('ica:data'):str('Goals[{Slot: %db}]', i); p = nbt_storage('ica:data'):str('Goals[{Slot: %db}]', i);
if(p == null, ( if(p == null, (
print(str('- #%d: unset', i)); print(format(' ' + getLocaleKey('list.marker.0')
+ str(getLocaleKey('list.item.id'), i)
, 'gi ' + getLocaleKey('list.item.unset')));
), ( ), (
print(str('%s #%d: %s(%s)', if(nbt_storage('ica:data'):'Started' && p:'Completed', '+', '-') if(nbt_storage('ica:data'):'Started' && p:'Completed', (
, i, item_display_name(p:'Item'), p:'Item')) print(format(' ' + getLocaleKey('list.marker.1')
+ str(getLocaleKey('list.item.id'), i)
, 's ' + item_display_name(p:'Item')
, '^ minecraft:' + p:'Item'));
), (
if(nbt_storage('ica:data'):'Started' && !nbt_storage('ica:data'):'Preparing', (
print(format(' ' + getLocaleKey('list.marker.0')
+ str(getLocaleKey('list.item.id'), i)
, 'b ' + item_display_name(p:'Item')
, '^ minecraft:' + p:'Item'
, ' '
, 'mb ' + getLocaleKey('list.item.submit')
, '!/ica submit ' + str(i)));
), (
print(format(' ' + getLocaleKey('list.marker.0')
+ str(getLocaleKey('list.item.id'), i)
, 'b ' + item_display_name(p:'Item')
, '^ minecraft:' + p:'Item'));
));
)) ))
)); ));
));
); );
cmdMe() -> ( cmdMe() -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
myself = player(); myself = player();
career_hints = {
'Bystander' -> 'You have nothing to do, just watch.',
'Piggy' -> 'Complete all goals in time to win!',
'Hunter(Fireball)' -> 'Protect piggies and kill the wolf.',
'Hunter(Firework)' -> 'Protect piggies and kill the wolf.',
'Builder' -> 'Build protections and complete the goals!',
'Wolf' -> 'Stop them completing the goals!',
};
career = 'Bystander';
if(query(myself, 'has_scoreboard_tag', 'ica.piggy'), ( career = 'bystander';
career = 'Piggy'; for(['piggy', 'hunter', 'firework_hunter', 'builder', 'wolf'], (
if(query(myself, 'has_scoreboard_tag', 'ica.' + _), (
career = _;
)); ));
if(query(myself, 'has_scoreboard_tag', 'ica.hunter'), (
career = 'Hunter(Fireball)';
)); ));
if(query(myself, 'has_scoreboard_tag', 'ica.hunter_firework'), (
career = 'Hunter(Firework)';
));
if(query(myself, 'has_scoreboard_tag', 'ica.builder'), (
career = 'Builder';
));
if(query(myself, 'has_scoreboard_tag', 'ica.wolf'), (
career = 'Wolf';
));
print(str('You are "%s": %s', career, career_hints:career));
if(query(myself, 'has_scoreboard_tag', 'ica.voter'), ( print(str(getLocaleKey('career.whoami'), getLocaleKey('career.title.' + career)
print('[ability] voter: you can vote.'); , getLocaleKey('career.help.' + career)));
for(['voter', 'flyer', 'fireball_spyglasser', 'firework_spyglasser'
, 'build_spyglasser', 'coordinator'], (
if(query(myself, 'has_scoreboard_tag', 'ica.' + _), (
print(str(getLocaleKey('ablity.format')
, getLocaleKey('ablity.title.' + _), getLocaleKey('ablity.help.' + _)));
)); ));
if(query(myself, 'has_scoreboard_tag', 'ica.flyer'), (
print('[ability] flyer: you can fly with an elytra.');
));
if(query(myself, 'has_scoreboard_tag', 'ica.fireball_spyglasser'), (
print('[ability] shooter: You can shoot fireballs with a spyglass(except in prepare stage).');
));
if(query(myself, 'has_scoreboard_tag', 'ica.firework_spyglasser'), (
print('[ability] launcher: You can launch fireworks with a spyglass(except in prepare stage).');
));
if(query(myself, 'has_scoreboard_tag', 'ica.build_spyglasser'), (
print('[ability] builder: You can build paths with a spyglass(except in prepare stage).');
));
// if(query(myself, 'has_scoreboard_tag', 'ica.kungfu_master'), (
// print('[ability] kungfu master: You can get a temporary slow-falling effect by using a feather.');
// ));
if(query(myself, 'has_scoreboard_tag', 'ica.coordinator'), (
print('[ability] coordinator: you can locate other participants.');
)); ));
); );
@ -186,12 +188,12 @@ disableAllSpyglassAbilities(me) -> (
cmdSpyglassSwitch(feature_id) -> ( cmdSpyglassSwitch(feature_id) -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
me = player(); me = player();
if(nbt_storage('ica:data'):'Preparing', ( if(nbt_storage('ica:data'):'Preparing', (
display_title(me, 'actionbar', 'Currently preparing, please switch later.'); print(getLocaleKey('reject.reparing.switch'));
return(false) return(false)
)); ));
if(query(me, 'has_scoreboard_tag', 'ica.deceased'), ( if(query(me, 'has_scoreboard_tag', 'ica.deceased'), (
@ -209,33 +211,81 @@ cmdSpyglassSwitch(feature_id) -> (
cmdSubmit(slot_id) -> ( cmdSubmit(slot_id) -> (
if(!nbt_storage('ica:data'):'Started', ( if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.'); pendingReject();
return(false) return(false)
)); ));
if(nbt_storage('ica:data'):'Preparing', ( if(nbt_storage('ica:data'):'Preparing', (
print('Currently preparing, please submit later.'); print(getLocaleKey('reject.reparing.submit'));
return(false) return(false)
)); ));
me = player(); me = player();
if(query(me, 'has_scoreboard_tag', 'ica.deceased'), ( if(query(me, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.'); bystandReject();
return(false); return(false);
)); ));
pkey = str('Goals[{Slot: %db}]', slot_id); pkey = str('Goals[{Slot: %db}]', slot_id);
g_item = nbt_storage('ica:data'):pkey:'Item';
if(nbt_storage('ica:data'):pkey:'Completed', ( if(nbt_storage('ica:data'):pkey:'Completed', (
print(str('%s has already been collected.', item_display_name( print(format(' ' + getLocaleKey('submit.already.before')
nbt_storage('ica:data'):pkey:'Item'))); , 'b ' + item_display_name(g_item)
, '^ minecraft:' + g_item
, ' ' + getLocaleKey('submit.already.after')));
return() return()
)); ));
if(inventory_remove(me, nbt_storage('ica:data'):pkey:'Item', 1) == 0, ( if(inventory_remove(me, g_item, 1) == 0, (
print(str('%s not found.', item_display_name( print(format(' ' + getLocaleKey('submit.missing.before')
nbt_storage('ica:data'):pkey:'Item'))); , 'b ' + item_display_name(g_item)
, '^ mincraft:' + g_item
, ' ' + getLocaleKey('submit.missing.after')));
return() return()
)); ));
put(nbt_storage('ica:data'):(pkey+'.Completed'), '1b'); put(nbt_storage('ica:data'):(pkey+'.Completed'), '1b');
iv = bossbar('ica:collected', 'value') + 1; iv = bossbar('ica:collected', 'value') + 1;
bossbar('ica:collected', 'value', iv); bossbar('ica:collected', 'value', iv);
display_title(me, 'actionbar', 'OK.'); print(getLocaleKey('submit.success'));
);
cmdListPalyer() -> (
if(!nbt_storage('ica:data'):'Started', (
pendingReject();
return(false)
));
me = player();
cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
cand_n = length(cand_names);
print(str(getLocaleKey('ps.title'), cand_n));
for(cand_names, (
p = player(_);
fcomp = [' ' + getLocaleKey('ps.marker')];
if(p == null, (
put(fcomp, null, 'g ' + _);
put(fcomp, null, ' ' + getLocaleKey('ps.offline'));
), (
put(fcomp, null, if(query(p, 'has_scoreboard_tag', 'ica.deceased')
, 's ', 'b ') + _);
if(p == me, (
put(fcomp, null, ' ' + getLocaleKey('ps.me'));
));
if(query(me, 'has_scoreboard_tag', 'ica.wolf')
&& query(p, 'has_scoreboard_tag', 'ica.wolf'), (
put(fcomp, null, ' ' + getLocaleKey('ps.wolf'));
));
if(me != p && query(me, 'has_scoreboard_tag', 'ica.coordinator')
&& !query(p, 'has_scoreboard_tag', 'ica.deceased'), (
put(fcomp, null, 'mb ' + getLocaleKey('ps.button.locate'));
put(fcomp, null, '!/ica locate ' + _);
));
));
print(format(fcomp));
));
);
cmdAllInfo() -> (
if(nbt_storage('ica:data'):'Started', (
cmdListPalyer();
));
cmdList();
); );