#Script API General

1 messages · Page 109 of 1

thorn flicker
#

lol me suggesting something you already did

#

means we are both smart

#

haha

shy leaf
#

it uses IPC made by Omniac

thorn flicker
#

im doing something similar with a project, that has to do with food nutrients

shy leaf
#

which allows people to add stats with behavior packs without directly editing the addon

thorn flicker
#

you can setup nutrient values on food items

shy leaf
#

interesting

thorn flicker
#

custom command?

shy leaf
#

also has it

thorn flicker
#

im using custom commands because I think it'll be way easier to configure that way, so an addon creator can setup a function for their addon to be compatible with my addon

#

because it were to be in server ui... cant really do that, and commands are easy to understand.

shy leaf
#

i think its doable with server ui

#

well the readability would be terrible considering the nature of server forms

thorn flicker
#

there goes my system crumbling down

shy leaf
#

😭

thorn flicker
#

ill figure it out

shy leaf
thorn flicker
shy leaf
#

inter-pack communication

#

but uh

#

the repo doesnt have docs yet

thorn flicker
#

eh

#

I rather use my own stuff

shy leaf
#

i see

#

im just suggesting cuz its quite reliable

thorn flicker
#

im not a professional scripter or anything but it feels nice using things you make

#

I go insane more but thats fine

thorn flicker
shy leaf
#

its a little bit headache to set up tho

#

had to get a lot of help from omniac

thorn flicker
#

oh wait I know what my idea was

#

they dont need to access the dynamic properties, they just need to trigger the custom command when my addon is installed

#

so they either need to make a custom command, or a function, like I said, just to trigger my custom commands.

shy leaf
#

inter-pack communication with custom commands

#

interesting

thorn flicker
#

and if they cant set that up its not my problem

#

its not that hard

shy leaf
#

what about scriptevent?

thorn flicker
#

anyway to trigger my command

#

doesnt matter what

shy leaf
#

well scriptevent can be shared across behavior packs

thorn flicker
#

im looking into a way better to config so its not one item at time, per command

thorn flicker
shy leaf
#

yep

thorn flicker
#

theres no problem then.

shy leaf
#

its an interesting concept tho

#

we have another way for packs to communicate with each other

#

and its custom command

thorn flicker
#

and if i ever do release it ill have a tutorial for creators

#

so yeah

round bone
nova flame
#

anyone know if customcommandregistry has changed in the past 2 updates?

wary edge
nova flame
nova flame
#

bruh wtf is wrong with this shit

north frigate
#

imagine if Mojang gave us more json ui support in script api

nova flame
#

anyone wanna hop in vc?

#

just to chill

north frigate
#

for example check if your hovering your mouse over a specific button and then the script api gets that and you run stuff accordingly

nova flame
#

hello minato i see u

distant tulip
#

Hello to you too
gtg, lol

north frigate
nova flame
#

yes:

somber onyx
#
world.beforeEvents.worldInitialize.subscribe(initEvent => {
  initEvent.itemComponentRegistry.registerCustomComponent('pm_black_hole:trigger', {
    onUse: e => { e.source.runCommand("function black_hole"); },
  });
});

hey guys, do you have any ideas what doesn't worked

wary edge
nova flame
#

for me anyway

somber onyx
round bone
woven loom
#

i want them to support ts

round bone
wary edge
#

I would love that honestly.

distant tulip
#

as an option, forcing ts sound like a bad idea

halcyon phoenix
#

I am good enough with vanilla js

warm condor
#

are there any workarounds to obtain an entity's target through scripting?

fair quarry
#

Yo what is the best way to store entity data? I'm trying to make a item that stores an entity, but without losing its data

#

I will probably use structures

warm condor
#

we decided to go an alternate route that only requires us to detect whether or not it has a target

slim forum
#
while (true) {
  world.getDimension('overworld'). spawnEntity('minecraft:fox', {x: 0, y: 0, z: 0});
}
#

Consider this a warning

granite cape
#

this using clearVelocity method?

winged gull
#

lol I have made add-ons for that add-on before

winged gull
distant tulip
winged gull
shy leaf
#

i actually dont know how it went

sudden verge
#

I'm wondering if there's any way to summon a firework with custom parameters like it's duration, and pattern.
Is this possible?

chilly fractal
#

y'all

#

i feel like i am gonna go insane

#

ima make a post

nova flame
#

anyone know any known issues with beforeEvent Startup

chilly fractal
#

what are you facing?

nova flame
chilly fractal
#

in what

#

commands?

#

enums?

#

items?

nova flame
#

the beforeEvent

#

just wont fire

chilly fractal
#

really?

nova flame
#

yes#

chilly fractal
#

did you make a post?

nova flame
#

yes

shy leaf
#

what did you do to confirm that it wont fire?

chilly fractal
nova flame
#

look in my post

shy leaf
#

@thorn flicker so im testing it right now...

#

this is weird as hell

#

its not 20 per breaking block

#

but its rather inconsistent

#

simply swinging in air fires the event once

#

but attacking(??????) or dropping an item fires it two times for me

distant tulip
#

Lot of stuff trigger it twice, fishing and so on

shy leaf
#

one thing thats certain is that the amount of triggers depend on the client's framerate

distant tulip
#

Huh

shy leaf
#

but

#

i dont know what would happen if the script was ran in a server

safe stream
#

normalising typeids?

granite cape
#

hey

woven loom
#

Hi

distant tulip
#

Hello!

thorn flicker
#

Yo

chilly fractal
#

sup

#

quick question y'all

#

do simulated players have a chat function other than .chat?

#

because it doesn't seem to send anything in the chat.

round bone
#

I don't think so.

distant tulip
#

if not run /say from it

chilly fractal
#
// ...
if (!bot) return print(source, `§cBot §6'${botName}'§c not found.`);
const msg = extra || "Unknown message";
bot.chat(msg);
print(source, `§3Bot §b'${botName}'§3 said: §7${msg}`);
// ...

it tells me that the bot sent the message and no error happens

chilly fractal
#

i can do:

#
world.sendMessage(`<${bot.name}> ${msg}`);
#

but the thing is, this wouldn't fire the chatSend event

#

does the .chat method fire the chatSend event??
i don't know, but i assume so.

distant tulip
#

try /say 🤷‍♂️

chilly fractal
#

does it trigger chatsend?

#

oh right

#

my bad

#

i'll test

distant tulip
#

