#help-development

1 messages · Page 1458 of 1

opal juniper
#

Does that ignore amount?

eternal oxide
#

or just compare Material

#

yes

#

someone able to join a server to test something for me?

#

a Workbench

opal juniper
#

sure

eternal oxide
#

a wqorkbench shoudl have opened

opal juniper
#

nope

vital swift
#

how do i get create temporary team in scoreboard?

#
        defaultTeam.setPrefix("§7");```
#

i use this

#

but it saves it into scoreboard.bat

#

and i don't want that

opal juniper
#

@eternal oxide can i steal your code for it if you get it working 😄

eternal oxide
#

yep

opal juniper
#

awesome

eternal oxide
#

Not sure I will. I'm just playign around

opal juniper
#

Well, fingers crossed

eternal oxide
#

I can get both players using the same workbench, but one of them can't craft as its treated as a normal inventory

#

I wonder...

opal juniper
#

oohhhhh,

#

that makes sense but is annoying

keen kelp
#

how do I load a yaml that's inside a sub directory

sleek pond
#

you use google

keen kelp
#

k

eternal oxide
#

Reverse of saving

eternal oxide
minor garnet
#

if i define a vector in the direction of a player and define another in another direction, can i create a distance between these two directions with the pitch and yaw axes?

opal juniper
eternal oxide
#

I can too, but seperate inventories 😦

keen kelp
#

oh so File file = new File()
then a.load(file)?

opal juniper
eternal oxide
#

I can get both using the same crafting inventory but only one can craft.

#

It seems only possible using nms

opal juniper
#

I mean, that isn't too bad ig

#

but a pain

shy wolf
#

how to get the time in the real life?

eternal oxide
#

I tried using the same location, but it just creates a seperate inven

opal juniper
#

<

#

Are you using the method under player?

eternal oxide
#

a combination

#

When the first player opens you openWorkbench, then store the TopInventory reference, so any subsequent players open that inventory

#

That allows you to all use teh same grid, but the one who opened it as an Inventory can;t craft

opal juniper
#

Riiiight, what does the boolean do

eternal oxide
#

forces it to open a Workbench even if teh location has no workbench

shy wolf
#

i did it

#

i google it

#

YAY

opal juniper
eternal oxide
#

you could 🙂

#

ok join once more

opal juniper
#

oh wait, that might not work anyways, cause it would not consider the ingredients as ingredients

#

ok

#

How are you moving stuff in my inv?

eternal oxide
#

lol, It seems it can work as crafting, but the result is not filled in for me

opal juniper
#

that was so weird

eternal oxide
#

I could access your inventory by storing the View and opening that

opal juniper
#

lmao

eternal oxide
#

So close, but its not quite right

opal juniper
#

Now that is an actually good invsee plugin right there

vital swift
#

i get player's scoreboard and register new objective inside it

eternal oxide
#

This is the code thats forcing everyone to have seperate Workbenches java getHandle().openTileEntity(new TileEntityContainerWorkbench(getHandle().world, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ())));

#

In CraftHumanEntity

opal juniper
#

Yeah i see that

#

Is there a crafting table placed in ur world?

eternal oxide
#

yes

opal juniper
#

Hmmm, i mean, If there was an easy event listener for change, you could just get the contents and for every Viewer just set the result

#

But idk other than that

sleek dragon
#

yep

#

Tuinity tho- not sure if that effects it in any way

sharp bough
#

is there a way to check a string like if title.equals("add" + anything here)

#

im trying to make a gui that has 2 functions based on the title, but same items

sleek dragon
#

ok so

sharp bough
#

so if the title is "add location" it will run command "add location"

sleek dragon
#

it does work, but not 100% of the time

sharp bough
#

but if the title is add item it will run command "add item"

sleek dragon
#

if u try enough, the item will get stuck and wont be canceled

vital swift
#

Objective e = board.registerNewObjective("Tablist");

#

i register new one

#

on the main

summer scroll
sharp bough
vital swift
#

it works for me

summer scroll
#

you're comparing inventory using its title

sharp bough
#

and the item clicked, plus i have an unique id for my plugin in the title name

minor garnet
vital swift
#

can u come in private?

opal juniper
paper viper
#

if you can share it private you can share it here

vital swift
#

sec lkoging to pastebin

shy wolf
#

?paste

queen dragonBOT
vital swift
#

it's longer code

#

it just adds the player

#

and check for permission

#

sec

paper viper
#

holly

vital swift
#
        Boolean displayHealth = Settings.getValue("DisplayHealth");
        Boolean updateName = Settings.getValue("DisplayUpdateAboveName");
        for (Player pls : Bukkit.getOnlinePlayers()) {
            sendTablist(pls);
            if (updateName == true) {
                loadTeams(pls.getScoreboard(), pls);
            }
            if (displayHealth == true) {
                removeHealth(pls);
                showHealth(pls);
            } else {
                removeHealth(pls);
            }
        }
    }```
#

oke

#

So it won't save it in scoreboard.bat?

#

oke

#

Scoreboard board = Bukkit.getScoreboardManager().getMainScoreboard();

#

player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());

#

i did like this

#

how should i use it instead?

#

oh new

#

oke Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard();

#

so this

#

will not override player's scoreboard?

#

like this

#

already have it

#

but will it override player's scoreboard?

#

because i don't want to override player's current scoreboard

#

It's in different plugin the scoreboard

#

Objective?

#

I used to use objectives

#

and it worked

#

but it stored the teams in Scoreboard.dat

#

which i didnt want

#

because it makes the player wait longer

#

Can i do it with objectives?

#

like get player's scoreboard

#

and register new objective

rancid agate
#

I have a problem: when i want get type of 1.16 item my return is "AIR"

code: String itemType =player.getInventory().getItemInMainHand().getType().toString(); player.sendMessage(itemType);

tardy delta
#

if a player is holding nothing or what?

muted idol
#

hey there so i have this part of my code which once a player dies it sends them back to the lobby, and then unloads all the worlds on that bungeecord server for example World1_overworld World1_nether & World1_the_end and then deletes them. but for some reason the world that the player dies in doesn't get deleted. im getting no stacktrace.

rancid agate
#

no player is holding a 1.16 item like warped sign

#

my API is spigot 1.16.5 ...

opal juniper
#

