2026-02-28 21:10:56 -03:00

139 lines
4.8 KiB
JavaScript

// priority 99
// related files:
// instance/server_banlist_config.json
// instance/kubejs/client_scripts/server_sync_banlist.js
// instance/kubejs/server_scripts/Tweaks/remove_recipes_from_banlist.js
// instance/kubejs/server_scripts/banlist_script.js
let $HashSet = Java.loadClass("java.util.HashSet")
let $ArrayList = Java.loadClass("java.util.ArrayList")
let config
let bannedBlockEntities
if (!Platform.isClientEnvironment()) {
let configPath = "server_banlist_config.json"
let defaultConfig = {
server: {
banned_block_entities: Utils.newList(),
banned_items: Utils.newList(),
banned_entities: Utils.newList(),
remove_recipes_by: Utils.newList()
}
}
config = JsonIO.read(configPath)
if (config == null) {
JsonIO.write(configPath, defaultConfig)
config = defaultConfig
}
/** @type {$ArrayList_<string>} */
bannedBlockEntities = config?.server.banned_block_entities
/** @type {$ArrayList_<string>} */
let bannedItems = config?.server.banned_items
/** @type {$ArrayList_<string>} */
let bannedEntities = config?.server.banned_entities
if (bannedEntities instanceof $ArrayList) {
let $EntityJoinLevelEvent = Java.loadClass("net.neoforged.neoforge.event.entity.EntityJoinLevelEvent")
NativeEvents.onEvent($EntityJoinLevelEvent, event => {
if (bannedEntities.contains(event.entity.type)) {
event.level.server.tell(Text.red("Removed banned entity: " + event.entity.type + " at " + event.entity.blockPosition().toShortString()))
event.setCanceled(true)
}
})
}
let bannedList = new $HashSet()
bannedList.addAll(bannedBlockEntities)
bannedList.addAll(bannedItems)
if (!bannedList.isEmpty()) {
bannedList.forEach(item => {
ItemEvents.rightClicked(item, (event) => sendMessageAndCancel(event, "item"))
})
BlockEvents.rightClicked((event) => {
if (bannedList.contains(event.item.id)) sendMessageAndCancel(event, "item")
})
PlayerEvents.loggedIn((event) => {
let data = bannedList
console.log("Banned items: " + data)
console.log("Sending banned items to " + event.player.username)
event.player.sendData("banned_items", { banned_items: data })
})
}
let $ChunkEvent$Load = Java.loadClass("net.neoforged.neoforge.event.level.ChunkEvent$Load")
let $LevelTickEvent$Pre = Java.loadClass("net.neoforged.neoforge.event.tick.LevelTickEvent$Pre")
if (!bannedBlockEntities.isEmpty()) {
NativeEvents.onEvent($ChunkEvent$Load, event => {
if (event.level.clientSide) return
removeBlockEntities(event)
})
NativeEvents.onEvent($LevelTickEvent$Pre, event => {
let blocksToRemove = levelAndPosToRemove.get(event.level)
if (blocksToRemove == null) return
let pos
while ((pos = blocksToRemove.poll()) != null) {
addSignToPos(event.level, pos)
event.level.server.tell("Removing banned block entity at " + pos.toShortString())
}
})
LevelEvents.unloaded(event => {
levelAndPosToRemove.remove(event.level)
})
}
}
function sendMessageAndCancel(/** @type {$ItemClickedKubeEvent_} */event, type) {
switch (type) {
case "item":
event.player.setStatusMessage(Text.red("This server does not allow you to use this item!"))
event.cancel()
break
default:
break
}
}
let $LevelChunk = Java.loadClass("net.minecraft.world.level.chunk.LevelChunk")
let levelAndPosToRemove = Utils.newMap()
let $ConcurrentLinkedQueue = Java.loadClass("java.util.concurrent.ConcurrentLinkedQueue")
let removeBlockEntities = (/** @type {$ChunkEvent$Load_} */ event) => {
if (event.isNewChunk()) return
let blocksToRemove = Utils.newList()
if (event.chunk instanceof $LevelChunk) {
if (event.chunk.persistedStatus != "minecraft:full") return
event.chunk.getBlockEntities().forEach((pos, be) => {
/** @type {$ResourceLocation_} */
let beRL = be.getType().getKey(be.getType())
if (bannedBlockEntities.contains(beRL.toString())) {
blocksToRemove.add(pos)
}
})
}
if (!blocksToRemove.isEmpty()) {
let original = levelAndPosToRemove.get(event.level)
if (original == null) {
let queue = new $ConcurrentLinkedQueue(blocksToRemove)
levelAndPosToRemove.put(event.level, queue)
} else {
original.addAll(blocksToRemove)
}
}
}
let addSignToPos = (/** @type {$ServerLevel_} */level, /** @type {$BlockPos_} */pos) => {
let beRL = level.getBlock(pos).entityId
level.getBlock(pos).set("minecraft:oak_sign", {}, 18)
/** @type {$SignBlockEntity_} */
let oakSignBlockEntity = level.getBlockEntity(pos)
let namespace = `'${beRL.split(":")[0]}:'`
let path = beRL.split(":")[1]
let nbt = {is_waxed: 1, front_text: {has_glowing_text: 1, color: "black", messages: [namespace, path, '"is banned on this"', "server"]}}
oakSignBlockEntity.loadWithComponents(nbt, level.registryAccess())
}