alr, sense it is not the same as send message, /say actually make the entity say so

chilly fractal
#

wait, while i am at it. let me test out the .chat method if it triggers the chatsend event

chilly fractal
chilly fractal
#

oh well

#

i guess world.sendMessage it is.

distant tulip
chilly fractal
round bone
distant tulip
chilly fractal
distant tulip
#

welp

chilly fractal
#

yeah the method is bugged, it legit is supposed to send the message. if it ain't sending anything then chances are, it won't trigger chatsend.

#

i am just gonna keep it in until moyang decides to fix it

#

when an admin tells me a bot is sending messages twice i'll remove the world.sendMessage call.

warm condor
deep quiver
distant tulip
deep quiver
#

Ye

distant tulip
#

That's rude, i was watching

thorn flicker
#

🤖

subtle cove
tame chasm
#

Are here some coders? I need help with a custom scoreboard

chilly fractal
#

what is the issue you're facing?

#

also bruh, i have been typing my whole pack that player id is number | string

#

apparently it's only string??

subtle cove
#

numerical string

#

such id is relevant to entity.scoreboardIdentity.displayName

#

also used on world.getEntity

nova flame
#
if (coins >= cost) {
                removeScore(player, "Coins", cost);
                const itemStack = new ItemStack(chosenItem.id, amount);
                if (chosenItem.customName) itemStack.nameTag = chosenItem.customName;

                inventory.addItem(itemStack);

                player.sendMessage(
                    `§aPurchase Complete! Bought §e${amount} ${chosenItem.name}(s) §afor §e${cost} Coins§a.`
                );
                player.playSound("note.pling", { location: player.location });
            } else {
                player.sendMessage(`§cNot Enough Money! You need §e${cost} Coins§c.`);
                player.playSound("note.bass", { location: player.location });
            }``` how would i go about making this give the ammount of items even if its a non-stackable item
floral timber
nova flame
#

im not good at coding could u please give more in depth or example

floral timber
#
if (!item.isStackable) {
    //loop
} else {
   //add item like  u do
}
grave halo
#

is there any way that i can get the world's seed using js?

nova flame
#

loop?

nova flame
#

what do i place within loop

floral timber
#

wait a min

floral timber
#

this should do ig.

subtle cove
grave halo
distant tulip
#

commands support amount for none stackable

floral timber
nova flame
#

just with ${amount}?

nova flame
subtle cove
#

the last prob lacked the amount

nova flame
#

all i had to do is replace the inventory.addItem(itemStack); with it right

distant tulip
#

`give target id ${amount}`

subtle cove
#

the else part

nova flame
deep quiver
#

Do whatever you want

winged gull
nova flame
#

@winged gullhi crafter

winged gull
north frigate
#

i wish the script api was mostly asynchronous

woven loom
#

?

subtle cove
# nova flame ```js if (coins >= cost) { removeScore(player, "Coins", cost); ...
export const give = (player, itemStack, amount = 1) => {
    const inv = player.getComponent('inventory').container;
    let leftover;
    const addItem = (amt) => {
        let item = itemStack.clone();
        item.amount = amt;
        if (!leftover) {
            (item = inv.addItem(item)) && (leftover = true);
        }
        item && player.dimension.spawnItem(item, player.location);
    };
    const maxAmount = itemStack.maxAmount;
    if (maxAmount === 1) {
        while (amount-- > 0) {
            addItem(1);
        }
    }
    else if (amount <= maxAmount) addItem(amount);
    else {
        while (amount > maxAmount) {
            addItem(maxAmount);
            amount -= maxAmount;
        }
        if (amount > 0) addItem(amount);
    }
};```use it like```js
const itemStack = new ItemStack(chosenItem.id);
if (chosenItem.customName) itemStack.nameTag = chosenItem.customName;
give(player, itemStack, amount);
nova flame
#

i did it already thanks

distant tulip
winged gull
slow walrus
slow walrus
#

ill prob do it for the next release

warm mason
#
/**
 * @param {Entity} entity
 * @param {ItemStack | ItemStack[]} items
 */
function giveItem(entity, items) {
    const inv = entity.getComponent('inventory')?.container;
    if (inv == undefined) return;
    if (!Array.isArray(items)) items = [items];

    for (let item of items) {
        if (item == undefined) continue;

        item = inv.addItem(item);
        if (item) try {
            entity.dimension.spawnItem(item, entity.location);
        } catch {}
    } 
}
runic maple
#

Use world.afterEventEntitySpawn

#

So I need some knowledge on what causes more lag:
I run a bunch of like scoreboard checks for each entity in the world each tick.
If using scripts what lags more in entity.hasTag, scoreboard checks or getting and setting dynamic properties.
Also I heard tags cause lag in commands what about in scripts.

woven loom
#

U can test it urself with profiler

#

Start profiler try all the meathods few times then stop and view the profiler file in vscodd

frozen vine
#

Is there any difference between onUseon of custom component and playerInteractwithBlock?

thorn flicker
#

and there's the isFirstEvent property for playerInteractWithBlock

#

which can be used to see if you are holding interaction or not

frozen vine
frozen vine
# thorn flicker no

Ah, in this case then I should define it manually, I was using playerInteractWithBlock but it executes even when I interact with interactive blocks without being crouched

runic maple
slender bolt
#

Is it possible to remove knockback when getting hit by a projectile?

runic maple
runic maple
#

Though I think hasTag takes more ms than removeTag and addTag and to be fair I also had few tags which might have been why they where so low

#

But it's prolly better to use entity.addTag() than if(entity.hasTag() ) entity.addTag,
But scoreboards eat tps with scripts to summarise

wise raft
#

How can I create a command with a parameter for only one enum entry?

woven loom
runic maple
lone thistle
deep quiver
#

entity.clearVelocity();

subtle cove
deep quiver
subtle cove
#

would it...

floral timber
#

read it first

deep quiver
#

Context is hard

#

Yeah I see lmao

woven loom
narrow patio
#

Is it possible to get a nametag of a mob like a named nametag thing and set their nametag to smth custom?

woven loom
#

yes

full idol
#

Is it a bug that .runCommand can't use the [] data? /setblock ~ ~ ~ ladder["facing_direction"=0]

wary edge
full idol
snow knoll
#

Has anyone else experienced the inability to use transition in and out of free cameras in the camera command?

full idol
open urchin
#

that's the old command syntax
you need to update your min_engine_version in your pack manifest

full idol
#

Ahh that makes more sense, I still had it set to 1.20

warped blaze
open urchin
#

it uses whatever the command syntax was in the min_engine_version you have specified

round bone
narrow patio
#

thanks

round bone
#

You can read it and set.

#

Try searching in documentation first, sometimes you can find an answer here faster than someone might reply.

broken dagger
#

How do I generate structures in specific coordinates as soon as I enter the world? Is it possible?

fallow minnow
#

yeah as long as the area is loaded

broken dagger
#

Hm

shy leaf
#

@pallid stag

world.afterEvents.itemUse.subscribe((ev) => {
    const { itemStack, source } = ev;

    const itemId = "minecraft:compass";
    const command = "say this is baller";
    
    if (itemStack?.typeId !== itemId) return;
    
    source.runCommand(command);
})
#

this is what you can use for now

pallid stag
#

I don't understand anything about the code, and my addon has things that if I pass them to the script, it will only make it more complicated, just look

#

It has a timeline where it is timed from the use of the item, identifying scores, tags to be able to execute what I want

#

I'll wait a little longer to improve my scripting knowledge.

shy leaf
#

oh wow thats a lot

#

the good news is

#

those are very recreatable with scripting api

pallid stag
#

@shy leaf I'm going to practice scripting now, but first I need you to ask a question (sorry for marking)

shy leaf
#

sure, go on

pallid stag
#

Is my manifest correct to begin with?

#

Behavior

shy leaf
#

sure, but the version you are using there is outdated

pallid stag
#

Version of what?

shy leaf
#

api versions

pallid stag
#

Which one would be correct?

shy leaf
#

the latest version for server is 2.1.0

#

and 2.0.0 for server-ui

pallid stag
#

Oh

#

I will change it, thank you very much.

shy leaf
#

server-ui is not needed if you are not planning to make UI forms

pallid stag
#

Ok

#

Is it correct?

shy leaf
#

but the issue here is that it does not know when to send the message

#

so you might not be able to see the message when you load into the world

pallid stag
#

I learned that I always have to put import (world) from "@minecraft/server";

thorn flicker
#

and you'll get a privilege error in v2

pallid stag
#

In the beginning

shy leaf
#

you tell the game that youre using this script file

pallid stag
#

How could I see the message?

shy leaf
pallid stag
#

Hum

#

Ok

shy leaf
#

this is what "events" are used for

thorn flicker
#

the problem is the message tries to send when the system starts up, but you are not loaded into the world yet

#

when you load into the world, you wont see it in chat

shy leaf
#

yep, when you start a world, the codes in the script will be ran once

pallid stag
thorn flicker
#

and like I said it wont work in the first place like this if its script v2

thorn flicker
#

there's listeners for specific things like, when an entity gets hurt, when a block gets broken, ect.

shy leaf
pallid stag
#

Can I use this world.afterEvents.playerPlaceBlock.subscribe((event) => {};

shy leaf
#

this is probably easier to read

shy leaf
#

oops

#

forgot to switch

thorn flicker
#

theres also beforeEvents
you should check this out before using beforeEvents, which also explains the privellege error I was talking about with world.sendMessage()
https://wiki.bedrock.dev/scripting/privileges

pallid stag
pallid stag
#

Broooooooooooo

#

It worked 🙏

#

🙏🙏🙏

#

I'm so excited and happy, thank you for the support

pallid stag
#

I also learned how to use if

#

And how to execute such a thing (send the message) if only a specific block is placed on the ground

floral timber
#

uh, nvm

wise raft
#

Is it possible to to make nametag only mandatory when my:parameters is set? js event.customCommandRegistry.registerEnum("my:parameters", ["set", "reset"]) event.customCommandRegistry.registerCommand( { name: "my:command", description: "desc", permissionLevel: Minecraft.CommandPermissionLevel.Admin, cheatsRequired: false, mandatoryParameters: [ { name: "nametag:parameters", type: Minecraft.CustomCommandParamType.Enum }, { name: "player", type: Minecraft.CustomCommandParamType.EntitySelector }. { name: "nametag", type: Minecraft.CustomCommandParamType.String } ] },

wise raft
chilly fractal
#

you'll get an error if my:parameters is not registered and you used it

#

and also you can't change params dynamically

#

you can make the nametag parameter optional, and check if nametag:paramaters is set and then you can make nametag manadory by just returning a command result with failure in the status if it isn't provided.

chilly fractal
#

OH

#

i understand now lol

wise raft
#

alright

#

thanks

chilly fractal
#

no problem

floral timber
chilly fractal
#

but it's JSON UI + action form.. right?

floral timber
#

ye

chilly fractal
#

also it seems your music was recorded while recording the vid

floral timber
#

oh sry lol

chilly fractal
#

it's okay lol

warm mason
floral timber
#

yup, its annoying af

#

and idk how

chilly fractal
#

anyway action form buttons are still buttons and can't really have "holding" like normal slots which is very problematic on mobile devices lol

floral timber
#

yup

#

idk what to do about that

chilly fractal
#

you can't, atleast i don't think so

#

i myself have been looking for a bit.. but my searching was not fruitful.

floral timber
#

about animation, you know something?

chilly fractal
#

nah lol

floral timber
#

gotta ask in #1067869374410657962

chilly fractal
#

if you find out how to remove it, it'd be helpful if you ping me about the solution

#

as i also need it very much

floral timber
#

sure thng

chilly fractal
#

well have a great afternoon then.

floral timber
#

dont know about that

#

lol

chilly fractal
floral timber
#

oh, i meant ive things that aint gonna go great so

#

(studies i mean)

chilly fractal
#

oh. that's sad, good luck with your studies lol

floral timber
#

hope so

floral timber
chilly fractal
#

ooh

floral timber
#

still want that?

chilly fractal
#

sure

#

anything is better than waiting 2 seconds

floral timber
#

uh, in the server form add this.

{
    "namespace": "server_form",

    "[email protected]_screen": {
        "$screen_content": "server_form.main_screen_content",
        "$screen_animations": [],

        "button_mappings": [
            {
                "from_button_id": "button.menu_cancel",
                "to_button_id": "button.menu_exit",
                "mapping_type": "global"
            }
        ]
    }
    // ..........
}
#

this would clear all the animation it had

chilly fractal
#

thanks!

floral timber
#

np

floral timber
chilly fractal
#

oohhh

#

one sec

#

it's loadin' lol

floral timber
#

there are flickers, but thats almost instantaneous

chilly fractal
#

yeah it's so much better

#

great work!

#

this is very fantastic!

floral timber
#

not me, im building on the shoulder of giants yk.

#

thank BAO

chilly fractal
#

of course

#

and thank you to every single one who has helped you and every single one of us in our journeys

floral timber
#

yup

floral timber
#

ima keep lookin ig

chilly fractal
#

it's pretty good

#

like very actually

#

but it's not "fluent".. like.. state of form to next state.

floral timber
#

its better, agreed, maybe i'll find best, who knows?

chilly fractal
#

this is very great for most forms

chilly fractal
floral timber
#

hmm

chilly fractal
floral timber
#

yup. whatcha you building btw?

#

*making

chilly fractal
#

the taking logic works, but putting logic? i am still testing and pondering

floral timber
#

good luck. these things can be frustrating

chilly fractal
#

fr

floral timber
#

like real real frustrating

chilly fractal
#

so real

floral timber
#

good luck.
it took me over a week for that table alone

chilly fractal
#

damn

#

well good luck on what's left

floral timber
#

thanx

untold magnet
#

umm, sending a scriptevent via scripts is possible but not stable?
for now, ill just use runCommand('scriptevent <eventId>')

slow walrus
slow walrus
#

what you using it for?

untold magnet
# slow walrus what you using it for?

activating my hydration addon functionality,
the function is inside another addon, so i need to send a scriptevent to run the function when both addons are activated

#

basically:
xCore has all addons functionality
xHydration wont work without it, so u have to activate both addons

slow walrus
#

do you care much for using libraries?

untold magnet
#

and in the xHydration script, i can detect if the xCore addon is activated or not to trigger the addon functionality

untold magnet
slow walrus
#

library for communicating between packs

untold magnet
slow walrus
#

no, it uses scriptevents

#

you can setup something to sync dynamic properties if you want though

untold magnet
#

anyways the current method i am using are good, i can use it to detect if my addons are activated or not, and it can detect when the world is fully loaded

round bone
pallid stag
#

Why doesn't it work?

thorn flicker
#

stop using ai

shy leaf
shy leaf
#

rather than ai

thorn flicker
#

getMainHandItem()

#

lol

#

did this really exist

shy leaf
#

except for that

#

i guess

thorn flicker
#

its either ai or randomly guessing stuff.

#

and wondering why its not working? Lol

somber sundial
#

world.events.tick was never a thing

subtle cove
shy leaf
somber sundial
shy leaf
#

for checking stuff

somber sundial
#

or does it default to 1

thorn flicker
shy leaf
somber sundial
#

oh interesting, i didn't actually know that

shy leaf
#

0 also does the same since its clamped

somber sundial
#

i suppose that makes sense

#

runTimeout defaults to 0 though right?

shy leaf
#

i havent used runTimeout for a long time so i forgir

subtle cove
#

its always 1 tick late execution

#

minimum

#

within the millisec, it's possible to clearRun it

shy leaf
#

interesting

neat hazel
#

Why does this happen? I don't understand much about blocks

My code is this:

world.beforeEvents.playerBreakBlock.subscribe((data) => {
  const { block, itemStack, player } = data;
  data.cancel = true
  const item = new ItemStack("minecraft:apple", 1);
  block.dimension.spawnItem(item, block.location);
});
somber sundial
#

before events are "read only", meaning you cannot call apis that modify the world's state

#

you need to wrap that stuff in system.run(() => { /* code here */ })

shy leaf
#

some functions can be ran in read-only mode

somber sundial
shy leaf
#

but stuff that modifies the world usually cant be run in read only

#

like spawnItem

thorn flicker
untold magnet
fading sand
#

How do i reverse an view vector, so it faces the opposite direction?

somber sundial
#

should just be able to multiply by -1 to flip it

fading sand
#

Basically it should look in an different direction
Like if its

it should be <<

thorn flicker
#

yeah but remember you cant do object * number

#

so you'll have do something like this{x: vector.x * -1, y: vector.y * -1, z: vector.z * -1}

fading sand
#

I see,hmm

fading sand
#

Im using this for some kind of shield to detect if the projectile hits within 10deg of where the player looks

hazy kraken
thorn flicker
#

it just makes negative positive, and positive negative.

#

therefore reverts it

thorn flicker
fading sand
thorn flicker
pallid stag
#

I just combined my knowledge in commands like what I knew about scripting and some things I was seeing on the website that was recommended to me

thorn flicker
#

uh huh

hazy kraken
fading sand
thorn flicker
fading sand
#

Im not sure

thorn flicker
#

what method are you using

#

getViewDirection?

round bone
#
try {
    new ItemStack("some:item_that_does_not_exist", 1)
} catch {
    // this code will be executed if item does not exist
}
fading sand
untold magnet
thorn flicker
#

theres an AppleSkin addon?

untold magnet
#

ur idea will work tho

thorn flicker
#

cool

untold magnet
#

it will recieve a big update soon

#

enhancing the ui system, removing the delays, making it compatible with my hydration addon

thorn flicker
#

oh by you

#

nice

fading sand
#

Yellow projectiles should return false and red true the blue circle is where the black view vector comes from

untold magnet
# thorn flicker nice

it will works on custom food items too, like it shows u the custom food info when u hold it

thorn flicker
#

im doing a thirst system too

untold magnet
#

its pretty simple, just some dynamic properties

thorn flicker
#

yup

untold magnet
#

like one or two

thorn flicker
#

and im using the new exhaustion api

remote oyster
untold magnet
thorn flicker
somber sundial
#

Was there no concept of before/after events either?

untold magnet
thorn flicker
#

are you running it every tick?

untold magnet
#

yes,

thorn flicker
#

I didnt have issues

untold magnet
#

if u have hunger effect, it wont catch it sometimes

thorn flicker
#

hm

untold magnet
#

like hunger 2+ will make it buggy

thorn flicker
#

noted

untold magnet
#

do some testing ig

granite badger
thorn flicker
remote oyster
untold magnet
#

even with hunger 255

covert rose
#

What are the new versions for dependencies

#

I’m new and I dunno where to find them

thorn flicker
#

they wont drain thirst normally

#

I mean like, it wont be detached

untold magnet
#

it will detect the saturation, u cant eat to restore saturation when the hunger is full

hazy kraken
#

is this practical? for my kits, I gotta register all the items so I can set up players inventories/equipment, this is js a bunch of export const of itemStacks

#

like 300 lines

thorn flicker
#

like an apple

untold magnet
thorn flicker
#

thats what I did before

untold magnet
#

but gl detecting when the player jumps

thorn flicker
#

so I guess, using my old system would be better

thorn flicker
#

I did that already

untold magnet
thorn flicker
#

you can

untold magnet
#

show me how, and i will show u how buggy it is
-# ill be back in 4m

subtle cove
#

only when pressed/released

#

more like on playerstartjump

thorn flicker
#

well i didnt use that for my old system.

#

I dont recall it being buggy.

untold magnet
#

like PlayerJumpAfterEvent

thorn flicker
#

it does

untold magnet
#

the system is not perfect tho

thorn flicker
#

like I said i didnt use that

untold magnet
#

u can detect when the player is jumping, but not when the player jumps, idk i cant explain it

thorn flicker
#

you can though...

untold magnet
thorn flicker
#

I know what the exhaustion does

untold magnet
#

see how will the exhaustion value will go up each time u jump, also try jumping under a block, like spam jumping

#

see how will the value keep increasing like crazy

#

u cant really do that in scripts

#

i tried everything

subtle cove
#

welp the game is written that way, just input for jumping

thorn flicker
#

lol

untold magnet
# thorn flicker lol

u better make ur thirst system slow, bec u cant get access to pure water early on

#

also, show me the hydration system on ur addon, like how to get hydrated

thorn flicker
#

its not finished, so no

untold magnet
#

mhm

naive frost
thorn flicker
untold magnet
#

hmmm

thorn flicker
#

mhm what

untold magnet
#

<villager-noise>

thorn flicker
#

and you'll get water "saturation" when you first spawn.

#

just like hunger

untold magnet
#

if u made a thirst addon, everyone will ask for a temperature addon, so gl dealing with the system

#

idk i found it a little too complicated

thorn flicker
#

thats what im doing.

#

lol

dawn zealot
#

temprature seems abit easy

#

change temp based on biome

untold magnet
#

SHOW ME

thorn flicker
#

theres a getBiome method in preview

dawn zealot
#

^

distant tulip
#

hmm

untold magnet
thorn flicker
#

im going to rework my temp system tho

#

its not doing so good lmao

dawn zealot
thorn flicker
untold magnet
#

my temperature addon will have two new armor sets, leaf armor and goat-fur armor

#

each one has some downsides

thorn flicker
#

yeah and then you lose armor values

dawn zealot
#

or make a object array like "minecraft:chain_helmet": { temperature_increase: 3 },

thorn flicker
#

yup

#

then add the temperature you've set from the biome

dawn zealot
#

then add it all up and set it

thorn flicker
#

well

#

increment it over time

#

you dont want to happen instantly

untold magnet
#

i have no idea how array works tho

dawn zealot
#

well obv

untold magnet
#

i never deal with them

thorn flicker
dawn zealot
#

works like this

thorn flicker
#

thats not an array

dawn zealot
#

same thing

thorn flicker
#

its not

#

lol

dawn zealot
#

yapa yapa

distant tulip
#

Obj are faster

dawn zealot
#

idek if i hazve a single array

thorn flicker
#

so you do know the difference

dawn zealot
thorn flicker
#

time to script

untold magnet
#

the issue is, my armor system has different values in different biomes,

untold magnet
#

so i dont think the array will works fine for me

dawn zealot
#

it does

distant tulip
untold magnet
# dawn zealot it does

this is what i mean

Leaf Armor:
  - Cold: 1 - (0.2 + 0.3 + 0.25 + 0.2) = 0.05 → -95%
  - Hot: 1 - (0.15 + 0.25 + 0.2 + 0.15) = 0.25 → -75%
  - Chilly/Mild: 1 - (0.1 + 0.2 + 0.15 + 0.1) = 0.45 → -55%

thorn flicker
#

eh

untold magnet
#

it has different values in different biomes

distant tulip
#

Eh indeed

dawn zealot
#

chatgpt moment

thorn flicker
#

yay more ai

neat hazel
#

Does afterEvents.playerPlaceBlock not have itemStack?

thorn flicker
#

no

#

I dont see why it would

dawn zealot
dawn zealot
thorn flicker
#

you edited your message

distant tulip
#

You could just make a multiplier for each biome
The armors have a value but before calculating how that affects the player temperature you multiply it by the biome temperature multiplier

dawn zealot
neat hazel
#

So how can I detect the item that was in the player's hand after I placed a block?

thorn flicker
#

get the equippable component

dawn zealot
#

then run it a tick late o smt

#

or*

dawn zealot
#

for getBiome

untold magnet
distant tulip
thorn flicker
#

like im doing

neat hazel
untold magnet
# distant tulip Nope You hard coded the values

HelmetBonus / HelmetEnchantBonus + ChestplateBonus / ChestplateEnchantBonus + LeggingsBonus / LeggingsEnchantBonus + BootsBonus / BootsEnchantBonus
each armor will have different value if it has fire protection enchant

distant tulip
#

Again, multiplier

dawn zealot
#

just run function using before event

untold magnet
#

it works somewhere good ig

distant tulip
#

I know it work, just saying there is better way to do things

untold magnet
#

all i have to do next is increasing the temperature value from being too small, like 0,025

dawn zealot
#

u remind me of when i said functions were better than scripts

#

oh how wrong i was

neat hazel
dawn zealot
#

just remember to import system

neat hazel
neat hazel
# dawn zealot looks right to me

This is appearing:
[Scripting][error]-TypeError: cannot read property 'subscribe' of undefined at <anonymous> (index.js:103)

[Scripting][error]-Plugin [Addon - [index.js] ran with error: [TypeError: cannot read property 'subscribe' of undefined at <anonymous> (index.js:103)
]

dawn zealot
#

then its ur event

neat hazel
#

I think it's something related to "beforeEvents.playerPlaceBlock"

warped blaze
neat hazel
#

I didn't want to use beta apis, but it's the only way

thorn flicker
#

you didnt need to create a function

full idol
wary edge
#

You can check #1072983602821861426 for workarounds.

full idol
#

Oh oops thanks!

grand needle
#

Is it possible to detect if an entity is an adult?

warm mason
subtle cove
#

what about hasComponent

wary edge
#

Dont be rude @warm mason

thorn flicker
#

!entity.hasComponent('is_baby') would work too yeah

naive tinsel
#

is there a smoother way to move an entity other than running a entity.applyImpulse... every tick?

distant tulip
#

gametest

pallid stag
#

Is it possible to create a UI that only appears if there is a specific tag on the player, and it changes according to the value of a scoreboard?

naive tinsel
naive tinsel
snow knoll
pallid stag
#

I don't know the difference between the two, can you explain it to me?

snow knoll
#

When I said action form I was referring to general scripting UI but to simplify it as much as possible Action Forms, Message Forms and Modal Forms are all scripting ui and looks like the picture below
Whereas, json ui is more like the in game vanilla ui, as in crafting table, inventory, so on and so forth

pallid stag
#

I understand, but it's not that type, but something like an image.

#

I intended to add a bar like the one in the image above

#

Where it is controlled according to the value of a specific scoreboard

spice finch
#

Is there a reason that I shouldn't use world.setDynamicProperty() for like a couple hundred to maybe thousands of key value pairs?

#

dynamic properties feel super powerful, surely there is a downside to doing this

hazy kraken
#

I feel like u could get away with a few hundred sense it's usually static data

#

But maybe you'll feel some lag if there all dynamically changing every tick

spice finch
#

They would only be strings of a couple characters long (20ish max)

hazy kraken
spice finch
#

static

#

mainly just data storage at large scale

hazy kraken
#

Yea I feel like you could get away with upwards of 250, but I've never try anything like it so I'm not sure

spice finch
#

hmmm, I'll have to give it a test

#

thanks

hazy kraken
spice finch
#

how would I tell if its lagging the game? since they aren't being called very often, just kind of existing in large quantities

hazy kraken
#

I mean I was able to store multiple inventories on player, and that's like 500 character per saved inventory

hazy kraken
#

So js log out and see how much of difference it makes

dense wraith
#

One message removed from a suspended account.

spice finch
spice finch
dense wraith
#

One message removed from a suspended account.

#

One message removed from a suspended account.

dense wraith
#

One message removed from a suspended account.

hazy kraken
dense wraith
#

One message removed from a suspended account.

#

One message removed from a suspended account.

hazy kraken
#

Hmm

#

I'm not sure, I haven't worked with health component yet

spice finch
dense wraith
#

One message removed from a suspended account.

#

One message removed from a suspended account.

spice finch
# hazy kraken Nice lol

Quick update:
10k properties in and doesn't seem to be any issues. although it doesn't like when you call world.getDynamicPropertyIds()

pallid stag
hazy kraken
spice finch
hazy kraken
spice finch
#

now how does one delete roughly 10k dynamic properties from your world. not that I have that many... 🙃

spice finch
hazy kraken
hazy kraken
jolly junco
#
[Scripting][error]-TypeError: cannot read property 'subscribe' of undefined    at <anonymous> (enchMomentum.js:118)

This is line 118: world.beforeEvents.chatSend.subscribe((ev) => {

#

Why?

unique acorn
#

you need beta api for it

jolly junco
#

Ohh thanks

empty yoke
#

With "onPlayerInteract" on the block, can't the event be canceled?

round bone
warm mason
empty yoke
wise raft
#

Is it possible to have rawtext as command parameter?

deep quiver
floral timber
#

for someone who just codes in one file, modularity at this level is such an achievement.

deep quiver
#

Doing more and more projects is the best way to learn structuring

floral timber
#

yup. its my first step towards spliting

#

structure is okay for beginners right?

deep quiver
#

Its ok yeah, theres definitely still improvements to be made

floral timber
#

like

deep quiver
#

Its all personal preference, but you could move the individual registry files into their folders, so the menu folder includes the menu registry code + all the menus

floral timber
#

good idea

deep quiver
#

Also for the future you should make utils a folder

floral timber
#

yup, and?

deep quiver
#

Thats good for now

#

Would be even better if I could see the code, structure is really dependant on the code. Most other suggestions I would give are just very personal preference, but what you have is definetly not bad. Most important is that your comfortable with your code base

floral timber
#

thats right. should i send the code over to you, perhaps?

deep quiver
#

Nono

floral timber
#

figured lol

#

was jk

#

thank you for the suggestions.

deep quiver
#

We can one day hop into a vc, but that will turn into a full on code review

floral timber
#

im quite uncomfortable in vc

#

introvert kinda things

#

sure if its just screen sharing.

#

btw thanks.

deep quiver
#

Np, I like it when people actually care about code quality

floral timber
#

its only recent awareness tho.

#

i was a guy whose motto was "make it work"

#

how? dont care.

deep quiver
#

Yeah like 99% of the bedrock community

#

Sometimes its good to have that mindset, but if you actually want to improve, you should care

#

And one day you will just write decent quality code without thinking about it

floral timber
#

right, its practice after all.

#

well, still a long way to go

#

wish me luck lol

hazy kraken
#

jk

#

I use to have structre, but I had to edit tons of stuff, and everything got complied into one folder so I just left it🥀

deep quiver
# hazy kraken you must hate me then

I don't hate anyone, if your ever work with me, you will see that I would just give tips and tricks and help the other get onto a level, where we can work together comfortably. Sadly it doesn't always work out, bcs of time constrains

hazy kraken
untold magnet
#
  • will it be compatible with custom food/drinks? for my addon it is, it just requires a specific tag
thorn flicker
pallid portal
#

Stupid question:
when you have a script that check when a block is broken, placed, interacted with etc.
Does this script only check the block that has that script as part of its custom component, or will it check every block in the world and then check if its the applicable block before doing the rest of whatever the script is about?

Because if yes, wouldn't that make the code a bit clunky or demanding in performance when stacked up with multiple blocks and/or addons?

And wouldn't there be a way for the script to fire only when the relevant block it is supposed to run with be triggered for its event?
ex. interacting with custom block A triggers event B. Instead of interacting with every block in general (or just interacting as an action) for the script to constantly check for custom block A to trigger event B.

distant tulip
#

assuming you are talking about custom components events

#

ItemFoodComponent
only work for apples?

thorn flicker
#

it's annoying

distant tulip
#

@civic nest
🤷‍♂️

thorn flicker
#

when it comes to vanilla foods just rely on the wiki for that info

distant tulip
#

i guess that's one way of doing it

thorn flicker
distant tulip
#

cry

#

lol, i didn't think of any other way
was thinking more of in game thing

thorn flicker
#

just create an object listing every vanilla food item and for each item have an object listing their food info.

#

and just go to the wiki for that data

pallid portal
# distant tulip assuming you are talking about custom components events

custom components, yes
Mainly for blocks.

I have trouble understanding why the script I was learning was apparantly reading all interactions and then the script checks if it is the applicable block. And if there were something that makes the script trigger only when the block in question is interacted with, ticks or does an event in general.

In other words.
Would scripts run when the player does an interaction event. Which can be anything and thus unnecessary for everything other than the block that the script is supposed to trigger on.
Or would interacting with the only the applicable block make the script run.

The former makes the script run several times and make unnecessary checks, while the latter only checks for when the block in question is doing an event.

distant tulip
thorn flicker
#

I mean in the way food component represents it.

distant tulip
#

hmm?

thorn flicker
#

the itemFoodComponent properties

distant tulip
#

i just scraped the wiki and though to share it

#

you mean the names?

thorn flicker
#

I was thinking of only doing the info the food component provides.

#

and use the wiki to help figure that out

distant tulip
#

yeah, there was a lot tho. typing all that will be a nightmare
that just the raw stuff i got from it

thorn flicker
#

it'll just be tedious

distant tulip
#

yeah

thorn flicker
# distant tulip yeah

also you typing all that stuff out would take as long as you gathering the data from the wiki...

#

not as long but both seem tedious to me.

distant tulip
#

not really, i used ai
Ai prompt:
I have this link and there is a table in it formatted like this
"x"
scrap that data and follow the link to the item page, in it there is this table
"y"
use both of those and put the data into a json file formatted like this
"z"

thorn flicker
#

ai...

#

so you didnt scrape through it

#

lol

distant tulip
#

i guess

thorn flicker
#

you saying that made me think you did.

#

dont blame you using ai for that though, wouldnt want to sit there doing that.

distant tulip
#

no i didn't
i mean i know how to use axios and most scraping tools but i am not making a code that i only run once and delete it

jagged gazelle
#

Wazzup guys

runic maple
prisma shard
#

send me some in dm

normal wing
#

The /toggledownfall command doesn't trigger the WeatherChangeAfterEvent, bug or no?

distant tulip
#

toggledownfall??

prisma shard
#

whaaaat

#

tf is the toggledownfall command

thorn flicker
#

its a command to make it quickly rain guys.

thorn flicker
subtle cove
#

hmm

#

it sure does not trigger any event

thorn flicker
#

if I remember correctly, the weather command also does not trigger it

subtle cove
#

/weather triggers the event

earnest meadow
#

Hey @fiery solar, I was wondering on your "Quantum Entities" post, how did you detect whether the player is looking at the entity?

#

Is it scripts or the same thing creaking uses?

#

If scripts, can you please share how?

prisma shard
#
function isLookingAtEntity(player, maxDistance) {
        try {
            const rayEntity = player.getEntitiesFromViewDirection({ maxDistance: maxDistance })[0]?.entity;
            if (rayEntity) {
                return true;
            }
        } catch (e) { return false; }
    }```
lone mango
#

How does one blank out the off-hand slot?
I tried this:

equippableComponent.setEquipment(EquipmentSlot.Offhand, undefined);

Doesn't work.

lone mango
#

I do not.

shy leaf
#

odd

#

does setting it with other items work?

lone mango
#

yeah, works with the other slots like head, chest, leggings, etc

shy leaf
lone mango
#

ok... then it worked that time... I swear this game is off its rocker sometimes

subtle cove
#

hmmm

jagged gazelle
subtle cove
earnest meadow
earnest meadow
#

yeah I wasn't talking about that

prisma shard
#

well if you meant player's whole screen view thats also possible

prisma shard
prisma shard
prisma shard
distant tulip
# prisma shard
import { Entity } from "@minecraft/server";

Entity.prototype.getEntitiesFromAngle = function (maxDistance = 6, fov = 60, options = {}) {
    const viewDir = this.getViewDirection();
    const pLoc = this.location;

    const queryOptions = {
        ...options,
        maxDistance,
        location: pLoc
    };

    const cosFov = Math.cos((fov * Math.PI) / 180);
    const results = [];

    for (const entity of this.dimension.getEntities(queryOptions)) {
        if (entity === this) continue;

        const eLoc = entity.location;
        const toEntity = {
            x: eLoc.x - pLoc.x,
            y: eLoc.y - pLoc.y,
            z: eLoc.z - pLoc.z
        };

        const dot = viewDir.x * toEntity.x + viewDir.y * toEntity.y + viewDir.z * toEntity.z;
        const mag = Math.sqrt(toEntity.x ** 2 + toEntity.y ** 2 + toEntity.z ** 2);
        if (mag === 0) continue;

        const cosAngle = dot / mag;
        if (cosAngle >= cosFov) results.push(entity);
    }

    return results;
};

prisma shard
#

updated version?

#

nice

sharp elbow
#

In most cases this shouldn't matter, since people are very likely to give it an object literal. But that is something to consider if someone passes a variable as an argument

sharp elbow
#

Instead, I would construct a new object in the getEntities call with the new properties passed in:

for (const entity of this.dimension.getEntities({...options, maxDistance, location: pLoc})) {
distant tulip
#

updated, thanks for pointing that out

mint cairn
#

I'm learning more about scripting. When I run /reload are all existing subscriptions automatically cleaned up or do I need to manually unsubscribe to the events I subscribed to?

sterile epoch
#

how do I stop the player from dying and instead give a tag?

shy leaf
sterile epoch
round bone
sterile epoch
#

I tried to set min health to 1 then check if damage received was fatal but it seems min in health component was removed

edgy elm
#

Hello here, does anyone here encounter the same issue with me?

Whenever i add a new file or folder inside my script folder, i still need to re-open Minecraft instead of just reloading it. Before I just /reload and it will detect new file script added but now I need to re-open Minecraft just to detect new file.

floral timber
edgy elm
floral timber
#

to me it didnt work like that iirc, js json all needed reopening world

#

ig ive the same issue as you lol

fickle dagger
hazy kraken
prisma shard
#

hm

#

When I constantly add dynamicProperty to my item, it keeps moving in my hand 😭

#

halp

#

it also makes it have "has custom properties" lore

#

thats not the problem but the problem is its moving like when you interact/consume something, i cant find a way to save itemstack as dynamicproperty in world or player

valid ice
#

That's normal, you're replacing the item in hand constantly.
The "has custom properties" can be toggled with a gamerule /gamerule showtags false

#

Can I ask why you're constantly replacing the item?

hazy kraken
tame chasm
#

Hi can some help me my friend do me a scoreboard script but he mean that I have too modify some things what I have too modify

import {
    BlockExplodeAfterEvent,
    BlockVolume,
    Dimension,
    ListBlockVolume,
    Player,
    PlayerBreakBlockBeforeEvent,
    system,
    UnloadedChunksError,
    world,
    type Vector3,
} from "@minecraft/server";
import { BlockPattern } from "BlockPattern";
import { getStringFromDynamicProperties } from "getStringFromDynamicProperties";
import { sellAllMaterialsForPlayer } from "materialSell";
import { numberFormatter_compact_lite } from "numberFormatter";
import { saveStringToDynamicProperties } from "saveStringToDynamicProperties";

/**
 * Updates the sidebar for a player with their rank, money, and other information.
 *
 * @param {Player} player The player whose sidebar will be updated.
 */
export function updateSidebar(player: Player): void {
    if (!player.isValid) return;
    const rankTags: string[] = player.getTags().filter((tag) => tag.startsWith("rank:"));
    const sidebarTitleText: string = `§a§n§d§e§x§n§o§v§a§_§s§i§d§e§b§a§r§_§t§i§t§l§e§r§dIGN: §r${player.name}§r
§gRank: §r${rankTags.length > 0 ? rankTags.map((tag) => tag.replace("rank:", "")).join(", ") : "§bMember"}§r
§aMoney: §r§2§a${playerMoneyData.get(player) !== undefined ? numberFormatter_compact_lite(playerMoneyData.get(player)!.toString(), true) : "§dLoading..."}§r
§vMine Rank: §r§b${player.getDynamicProperty("mineRank") ?? "§cNone"}§r`;
    const sidebarSubtitleText: string = `§9Discord: §r§bheCTKamNWZ§r
§dRealm: §r§eA7GcoEgktxYHibk§r
§cIP: §r§e74.208.75.189§f:§e19132§r
§eTPS: §r${avgTps1SecondColor}${avgTPS1Second.toFixed(0)}§r`;
    player.onScreenDisplay.setTitle(sidebarTitleText, { fadeInDuration: 0, stayDuration: 1200, fadeOutDuration: 0, subtitle: sidebarSubtitleText });
}
tame chasm
# hazy kraken What do you want

Its a sidebar Scoreboard because I'm too stupid @winged gull have do it me but I dont know what I have too modify that I work

prisma shard
valid ice
#

can you show your code?

prisma shard
#

I am not on pc lol

#

Srry for late reply but yuh can i show tmr

tame chasm
hazy kraken
valid ice
#

finna

tame chasm
#

Oh :(. Than I get ignore

hazy kraken
prisma shard
hazy kraken
hazy kraken
tame chasm
#

Wait

#

Can some of u help me pls

#

If not I'm sad :(.

hazy kraken
prisma shard
# hazy kraken What's the functionality

Its a flashlight script which places light blocks around and saves the battery charge percentage across each flashlight item, which i am using dynamicProperty for, to save the charge value.

tame chasm
#

Pls 🥹

prisma shard
tame chasm
#

Bruh i think I get help

#

In this server

prisma shard
#

Either learn basics of script api and have patience, Because you just pasted a whole chunk of code written by another person and asking for help repeatedly

valid ice
prisma shard
#

Maybe AI secretly put that in my code.... Yuh ill see tmr

hazy kraken
prisma shard
#

Sorry Im on not on pc 😓

hazy kraken
valid ice
flat barn
#

🤷‍♂️

silver agate
#

And everything is wrong there.

#

Just the js syntax is ok, all the minecraft scripting logic is wrong there.

shy leaf
#

if you feed GPT the whole metadata and documents, it could work

#

not guaranteed though

tame chasm
prisma shard
pseudo kraken
#

Minecraft released 1.21.120 preview when 1.21.110 is not released. Next update will be 1.21.110 (2.3.0-beta) or 1.21.120 (2.4.0-beta)?

open urchin
#

the next update will be 1.21.110
they always start the preview cycle of the next update before the previous one releases

north frigate
valid ice
#

runJob

deep quiver
#

runCommand

hazy kraken
#

marathonCommand

unique acorn
#

walkJob

amber nest
#

marchCommand

somber onyx
#
system.beforeEvents.startup.subscribe((init) => {
    const testCommand = {
        name: "lu:test",
        description: "test",
        permissionLevel: 3,
        cheatsRequired: true
    }
    init.customCommandRegistry.registerCommand(testCommand, test());
});

function test(player) {
    let ply = Player_DB.get(player.id)
    world.sendMessage(JSON.stringify(ply))
}

hey guy how to get the player who did the command

unique acorn
somber onyx
#

someone would like how an add arguments to a command?

subtle cove
empty grail
#

yes

#

is there a way to send packet?

slender bolt
#

How to add like numbers to a property instead of setting it? setProperty("example:property", 2)

slender bolt
fallow minnow
#
const prop = getProperty("example:property")
setProperty("example:property", prop + 1)```
sour sedge
#

Old thread, but still a relevant topic I think. I recently asked chatgpt to refactor some minified Javascript and it got the logic wrong several times. Most of the time it was correct, but it was so time consuming carefully checking each line. Or it would just leave out parts. I've started just refactoring it myself.

So many little glitches with AI, and so unsatisfying carefully checking it compared to me just rewriting it. I experimented with asking it to refactor Boolean statements and it still got it wrong sometimes. When I restated the same Boolean statements but with simple a, b, c instead of longer variable representations, it would sometimes tell me the opposite logic result.

When a computer program gets logic wrong, you know you're not dealing with something deterministic and reliable. A program to refactor code deterministically (traditional coding) would be far more reliable here - I'm sure some exist.

What I have found AI useful for is identifying coding patterns from very little code given to it that I'm unclear about the function of, because pattern recognition is about the most useful application of machine learning.

And sometimes explaining stuff and answering questions but even then it can lead me up the garden path because it doesn't really understand context.

granite cape
narrow lintel
#

Hello creators, can I summon a warden where the custom projectile will hit, but only owner player can lauch the projectile not other players

#

Owner player mean, player who will spawn the projectile

#

Is it possible?

woven loom
#

cancel item use ?

narrow lintel
narrow lintel
woven loom
#

your