RetardsModpack/kubejs/server_scripts/warzone.js
2026-02-22 21:51:29 +01:00

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`);
});