add vote & loader

Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
方而静 2023-08-28 12:34:27 +08:00
parent 8acd57c49b
commit 00f2943262
Signed by: szTom
GPG Key ID: 072D999D60C6473C
7 changed files with 255 additions and 81 deletions

View File

@ -2,7 +2,6 @@ __config() -> {
'scope' -> 'global',
'command_permission' -> 'ops',
'commands' -> {
'' -> 'cmdList',
'list' -> 'cmdList',
'confirm' -> 'cmdStart',
'reset clear' -> 'cmdResetClear',
@ -10,23 +9,42 @@ __config() -> {
},
};
import('ica-libs', 'shuffleList', 'countCareer');
import('ica-libs', 'shuffleList', 'countCareer', 'playerListNbt', 'findVoteMax', 'resetVotes');
__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: []}')
nbt_storage('ica:careers', '{Config: []}')
));
if(nbt_storage('ica:voting'):'Created' == null, (
nbt_storage('ica:voting', '{Created: 1b, Candidates: [], Votes: []}')
))
);
clearBossbars() -> (
// bossbar(name, 'remove') is sometimes buggy.
run('bossbar remove ica:prepare_counter');
run('bossbar remove ica:time_counter');
run('bossbar remove ica:collected');
);
cleanPlayerTags() -> (
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', 'ica.participant']));
);
endCleanup() -> (
clearBossbars();
cleanPlayerTags();
put(nbt_storage('ica:data'):'Started', '0b');
put(nbt_storage('ica:data'):'Preparing', '0b');
run('ica-effect-applier disable');
);
createBossbar(nid, name, val, sty) -> (
bossbar(nid);
bossbar(nid, 'max', val);
@ -46,9 +64,14 @@ __on_player_dies(p) -> (
);
__on_player_connects(p) -> (
if(nbt_storage('ica:data'):'Started'
&& query(p, 'has_scoreboard_tag', 'ica.deceased'), (
modify(p, 'gamemode', 'spectator');
if(nbt_storage('ica:data'):'Started', (
if(!query(p, 'has_scoreboard_tag', 'ica.participant'), (
modify(p, 'tag', 'ica.deceased');
));
if(p, 'has_scoreboard_tag', 'ica.deceased', (
modify(p, 'gamemode', 'spectator');
));
));
);
@ -65,7 +88,7 @@ tm_per_goal() -> (
);
getPigPlayers() -> (
entity_selector('@a[tag=!ica.wolf]')
entity_selector('@a[tag=!ica.wolf,tag=ica.participant]')
);
getWolfPlayers() -> (
@ -78,8 +101,7 @@ endGameTitle(p, m, s) -> (
);
endTimeout(iv) -> (
clearBossbars();
put(nbt_storage('ica:data'):'Started', '0b');
endCleanup();
endGameTitle(getPigPlayers(), 'Timeout!'
, str('You didn\'t complete %d goals in time.', iv));
endGameTitle(getWolfPlayers(), 'You won!'
@ -87,8 +109,7 @@ endTimeout(iv) -> (
);
endFinish() -> (
clearBossbars();
put(nbt_storage('ica:data'):'Started', '0b');
endCleanup();
endGameTitle(getPigPlayers(), 'Congratulations!', 'You have completed all the goals.');
endGameTitle(getWolfPlayers(), 'Oh no!'
, str('They have completed all the goals.', iv));
@ -120,6 +141,31 @@ warnDeadline(dt) -> (
));
);
electionKill(pname) -> (
modify(player(pname), 'kill');
print(player('all'), str('Election victim %s killed.', pname))
);
checkVotes(tm) -> (
if(tm % 12000 == 3600, (
print(player('all'), '[WARN] Vote ends in 1 minute');
return(false);
));
if(tm % 12000 == 2400, (
max_p = findVoteMax();
phint = if(max_p == null, (
'nobody was elected.'
), (
ele_p = player(max_p);
schedule(200, 'electionKill', ele_p);
print(ele_p, '[WARN] You were elected! You will be killed in 10 seconds.');
str('elected player %s', max_p)
));
resetVotes();
print(player('all'), str('Election result: %s.\nNew eletion round started.', phint));
));
);
runUpdateCollect() -> (
if(!nbt_storage('ica:data'):'Started', return());
tm = bossbar('ica:time_counter', 'value') - 20;
@ -131,6 +177,7 @@ runUpdateCollect() -> (
endTimeout(iv);
), (
warnDeadline(dt);
checkVotes(tm);
schedule(20, 'runUpdateCollect');
))
);
@ -172,9 +219,7 @@ playerInit(p) -> (
);
cmdResetClear() -> (
clearBossbars();
put(nbt_storage('ica:data'):'Started', '0b');
put(nbt_storage('ica:data'):'Preparing', '0b');
endCleanup();
);
cmdReschedule() -> (
@ -223,16 +268,13 @@ cmdStart() -> (
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']));
cleanPlayerTags();
put(nbt_storage('ica:voting'), 'Candidates', playerListNbt(participants_list));
for(participants_list, (
modify(_, 'tag', ['ica.voter', 'ica.flyer']);
modify(_, 'tag', ['ica.voter', 'ica.flyer', 'ica.participant']);
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']);

View File

@ -1,52 +0,0 @@
__config() -> {
'scope' -> 'global',
'command_permission' -> 'ops',
'commands' -> {
'' -> 'cmdList',
'list' -> 'cmdList',
'set <slot> <item>' -> 'cmdSet',
'add <item>' -> 'cmdSetAppend',
},
'arguments' -> {
'slot' -> { 'type' -> 'int', 'min' -> 0, 'max' -> 5
, 'suggest' -> [0, 1, 2, 3, 4, 5] },
'item' -> { 'type' -> 'item' }
}
};
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() -> (
print('please use /ica instead');
run('/ica');
);
cmdSet(slot_id, goal_item_tuple) -> (
if(nbt_storage('ica:data'):'Started', (
print('Already started, use /ica-admin reset clear to cancel.');
return(false)
));
pkey = str('Goals[{Slot: %db}]', slot_id);
etag = nbt(str('{Slot: %db, Item: "%s"}', slot_id, goal_item_tuple:0));
if(nbt_storage('ica:data'):pkey != null, delete(nbt_storage('ica:data'):pkey));
put(nbt_storage('ica:data'), 'Goals', etag, -1);
print(str('Goal #%d set to %s.', slot_id, goal_item_tuple:0))
);
cmdSetAppend(goal_item_tuple) -> (
missing_goal = getFirstUnsetGoal();
if(missing_goal <= 5, (
cmdSet(missing_goal, goal_item_tuple)
), (
print('All are goals set, please specify slot.')
));
);

View File

@ -1,6 +1,7 @@
__config() -> {
'scope' -> 'global',
'exports' -> ['shuffleList', 'countCareer']
'exports' -> ['shuffleList', 'countCareer', 'findVoteMax', 'resetVotes'
, 'playerListNbt', 'listContain', 'countVotes', 'countAbstainVotes'],
};
shuffleList(list) -> (
@ -23,4 +24,54 @@ countCareer(cartype) -> (
),
nbt_storage('ica:careers'):str('Config[{Type: "%s"}].Count', cartype)
)
);
);
playerListNbt(plist) -> (
res = [];
for(plist, (
put(res, null, query(_, 'command_name'), 'extend');
));
encode_nbt(res)
);
listContain(plist, pele) -> (
for(plist, if(_ == pele, return(true)));
false
);
nbtLength(l) -> (
if(l == null, return(0));
lp = parse_nbt(l);
if(type(l) == 'list', length(l), 1)
);
countVotes(pname) -> (
l = nbt_storage('ica:voting'):str('Votes[{Abstain: 0b, To: "%s"}]', pname);
nbtLength(l)
);
countAbstainVotes() -> (
l = nbt_storage('ica:voting'):'Votes[{Abstain: 1b}]';
nbtLength(l)
);
findVoteMax() -> (
cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
max_p = null;
max_c = countAbstainVotes();
for(cand_names, (
v_n = countVotes(_);
if(v_n == max_c, (
max_p = null;
));
if(v_n > max_c, (
max_p = _;
max_c = v_n;
));
));
max_p
);
resetVotes() -> (
put(nbt_storage('ica:voting'), 'Votes', '[]');
);

16
src/ica-loader.sc Normal file
View File

@ -0,0 +1,16 @@
__config() -> {
'scope' -> 'global',
'command_permission' -> 'ops',
'commands' -> {
'' -> 'cmdLoad',
},
};
cmdLoad() -> (
run('script load ica-admin');
run('script load ica-effect-applier');
run('script load ica-fireball');
run('script load ica');
run('script load ica-vote');
run('script load ica-settings');
);

View File

@ -2,7 +2,6 @@ __config() -> {
'scope' -> 'global',
'command_permission' -> 'ops',
'commands' -> {
'' -> 'cmdList',
'list' -> 'cmdList',
'set <slot> <item>' -> 'cmdSet',
'add <item>' -> 'cmdSetAppend',

90
src/ica-vote.sc Normal file
View File

@ -0,0 +1,90 @@
__config() -> {
'commands' -> {
'' -> 'cmdInfo',
'list' -> 'cmdInfo',
'info' -> 'cmdInfo',
'sus <candidate_name>' -> 'cmdVotePlayer',
'abstain' -> 'cmdVoteAbstain',
},
'arguments' -> {
'candidate_name' -> { 'type' -> 'string', 'suggester' -> _(arg) -> (
if(nbt_storage('ica:data'):'Started',
parse_nbt(nbt_storage('ica:voting'):'Candidates'),
[]
)
)},
}
};
import('ica-libs', 'listContain', 'countVotes', 'findVoteMax', 'countAbstainVotes');
cmdInfo() -> (
if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.');
return(false)
));
cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
cand_n = length(cand_names);
print(str('There are %d candidates:', cand_n));
for(cand_names, (
p = player(_);
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'), ' [deceased]', '')));
));
abv_cnt = countAbstainVotes();
print(' - %02d vote%s (abstain)', abv_cnt, if(abv_cnt > 1, 's', ' '));
max_p = findVoteMax();
print(str('Current elected: %s', if(max_p == null, '(nobody)', max_p)));
);
beforeVoteChecks() -> (
if(!nbt_storage('ica:data'):'Started', (
print('Not started. use /ica-admin confirm to start.');
return(false)
));
myself = player();
if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.');
return(false);
));
if(!query(myself, 'has_scoreboard_tag', 'ica.voter'), (
print('You don\'t have this ability');
return(false);
));
myname = query(myself, 'command_name');
if(has(nbt_storage('ica:voting'), str('Votes[{From: "%s"}]', myname)), (
print('You have already voted.');
return(false);
));
true
);
cmdVotePlayer(sus_name) -> (
if(!beforeVoteChecks(), return(false));
cand_names = parse_nbt(nbt_storage('ica:voting'):'Candidates');
if(!listContain(cand_names, sus_name), (
print(str('Candidate %s not found.', sus_name));
return(false);
));
myself = player();
myname = query(myself, 'command_name');
etags = nbt(str('{From: "%s", To: "%s", Abstain: 0b}', myname, sus_name));
put(nbt_storage('ica:voting'), 'Votes', etags, -1);
print('OK.');
);
cmdVoteAbstain() -> (
if(!beforeVoteChecks(), return(false));
myself = player();
myname = query(myself, 'command_name');
etags = nbt(str('{From: "%s", To: "", Abstain: 1b}', myname));
put(nbt_storage('ica:voting'), 'Votes', etags, -1);
print('OK.');
);

View File

@ -6,6 +6,7 @@ __config() -> {
'refill' -> 'cmdRefill',
'seed' -> 'cmdSeed',
'me' -> 'cmdMe',
'whoami' -> 'cmdMe',
'locate <participant>' -> 'cmdLocate',
},
'arguments' -> {
@ -28,17 +29,32 @@ cmdLocate(pname) -> (
print('Not started. use /ica-admin confirm to start.');
return(false)
));
myself = player();
if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.');
return(false);
));
if(!query(player(), 'has_scoreboard_tag', 'ica.coordinator'), (
print('You don\'t have this ability.');
return(false)
));
p = player(pname:0);
if(p == null, (
print('Not found');
return(false);
));
ppos = query(p, 'pos');
pdim = query(p, 'dimension');
mydim = query(player(), 'dimension');
mydim = query(myself, 'dimension');
if(pdim == mydim, (
print(str('%s: %.1f %.1f %.1f.', pdim, ppos:0, ppos:1, ppos:2));
sslot = query(myself, 'selected_slot');
sitem = inventory_get(myself, sslot);
inventory_set(myself, sslot, 1, 'compass',
str('{LodestonePos: {X: %d, Y: %d, Z: %d}, LodestoneDimension: "%s", LodestoneTracked: 0b}'
, floor(ppos:0), floor(ppos:1), floor(ppos:2), pdim));
), (
print(str('%s: ? ? ?', pdim));
));
@ -53,11 +69,18 @@ cmdRefill() -> (
print('Not started. use /ica-admin confirm to start.');
return(false)
));
if(!query(player(), 'has_scoreboard_tag', 'ica.flyer'), (
print('You cannot fly.');
return(false)
myself = player();
if(query(myself, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.');
return(false);
));
if(query(myself, 'has_scoreboard_tag', 'ica.flyer'), (
run('give @s minecraft:firework_rocket 64');
));
if(query(myself, 'has_scoreboard_tag', 'ica.spyglasser')
&& !nbt_storage('ica:data'):'Preparing', (
modify(myself, 'tag', 'ica.spyglass_fireball');
));
run('give @s minecraft:firework_rocket 64');
);
cmdList() -> (
@ -136,6 +159,11 @@ cmdSubmit(slot_id) -> (
print('Currently preparing, please submit later.');
return(false)
));
me = player();
if(query(me, 'has_scoreboard_tag', 'ica.deceased'), (
print('You can only bystand.');
return(false);
));
pkey = str('Goals[{Slot: %db}]', slot_id);
if(nbt_storage('ica:data'):pkey:'Completed', (
@ -143,7 +171,7 @@ cmdSubmit(slot_id) -> (
nbt_storage('ica:data'):pkey:'Item')));
return()
));
me = player();
if(inventory_remove(me, nbt_storage('ica:data'):pkey:'Item', 1) == 0, (
print(str('%s not found.', item_display_name(
nbt_storage('ica:data'):pkey:'Item')));