Hey @eternal oxide you mind sending me what you got to

eternal oxide
#

I'm still digging through nms

opal juniper
#

Oh, sorry!

#

Thanks tho

rancid agate
#

that is to say?

muted idol
#

here is the function. do you want my full class?

    public void GameEnd() throws IOException {    
        for (Player player : Bukkit.getOnlinePlayers()) {
            plugin.runners.clear();
            plugin.hunters.clear();
            plugin.playermanager.clear();
            plugin.playersInGame.clear();
            plugin.playersLeftGame.clear();
            player.getInventory().clear();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }   
            plugin.sendToServer(player, plugin.getConfig().getString("Settings.Hub"));
        }
        
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }   
        
        Bukkit.getServer().unloadWorld("ManHunt", false);
        Bukkit.getServer().unloadWorld("ManHunt_nether", false);
        Bukkit.getServer().unloadWorld("ManHunt_the_end", false);
        
        FileUtils.deleteDirectory(new File("ManHunt"));
        FileUtils.deleteDirectory(new File("ManHunt_nether"));
        FileUtils.deleteDirectory(new File("ManHunt_the_end"));

        Bukkit.createWorld(WorldCreator.name("ManHunt"));
        Bukkit.createWorld(WorldCreator.name("ManHunt" + "_nether").environment(Environment.NETHER));
        Bukkit.createWorld(WorldCreator.name("ManHunt" + "_the_end").environment(Environment.THE_END));
    }
