#is there any way to check if a player is in a certain structure?
58 messages · Page 1 of 1 (latest)
Once your ticket has been resolved, please close it with </ticket close:1054771505520717835> command!
here is logs
Paste version of server.log from @marsh gale
here is my code
const $ResourceKey = Java.loadClass("net.minecraft.resources.ResourceKey");
const structureName = "minecraft:mineshaft";
const structure = $ResourceKey.create($ResourceKey.createRegistryKey("worldgen/structure"), structureName);
BlockEvents.rightClicked((event) => {
const { player, level } = event;
if (level.structureManager().getStructureWithPieceAt(player.blockPosition(), structure).isValid()) {
player.tell ('aa')
}
else player.tell ('bb')
});
It looks interesting. But I have a question: does this method cause lags? And the second question is maybe there is a way to check the player's location in a needed structure only at the moment of activation of the events like item right click or block right click
no, and idk
Ok, thank you.
I will wait for another method if it exists
@still frigate sorry for ping, but may be you know is it a bug or something? because everything works great on 1.20.1, but for some reason it gives this error on 1.19.2

maybe try this one @marsh gale https://discord.com/channels/303440391124942858/1234946395132133458
[23:07:41] [ERROR] ! a.js#3: Error loading KubeJS script: server_scripts:a.js': Failed to load Java class 'net.minecraft.core.RegistryAccess.RegistryEntry': Class could not be found!
do you know what class should I use instead of this
and there is another problem
Paste version of server.log from @marsh gale

