#is there any way to check if a player is in a certain structure?

58 messages · Page 1 of 1 (latest)

marsh gale
glass hingeBOT
#

Once your ticket has been resolved, please close it with </ticket close:1054771505520717835> command!

marsh gale
cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

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')
});
marsh gale
drifting nexus
#

no, and idk

marsh gale
#

Ok, thank you.
I will wait for another method if it exists

marsh gale
#

@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

marsh gale
half canyon
marsh gale
cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

half canyon
half canyon
half canyon
marsh gale
# half canyon 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"))
})
cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

half canyon
#

ok try this js let dimension = entity.getLevel().dimension let sw = entity.server["getLevel(net.minecraft.resources.ResourceLocation)"](dimension)

cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

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"))
})
half canyon
#

alright hold on

#

ah i see what it is

half canyon
cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

half canyon
#

ok good, progress

#

this means we finally have the server level

#

lemme check the registryaccess class now

marsh gale
#

thank you

half canyon
#

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

marsh gale
cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

marsh gale
# half canyon we're gonna try going off builtinregistries for the STRUCTURES resource key inst...
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"))
})
half canyon
#

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

marsh gale
cobalt wedgeBOT
#

Paste version of server.log from @marsh gale

marsh gale
#

smae problem I guess

half canyon
#

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

#

🤞

marsh gale
half canyon
#

replace it

marsh gale
#

this one

half canyon
#

so instead of this js let Registries = Java.loadClass("net.minecraft.data.BuiltinRegistries")

marsh gale
#

yeah

#

thats work. pretty gratefull

half canyon
#

post the final script for others before you close this

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.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;

}
half canyon
#

aight gonna add this to the example scripts page as the 1.19 version

marsh gale
#

🙏