``` and yes i know that i have to fix the Thread.sleep thing. its just there for testing purposes
opal juniper
#

?paste

queen dragonBOT
muted idol
#

lmao just said that its for testing purposes

#

i was going to fix that

#

do you mean in between Bukkit.getServer().unloadWorld("ManHunt_the_end", false); and FileUtils.deleteDirectory(new File("ManHunt_the_end"));?

civic tapir
#

Where would I learn how to do custom world/terrain generation and adding custom ores/blocks?

wraith rapids
#

you have a long way to go

keen kelp
#

how do I write FileConfiguration to a custom config file

wraith rapids
#

you use google

keen kelp
#

ok

#

got it

opal juniper
keen kelp
#

javadocs has it lel

tardy delta
#

how to use google?

#

:/

civic tapir
#

instructions unclear how to goooogloo

keen kelp
tardy delta
#

imagine googling how to use google

civic tapir
tidal dust
tardy delta
#

wew

civic tapir
#

!paste

#

or whatever

tardy delta
#

?paste

queen dragonBOT
keen kelp
#

?paste

queen dragonBOT
devout estuary
#

Is player#getStatistic available in <1.13?

tardy delta
#

i always thought it was easier to read code here than clicking on a link

opal juniper
#

no

civic tapir
#

ik

#

but its kinda the rules

tardy delta
#

oh

opal juniper
#

it spams chat

#

and is annoying

digital rain
#

any ideas on how to edit preexisting jar files, if i want to adjust just a couple of lines

civic tapir
opal juniper
#

np!

#

i will have a look

digital rain
#

after i decompile its missing libraries and getting a lot errors tho

tidal dust
#

Thank you!

civic tapir
opal juniper
#

make e.getInventory().setItem(2, result); the last line

earnest junco
civic tapir
#

maven mmm

opal juniper
tidal dust
#

Ok. Is this what is stopping the item from being added at all?

digital rain
tardy delta
#

what :/

civic tapir
opal juniper
digital rain
#

no

#

lol

#

completely different paths

#

and i have relocate them

#

no idea how tho

tardy delta
#

._.

opal juniper
devout estuary
#

Yes? Because i've had issued with the getPlayedTick stat

tidal dust
# opal juniper Errrm, no

Oh, for some reason when I place a lingering potion (in my test i used a lingering potion of slowness) and a diamond block, nothing appears in the output box, and the arrow has a x over it.

civic tapir
#

where on the javadocs can I find stuff on creating custom bloccks and such?

opal juniper
#

yeah, have a look at that

civic tapir
#

ones that I make myself, in the code

opal juniper
#

There won't be anything, cause it ain't possible

#

Cause the client doesn't know how to interpret it

digital rain
opal juniper
#

yes

#

it does matter

digital rain
#

so it wont work im guessing

opal juniper
#

most likely not

digital rain
#

does anyone have a quick link to 1.9 spigot?

vagrant stratus
#

Have to use build tools m8

#

?bt

queen dragonBOT
digital rain
#

oh yeah true

#

christ overwriting someone's code for single patch is much more difficult than anticipated

earnest junco
#

which is why you say "no" when someone tells you to do it for a project that's not open-source

keen kelp
#

do I need to import anything to use Logger?

tardy delta
#

yes

digital rain
#

i feel like ill copy all the classes all the files individually and it will be faster

#

-_-

#

like i have no idea what to do

#

when i put the new version of the plugin back it only took half of the storage of the previous one and it didnt even show up as plugin after i ran the server

#

any ideas for good player health display plugins

#

ty,

errant drift
#

1.9?

digital rain
#

1.16.5

errant drift
#

what's the point in using 1.9?

digital rain
#

no just 1.9 was the thing that the revious plugin used, and its like impossible to adjust it

keen kelp
#

when would WorldLoadEvent be triggered

dusty herald
#

when a world is loaded

keen kelp
#

like server start?

dusty herald
#

no

#

when a world is loaded

sharp bough
#

how did i mange to copy a chest with internal items? whenever i place it it has the items

keen kelp
#

or player join

ivory sleet
#

lol no

keen kelp
#

under what circumstances would a world be loaded

dusty herald
#

when the world is loaded 🤷

sharp bough
#

oh shit with ctrl you can copy a chest and it data

dusty herald
#

wtf

ivory sleet
#

whenever a world is loaded into the server first WorldInitEvent is fired (precisely after instantiation), then WorldLoadEvent is fired once the world loaded in stuff into memory like chunks etc

dusty herald
#

sorry conclure

ivory sleet
#

lol its fine 🙂

dusty herald
ivory sleet
#

oof

dusty herald
#

CraftBukkit's repo of course

ivory sleet
#

damn never seen that happen on any gh repo b4

paper viper
#

link?

#

i wanna se

dusty herald
#

oop

#

i tried to make embed show and now i cant link

paper viper
#

o

#

F

eternal oxide
#

Anyone have an example of PacketPlayOutOpenWindow for 1.16?

keen kelp
#

?Paste

queen dragonBOT
keen kelp
#

this is the code for automatically disabling

#

natural regeneration

#

but for some reason, non of the logs outputted

#

Did I overlook something simple?

#

nvm I figured it out

rare hazel
#

Does anyone know if you need to use setDescriptionComponent(BaseComponent description) to set the motd on a proxy ping event for a BungeeCord plugin? setDescription(String description) is deprecated or am im totally off track with this....

quasi merlin
#

i have an a question i trying to make multiple items and for each item i made it events like Item1.EntityDamageByEntityEvent Item2.OnFish
but my question is on a event is fired for example EntityDamageByEntityEvent how i can get all items in a folder so i can fire it event instead of making listener for each items

keen kelp
#

how do I create a taskbar(or whatever it's called)(actionbar?) that updates every tick

#

so 2 problems 1. how to action bar 2. how to have something happen every tick

#

but how do I schedule an event tho

rare hazel
#

@ILikeToCode so should i use the deprecated one or the on with the BaseComponent?

quasi merlin
#

wdym

#

i creating it through itemStack

#

classes

grave sparrow
quasi merlin
grave sparrow
#

Essentially each item extended a CustomItem class and then if I knew an events item was the same one as the customitems item stack I could cast it and run the event

#

Event method for that item*

quasi merlin
#

ok thx i hope u still have it

keen kelp
#

how do I send a player an action bar

#

like text above the hotbar

slim rivet
#

yoo

grave sparrow
rare hazel
#

@ILikeToCode do you know how to create a BaseComponent, im having a hard time even figuring out how to create one it....

keen kelp
#

so there's no good way to do it by oneselves?

keen kelp
#

thx

#

so like this?
p.spigot().sendMessage(ACTION_BAR, "Test");

quasi merlin
#

another question is there is a way to make a itemStack item have a uuid for database saving for an example an item have random damage value on it lore but on hit i want to import that item data from a database and check it damage instead of reading item lore

keen kelp
#

I dont think it is

#

how do I fix that

#

Im using Intellij btw

naive spindle
rare hazel
#

TextComponent test = new TextComponent();
test.setText("is this working!");ping.setDescriptionComponent(test);

#

fuck

keen kelp
#

If I was suppose to replace ACTION_BAR with that it's the same error

rare hazel
#

@quaint mantle am i far from doing it right?
TextComponent test = new TextComponent();
test.setText("is this working!");
ping.setDescriptionComponent(test);

keen kelp
#

it just says something about it not existing

keen kelp
#

I think it just doesn't recognize ChatMessageType

#

for some reason

#

cause
ChatMessageType A; also gives error

#

repository?

#

spigot api you mean?

vital swift
#

is there API for teams?

#

i want to get all teams

keen kelp
#

did you mean the api

vital swift
keen kelp
#

So emm how do I do action bars?

chrome beacon
#

What dependency are you using?

#

Because ChatMessageType should be included in the spigot one

wide dune
keen kelp
#

1.16.5-R0.1

chrome beacon
#

Or just importing the jar

keen kelp
#

import

chrome beacon
wide dune
#

I dont think the plugin message is being sent

keen kelp
wide dune
#

but the player isnt null

chrome beacon
keen kelp
chrome beacon
#

Uh import the full spigot jar

rare hazel
#

@quaint mantle i'm sorry, for asking so much... But TextComponent.fromLegacyText("test", ChatColor.AQUA) returns BaseComponent[] and if try to setDescriptionComponent with test[0], i get a lot of errors so i think i'm still doing something strange... On of the errors are "Index 0 out of bounds for length 0" so i guess the text is not even there......

keen kelp
#

like from the buildtool?

chrome beacon
#

Yes

keen kelp
#

ok now how do I set the content of the message

#

it's a BaseComponent

empty gyro
#

Hi! I want to start plugin development and I have found a good tutorial. It calls for the Spigot/Bukkit JAR file and I can't find it. The tutorial tells me to get it from getspigotmc.org but this URL doesn't exist. Please help

keen kelp
#

google "Spigot build tool"

empty gyro
#

wait so do i use the BuildTools.jar from Jenkins?

eternal night
#

You download the BuildTools.jar and use to to locally compile your spigot.jar

worldly ingot
empty gyro
#

goddamnit

worldly ingot
#

Funny enough, that hosting company is also advertising Hytale servers

#

but yeah RE: BuildTools. Download it, stuff it in a folder and run it, will build the latest version of Spigot for you

#

?bt

queen dragonBOT
empty gyro
#

wait so do i use --compile craftbukkit?

#

i have no idea what i am doing ;-;

worldly ingot
#

No, just java -jar BuildTools.jar

#

That's it. That's all you need

#

Unless you're building a version other than 1.16.5

#

java -jar BuildTools.jar --rev 1.12.2

empty gyro
#

so what jar do i add to my project libraries?

rare hazel
#

@quaint mantle DUDE!! thank you so much! finally got it to work! Thank you!

worldly ingot
#

Let BuildTools run and it will generate a spigot-1.x.x.jar for you

#

That's what you'll use

#

Should take anywhere from 5 - 10 minutes on first run depending on your internet connection and hardware

#

Subsequent runs will take like 1 - 2 minutes

empty gyro
#

Ohh ok ty :)

lusty cipher
#

Can I debug my plugin with breakpoints in IDEA?

quaint mantle
#

help meh xD

worldly ingot
#

You have an invisible separator character in your plugin.yml

#

Some systems will try to use that in place of tabs, though tabs aren't supported either. Anywhere you have a tab, use spaces

worldly ingot
#

Oh, sorry, it's in a schematic file

quaint mantle
#

xd

worldly ingot
#

It's loaded with YAML For some reason so I was confused lol

quaint mantle
#

neither

grim sage
#

Hey guys, looking for a way to get all active boss bar in a world / a server thanks :b

#

ty I will take a look

shy wolf
#

hi can someone help me i am trying to make it whan it get to 00:00
it's wiil do something like summon particle

#

i need to use while?

grim sage
#

don't work :/ the getBossBras method doesn't return bar created with creatBossBar method or boss bossbar

livid tundra
#
package me.moob.hardersurvival;

import org.bukkit.Location;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.ArrayList;

public class Main extends JavaPlugin {

    @Override
    public void onEnable() {
        // Plugin startup logic
        ArrayList<Location> listOfblocksplayersplaced = new ArrayList<>();
        getServer().getPluginManager().registerEvents(new eventThatChangesListOfBlocksplayersplaced(listOfblocksplayersplaced), this);
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }
}

I want to keep the list the same until the world changes to a different seed, does this work?, or does the list reset when the server restarts(not the world). and if so, is there a better method?

shy wolf
#

not Location like real time

opal juniper
#

You would have to save it to file if you want it to persist

livid tundra
opal juniper
#

Yeah

#

It doesn't matter what format

shy wolf
#

some one can help me or i will die jk

opal juniper
#

Although, i reccomend a Set over an ArrayList @livid tundra

granite stirrup
grim sage
#

I'm creating a boss bar with createBossBar method but If the server crash when it restart the old boss bar is still active because my plugin didn't has the time to delete it before the crash so I want to delete it. But problem solved, I was using /rl so bars are not removed but if the server crash / reload all bars are removed so it's okay

#

@quaint mantle

granite stirrup
opal juniper
#

yeah

#

you purge it onDisable

#

and load onEnable

grim sage
#
private static BossBar bar = Bukkit.createBossBar("EnderDragon", BarColor.PINK, BarStyle.SOLID, BarFlag.CREATE_FOG, BarFlag.DARKEN_SKY, BarFlag.PLAY_BOSS_MUSIC);
granite stirrup
shy wolf
#

ty

livid tundra
grim sage
#

hum interesting, how I can do ti ?

granite stirrup
#

idk what is YamlConfiguration?

#

what is YamlConfiguration i never heard of it

#

oh its a spigot thing is that why i see gson in my dependencies when i didnt put it in my pom.xml

upper vale
#

why tf is your bounding box at your feet when you are gliding lol

granite stirrup
#

probs cuz u set it as a string

#

lmao

#

Ollie ur such a idiot

#

lmao

livid tundra
opal juniper
livid tundra
#

the src folder

opal juniper
#

oh, it should just be created by the plugin rlly ig

opaque grove
#

What's the most effizient way to store data per Player permanent

livid tundra
#

wait, nvm

opal juniper
#

it will just save over top

livid tundra
opal juniper
#

of the existing data

livid tundra
#

I was thinking of checking if the file already exists and then creating it

#

like this: ```java
File myObj = new File("filename.txt");
if (myObj.createNewFile()) {
System.out.println("File created: " + myObj.getName());
} else {
System.out.println("File already exists.");

opal juniper
#

also, the createNewFile() will just create a file no matter what

granite stirrup
opal juniper
#

It would be like myObj.exists() or something

#

Heya @eternal oxide you manage to get anywheres? 😄

eternal oxide
#

Nope, I've fallen down the rabbit hole of nms

opal juniper
#

ohhhhh, thats a one way trip 🙃

granite stirrup
#

wait what is he doing?

opal juniper
#

Linking two crafting inventories together

eternal oxide
#

Experimenting with shared crafting

granite stirrup
#

thats sounds easy but not at the same time XD

opal juniper
#

Its really not ><

#

And also i find that as soon as you involve nms it gets more difficult as things don't get documented

granite stirrup
#

cant you get all the items in one of the crafting inventories and then put it in the other one in the correct slots?

eternal oxide
#

I got it working (without NMS) as far as each player could see their own inventory and had a shared crafting grid, but only one of those players could actually craft.

granite stirrup
#

my intelij needs updating

eternal oxide
#

You could both put items in, but only one player coudl see and pull out results

opal juniper
#

Did the other player's inventory view function as a crafting table if you manually set the output?

granite stirrup
opal juniper
#

or was it just a pretty chest 🤣

eternal oxide
#

I didn;t try

opal juniper
#

fair enough

eternal oxide
#

I started diving into nms

opal juniper
#

Does there seem like there is a way?

#

e.g. - what has ur approach been

granite stirrup
#

nms sucks kinda cuz u need reflection to even use it or it just supports one version i mean if you dont care about it being one version then its fine but still i dont like using nms

livid tundra
eternal oxide
#

Not really, it would require extending the ContainerWorkbench class to accept multiple EntityHumans

opal juniper
#

Huuuuuh, im thinking we go the non-nms way and then do some hacky stuff...

granite stirrup
#

what are you even making that needs that

opal juniper
#

Persistent Crafting Table storage

eternal oxide
#

or modify openWorkbench to accept an extra value to reuse its TileEntity

livid tundra
# opal juniper idrk

I tested it with a not minecraft test code and it worked, not sure if it will work for the minecraft plugin

opal juniper
#

but it needs to work for multiple people

#

Cause atm you can easily just dupe glitch it

granite stirrup
#

cool

#

why do u need it

opal juniper
#

its nice to have feature

#

you ever seen the tool tables from tinkerers

eternal oxide
#

If this method were modified to allow reuse of the TileEntityContainerWorkbench.java public InventoryView openWorkbench(Location location, boolean force) { if (!force) { Block block = location.getBlock(); if (block.getType() != Material.WORKBENCH) { return null; } } if (location == null) { location = getLocation(); } getHandle().openTileEntity(new TileEntityContainerWorkbench(getHandle().world, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()))); if (force) { getHandle().activeContainer.checkReachable = false; } return getHandle().activeContainer.getBukkitView(); }