for this just do js server.getLevel(dimension)
also do you have the actual error report for this?
yeah.
here is code that I use
let ServerLevel = Java.loadClass("net.minecraft.server.level.ServerLevel")
let ChunkStatus = Java.loadClass("net.minecraft.world.level.chunk.ChunkStatus")
let Registries = Java.loadClass("net.minecraft.core.RegistryAccess")
/**
*
* @param {Internal.Entity} entity
* @param {String} structure
* @returns
*/
function isInStructure(entity, structure) {
let pos = entity.block.pos
let dimension = entity.getLevel().dimensionKey;
let sw = entity.server.getLevel(dimension)
if (sw instanceof ServerLevel) {
let chunk = sw.getChunk(pos.x >> 4, pos.z >> 4, ChunkStatus.STRUCTURE_REFERENCES, false);
if (chunk == null) {
return false;
}
let references = chunk.getAllReferences();
for (references of references.entrySet()) {
let e = references
let longs = e.getValue();
if (!longs.isEmpty()) {
let struct = e.getKey();
let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURE).getKey(struct);
if (key.toString() == structure) {
return true;
} else {
return false;
}
}
}
}
return false;
}
ItemEvents.rightClicked(event => {
event.player.tell(isInStructure(event.entity, "minecraft:pillager_outpost"))
})
and here is log
Paste version of server.log from @marsh gale
ok try this js let dimension = entity.getLevel().dimension let sw = entity.server["getLevel(net.minecraft.resources.ResourceLocation)"](dimension)
Paste version of server.log from @marsh gale
let ServerLevel = Java.loadClass("net.minecraft.server.level.ServerLevel")
let ChunkStatus = Java.loadClass("net.minecraft.world.level.chunk.ChunkStatus")
let Registries = Java.loadClass("net.minecraft.core.RegistryAccess")
/**
*
* @param {Internal.Entity} entity
* @param {String} structure
* @returns
*/
function isInStructure(entity, structure) {
let pos = entity.block.pos
let dimension = entity.getLevel().dimension
let sw = entity.server["getLevel(net.minecraft.resources.ResourceLocation)"](dimension)
if (sw instanceof ServerLevel) {
let chunk = sw.getChunk(pos.x >> 4, pos.z >> 4, ChunkStatus.STRUCTURE_REFERENCES, false);
if (chunk == null) {
return false;
}
let references = chunk.getAllReferences();
for (references of references.entrySet()) {
let e = references
let longs = e.getValue();
if (!longs.isEmpty()) {
let struct = e.getKey();
let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURE).getKey(struct);
if (key.toString() == structure) {
return true;
} else {
return false;
}
}
}
}
return false;
}
ItemEvents.rightClicked(event => {
event.player.tell(isInStructure(event.entity, "minecraft:pillager_outpost"))
})
try this js let dimension = entity.getLevel().dimensionKey let sw = null entity.server.getAllLevels().forEach(serverLevel => { if (serverLevel.dimensionKey != dimension) return sw = serverLevel })
Paste version of server.log from @marsh gale
ok good, progress
this means we finally have the server level
lemme check the registryaccess class now
thank you
ok change the Registries keyword at the top to this js let Registries = Java.loadClass("net.minecraft.data.BuiltinRegistries")
and halfway through the script change the registry access key line to this js let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURES).getKey(struct);
we're gonna try going off builtinregistries for the STRUCTURES resource key instead since they moved it since 1.19
Paste version of server.log from @marsh gale
let ServerLevel = Java.loadClass("net.minecraft.server.level.ServerLevel")
let ChunkStatus = Java.loadClass("net.minecraft.world.level.chunk.ChunkStatus")
let Registries = Java.loadClass("net.minecraft.data.BuiltinRegistries")
/**
*
* @param {Internal.Entity} entity
* @param {String} structure
* @returns
*/
function isInStructure(entity, structure) {
let pos = entity.block.pos
let dimension = entity.getLevel().dimensionKey
let sw = null
entity.server.getAllLevels().forEach(serverLevel => {
if (serverLevel.dimensionKey != dimension) return
sw = serverLevel
})
if (sw instanceof ServerLevel) {
let chunk = sw.getChunk(pos.x >> 4, pos.z >> 4, ChunkStatus.STRUCTURE_REFERENCES, false);
if (chunk == null) {
return false;
}
let references = chunk.getAllReferences();
for (references of references.entrySet()) {
let e = references
let longs = e.getValue();
if (!longs.isEmpty()) {
let struct = e.getKey();
let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURES).getKey(struct);
if (key.toString() == structure) {
return true;
} else {
return false;
}
}
}
}
return false;
}
ItemEvents.rightClicked(event => {
event.player.tell(isInStructure(event.entity, "minecraft:pillager_outpost"))
})
change this part to grab the key instead js Registries.STRUCTURES.key
so like js let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURES.key).getKey(struct);
Paste version of server.log from @marsh gale
smae problem I guess
yeah sec
ok try this js let Registries = Java.loadClass("net.minecraft.core.Registry")
then halfway down like last time js let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURE_REGISTRY).getKey(struct);
pretty sure this is the fix
🤞
should I replace or just add it?
replace it
this one
so instead of this js let Registries = Java.loadClass("net.minecraft.data.BuiltinRegistries")
post the final script for others before you close this
let ServerLevel = Java.loadClass("net.minecraft.server.level.ServerLevel")
let ChunkStatus = Java.loadClass("net.minecraft.world.level.chunk.ChunkStatus")
let Registries = Java.loadClass("net.minecraft.core.Registry")
/**
*
* @param {Internal.Entity} entity
* @param {String} structure
* @returns
*/
function isInStructure(entity, structure) {
let pos = entity.block.pos
let dimension = entity.getLevel().dimensionKey
let sw = null
entity.server.getAllLevels().forEach(serverLevel => {
if (serverLevel.dimensionKey != dimension) return
sw = serverLevel
})
if (sw instanceof ServerLevel) {
let chunk = sw.getChunk(pos.x >> 4, pos.z >> 4, ChunkStatus.STRUCTURE_REFERENCES, false);
if (chunk == null) {
return false;
}
let references = chunk.getAllReferences();
for (references of references.entrySet()) {
let e = references
let longs = e.getValue();
if (!longs.isEmpty()) {
let struct = e.getKey();
let key = sw.registryAccess().registryOrThrow(Registries.STRUCTURE_REGISTRY).getKey(struct);
if (key.toString() == structure) {
return true;
} else {
return false;
}
}
}
}
return false;
}
aight gonna add this to the example scripts page as the 1.19 version
🙏