#How to track if a player has a specific item in his inventory.
1 messages · Page 1 of 1 (latest)
let inv = player.getComponent('inventory').container;
Then loop over inventory:
if (inv.emptySlotsCount === 0) return false; // there inv is empty
for (let i = 0; i < inv.size; i++) {
// code
}
Then check if the typeId matchs.
let item = inv.getItem(i);
if (!item || item.typeId !=== "minecraft:diamond") continue; // skip
return true; // they have a diamond!
Now piece the script together
Its a pretty simple but efficient way to make sure you learn instead of just copy pasting
Are you referencing someone 🤨🧐
function keepCompassInSlot() {
system.runInterval(() => {
world.getPlayers().forEach(player => {
let inv = player.getComponent('minecraft:inventory').container;
if (inv.emptySlotsCount === inv.size) {
return;
}
let hasRecoveryCompass = false;
for (let i = 0; i < inv.size; i++) {
let item = inv.getItem(i);
if (!item || item.typeId !== "minecraft:recovery_compass") continue;
hasRecoveryCompass = true;
break;
}
if (!hasRecoveryCompass) {
console.log("Player does not have a recovery compass. Giving one...");
player.runCommandAsync('/give @s minecraft:recovery_compass 1 0 {"minecraft:item_lock":{"mode":"lock_in_inventory"},"minecraft:keep_on_death":{}}')
} else {
}
});
}, 20);
}
Do you know whats wrong by any chance it doesn't do the runcommand when I don't have the recovery_compass
because the item JSON is invalid
also you can just use .addItem()
and make an itemStack with the lock in slot, and deep on death
Nope
player.runCommand() ===> ```js
let item = new ItemStack("recovery_compass"); // Make sure to put "ItemStack" in your imports like this: import { world, ItemStack, otherImports...} from "@minecraft/server";
item.keepOnDeath = true;
item.lockMode = "inventory";
player.getComponent('inventory').addItem(item);
function keepCompassInSlot() {
system.runInterval(() => {
world.getPlayers().forEach(player => {
let inv = player.getComponent('minecraft:inventory').container;
if (inv.emptySlotsCount === inv.size) {
return;
}
let hasRecoveryCompass = false;
for (let i = 0; i < inv.size; i++) {
let item = inv.getItem(i);
if (item && item.typeId === "minecraft:recovery_compass") {
hasRecoveryCompass = true;
break;
}
}
if (!hasRecoveryCompass) {
let compassItem = new ItemStack("minecraft:recovery_compass");
compassItem.keepOnDeath = true;
compassItem.lockMode = "inventory";
let success = inv.addItem(compassItem);
if (!success) {
}
}
});
}, 20);
}```
why won't this work
Are you calling the function?
import { world, system, ItemStack } from '@minecraft/server';
system.runInterval(() => {
for (const player of world.getPlayers()) {
const inventory = player.getComponent('inventory').container;
let recoveryCompass = false;
for (let i = 0; i < inventory.size; i++) {
const item = inventory.getItem(i);
if (item && item.typeId === 'minecraft:recovery_compass') {
recoveryCompass = true;
break;
}
}
if (!recoveryCompass) {
const itemStack = new ItemStack('minecraft:recovery_compass', 1);
itemStack.keepOnDeath = true;
itemStack.lockMode = 'inventory';
inventory.addItem(itemStack);
}
}
});
Simple as this can work
It keeps giving me the compass even though i already have one
replace the item.id with item.typeId
-# sorry bout that