#

it creates a new one each time its accessed.

opal juniper
#

hahha, yeah i saw that earlier when u mentioned the src

eternal oxide
#

it only needs to accept a int argument.

opal juniper
#

what about if we ping md_5 right now to just add the ability to add an extra arg which is an existing one 🙃

#

what the int id

granite stirrup
#

i mean do u really need this

opal juniper
#

yeah i kinda do want it

granite stirrup
#

seems useless

eternal oxide
#

yep, if you provide an id it would open the existing TileEntity if it already exists

opal juniper
#

Stop being so defeatist

eternal oxide
#

actually

#

it wouldn;t need that, it would just base it on the location

#

same location = same bench

#

Map of TileEntities with the location as a key. Remove from the map on closeInventory

granite stirrup
#

is the source code of bukkit and spigot obfuscated?

opal juniper
#

no

eternal oxide
#

no

granite stirrup
#

why tho

#

lmao

opal juniper
#

Wdym

why tho

eternal oxide
#

I have no use for it, but its a fun thing to attempt

granite stirrup
#

i thought it would be obfuscated

#

lmao

opal juniper
#

its free software, whats the point

eternal oxide
#

only nms is obf

granite stirrup
#

bruh

opal juniper
#

It makes sense that Mojang want to protect their code

granite stirrup
#

