250 lines
8 KiB
JavaScript
250 lines
8 KiB
JavaScript
/**
|
|
* @type {{
|
|
* guns: [Internal.ItemStack, Internal.ItemStack][],
|
|
* items: Internal.ItemStack[],
|
|
* }}
|
|
*/
|
|
var loot = { guns: [], items: [] };
|
|
|
|
/** @type {{[key: string]: number }} */
|
|
var playerKills = {};
|
|
/** @type {?string} */
|
|
var playerBoss = null;
|
|
|
|
ServerEvents.commandRegistry((event) => {
|
|
// /enter_warzone <target>
|
|
registerCommand(event, {
|
|
command: "enter_warzone",
|
|
operator: true,
|
|
parameters: [
|
|
{
|
|
name: "target",
|
|
type: event.arguments.PLAYER,
|
|
handler: (ctx) => {
|
|
const server = ctx.source.server;
|
|
const player = event.arguments.PLAYER.getResult(ctx, "target");
|
|
|
|
// Initialize scoreboards
|
|
if (!server.persistentData.getBoolean("scoreboardsInitialized")) {
|
|
server.runCommandSilent(
|
|
`scoreboard objectives add warzone_kills dummy "Kills"`,
|
|
);
|
|
server.runCommandSilent(
|
|
`scoreboard objectives setdisplay sidebar warzone_kills`,
|
|
);
|
|
server.runCommandSilent(
|
|
`scoreboard objectives setdisplay belowName warzone_kills`,
|
|
);
|
|
server.runCommandSilent(
|
|
`scoreboard objectives add warzone_total_kills dummy "Total Kills"`,
|
|
);
|
|
server.runCommandSilent(
|
|
`scoreboard objectives setdisplay list warzone_total_kills`,
|
|
);
|
|
server.persistentData.putBoolean("scoreboardsInitialized", true);
|
|
}
|
|
|
|
// Teleport to warzone
|
|
server.runCommandSilent(
|
|
`execute in retards:adventure run tp ${player.username} 424 122 552`,
|
|
);
|
|
|
|
// Clear inventory
|
|
server.runCommandSilent(`clear ${player.username}`);
|
|
|
|
// Initialize kill count
|
|
const data = player.persistentData;
|
|
if (!data.getInt("kills")) data.putInt("kills", 0);
|
|
|
|
// Set scoreboard kill count
|
|
server.runCommandSilent(
|
|
`scoreboard players set ${player.username} warzone_total_kills ${data.getInt("kills")}`,
|
|
);
|
|
|
|
// Initialize kill streak
|
|
playerKills[player.username] = 0;
|
|
|
|
// Set scoreboard kill streak
|
|
server.runCommandSilent(
|
|
`scoreboard players set ${player.username} warzone_kills 0`,
|
|
);
|
|
|
|
// Toggle layout
|
|
server.runCommandSilent(
|
|
`fmlayout default_hud_layout false ${player.username}`,
|
|
);
|
|
server.runCommandSilent(
|
|
`fmlayout warzone_hud_layout true ${player.username}`,
|
|
);
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
// /exit_warzone <target>
|
|
registerCommand(event, {
|
|
command: "exit_warzone",
|
|
operator: true,
|
|
parameters: [
|
|
{
|
|
name: "target",
|
|
type: event.arguments.PLAYER,
|
|
handler: (ctx) => {
|
|
const server = ctx.source.server;
|
|
const player = event.arguments.PLAYER.getResult(ctx, "target");
|
|
|
|
// Teleport to portal
|
|
server.runCommandSilent(
|
|
`execute in retards:adventure run tp ${player.username} -103 -14 -82`,
|
|
);
|
|
|
|
// Clear inventory
|
|
server.runCommandSilent(`clear ${player.username}`);
|
|
|
|
// Remove from scoreboards
|
|
server.runCommandSilent(
|
|
`scoreboard players remove ${player.username} warzone_total_kills`,
|
|
);
|
|
server.runCommandSilent(
|
|
`scoreboard players remove ${player.username} warzone_kills`,
|
|
);
|
|
|
|
// Toggle layout
|
|
server.runCommandSilent(
|
|
`fmlayout warzone_hud_layout false ${player.username}`,
|
|
);
|
|
server.runCommandSilent(
|
|
`fmlayout default_hud_layout true ${player.username}`,
|
|
);
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
// /warzone_load_loot_tables
|
|
registerCommand(event, {
|
|
command: "warzone_load_loot_tables",
|
|
operator: true,
|
|
handler: (ctx) => {
|
|
const server = ctx.source.server;
|
|
const level = server.getLevel("retards:adventure");
|
|
|
|
const itemFrames = filterEntities(
|
|
level,
|
|
(e) => e.type === "minecraft:item_frame",
|
|
);
|
|
|
|
loot = { guns: [], items: [] };
|
|
|
|
const isAir = (/** @type {Internal.ItemStack} */ item) =>
|
|
item.id === "minecraft:air";
|
|
|
|
for (var i = 0; i < itemFrames.size(); i++) {
|
|
var frame = itemFrames.get(i);
|
|
if (frame.item && frame.item.id === "minecraft:copper_ingot") {
|
|
var pos = frame.blockPosition().below();
|
|
var block = level.getBlock(pos);
|
|
if (block.id == "minecraft:chest") {
|
|
console.log(pos);
|
|
/** @type {Internal.Optional<Internal.ChestBlockEntity>} */
|
|
var chestEntity = level.getBlockEntity(pos, "chest");
|
|
if (chestEntity.isPresent()) {
|
|
/** @type {Internal.ChestBlockEntity} */
|
|
var chest = chestEntity.get();
|
|
for (var col = 0; col < 9; col++) {
|
|
var first = chest.getItem(col).copy();
|
|
var second = chest.getItem(col + 9).copy();
|
|
var third = chest.getItem(col + 18).copy();
|
|
|
|
if (!isAir(first) && !isAir(second))
|
|
loot.guns.push([first, second]);
|
|
if (!isAir(third)) loot.items.push(third);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const gunCount = loot.guns.length;
|
|
const itemCount = loot.items.length;
|
|
|
|
server.runCommandSilent(
|
|
`say Loaded ${gunCount} guns and ${itemCount} items`,
|
|
);
|
|
},
|
|
});
|
|
});
|
|
|
|
ServerEvents.tick((event) => {
|
|
if (event.server.tickCount % 1200 !== 0) return;
|
|
if (event.server.tickCount % 2400 === 0)
|
|
event.server.runCommandSilent(
|
|
"execute in retards:adventure run effect give @a[x=424,y=-1,z=552,distance=..128] minecraft:glowing 3 1 true",
|
|
);
|
|
const level = event.server.getLevel("retards:adventure");
|
|
|
|
const itemFrames = filterEntities(
|
|
level,
|
|
(entity) => entity.type === "minecraft:item_frame",
|
|
);
|
|
|
|
for (var i = 0; i < itemFrames.size(); i++) {
|
|
var frame = itemFrames.get(i);
|
|
if (frame.item && frame.item.id === "minecraft:gunpowder") {
|
|
var pos = frame.blockPosition().above().above();
|
|
var block = level.getBlock(pos);
|
|
if (block.id === "minecraft:chest") {
|
|
/** @type {Internal.Optional<Internal.ChestBlockEntity>} */
|
|
var chestEntity = level.getBlockEntity(pos, "chest");
|
|
if (chestEntity.isPresent()) {
|
|
/** @type {Internal.ChestBlockEntity} */
|
|
var chest = chestEntity.get();
|
|
chest.clearContent();
|
|
var { guns, items } = loot;
|
|
if (guns.length) {
|
|
var [gun, ammo] = guns[Math.floor(Math.random() * guns.length)];
|
|
chest.setItem(0, gun.copy());
|
|
chest.setItem(1, ammo.copy());
|
|
}
|
|
if (items.length) {
|
|
var item = items[Math.floor(Math.random() * items.length)];
|
|
chest.setItem(2, item.copy());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
EntityEvents.death("player", (event) => {
|
|
const killer = event.source.player;
|
|
const victim = event.entity;
|
|
|
|
if (!killer) return;
|
|
|
|
// Increase killer total kill count
|
|
const data = killer.persistentData;
|
|
data.putInt("kills", data.getInt("kills") + 1);
|
|
event.server.runCommandSilent(
|
|
`scoreboard players set ${killer.username} warzone_total_kills ${data.getInt("kills")}`,
|
|
);
|
|
|
|
// Increase killer kill streak
|
|
if (!playerKills[killer.username]) playerKills[killer.username] = 0;
|
|
playerKills[killer.username]++;
|
|
event.server.runCommandSilent(
|
|
`scoreboard players set ${killer.username} warzone_kills ${playerKills[killer.username]}`,
|
|
);
|
|
|
|
// Reset victim kill streak
|
|
playerKills[victim.username] = 0;
|
|
event.server.runCommandSilent(
|
|
`scoreboard players set ${victim.username} warzone_kills 0`,
|
|
);
|
|
|
|
// Update player boss
|
|
event.server.runCommandSilent(`effect clear ${playerBoss} minecraft:glowing`);
|
|
for (const [username, kills] of Object.entries(playerKills))
|
|
if (!playerBoss || kills > playerKills[playerBoss]) playerBoss = username;
|
|
event.server.runCommandSilent(`effect clear ${playerBoss} minecraft:glowing`);
|
|
});
|