icollect-alpha/src/ica-admin.sc
szdytom 8acd57c49b
add career config & fix
Signed-off-by: szdytom <szdytom@qq.com>
2023-08-25 12:34:41 +08:00

257 lines
6.3 KiB
Scala

__config() -> {
'scope' -> 'global',
'command_permission' -> 'ops',
'commands' -> {
'' -> 'cmdList',
'list' -> 'cmdList',
'confirm' -> 'cmdStart',
'reset clear' -> 'cmdResetClear',
'reset schedule' -> 'cmdReschedule'
},
};
import('ica-libs', 'shuffleList', 'countCareer');
__on_start() -> (
if(nbt_storage('ica:data'):'Goals' == null, (
nbt_storage('ica:data', '{Goals: [], Started: 0b, Preparing: 0b}')
));
if(nbt_storage('ica:careers'):'Config' == null, (
nbt_storage('ica:careers', '{Config: [], Participants: []}')
))
);
clearBossbars() -> (
run('bossbar remove ica:prepare_counter');
run('bossbar remove ica:time_counter');
run('bossbar remove ica:collected');
);
createBossbar(nid, name, val, sty) -> (
bossbar(nid);
bossbar(nid, 'max', val);
bossbar(nid, 'value', val);
bossbar(nid, 'name', name);
bossbar(nid, 'players', player('all'));
if(sty != null, bossbar(nid, 'style', sty));
);
__on_player_dies(p) -> (
if(nbt_storage('ica:data'):'Started'
&& !nbt_storage('ica:data'):'Preparing', (
modify(p, 'gamemode', 'spectator');
modify(p, 'tag', 'ica.deceased');
));
);
__on_player_connects(p) -> (
if(nbt_storage('ica:data'):'Started'
&& query(p, 'has_scoreboard_tag', 'ica.deceased'), (
modify(p, 'gamemode', 'spectator');
));
);
tm_prepare() -> (
12000
);
tm_total() -> (
72000
);
tm_per_goal() -> (
12000
);
getPigPlayers() -> (
entity_selector('@a[tag=!ica.wolf]')
);
getWolfPlayers() -> (
entity_selector('@a[tag=ica.wolf]')
);
endGameTitle(p, m, s) -> (
display_title(p, 'title', m, 10, 200, 10);
display_title(p, 'subtitle', s, 10, 200, 10);
);
endTimeout(iv) -> (
clearBossbars();
put(nbt_storage('ica:data'):'Started', '0b');
endGameTitle(getPigPlayers(), 'Timeout!'
, str('You didn\'t complete %d goals in time.', iv));
endGameTitle(getWolfPlayers(), 'You won!'
, str('Those fools have failed, good job.', iv));
);
endFinish() -> (
clearBossbars();
put(nbt_storage('ica:data'):'Started', '0b');
endGameTitle(getPigPlayers(), 'Congratulations!', 'You have completed all the goals.');
endGameTitle(getWolfPlayers(), 'Oh no!'
, str('They have completed all the goals.', iv));
);
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);
);
warnDeadline(dt) -> (
if (dt == 1200, (
print(player('all'), '[WARN] Submission deadline in 1 minute.');
));
if (dt == 600, (
print(player('all'), '[WARN] Submission deadline in 30 seconds.');
));
if (dt == 300, (
print(player('all'), '[WARN] Submission deadline in 15 seconds.');
));
if (dt <= 200 && dt % 20 == 0, (
print(player('all'), str('[WARN] Submission deadline in %d second%s!'
, dt / 20, if(dt > 20, 's', '')));
));
);
runUpdateCollect() -> (
if(!nbt_storage('ica:data'):'Started', return());
tm = bossbar('ica:time_counter', 'value') - 20;
bossbar('ica:time_counter', 'value', tm);
iv = bossbar('ica:collected', 'value') + 1;
if(iv == 7, endFinish());
dt = tm - (6 - iv) * tm_per_goal();
if(dt <= 0, (
endTimeout(iv);
), (
warnDeadline(dt);
schedule(20, 'runUpdateCollect');
))
);
startCollectStage() -> (
schedule(20, 'runUpdateCollect');
clearBossbars();
createBossbar('ica:time_counter', 'Time Left', tm_total(), 'notched_6');
createBossbar('ica:collected', 'Collected', 6, 'notched_6');
bossbar('ica:collected', 'value', 0);
for(player('all'), (
if(query(_, 'has_scoreboard_tag', 'ica.spyglasser'), (
modify(_, 'tag', 'ica.spyglass_fireball');
));
));
put(nbt_storage('ica:data'):'Preparing', '0b');
);
setElytra(p) -> (
// 38 is where the player's elytra should be at.
inventory_set(p, 8, 64, 'minecraft:firework_rocket');
inventory_set(p, 38, 1, 'minecraft:elytra', '{Unbreakable: 1b}');
);
clearExp(p) -> (
modify(p, 'xp_level', 0);
modify(p, 'xp_progress', 0);
modify(p, 'xp_score', 0);
);
playerInit(p) -> (
modify(p, 'gamemode', 'survival');
if(query(p, 'has_scoreboard_tag', 'ica.flyer'), setElytra(p));
clearExp(p);
inventory_set(p, 2, 1, 'minecraft:spyglass');
);
cmdResetClear() -> (
clearBossbars();
put(nbt_storage('ica:data'):'Started', '0b');
put(nbt_storage('ica:data'):'Preparing', '0b');
);
cmdReschedule() -> (
if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.');
return(false)
));
schedule('runUpdateCollect', 20);
);
runUpdatePrepare() -> (
if(!nbt_storage('ica:data'):'Started', return());
if(!nbt_storage('ica:data'):'Preparing', return());
tm = bossbar('ica:prepare_counter', 'value') - 20;
bossbar('ica:prepare_counter', 'value', tm);
if(tm <= 0, (
startCollectStage();
), (
schedule(20, 'runUpdatePrepare');
))
);
cmdStart() -> (
missing_goal = getFirstUnsetGoal();
if(missing_goal <= 5, (
print(str('Goal #%d is unset.', missing_goal));
return(false)
));
if(nbt_storage('ica:data'):'Started', (
print('Already started, use /ica-admin reset clear to cancel.');
return(false)
));
participants_list = player('all');
participants_list = shuffleList(participants_list);
wolf_n = countCareer('wolf');
hunter_n = countCareer('hunter') + wolf_n;
if(hunter_n > length(participants_list), (
print('Not enough players online.');
return(false);
));
put(nbt_storage('ica:data'):'Started', '1b');
put(nbt_storage('ica:data'):'Preparing', '1b');
put(nbt_storage('ica:data'):'Goals[].Completed', '0b');
createBossbar('ica:prepare_counter', 'Preparing', tm_prepare(), null);
schedule(20, 'runUpdatePrepare');
for(player('all'), modify(_, 'clear_tag', ['ica.piggy'
, 'ica.wolf', 'ica.hunter', 'ica.spyglasser', 'ica.spyglass_fireball'
, 'ica.voter', 'ica.flyer', 'ica.spyglasser_cooldown'
, 'ica.coordinator', 'ica.deceased']));
for(participants_list, (
modify(_, 'tag', ['ica.voter', 'ica.flyer']);
career_tag = 'ica.piggy';
if(_i < hunter_n, career_tag = ['ica.hunter', 'ica.spyglasser', 'ica.spyglasser_cooldown']);
if(_i < wolf_n, career_tag = ['ica.wolf', 'ica.spyglasser', 'ica.coordinator']);
modify(_, 'tag', career_tag);
));
run('execute as @a run clear');
for(participants_list, playerInit(_));
run('ica-effect-applier enable');
run('time set day');
run('gamerule keepInventory false');
run('gamerule playersSleepingPercentage 0');
run('worldborder set 10000');
);
cmdList() -> (
print('please use /ica instead');
run('/ica');
);