stupid bot

opal juniper
#

lmoa

granite stirrup
#

lmao

eternal oxide
#

Mojang have to make a minimal effort or they can't so easily sue anyone who tries to steal their code.

opal juniper
#

If not, the people can make the argument that 'they didn't bother to protect it anyways'

granite stirrup
#

i made this odd thing for some reason public Player getPlayer(CommandSender sender) { if (sender instanceof Player) { Player player = (Player) sender; return player; } return null; } and i really dont know why since its pretty pointless

eternal oxide
#

I can't remember if its Copyright or Trademark, but you have to do some level of defending your mark or its no longer yours.

turbid ridge
#

Hi! Im creating a fake break effect with protocollib but after its done with its animation it gets stuck at the last stage of the animation. Ive tried sending a packet of 0 or 100 (to remove it) a few tick later but it didnt do anything

                PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.BLOCK_BREAK_ANIMATION);
                packet.getBlockPositionModifier().write(0, new BlockPosition(location.getBlockX(), location.getBlockY() - 1, location.getBlockZ())); //position
                packet.getIntegers().write(0, new Random().nextInt(2000)); //entityid
                float divideby = timeAlive / 8;
                if(tick[0] % 3 == 0) {
                    packet.getIntegers().write(1, (int) ((Integer) tick[0] / divideby)); //stage

                    try {
                        for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
                            protocolManager.sendServerPacket(onlinePlayer, packet);
                            Bukkit.getPlayer("InvertedOwl").sendMessage("send packet " + tick[0] / divideby);

                        }
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }```
quaint mantle
granite stirrup
#

\n might

quaint mantle
#

i know its not allowed how do i fix that

granite stirrup
#

u cant

opal juniper
#

i mean, could you hash it

#

so that it is different

granite stirrup
#

its probs disabled for a reason

quaint mantle
#

hash it?

opal juniper
#

wait no

#

dont hash

#

its one way - im dumb

granite stirrup
#

yeah lmao

cold tartan
#

ok thank you, also, is there a way to detect when blocks are destroyed by an explosion? or just destroyed in general

granite stirrup
#

i was about to say that

granite stirrup
#

more like encrypt it

quaint mantle
#

which way

opal juniper
granite stirrup
eternal oxide
quaint mantle
#

okay

granite stirrup
#

so after u hash something u cant unhash it

opal juniper
#

nope

granite stirrup
#

u can compare hashes tho

cold tartan
eternal oxide
#

yes

cold tartan
#

tysm!

granite stirrup
#

yeah its kinda weird that its not the explode event

opal juniper
#

Explode is for tnt

granite stirrup
#

i wonder why they did that

opal juniper
#

Idrk why, there is probs a very good reason under the hood

#

or just for usecases

granite stirrup
opal juniper
#

ohhh, sorry yeah it is the block one

eternal oxide
#

no

opal juniper
#

no?

eternal oxide
#

Block is for things like beds. TNT is entity explosion

granite stirrup
#

but why isnt explode event for everything lmao

opal juniper
#

It is? huh i mean i guess it is an entity b4 it explodes

eternal oxide
#

TNT, fireballs etc are all entities

granite stirrup
#

yeah primed tnt is a entity

opal juniper
#

makes sense

granite stirrup
#

its basically a falling block with explosion

#

lmao

#

actually it probs is a falling block lol

#

which that is a entity

opal juniper
eternal oxide
#

yes

opal juniper
#

they reckon'ed the only way was to manually set items

eternal oxide
#

You can get the top inventory from the returned view, but if you have a player open that as an inventory its not recognized as a Crafting inventory

opal juniper
#

Yeye, just thought i'd let ya know just in case ya didn't know

opal juniper
#

what does what mean

#

lmao

granite stirrup
eternal oxide
#

If Player.openInventory treated teh top inventory correctly as a workbench it would all work as we want

opal juniper
#

but it opens it (hence the name) as an inventory

eternal oxide
#

yep, even though it IS a workbench

#

it doesn;t detect it as such

opal juniper
#

yep, its just one of those stupid things

granite stirrup
#

i saw this thing and it says u can create a inventory with InventoryType.CRAFTING and then it works Lmao

opal juniper
#

Ummmmm, no

#

iirc i tried that

granite stirrup
#

thats what i saw on a forum

opal juniper
#

I think i saw that thread, it used nms right?

eternal oxide
#

its actually InventoryType.WORKBENCH as craftign is the player crafting grid

granite stirrup
opal juniper
#

oh, thats why lmao

granite stirrup
#

if you want i can figure out how to make a inventory thats shared and then i give it to u (cant promise this XD)

opal juniper
#

Ummm, idm

wraith rapids
#

if you can't do it this guy can't get it done either

opal juniper
#

Did u keep ur code ElgarL when you got it to mostly work but with no crafting for one person?

granite stirrup
#

lmao

wraith rapids
#

1.14 plebian

eternal oxide
#

yes, theres very minimal code

granite stirrup
sage swift
#

wym 1.14 is the best vershun

opal juniper
wraith rapids
#

have you tried the manually synchronizing inventories by setting items approach yet

eternal oxide
#

no, I wan;ted a simple way

wraith rapids
#

probably nms town

opal juniper
#

population : not fun

eternal oxide
#

@opal juniper could you join for one last test

opal juniper
#

oh im kinda busy rn

eternal oxide
#

just trying one last thing

#

ok

opal juniper
#

idk if some1 else can

eternal oxide
#

@wraith rapids Join my test server you noob, I need a guinepig

#

nm, it doesn;t work 😦

granite stirrup
#

what u cant make a inventory with InventoryType.MERCHANT

#

cuz i looked in the enum inventorytype in intelij and it sets isCreatable to false for that one

torn oyster
#

how do i check if a world exists (even if it isnt loaded)

#

wait no

#

how do i load a world

#

without creating a new one if it doesnt exist

lyric grove
#

how would i fix this, i dont think its a string

torn oyster
#

its a string

ivory sleet
#

getTimeLeft returns a String

torn oyster
#

the timer.getTimeLeft() is a string

lyric grove
#

oh

#

how would i convert it into a integer?

granite stirrup
torn oyster
granite stirrup
#

wait no

lyric grove
#

thanks i think its working

granite stirrup
granite stirrup
#

not getInteger

#

lmao

lyric grove
#

thanks

#

xd

ivory sleet
#

why compare int to long

granite stirrup
#

oh if u want a long its Long.parseLong i think

cold tartan
#

this is probably more of a question for java, but could someone explain why this doesn't work?

    @EventHandler
    public static void onExplosion(EntityExplodeEvent event) {
        event.blockList().forEach(block -> {
            if (!(block.getType() == Material.OAK_PLANKS)) event.blockList().remove(block);
        });
    }
ivory sleet
#

uh first and foremost != comparison exists

#

also I think you might have to use an iterator there if you wanna remove while iterating

cold tartan
#

oh shoot ya

cold tartan
#

like for (int i = 0; i < blockList.size(); i++){}?

eternal oxide
ivory sleet
#
Iterator<Block> iterator = event.blockList().iterator();
while (iterator.hasNext()) {
  if (iterator.next().getType() != Material.OAK_PLANKS) {
    iterator.remove();
  }
}``` smtng like that
cold tartan
torn oyster
eternal oxide
#

