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