#help-development
1 messages ¡ Page 1194 of 1
but ig if it's user input đ¤ˇââď¸
The default impl lower cases it, replaces any spaces with _, and then tries to parse it as a namespace key
If it doesnât have a namespace minecraft is assumed
wait are registries modifiable
why would they be modifiable
That's kind of their whole point
exactly
what
so what if I try to register a new block
Won't work
rip
Not all registries are fully modifiable yet
do bukkit registries just pull from NMR registries?
Mojang is working on it
Yes
custom blocks without mods boutta drop?
Also no registries are modifiable while the server is running
It all has to be done very very early
breh.
resource packs exist
paper has API for that-
for enchantments at least
You can do custom blocks server side
But you need to lie to the client or it'll freak out
yeah, polymer my beloved
i kinda wanna make polymer for spigot but that'd require a fork
fork of what
of spigot
why
polymer needs mixins
and you can't do all stuff it does with events
they modify outgoing packets afaik
Packet listener
well, packetevents, I guess
What happens when one constructs a PotionEffect with negative or greater than 255 amplifier?
Usually no point in doing so
it doesnt error though, right?
and when applying such effect it would error too?
Try it and see
Hello, I'm having some problems importing a JAR into my project. this is the error i get when compiling. (I get all the classes from the JAR with autocompletition and i have analyzed the dependency and it reads it). I have added the JAR under the project settings, on the modules dependencies.
Sounds like you added the dependency to Intellij and not Maven
And then attempted to compile with maven
You should be specifying all your dependencies in your pom.xml
u can add dependency to intellij??
Yes Artifacts exist
You can build without Maven/Gradle
It's not recommended though
oh yeah that's why thanks!
Can a player have Strength 2 for 1 minute and Strength 1 for 2 minutes so that when Strength 2 expires they still have Strength 1 for 1 min?
I made a small placeholder since I am not at home, but does this look good for only handling an increase in charge?
public abstract class Ultimate extends Attribute {
public float ultimateCharge = 0;
public float ultimateMaxCharge;
public float ultimateChargeAdd;
protected double delay;
public boolean enabled = true;
public Ultimate(float ultimateMaxCharge, float ultimateChargeAdd, double delay) {
super();
this.name = "Ultimate Charge";
this.ultimateMaxCharge = ultimateMaxCharge;
this.ultimateChargeAdd = ultimateChargeAdd;
this.delay = delay;
task = this.runTaskTimer(plugin, 0, (long) delay);
}
@Override
public void run() {
if (ultimateCharge < ultimateMaxCharge) {
this.ultimateCharge = Math.min((ultimateCharge + ultimateChargeAdd), ultimateMaxCharge);
}
}
}
the ultimate prefix is kind of redundant on those variables
I feel like it has no need to be an abstract class that extends attribute
all you're doing is passing a couple params so they can be detached
I'm sorry, when should I use abstract and when not?
In short there are 2 main approaches: Composition and Inheritance
Composition in most cases is the better one. It allows things to be decoupled and individually testable
For example, let's talk about entities so you have a better idea
Basically this Ultimate class will stand as a base for abilities that fall under this class
Mojang's implementation uses inheritance.
You start with a base entity and you extend it to a LivingEntity to implement a couple features like health
Mobs extend LivingEntity and implement Pathfinding etc etc
A different approach is to use components. You start with a base entity that just holds a bunch of components and each feature you want to attach is a component
Most game engines use component systems ^^
So you can have a "health component" that tracks health, max health and damage, or a position component that tracks position
You can then attach logic to these components so that you can have a "pathfinding component" that tracks the path and updates the position
Your abilities can also use a modular approach like that
This is all very confusing to me im sorry haha
For abilities, you can split them into "triggers" and "actions", with added restrictions
So that when a "trigger" is fired, it goes through its restrictions (player has it unlocked, it's charged / off cooldown etc) and runs the actions (damage mobs, do whatever)
Decoupling abilities like this will allow you to, for example, make upgraded versions with shorter cooldowns
Or abilities that are a mix of multiple ones (heal and teleport)
Here's an example of an Entity Component System
Yeah that makes sense
So yeah I'd like you to try to make a component-based ability system
Think of cooldown components, charge components etc
You can make Tickable components that tick
I have those things in my Attribute class
And add filters to components so their actions are only fired if the player is holding an item etc
I need to rewrite my fishing plugin to use components for its tools tbh
I like the idea of components, not sure how performant it is at a grand scale
They can be quite performant
I guess it's just little components
Yeah they're tiny and independent
The cool thing about components is that you can kinda tick stuff async
also the other cool thing is just attaching logic to an entity without stressing
Ye
hey I have async ticking stuff
Mojang is notorious for their huge entity classes đŚ
entity.addComponent(EntityComponentTypes.CLICK.create { player, context ->
player.sendMessage("you clicked on the entity!!")
})
DisplayEntity.java my beloved
this is how we do it at work
Pretty cool
that seems kinda cool but also like a pain to implement
I'm trying to apply a .patch file
Can I fetch a boolean from a different class or do I have to have a local variable
entity.addComponent(EntityComponentTypes.HOLDER.create<String>("hi"))
val text = entity.getComponent(EntityComponentTypes.HOLDER.getType<String>())?.contents ?: ""
type shit
which worked fine previously
...functions?
?di
Guide to dependency injection: https://www.spigotmc.org/wiki/using-dependency-injection/
did you use IJ's patch applying?
they put it in a different change list for some reason
I am using a function, the problem is that I cannot access the boolean from the other class because it tells me it's not a statement
Am I blind
this
did not expect the pic
anyhow
tried to apply this
downloaded the .patch
intelliJ asked me for each class
said yes
it didn't apply
wtf
I changed the general package name but the patch from before applied just fine
If you add .patch to the commit URL you get an actual patch file
try applying it with git
yeah that's what I did
previously I did Git > Patch > Apply Patch
git isn't configured to my project
I've not used IJs git at all in the last 4 months so no idea
what?
do you know how I can give it a dir?
cd <dir> đ
rename commands to command pls
why
as long as you're consistent it's fine
no
whatchu gonna do
?
I'm renaming them to comandsss
no you dont
I mean, I have commands, utils, resourcepacks, all plural for multiple things
cringe
Arenât you the goon who spam dmed people to use your api?
?paste
it's literally personal preference
he is
blue kat :c
I been blue
no its not
Just havenât been around lately lol
you haven't been very active
yes lmao
except it literally is lmfao.
Yeah I been looking for new job so
i mean yea, generally most of the time its singular, but still
it can be plural too
no space suit anymore?
Well that was only cuz I was spraying chemicals
Not an everyday thing unfortunately
this you?
that was the guy who dmed everyone about his shitty api
"brand new advancedAPI"
like same bro
my api is also so advanced
I save in a class several info about players (inventory, enderchest, life, xp, etc...) in sql. Should I first convert the itemstack and other thing in the class to base64 and then convert the class to base64, or can I convert the class directly?
save the itemstack as blob
Base64 is not useful in sql
i think you can convert quite a few of those things into blob and even combine them all into a single blob
I just save my stuff as json in a TEXT type
i mean you can store it as a string ig
Is blob a data type?
pretty sure pg has one
why???
I never used this hmm
is it more optimized to simply convert with gson?
its actually really useful
It sounds cool
you already have your instance of itemstack (and a few more things) that are technically blob
I've not really had the need to store blobs in my database yet
I've done items with base64 in mongo before
but not for this
I just have a json column for options
yea that also works, i just like this bc i feel its cleaner
pretty sure pg even has a json type
item as blob >>
less gooo
why isn't it a good idea to store as base64?
its up to you
it isn't a bad idea
blob will take the binary of the instance of the itemstack and save that
isnt base64 more space consuming
not necessarily
base64 will convert the itemstack into string and save that
i dont think he gives a single fuck about space taken lmfao
đ
reminds me that I should move all my uuid columns to two longs
more space more cycles, muh cpu cycles
u128 in kotlin when
I used to use Base64 before, not worth it
lol
sounds unique
lmfao
I mean a UUID can be stored in a u128 right?
Should be ye
(i think he means like gson.toJson or smth like that)
most and least significant bits
yea but why not store it as string
for the meme?
now just need a u128 int for the JVM
more space consuming
or im missing smth
and less efficient
blob is sql-specific? can blob content also be stored in redis?
i store all my uuids as a string with no dashes
yes no
(i think)
ew undashed is the worst shit ever
I just keep my UUID as the string representation
blob is just a byte array basically
toString
fromString
đŻ
i just create 1 column for each individual character of the uuid and combine them when i fetch it
The space it saves isn't worth it
s/
for my system, player data must be stored in sql but also sent to other servers (and to the proxy) via a redis broker message
does the data have to be persistent?
object ScoringEntries : Table("scoring_entries") {
val playerId = uuid("player")
val gameType = varchar("game_type", 255)
val session = uuid("session")
val score = integer("score")
val bonusScore = integer("bonus_score")
val multiplier = double("multiplier").default(1.0)
}
``` I wonder whether exposed's UUID type is just a string or two longs
I would need to check, but am on my phone
actually it's a string, I remember putting in my UUID there
yes and no, if a player changes server, we store his content in sql just in case, but we also send it to the new server
Nice ^
id probably just use redis to tell the server to freeze the pre login untill the data is saved and it can load it
do you have a high volume of players?
Forwarding the data is a nice way to prevent loss of data, duplications
bc you could simply save -> transfer -> load all in sql
if save fails cancel transfer
if load fails cancel login
Redisson distributed locks :)
I've never worked with redis
yes (i've spent dozens of hours âstudyingâ the best way for synchronization and here's what I've come up with (give me a few minutes to write them all down)
I guess I've never had the need for it
i love redis
just make an RLock of like
player-data-<uuid>
Get the lock, save data, unlock
get the lock, load data, unlock
synchronize(object) but for redis
but it's distributed
cool
How would I show an empty line in a scoreboard?
Ive tried this
Score line1 = objective.getScore("§7");
line1.setScore(10);
wdym?
You can't have 2 scores that have the same name
so
The issue with server switches is that we donât know when the player leave and player join events will be triggered, so we are forced to "lock" the player on the server while loading/saving their data. For this, weâll use PacketEvents and set them to spectator mode to prevent them from interacting.
To avoid any problems with concurrency and atomicity, we need a central server to lock the data. Public sync plugins often use a database directly (Redis for the best performance and SQL for simplicity). Then, thanks to the atomic tools provided by these databases (procedures for SQL and Lua scripts for Redis), we can interact with the database while ensuring itâs not locked.
The problem with these plugins is that they are designed to be as simple as possible to set up (so they avoid requiring additional plugins on the proxy). As a result, when a player joins a server, the only way to know when they will be "unlocked" is to continuously query the database to check if the player is locked. Even though this doesnât cause performance issues if implemented properly, it doesnât seem very "conventional" to me (correct me if Iâm wrong).
So, I implemented a system:
We have an SQL database, a Redis messaging system, our proxy, and our servers.
When a player tries to connect, we lock them and send a message to the proxy saying, "As soon as itâs unlocked, send me this playerâs data." If itâs unlocked, the proxy sends it back immediately; otherwise, it sends it as soon as possible. (When the player disconnects, the server sends the player data to the proxy.) Only the proxy interacts with SQL, where it stores copies.
So if you have multiple spaces you need to use different colors for each
So like:
Score line1 = objective.getScore("§b\n");
line1.setScore(10);
Score line2 = objective.getScore("§1\n");
line1.setScore(10);
```?
( @remote swallow , @echo basalt @sharp bough Here's the explanation)
why not just block in the pre login event
have you checked you husk sync?
it would freeze them on the loading screen
he does a great job at that
Yes
also has redis sql and idk how many other things
yes like I said husksync looped request to database to know when it is unlcok (is this conventional?)
depends on how he implemented it, but its likely fine
because it blocks the main thread
i assume you wont have more than 3 4 players transfering at the same time
You can't use a proxy as a central service because people can run multi proxy setups
even with 10 its still fine
yes, in reality, the husksync system does the job very well, but I've long been intrigued by the idea of making a âperfect syncâ
pre login is async afaik
whats the utility?
making a "perfect sync" is quite the challenge
theres a lot of cases you need to consider
it wont take any less than 2 3 weeks to make
ah yes you're right
I started asking myself the question in June (but yes, I've only done the theory, and dev is another story...).
Now it shows squares (dunno how theyre called) https://share.emn4tor.de/uploads/Spotify_Tb8PxekiM3.html
Use imgur pls
okay sec
That link looks sus
Hi guys, I'm trying to create a plugin for Minecraft Java through my cell phone, could someone recommend an application for me?
unless you have a solid experience in java and services i would reommend going with husksync
I need it urgently
Its just an image server cuz imgur is slow, but one sec
you cant
run a vm that you can open vim on
I don't have a computer so I use my cell phone for everything
Don't use \n use a space instead
makes sense..
Pretty sure this is a a visible character
fixed, thx
sure (If I develop this, itâs mainly for myself or as open-source (I donât currently have any servers))
So, how should I serialize the data?
if you do want to do it yourself, for the data you have what we said earlier
either byte -> blob -> sql
byte -> string -> json -> sql as string
and the lock thing for redis
im honestly not sure how to serialize all that to redis tho
ig string could do it, but idk
gson is the solution to all our problems
cant I just do
byte -> base64 -> sql as string
?
that also works
why go to byte array to do b64
can I convert it directly in b64?
byte is the object instance i assume
yes its a class who contain inventory content, enderc, life, xp etc...
ahem
when you have custom mobs and want to store instance variables, can you do that directly in your custom mob's class?
public class CustomWitherSkeleton extends WitherSkeleton {
private static final String TEMP_KEY = "temp";
public CustomWitherSkeleton(Level world) {
super(EntityType.WITHER_SKELETON, world);
this.collides = false;
this.expToDrop = 0;
this.goalSelector = new GoalSelector(world.getProfilerSupplier());
this.targetSelector = new GoalSelector(world.getProfilerSupplier());
this.setInvulnerable(true);
this.setCanPickUpLoot(false);
this.setAggressive(false);
this.setCustomNameVisible(true);
this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true));
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Cow.class, true));
}
similar to this static variable declaration
You can just use PDC tags if you want to make things simple
b64 is just a string
how do you deal with persistent containers ?
ive never actually had to worry about this before ah
?pdc
?morepdc
You can create custom persistent data types on your own, or use one of the many libraries available which have implemented those which match your needs. Learn about more persistent data types here: https://www.spigotmc.org/threads/more-persistent-data-types-collections-maps-and-arrays-for-pdc.520677/
And I can convert an object directly in base64?
How could i do that my plugin adds for example dirt to the inventory of the player aslong it has space if its full it stopps
addItems returns the items that could not be added
everything is just a string in my version of string theory
look at all them strings
i have an for loop and would like to break it when no more dirt can be added how could i do this?
https://chatgpt.com/ I think you were trying to ask this guy
i did , the stuff it sends me is very weird
?learnjava
For Beginners:
Codecademy - Learn Java: Interactive Java programming course from basics to more advanced concepts. Perfect for absolute beginners.
https://www.codecademy.com/learn/learn-java
JetBrains Academy - Java Developer Track: Learn by doing with projects and challenges. It covers Java fundamentals to advanced topics.
https://www.jetbrains.com/academy/
Udemy - Java Programming Masterclass for Software Developers: Updated courses that cover Java 8 to Java 17 features. Suitable for those who prefer structured learning.
https://www.udemy.com/course/java-the-complete-java-developer-course/
For Intermediate to Advanced Learners:
Oracle Java Tutorials: The official guides by Oracle for Java programmingâgreat for understanding the depth of Java.
https://docs.oracle.com/javase/tutorial/
Baeldung - Learn Java and Spring: Focus on Spring Framework and modern Java technologies. Best for intermediate learners aiming to expand their knowledge.
https://www.baeldung.com/
Practice and Hands-on Learning:
Exercism - Java Track: Solve exercises and get feedback from mentors. Great for practicing coding skills.
https://exercism.io/tracks/java
LeetCode: Practice your coding skills and prepare for technical interviews with Java.
https://leetcode.com/
Free Resources and Documentation:
Java Programming and Documentation: A comprehensive collection of Java programming guides, tutorials, and API documentation.
https://docs.oracle.com/en/java/
Community and Support:
Stack Overflow: A vast community of developers. Great for getting help with specific problems or understanding concepts.
https://stackoverflow.com/questions/tagged/java
r/learnjava on Reddit: Join the community of Java learners and get advice, share resources, and discuss projects.
https://www.reddit.com/r/learnjava/
Remember: Learning to program takes practice and patience. Don't hesitate to experiment with code and participate in community discussions. Happy coding! đ
..
i love an for loop
wdym
im making a joke out of using an not a
my english is bad sorry
đŚ
What is the correct way of importing classes and methods from another jar in a project?
You're using maven, correct?
yup
in both projects?
yessir both
Then you can add the other project as a dependency
And set scope to provided or compile
after running mvn install on the project you want to use elsewhere
yes i've tried that with the intellij guide
i've tried a lot of stuff but none worked
Oh yeah, you need to mvn install for the other project to see changes
in the first project run the install goal, then in the project you want to use it in add the same info of that project as a dep
so the artifact group and version
You should add it as a dependecy
i also added that to the pom.xml, i can autocomplete all the methods and classes but when i compile the plugin it doesn't compile
saying that the class doesn't exist
That won't solve the compile problem
what would solve it?
Can you send the pom.xml files of the two projects?
?paste
<dependency>
<groupId>xyz.unhandlederror</groupId>
<artifactId>TWScoreboard</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
Change the artifactId to TWCore
You don't want your project to depend on itself
but on the core
also I recommend removing the dependency you added manually in Intellij to prevent confusion about it auto completing but not compiling
i get this error: ```xyz.unhandlederror:TWCore:jar:1.0 was not found in https://hub.spigotmc.org/nexus/content/repositories/snapshots/ during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of spigotmc-repo has elapsed or updates are forced
Try to run Maven import with -U flag (force update snapshots)
Need to run mvn install in the TWCore project
ok i'll try that
what to do if i need my config to be editable through file and through minecraft commands, and others say that reloading and saving every time is too unefficient
everytime what?
every time you change a value is fine
If it's a config those values aren't going to change too often
yeah but i did it and someone said that
It's not ideal but it's probably not worth spending too much time on
?
every time i took a map and added some value and saved it
list of maps
public void addCommand(String command, String time) {
reload();
List<Map<?, ?>> mapList = getConfig().getMapList("commands");
Map<String, String> map = new HashMap<>();
map.put("command", command);
map.put("time", time);
mapList.add(map);
getConfig().set("commands", mapList);
save();
}```
it s this code
How are you using that method
works fine now!
Great :)
Do note you'll need to run install every time you make a change that you want to be visible to the other project
eh not a fan of that map usage
also why are you reloading?
becaue user can also change that in config file
and i dont wanna override
That's fine then
You're mixing types
is there a website or smth where i can listen to a few sounds
i need to find some suitable onez
maybe on the wiki, but the names will probably be different
You can /playsound in game
use the play sound command ingame
clone https://github.com/misode/mcmeta/tree/assets and look at the sounds, or /playsound
teeeeed
thanks
can anyone save me some time actually
a sound for "good" and one for "bad"
i cant find any good ones
villager happy, anvil smash
You have one entry for the command and the next entry for time
these are strings ???
Yes they are strings
cant find villager happy hm
might be villager ambient
but they contain entierly different types of data (or so I assume)
what do you mean
Group them together
ok ty
different types of data, they are strings ??? isnt string type of data
Wait they are grouped đ¤Śââď¸
That's just a really odd choice of config
Think of your users
Misses the second dash and first misses a space
no its 1 dash
1 dash is correct here
Is this 1 line?
It's a list of maps
Hmm
That type of config isn't very common
yml supports that
yes
so how do you group it usuall
Users why don't know the yml format will struggle with it
wdym rare đŤ
It's great wdym
use the command name as the key maybe?
so rarely used that noone knows tf you talking about
umm
maybe but its not the same then
no repeated commands
commands:
"my_command":
time: etc
schedule:
"12:30":
commands:
- "/a"
oh you want repeated commands?
yeah thats way better
i was thinking about it
right I thought this was just a list of commands xD
could 12:30 just be a list?
sure
That looks like the old Forge cfg files
idk why it was not obvious for me to to that
fire
or a single item if its only 1 command
"12:30": cmd
You can allow for both
why i did it so dumbly lol
hello devs, today i would to know, how do you identify the execution enviroment from minecraft plugins? let say you have a library which you want to add in every plugin (Spigot / Paper / Bungeecord) and you want to plugin notify what server software is running via the library. Internally the library should get the package-id from the server and make reflections right?
spigot - plugin.yml
paper - paper-plugin.yml
bunge - bungee.yml
Different entry points 
Alternatively just check for a class that you know won't be present on Spigot for example
Is the paper entry point new?
It's not super new but I wouldn't call it old
right pretty cool, but going more in deep to identify the exact version? I known that in spigot, you cant get them via the package-id in the server, but for paper im not sure
There's bukkit get version
oh right
You shouldn't rely on the server package
allright i follow your recommendations
Bukkit get version is the best way to get your version
Probably have to substract the string
Not sure
great, thanks for both of you
đ
yeah there is not problem about that, im just happy about knowing the best way for it
I asked my friend (gpt) to make me this code and it seems to work, so I just have to use these methods to serialize my user data in sql?
public static String encodeObject(Object obj) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(obj);
byte[] objectBytes = byteArrayOutputStream.toByteArray();
return Base64.getEncoder().encodeToString(objectBytes);
}
public static Object decodeObject(String base64String) throws IOException, ClassNotFoundException {
byte[] objectBytes = Base64.getDecoder().decode(base64String);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(objectBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return objectInputStream.readObject();
}```
bukkit outpustream is deprecarted Ihv heard
could you tell me more? Why wouldn't they be?
fast question, spigot server versions starts from 1.7 or 1.7.10?
because honestly the OOS kinda sucks ass, but also because Bukkit objects go through a separate serialization process (which is also horrible, but that's besides the point)
basically if you use OOS your system will probably 100% break every version with an absolute guarentee
I mean BOOS struggles with the same issues, but atleast it tries
basically BOOS take bucket objects and then runs it through its Config serialization to Map<String, Object> than serializes it to bytes, where as Object Output stream uses some fun java internal magic!
.2 is the earliest I'm aware of
java magic
right, thanks Olivo
what are you trying to encode?
im trying to get the enviroment version Âż?
talking to the other guy Verano
oh sorry i have a night mare today đ
server sync (inventory and somethings about players should be shared in a proxy )
if you're on a certain fork called paper t here is a method to turn ItemStacks into bytes otherwise I reccomend using NMS to maintain version compatibility
otherwise your items will break literally every version
I had a PR open to do this for half a year but it seemed largely ignored, but the proper NMS is here
https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java?at=5a008ab907054a820686b4dd5086101c625acc7f#387-399.
I'd reccomend largely avoiding bukkit object output stream its not space efficent on top of possibly breaking items every version
if I use the paper method to serialize the inventories in my class, there will only be occtets, strings and uuid, so the methods I've provided above shouldn't cause any problems, no?
not sure what an occtet is
but all of the things you mentioned can be easily serialized to bytes
yes I mean bytes
if users dont need to edit it, just store the bytes
why is encoding spigot objects so complex?
its not complex its just we don't expose good API to do it for a lot of them
also javas built in method is kinda blegh
its not more complex than any other object
my class look like
data is a base64 converted itemstack
converting this object with the methods I've provided above may still cause problems (there are only strings and int) ?
public class Syncuser {
private String server;
private String data;
private int level;
}
idk what any of those mean
but its not hard given you use the right tools
its pretty easy to use NBT and serialize ItemStacks I sent the code in my old PR above
it works and allows cross version support
you mean itemstack or inventory i'm confused
it is, but he said the data is an itemstack
either way the code I sent works it doesn't matter
is it possible to convert an itemstack array with gson? or will it cause the same problems as base64?
probably, but idk if it would be larger space
you'd need to make your own stuff to handle everything
you have fun with that
gson cant serialize magically as he does so well?
you mean deserialize wym
no you have a fundamental misunderstanding of how the magic gson serialization works it would fundamentally fail given any given ItemStack by default
how you gonna convert it back to an item
its Reflection based, bukkit ItemStack wraps, ItemMeta an Int and Material, ItemMeta Wraps DataComponentPatch which wraps some other stuff. Its far to complex for GSON to handle without explicit directions
by deserializing the itemstack array? wouldn't that work?
not to mention with Gson you also have to handle the fact that ItemStack internally has a derivative called CraftItemStack too which is ever so slighty different
i tought gson had no "limits", its good to know
it has to have an explicit directive on how to serialize or deserialize things, it can do a lot
@shadow night would know
i love 20gb mcserver.json
it's just for example, to serialize itemstack to string is fine. but deserializing an interface, gson can't do that without an explicit deserializer
itemmeta is an interface if you tried it right now, it wouldn't work going back from a string to itemmeta without you implementing your own custom deserializer
I give up honestly I've told you the correct path a couple times why are avoiding the best method and keep doing this bonk ass shit with the bukkit API which is far inferior in this area
I don't intend to use gson or anything like that (I was asking out of curiosity)
ya, just best to fllow what miles said easier on the brain
wo wo how dare you use my real name, definitely not my discord username or anything
Miles Joe Biden
same bro
30gb
What triggers a VehicleUpdateEvent?
people often tell me I'd make a good helper
Oh so the velocity triggers it?
I don't want to say the wrong thing, but I think it's all about this kind of parameters (including speed) but the doc isn't very clear on what they call âupdateâ.
Seems to be called basically every tick
Yeah, I tried doing manual testing by broadcasting/logging "Update" if the event was triggered, but nothing
redacted has one
Aktually it has a tick start and end event
This would be like
The middle of the tick
lmao
`package me.wolfispuzzled.duplexDoubler;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.java.JavaPlugin;
public final class DuplexDoubler extends JavaPlugin implements Listener {
public DuplexDoubler(DuplexDoubler plugin) {
this.plugin = plugin;
}
@Override
public void onEnable() {
// Plugin startup logic
getServer().getPluginManager().registerEvents(this, this);
}
private final DuplexDoubler plugin;
@Override
public void onDisable() {
// Plugin shutdown logic
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
Block block = event.getBlock();
block.setMetadata("PLACED", new FixedMetadataValue(plugin, "something"));
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if (!block.hasMetadata("PLACED")) {
event.setDropItems(true);
// Double and drop items
event.getBlock().getDrops().forEach(drop -> {
drop.setAmount(drop.getAmount() * 2);
event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), drop);
});
}
}
}`
this is my 1.21.1 plugin thats supposed to double all block drops that arent placed by a player but its js not doubling anything any1 kow why?
have you debugged what code is running
wdym
Entity#addPassenger() seems to be kinda buggy unless I'm missing something
I'm creating an entity, i tried arrows, item displays, and armor stands because i just want a plain invisible entity for the player to sit on
I add the player as a passenger to this entity
The player doesn't sit, they instead fall through
The entity has the player as a passenger if I check getPassengers(), and the player has the entity as their vehicle if I check getVehicle()
so how come the player isn't sitting lol
the player can also move freely during this
hardly surprising given you can't normally ride arrows
right but there shouldn't be a restriction on that
gsit uses armor stands, i tried those too
ive seen people make plugins where the player rides thrown ender pearls
So every 250 ms
ticks are 50ms long arent they
Yes
Close enough

Why doesn't maps allow you to do more then one key value pair? I understand there's ways around this but it makes the code less clean
smh đŤ
Yeah that'll work thanks
Spigot ships Guava which has Multimaps
Just looked it up, it's what I'm looking for yeah ... Was setting up a command and needed a boolean, the player and bukkittask and after finishing it it looked bad because I was using two hashmaps
just sounds more like you want some record for the value rather than a collection value
I want to save a boolean and task under the player key
Yeah that's not something you should be using a multimap for
Using it to create an off on switch with a task
Wrap that in an object or record
or can one player have more than one bool task pair?
I'll show what I have once I get back home I've been writing it on pen and paper while we eat dinner lol
Pair<BukkitTask, Boolean> you mean
I forgot how long my ai automatic wiki translator takes to actually translate
it's quite long
it's been 20min and it's still working on chinese
how large is your wiki
Ur a pair
about 100k words?
maybe more
counter says that this old consolidated file is at 84859 words but that's before all of the recent additions
goddamn
it's not that much considering a single plugin it's documenting is nearly at 100k lines of code
one word describing every line
would be accurate if this wasn't documenting several plugins
but the real total count might be about that actually
the other plugins are nowhere near as large
I didn't know you could put multiple variables inside of a value
Oh no it can hold like everything not just variables
Hello, im trying to seek help regarding hibernate, this may be off-topic but its indeed for a minecraft plugin, i have a really big table with a lot of columns and i decided to start applying normalization to make it a bit better, the only problem is that i reached this Hiccup where i get an error where x is null https://paste.gg/p/anonymous/32a23a640f164eb19c6d2073c6bb29cc
but i have no fields called 'x' so i really dont know what is causing it
Ya'll a bunch of nerds, surely one of you have messed with twitch's api before lmfao
I know of using https://twitchtokengenerator.com/ for the twitch application (Making a chatbot), but I'd rather not use it lol
However, I'm being dumb and somehow screwing up doing it myself https://dev.twitch.tv/docs/authentication/#oauth-implicit-code-flow-user-access-tokens
trying to do this, if there is a better way to do this lmk.
No getOrDefault containsKey and put, just computeIfAbsent
this is still translating
I actually think it might take more than 6 hours
actually basic math says way longer
yeah might be closer to 8 hours
I have a question with intellij is there a way to increase the font size within the text editor without increasing the GUI size or the font on the GUI itself
ill look in key mappings, thanks
default is alt+shift+.
this is much better thanks again
could also change to a pattern variable (just learned what this is) makes Player player = ... redundant
public EmeraldArmor(YmcExtender plugin) {
super(plugin);
this.plugin = plugin;
}
what am I doing wrong here? super is getting underlined, I could swear I've used that in like 10 plugins before...
yeah
public class EmeraldArmor extends CustomItemHandler {
private final YmcExtender plugin;
public EmeraldArmor(YmcExtender plugin) {
super(plugin);
this.plugin = plugin;
}
Does the super class have a constructor that requires a plugin
nope
`@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
Block block = event.getBlock();
block.setMetadata("PLACED", new FixedMetadataValue(plugin, "something"));
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if (!block.hasMetadata("PLACED")) {
event.setDropItems(true);
// Double and drop items
event.getBlock().getDrops().forEach(drop -> {
drop.setAmount(drop.getAmount() * 2);
event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), drop);
});
}
}`
any1 know why these two listeners arent working? its supposed to double all naturally generated block drops but its only dropping 1
- Did you register?
- Metadata isn't persistent, i wouldnt recommend.
i did but even if metadata doesnt work then wouldnty it still drop 2?
Yes. That's true
i registered with this getServer().getPluginManager().registerEvents(this, this);
everything is in main class
if (!block.hasMetadata("PLACED")) {
Collection<ItemStack> originalDrops = block.getDrops(event.getPlayer().getItemInHand());
event.setDropItems(false);
for (ItemStack drop : originalDrops) {
ItemStack doubledDrop = drop.clone();
doubledDrop.setAmount(drop.getAmount() * 2);
event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), doubledDrop);
}
}
Does this work?
lemme try
Most chunk-related operations that modify world state MUST be done on the main thread. Otherwise, chunk generation and initial loading can be done async, but final modifications need to be on the main thread
From practice, typically i would load chunks async if possible, then switch to main thread for any world modifications
Then in the part of
if(!block.getChunk().isLoaded()){
block.getChunk().load();
}
``` i should use sync scheduler to load it?
on getBlocksOfType()
or do u have a tip
public List<Block> getBlocksOfType(World world, Material targetType, int x1, int y1, int z1, int x2, int y2, int z2) {
int minX = Math.min(x1, x2);
int maxX = Math.max(x1, x2);
int minY = Math.min(y1, y2);
int maxY = Math.max(y1, y2);
int minZ = Math.min(z1, z2);
int maxZ = Math.max(z1, z2);
List<Block> matchingBlocks = new ArrayList<>();
// to begin with do it synchronously here
CompletableFuture<Void> chunkLoading = new CompletableFuture<>();
Bukkit.getScheduler().runTask(YourPlugin.getInstance(), () -> {
for (int x = minX; x <= maxX; x++) {
for (int y = minY; y <= maxY; y++) {
for (int z = minZ; z <= maxZ; z++) {
Block block = world.getBlockAt(x, y, z);
if(!block.getChunk().isLoaded()){
block.getChunk().load();
}
}
}
}
chunkLoading.complete(null);
});
// wait first
try {
chunkLoading.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
// the process blocks
for (int x = minX; x <= maxX; x++) {
for (int y = minY; y <= maxY; y++) {
for (int z = minZ; z <= maxZ; z++) {
Block block = world.getBlockAt(x, y, z);
if (block.getType() == targetType) {
matchingBlocks.add(block);
}
}
}
}
return matchingBlocks;
}
since you're using CompletableFuture.supplyAsync() to run the block counting operation asynchronously, you should ensure that chunk operations are synchronized,as above.
it didnt work
what if my server is not starting now :kek
i think it blocked the main thread
no no. For getBlocksOfType schedular should be like:
if(!block.getChunk().isLoaded()){
Bukkit.getScheduler().runTask(plugin.getInstance(), () -> {
block.getChunk().load();
});
}
then in the getBlock do:
if(!chunk.isLoaded()) {
Bukkit.getScheduler().runTask(plugin.getInstance(), () -> {
chunk.load();
});
}
idk how to do that imnew to this
just print statements or something, put it in ur code after clauses to see if they pass
or debug
sry i dont know what any of that means
Dude. print statements
use System.out.println(yourVariableHere); to print to console the value of it
then you can follow the code
ohh
so like System.out.prinln(doubledDrop);
for (ItemStack drop : originalDrops) {
ItemStack doubledDrop = drop.clone();
doubledDrop.setAmount(drop.getAmount() * 2);
player.sendMessage(String.valueOf(doubledDrop));
event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), doubledDrop);
}
this is what i put but it doesnt send me the message
Then doesnt that tell you, that segment of code isnt being ran?
are u sure the event is being called
why wouldnt i tbe i registered it
hi guys
hey
?ask
If you have a question, please just ask it. Don't look for staff or topic experts. Don't ask to ask or ask if people are awake or available. Just ask the question to the channel straight out, and wait patiently for a reply. Make sure you use the right channel regarding the topic of your question. Create a thread in case the channel is already in use!
@EventHandler
public void onHit(ProjectileHitEvent e) {
if (e.getEntity() instanceof Trident trident) {
if (e.getHitEntity() instanceof Player victim) {
Player shooter = (Player) trident.getShooter();
if (shooter != null) {
ItemStack item = shooter.getInventory().getItemInMainHand();
if (item.getEnchantments().containsKey(this)) {
double speedMultiplier = 6.0;
Vector direction = shooter.getLocation().toVector().subtract(victim.getLocation().toVector());
if (direction.length() != 0.0) {
Vector velocity = direction.normalize().multiply(speedMultiplier);
victim.setVelocity(velocity);
}
}
}
}
}
}
I have a strange problem. I am writing a plugin for an enchantment for a trident that will attract a victim to the attacking player when the trident hits the victim. I wrote to the mechanic, but ran into a big problem. The problem is that if the players are in survival mode, the enchantment does not work at all. For some reason, it does not attract at all. If both are creative, then it attracts very strongly. If one has creative, and one is survival, then it attracts as it should. But it should attract as it should if both are survival. I do not know what to do and what it depends on
my plugin is the only one on the server
In computer programming, a common challenge facing systems programmers is that before an operation can be performed, a number of conditions must first be checked to confirm that the operation can be successfully performed. For example, before data can be written to a file, it must be confirmed that 1) the program has the file open for writing; 2...
Is it possible to require several ingredients for a recipe? E.g. 64 gold nuggets to craft a single item?
// Register gold coins to gold coin pile recipe.
private void registerGoldCoinPileRecipe() {
// Create the result item (shulker shell with custom data)
ItemStack result = new ItemStack(Material.SHULKER_SHELL);
ItemMeta meta = result.getItemMeta();
if (meta != null) {
meta.setCustomModelData(282032);
meta.setItemName("Kultakolikoita");
result.setItemMeta(meta);
}
// Define the shaped recipe
NamespacedKey key = new NamespacedKey(plugin, "GOLD_COIN_PILE");
ShapedRecipe recipe = new ShapedRecipe(key, result);
recipe.shape("G");
// Create a custom RecipeChoice for 64 gold nuggets
ItemStack goldNuggetStack = new ItemStack(Material.GOLD_NUGGET, 64);
RecipeChoice.ExactChoice goldNuggetChoice = new RecipeChoice.ExactChoice(goldNuggetStack);
// Set the ingredient for the recipe
recipe.setIngredient('G', goldNuggetChoice);
// Register the recipe
Bukkit.addRecipe(recipe);
}
I have tried this, but it allows crafting with only a single gold nugget.
The docs do mention that ExactChoice ignores stack size, but what are my options?
you can't do it as a true recipe but there are crafting events you can use
@EventHandler public void onPrepareItemCraft(PrepareItemCraftEvent event) {
if (event.getRecipe() != null && event.getRecipe().getResult().getType() == Material.SHULKER_SHELL) {
ItemStack[] matrix = event.getInventory().getMatrix();
for (ItemStack item : matrix) {
if (item != null && item.getType() == Material.GOLD_NUGGET) {
if (item.getAmount() < 64) {
event.getInventory().setResult(null);
break;
}
} else if (item != null && item.getType() == Material.SHULKER_SHELL) {
ItemMeta meta = item.getItemMeta();
if (meta == null || meta.getCustomModelData() != 282032 || !meta.getDisplayName().equals("Kultakolikoita")) {
event.getInventory().setResult(null);
break;
}
}
}
}
}
I did try this and it seems to work. Kind of.
The only problem is it only subtracts a single material.
Do I need to override CraftItemEvent as well?
Lot of code for a single recipe, but okay đ¤
how are you "consuming" the material?
I guess I'm not.
No I meant, what other method do you have?
Practically, in conjuncture with your onPrepareItemCraft you should also properly consume the nuggets:
@EventHandler
public void onCraftItem(CraftItemEvent event) {
if (event.getRecipe() != null && event.getRecipe().getResult().getType() == Material.SHULKER_SHELL) {
ItemStack[] matrix = event.getInventory().getMatrix();
int remainingNuggets = 64;
// consume / subtract / idk the word / exactly 64 gold nuggets
for (int i = 0; i < matrix.length; i++) {
if (matrix[i] != null && matrix[i].getType() == Material.GOLD_NUGGET) {
int currentAmount = matrix[i].getAmount();
if (currentAmount <= remainingNuggets) {
matrix[i].setAmount(0);
remainingNuggets -= currentAmount;
} else {
matrix[i].setAmount(currentAmount - remainingNuggets);
remainingNuggets = 0;
}
if (remainingNuggets == 0) break;
}
}
}
}
for loops like this get sticky very quickly
@EventHandler
public void onHit(ProjectileHitEvent e) {
if (e.getEntity() instanceof Trident trident) {
if (e.getHitEntity() instanceof Player victim) {
Player shooter = (Player) trident.getShooter();
if (shooter != null) {
ItemStack item = shooter.getInventory().getItemInMainHand();
if (item.getEnchantments().containsKey(this)) {
double speedMultiplier = 6.0;
Vector direction = shooter.getLocation().toVector().subtract(victim.getLocation().toVector());
if (direction.length() != 0.0) {
Vector velocity = direction.normalize().multiply(speedMultiplier);
victim.setVelocity(velocity);
}
}
}
}
}
}
I have a strange problem. I am writing a plugin for an enchantment for a trident that will attract a victim to the attacking player when the trident hits the victim. I wrote to the mechanic, but ran into a big problem. The problem is that if the players are in survival mode, the enchantment does not work at all. For some reason, it does not attract at all. If both are creative, then it attracts very strongly. If one has creative, and one is survival, then it attracts as it should. But it should attract as it should if both are survival. I do not know what to do and what it depends on
does anyone have the URL to the valentine or test minecraft capes?
none of the players have it equipped so i can't use sessionserver
?paste
and invert ifs
Do you think this will fix it?
No lol. all he did was invert your clauses.
no, but its easier to debug and work with like this
is there a way to get a single thing from this by a string? like Cape.<StringHere>. Obv this is without doing the long ifs statements.
could be if (!item.getEnchantments().containsKey(this)) return; acting funny for creative mode, debug the item, the enchantments and in what scenarios its ture
also whats "this" ?
A map?
how would I change that? Like Map<Cape>, but then how should I add them all
You could make a static register method or add them to a static map in the constructor
would that make them still accessible like Cape.DB?
yeah, but its been a while since i did something other that effects off APIs
is there a way to get a single thing from this by a string? like Cape.<StringHere>. Obv this is without doing the long ifs statements.
reflection might work
kinda
erm
something like
public static Set<Cape> find(String name){
return Arrays.stream(you class.class.getDeclaredFields())
.filter(f -> f.getName().equalsIgnoreCase(name))
.map(f -> {
try {
return ((Cape) f.get(null));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toSet());
}
would be better to return just first match, or fussy find with that given name if you want to return a set
up to you
What?
a
package me.carillon.foody.food;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import static org.bukkit.Bukkit.getServer;
public class chicken_sandwich {
public static ItemStack chicken_sandwich;
public static void init() {createChickSand();}
private static void createChickSand() {
ItemStack item = new ItemStack(Material.BREAD, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName("Chicken Sandwich");
meta.setCustomModelData(1);
item.setItemMeta(meta);
chicken_sandwich = item;
NamespacedKey key = new NamespacedKey(this, "chicken_sandwich");
ShapedRecipe recipe = new ShapedRecipe(key, item);
recipe.shape("B", "C", "B");
recipe.setIngredient('B', Material.CHICKEN);
recipe.setIngredient('C', Material.COOKED_CHICKEN);
getServer().addRecipe(recipe);
}
}
so i have made this custom recipe with item and i want to make a bunch of these in separate classes but how should i initiate all of them in my main class?
plus when i do "this" for the name spaced key it says it cant be reference from a static context but the init function requires it to be static
you should definitely use an item builder instead of a static method
can you set a custom model data with an item builder?
^^ Builder pattern
^^ This site does a good job of explaining different patterns with examples for different languages including Java
Or use a registry and treat your custom item classes as blueprints
Using both is also an option 
ok i think i see
package me.carillon.foody;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class ItemBuilder {
private ItemStack is;
public ItemBuilder(Material m, int amount){
is = new ItemStack(m, amount);
}
public ItemBuilder setDisplayName(String name){
ItemMeta meta = is.getItemMeta();
meta.setDisplayName(name);
is.setItemMeta(meta);
return this;
}
public ItemBuilder setCustomModelData(int key){
ItemMeta meta = is.getItemMeta();
meta.setCustomModelData(key);
is.setItemMeta(meta);
return this;
}
public ItemBuilder createRecipe(){
return null;
}
}
so this is what i got so far,
does this seem right?
yeah looks good
I'd avoid copying the item meta every time
You only really need to build that ItemStack when you're done with it
also personally I prefer fluent setters in builders
but that's up to you
fluent setters?
displayName() instead of setDisplayName()
ah
package me.carillon.foody;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class ItemBuilder {
private ItemStack is;
public ItemBuilder(Material m, int amount){
is = new ItemStack(m, amount);
}
ItemMeta meta = is.getItemMeta();
public ItemBuilder setDisplayName(String name){
meta.setDisplayName(name);
return this;
}
public ItemBuilder setCustomModelData(int key){
meta.setCustomModelData(key);
return this;
}
public ItemBuilder createRecipe(){
return null;
}
public ItemStack toItemStack(){
is.setItemMeta(meta);
return is;
}
}
so kinda like this?
so leave the setmeta where they were but only call the getmeta once?
no, you can set meta on build
What do you guys think of my item stack builder?
No components support :sadge:
There's no component support needed
components are quite useful 
my item builder is a monstrosity, each time i need something new i append another method lol
but yeah Spigot API still needs some work :c
Ye in chat, but I never found use in itemstack
translatable lore etc
Gotta localize your server smh
should i make the recipe in the builder?
No
You can make a new builder for the recipe if you want
or just use the API as is
The item builder is just a bit of a detour
How does translation works with components?
You send the key
Ah
The client shows what that key means
You'll need to provide keys through a resource pack
But my use is based on custom lore
Not mojang lore
I also try to not rely on resource packs
If I am to impl translation per user I'll do so as a choice in game
Where you can choose language
Ah no
I just send the translation per player
Unless you mean the item stack sharing
yeah that
But I make minigames the item stacks are not shared
Guess that's easier then
My windows installation is almost done đ
Time for 20 pages of denying tracking
and then 3 hours of updating windows
another 3 hours of removing bloat
It's still bloated but it's better at least
also I can recommend https://github.com/farag2/Sophia-Script-for-Windows/
Helps mass change settings and uninstall stuff you don't want
I'll take my time
I got this đ
Yay it boots
Now I have to see which driver is the culprit
Wouldn't suprise me if it was an Anticheat
You don't play any games with them?
Then they're installed
I got like 3 apps
That are bloatware
Outlook
Office and linkedin
I'll uninstall them manually
i have a list of locations of chests (which are chests with loot) and every player can open chest (it opens custom inventory not the actual chest), and then they have cooldown, so player has cooldown for every chest he opened, how can i save it to configs?
i just did this:
1st config with list of locations chests (or list of maps with x,y,z)
2nd config with every player having map<Location, Long>
is this ok?
if you're going to use configs you'd need one per player
Otherwise you'd end up loading a bunch of data for players that aren't online
he just gave you one
instead of storing the cooldowns on a single file create one per uuid
and delete it once all cooldowns are over
thats "if i'm going to use configs" sounds like configs are not great option
and this feels like not great option
package me.carillon.foody;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.CraftingRecipe;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
public class RecipeBuilder {
private ShapedRecipe sr;
public RecipeBuilder(String keyy, ItemStack item){
NamespacedKey key = new NamespacedKey(this, "keyy");
sr = new ShapedRecipe(key, item);
}
public CraftingRecipe build(){
return sr;
}
}
me trying to make a recipe builder ;C
"this" won't work
what the hell are those variable names
yeah found that out
A namespaced key takes either a plugin or a string
"this" would refer to neither
The "this" keyword refers to the current object instance you're in
Which would be an instance of RecipeBuilder
can you even acces "this" in constructor
ok you can
why there is no method to get list of locations from config
Because that's very specific
but there is getLocation
Just use getList and cast
but this will get me list<String> right?
i mean List<?> but with strings?
Make a util method to get a location list Ig?
It won't
If you set a list of locations it will return a list of locations
The Location class is configuration serializable
arent locations just strings in config?
It has an identifier that tells Spigot it's a location
what identifier
==: org.bukkit.Location or smth like it
yeah
you mean key == and value org.bukkit.Locatin
yes
You'd normally load that in to a player data object or smth
whats player data objejct
but you mean answer is "yes" ?
yes
thanky
An app?
???
electron-nextjs-nestjs project
What
I have an azure account
?????????????
???
I think you are off somewhere
yes, I am making a launcher
aha
via OAuth
what if you just didn't
We really don't need another Electron launcher đ
Yeah we absolutely do not
how to minecraft
is probably what you're looking for
Not 100% sure though
MS has 100 different ways of doing login
should i do getServer().addRecipe(recipe); inside the recipe builder?
i've had something in my ideas channel for a bit now
very creative name i know
Whoâs mrpack
modrinth modpack format
Just for Prism or smth
what
You don't really need to rewrite the launcher in Rust
not the entire thing
just a minimal lil launcher
takes you straight into the game, no extra bullshit
made for easy distribution ig
i mean, you still need to set up an instance for that and everything
You'd want that though?
that's meant to be a single click (+ auth ig) and it sets up your instance by itself