event.blockList().removeIf(block -> (block.getType() != Material.OAK_PLANKS));

cold tartan
torn oyster
#

yes but i dont want to generate a new world

#

if it doesnt exist

ivory sleet
#

if u want it to be minimal use elgars code altho it has negligible overhead as the compiler doesnt inline removeIf iirc

sage swift
#

read the description of the method

torn oyster
#

it says that it will create or load a world

sage swift
#

Creates or loads a world with the given name using the specified options.

torn oyster
#

i just want it to load a world

#

not create one

sage swift
#

or load

torn oyster
#

yes but in the event the world doesnt exist, i want it to not create it

sage swift
#

so check for the folder

quiet ice
sage swift
#

¯_(ツ)_/¯

torn oyster
#

how

sharp bough
#

how bad is it to make a plugin using guis comparing the clicked item and the title name in a scale of 1 to 10?

torn oyster
#

i am doing Bukkit.getWorldContainer().getAbsoluteFile()

sage swift
#

that will give you a file to the server folder

#

you want to check that the folder (file) to the server folder + /(name) exists

sage swift
#

and i guess if you just summon the projectile without using ProjectileSource#shoot

quiet ice
#

I think it returns null if the source got destroyed or is otherwise invalid (i. e. logged off), but that would not explain the frequency of the issue

stiff topaz
#

But it does nothing

cold tartan
#

do you guys know how to add to an array within its definition?

ivory sleet
#

you cant add new elements to an array, like extend its size

cold tartan
#

*arraylist is what i meant

ivory sleet
#

just #add

granite stirrup
#

uh whats ironSlot equal

cold tartan
# ivory sleet just #add

i know u can do that but is there a way to do something like this?
ArrayList<Material> weakBlocks = {Material.OAK_PLANKS};

ivory sleet
#

List<?> list = new ArrayList<>();
list.add(new Object());

granite stirrup
#

what does ironslot equal

torn oyster
#

whats the best method to delete and regenerate a world

#

im not bothered anymore

eternal oxide
#

Where the heck is TileEntityContainerWorkbench I can not for the life of me find it in any CB or nms

torn oyster
#

i've spent way too long trying to regenerate a world

#

each time it doesnt work

granite stirrup
#

u have a value named ironSlot

#

whats it equal

#

u sent this

#

lmao

stiff topaz
#

Which line are you looking at

granite stirrup
#

the if line

#

it says ironSlot

#

what does it equal

stiff topaz
#

That just sees if the slot you clicked is the slot in the GUI for iron

granite stirrup
#

but what does it equal

#

;-;

stiff topaz
granite stirrup
stiff topaz
#

11

torn oyster
#

whats the best method to delete and regenerate a world

granite stirrup
torn oyster
#

yes how

granite stirrup
#

idk

torn oyster
#

i've triedf so many things

#

all of which do not work

granite stirrup
#

well if ur deleting a world u gotta make sure u unload it

#

before deleting it

smoky lance
#

to be able to post a premium resource do I really have to have 80 posts on the forum? I read a thread that said that, but the thread was a bit old

granite stirrup
#

overwise it wont delete

ivory sleet
#

secret ye

#

not really hard to get frankly

indigo iron
#

I am trying to check if 2 players are facing the same direction and if one hits the other while facing the same direction they get poisoned
how would I check to see fi 2 players are facing the same direction

ivory sleet
#

just jump on development section and help people

#

or smtng

torn oyster
#
        World world = new WorldCreator("world_active").createWorld();
        if (world != null) {
            //world exists
            world.setMetadata("regenerating", new FixedMetadataValue(SpeedrunRace.getInstance(), true));
            Bukkit.getLogger().info(ChatColor.GREEN + "active world not null");
            if (world.hasMetadata("regenerating"))
                Bukkit.getLogger().info(ChatColor.GREEN + "Regenerating");
            Bukkit.unloadWorld(world, true);
        } else {
            //world doesn't exist
            Bukkit.getLogger().info(ChatColor.GREEN + "active world null");
            WorldCreator wc = new WorldCreator("world_active");
            wc.environment(World.Environment.NORMAL);
            this.world = Objects.requireNonNull(wc.createWorld());
        }```
#

i have this

#

and then a reload event

#

unload

#

?paste

queen dragonBOT
torn oyster
granite stirrup
torn oyster
#

it in theory should delete the world

#

but the unload event

#

isnt even called

#

but it says "active world not null"

#

and then "Regenerating"

#

so its kinda odd

#

its like the event isnt being called

cold tartan
torn oyster
#

but i know for a 100% fact that i have registered the listeners

cold tartan
#

the block explodes thru another block

cold tartan
granite stirrup
#

or higher i dont get how it works

cold tartan
sage swift
#

not easily

sage swift
#

does it not explode if there's obsidian instead of dirt?

cold tartan
#

no i mean like i only want the oak planks exploding

#

not the dirt, but I want the dirt to act like obsidian

sage swift
granite stirrup
#

just check the blocks around the dirt ?

#

and dont explode those

cold tartan
#

im trying to remake bedwars btw, and in bedwars only certain blocks can explode

#

and all blocks that can't explode act like obsidian, as in they stop blocks behind them (in relation to the explosion) from exploding

#

im fine if I have to make my own explosion raytracing, but i was just wondering if there is an easier way

#

WAIT A MINUTE

#

I KNOW WHAT I COULD DO!

#

it might cause lag, but... I could cause the explosion, then i could set all blocks that haven't been exploded to obsidian, then undo the explosion, then set all the obsidian blocks to what they were before

torn oyster
granite stirrup
#

fortnite is a scam

wispy fossil
#

truly is helpful

torn oyster
#

could anyone help

#

why is my WorldUnloadEvent not running

#

thats my issue

#

it should say "Unloading world: <worldname>"

#

but it doesnt say anything

#
    @EventHandler
    public void onUnload(WorldUnloadEvent e) {
        World w = e.getWorld();
        String name = w.getName();
        File folder = w.getWorldFolder();
        
        Bukkit.getLogger().info(ChatColor.GREEN + "Unloading world: " + name);
    }
eternal night
#

did you register the listener

torn oyster
#

yes lmao

#

im not that bad

#

i even tested it in a class that was already registered

#

nothing

cold tartan
eternal night
#

I mean, when are you expecting these events to be called ? Like are you unloading a world ?

sharp bough
#

did i do something wrong here? ```ItemStack item = new GetItemFromConfig().get(locID, lootID, (itemSlot + 1));

        ItemMeta itemMeta = item.getItemMeta();
        ArrayList<String> lore = new ArrayList<String>();
        lore.add("location:" + locID);
        lore.add("loot:" + lootID);
        for(String i : lore){
            itemMeta.getLore().add(i);
        }
        item.setItemMeta(itemMeta);

        inv.setItem(inv.firstEmpty(), item);```

error ar itemMeta.getlore.add(i)

torn oyster
#

i call Bukkit.unloadWorld(World, boolean)

eternal night
#

Looking at the source code of the unloadWorld method, the event is called rather straight forward xD

#

Are you trying to like unload main world or something

torn oyster
#

no

#

its a world called "world_active"

eternal night
#

can you also check the return value of the unloadWorld method

#

like, if that method returns false the event is probably not fired

torn oyster
#

i mean

#

doesnt unloadworld

#

take a who;e

#

while

eternal night
#

the method returns a boolean tho ?

torn oyster
#

yea

eternal night
#

doesn't matter that the internal process takes longer than the method itself

#

?paste

queen dragonBOT
sharp bough
#

but that will remove the current lore and add a new on e

#

i want to add the lines to the current lore

eternal night
#

like there

#

go read the implementation of the unloadWorld method

#

one of those checks is either failing for you

#

or you are not unloading the world at all

#

or your listener is not registered

#

pick your poison

sharp bough
#

            ItemMeta itemMeta = item.getItemMeta();
            ArrayList<String> lore = (ArrayList<String>) itemMeta.getLore();
            lore.add("location:" + locID);
            lore.add("loot:" + lootID);

            item.setItemMeta(itemMeta);

            inv.setItem(inv.firstEmpty(), item);```
#

i get null when i try lore.add.

ivory sleet
#

its null if the item is air right?

#

wym

#

no the material obv

quaint mantle
#

new GetItemFromConfig()

#

Mhm

ivory sleet
#

because spigot convention is to return empty data structured rather than null most of the times

quaint mantle
#

if its air then the meta is null

#

if theres no lore then the lore is null

ivory sleet
#

uh really

#

thats inconsistent but ok

sharp bough
#
            List<String> lore = new ArrayList<String>();
            if(itemMeta.hasLore()){
                lore = itemMeta.getLore(); // add lines onto current lore if the item has lore
            }
            lore.add("location:" + locID);
            lore.add("loot:" + lootID);

            itemMeta.setLore(lore);
            item.setItemMeta(itemMeta);

            inv.setItem(inv.firstEmpty(), item);```
it works, but now the lores get added on top of eachother for some reason
granite stirrup
#

ur adding lore to the current lore with the location:1 and loot:1 already on it so its just gonna add it again

sharp bough
#

but it gets added everytime i open the gui, and im creating the item on the spot

#

where is it getting saved?

#

the config item is the same

granite stirrup
#

¯_(ツ)_/¯

sharp bough
#

lol

granite stirrup
#

maybe dont add it again if its already there

royal hawk
#

who knows bot detection?

granite stirrup
#

im not a programmer really XD

eternal night
#

we can all tell :>

#

jkjk

granite stirrup
#

lmao

ivory sleet
#

are all coders programmers tho

granite stirrup
#

does inv.setItem() sets a slot to a itemstack?

ivory sleet
#

ye

sharp bough
#

nah same thing

#

idk im gonna find another way

eternal night
#

wat

#

that would definitely add the new ones first tho

sharp bough
#

it does add the new lines first

#

but still adds them over and over

eternal night
#

isn't that the point ?

#

because, you know, they are then the lore of the item ??

sharp bough
#

lol

eternal night
#

why is this even in the lore xD

#

is the user supposed to see this ?

sharp bough
#

yea

eternal night
#

ah

#

and you want to prevent those being added twice

sharp bough
#

i want them to be able to see the current location and loot of the item

eternal night
#

but also want to respect prior lore on the item

sharp bough
eternal night
#

I mean, then you would only have to check that, if the item already has lore, the first two lines do not start with location: and loot: respectively

granite stirrup
#

well just make it so if theres a change in it remove the current ones from the lore and then add it idk

eternal night
#

and if they do, remove them

sharp bough
#

i dont think the problem is how im adding the lines

#

somehow the current lores gets saved in the config

#

even tho theres like 5 lines running

eternal night
#

sure m8

#

The concept of "get lore from item -> prepend something to lore -> save to lore -> do again" in itself means it will duplicate

#

the lore of the item you fetch the second time around obviously already includes the previous two lines you added

granite stirrup
#

^

#

im bored

tranquil viper
#

?

royal hawk
#

who knows bot detection?

granite stirrup
tranquil viper
eternal night
#

YamlConfiguration

granite stirrup
tranquil viper
#

cause thats what I was told last night to do

#

im trying to save an existing file

#

messages.yml file

eternal night
#

YamlConfiguration

granite stirrup
#

YamlConfiguration

#

i think this is it

#

idk

#

maybe wrong thing

eternal night
#

Yeah

#

wat

#

no

#

FileConfiguration is an abstract class

#

do not instantiate it

tranquil viper
#

ok

#

so how would I use it then though

#

im just confused now

granite stirrup
#

use YamlConfiguration

#

lmao

eternal night
#

YamlConfiguration xD

tranquil viper
#

i did

#

i made it

eternal night
#

Okay ?

tranquil viper
#

but I want to update it

#

like save changes

eternal night
#

there is saveToFile

#

wait

#

no I lied

#

not the actual name

tranquil viper
#

lol

eternal night
#

FileConfiguration#save(File)

#

is the method

#

YamlConfiguration extends FileConfiguration tho

granite stirrup
#

any way YamlConfiguration extends FileConfiguration

eternal night
#

so feel free to use that

tranquil viper
#

heres my issue

#

i cant just do FileConfiguration.save

eternal night
#

your fc variable is not initialised

tranquil viper
#

but when I do this, what should I initialize it as

granite stirrup
#

yeah u need to instantiate yamlconfiguration

tranquil viper
#

i understand that

#

but as what

eternal night
#

a new YamlConfiguration?

tranquil viper
#

lol

granite stirrup
#

i meant yamlconfiguration

eternal night
#

huh ?

#
YamlConfiguration fc = new YamlConfiguration();
tranquil viper
#

well no error

#

ill try it out

#

ok its working

#

just need to fix my event now

#

thanks

tranquil viper
#

welp

#

im back

eternal night
#

👋

tranquil viper
#

and realizing that its just wiping the file clean

#

instead of updating it

vague relic
#

Does anyone have insight into why I cannot get mongodb sync 4.2.3 to stop logging in console?

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongodb-driver-sync</artifactId>
  <version>4.2.3</version>
</dependency>

I have tried:

Logger logger = Logger.getLogger("org.mongodb.driver");
logger.setLevel(Level.OFF);

as well as:

logger.setLevel(WARNING)

I also tried using logback to no avail.

The documentation (https://mongodb.github.io/mongo-java-driver/4.2/driver/reference/logging/) says that if slf4j is not present then it will send out a warning and not continue to log but it still does and I have no idea where it is coming from.

tranquil viper
#

because im creating a new file that overrides it

granite stirrup
#

then dont do it if the file exists

tranquil viper
#

yea ik

#

im fixing it rn

#

do you know if there is a way of saving it as deafults instead of just saving it?

#

and then resetting on reload

granite stirrup
#

might be cuz it does extend FileConfiguration but probs not

naive spindle
#

do we have any piglin trade event?

tranquil viper
#

stackoverflowerror is very overwhelming

eternal night
#

I think I saw some work on a piglin barter event on spigot stash

#

Don't know if that had been pulled yet

tranquil viper
#

wait

#

i just realized

#

if u can get stackoverflowerror to run

#

you can crash any server

#

holy

eternal night
#

What

#

Xd

#

No you can't

#

The JVM will cancel a stack overflow

#

Hence the thrown exception

tranquil viper
#

welp

#

im dumb

smoky lance
#

can I bungee a "paper version" of my plugin together with the spigot version when releasing a premium plugin?

granite stirrup
#

u cant use paper methods which is not in spigot in spigot api tho

lyric grove
#

anyone know how i can fix this?

dusk flicker
#

translate the color

granite stirrup
lyric grove
#

just a lib i use

cold tartan
#

ok ty, i was wondering if it would get the next next block

ivory sleet
#

everytime next() is called the next element will be returned except if you reach the tail

#

so a good thing can be to put next() into a variable assuming u want to reuse it

cold tartan
ivory sleet
#

uh well here's how it works sort of

#

just trying to find an image 1 sec lol

cold tartan
#

np

ivory sleet
#

uh cant find anything but like yeah this:

for (int i;i<100;i++) {
  System.out.println(i);
  System.out.println(++i);
}


//can be this also sort of

Iterator<Integer> it = intList.iterator();
while (it.hasNext()) {
  System.out.println(it.next());
  System.out.println(it.next());
}
#

I think

#

assuming u r not storing the it.next() into a variable

cold tartan
#

ty

paper viper
#

the second one tho will error out

#

you only check if the next one exists, but you are taking 2

ivory sleet
#

ye lol

#

but for demonstration purposes why you would store the variable instead

cold tartan
#

is there a way to do something like:
for (int i : *HashMap variable*) {}

ivory sleet
#

well fori doesnt throw

cold tartan
#

wdym?

ivory sleet
#
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));

for (int i = 0; i < list.size(); i++) {
  list.remove(i);
}

wont throw since its index based loop

#

or like fori

cold tartan
#

i mean it might help if i explain what i want to do,
I want to store a bunch of blocks and their materials in some sort of map variable (or other variable type i just think some form of map would be easiest), then for each one, edit its type, then set it back to what i stored in the map variable

ivory sleet
#

oh yeah also using map gives u special ability to remove entries in a for loop with the entry set

granite stirrup
#

lmao this looks cursed

cold tartan
#

what

granite stirrup
#

i cant craft a crafting table :(

ivory sleet
#

?

cold tartan
#

oh wait

#

forEach

#

thats what i need

paper viper
#

?

cold tartan
#

ill show you the code after

sullen marlin
#

blockList is mutable

cold tartan
paper viper
#

You only have two options here

#
  1. use the iterator
#

or

ivory sleet
#

its immutable

paper viper
#
  1. make a list with stuff you want to remove
#

then remove it

cold tartan
ivory sleet
#

Oh yes ILikeToCode that's true but that wasnt my point

cold tartan
#

there we go

#

it works

#

should i send the code in pastebin?

#

its not too long, but ill send it in pastebin anyway

#

there it is

#

i think it explains it much better than i did

#

also all the armor stand stuff is unnecessary

#

i accidentally left it in there

#

im not

#

i didn't explain what i was trying to do very well

granite stirrup
#

i made a player inventory