#help-development
1 messages · Page 1292 of 1
unless you tell opengl to do it anyways
Anyway I recommend https://discord.gg/RpzWN9S
i don't think you can do that with core shaders
this is just for minecraft xdddddd
and it has 57k members
Is this not for Minecraft?
but if you can access e.g. resourcepack assets, you could include a big item texture or something in your resourcepack and sample that; supposing you can get a pointer to it somehow
this is so funny
yeah yeah it is
It’s got a lot of people doing Iris/Optifine shaders
it's just that
But it has a #vanilla-shaders channel
ah aight
yeah, is it possible to do that?
i don't know
lol
You can include a big font texture I assume
Textures can be up to 256x256
Well, for fonts
That’s what
256x256
256 16x16 textures
You can fit 256 16x16 textures in a 256x256 pixel area
uhhh
16x16 is 256
meth
oh that should work plenty for them as they need 16 frames
no I need way more frames
like at least 64
Well 256 > 64
^
Maffs
and texture sizes at least 128
you could always try composing a larger image from multiple bitmap font characters
so you could split a large image into 16x16 chunks
Mmyeah
the point is for it to be a single character
what for
just replace a single token character with the desired character sequence when parsing the plugin config or whatever
or if it's in chat, then in chat
its never parsed
He really tried to add me xD
well parse it
that's not the point, also it won't work vertically
you can do that with the magic offset bullshit e.g. happyhud uses
and I really wanted to make the frames like the size limit, of 256x256
I should definitely skid that plugin, it does a lot of magic, yes
betterhud, I mean
yeah whichever one of the hud plugins
i only remember happyhud because it's part of the mythic ecosystem and the mythic ecosystem makes me mad
as in everything in their orbit is 🚮
except libsdisguises
consider forwarding it instead of linking it as i think you need to be in the same guild + have access to the channel for links to work
at least i just see #unknown
wait, wtf people have already done that waaay before?
damn, I will see the code
going by the description i'm not sure if that addresses the texture size issue but it might be worth a shot to look into
Hi everyone, how do we deal with world operations in ChunkEvent listeners
i.e. doing getChunk().getEntities() when ChunkUnloadEvent & EntitiesLoadEvent
That's likely to cause trouble but it seems that we can handle it
Umm, it's a bit complicated but I'm trying to support plugins instead of coding the plugins myself
I dived into your implementation but I was too dumb to find out how you prevented this
Prevent what
I tried to write similar patches and apply them to support ChunkUnloadEvent
I actually make them exactly the same but
ChunkMapDistance is ticked and ChunkUnloadEvent is triggered again for the same chunk and it repeats itself
Not really sure what to suggest
Spigot internals are sort of a mashup of code written over the past 14 years
I think you mean Python
too slow
Should rewrite it in Lua
COBOL it is
when you guys do lambdas do you prefer using standardised consumer supplier predicate or you instead define your own types of functional interfaces just for the sake of documentation and the clear usage
it depends
but generally ill just go with whatever is already available
AutoCloseable is just a throwing Runnable
It really depends
I usually make my own if I'm planning to expand
Or just use what already exists if I'm not
for application or internal library code I'll definitely use what's available unless I have some very specific need
for me shit changes when making a public api
and even then, what kind of api it is
plenty of situations where Function, Predicate, Runnable are more than enough and self explicative for the given setting
I usually change my stuff down the line to add more features or whatever and having to change literally every Function<A, B> to a BiFunction<A, B, C> or whatever is much more work
sometimes i make my own if the name is confusing
I'm not entirely sure what you mean
if you need to change from a Function<T, R> to a BiFunction<T, U, R>, whether you are using those interfaces or your own, it will break all existing lambdas anyway
i don't usually pass it around to a different interface
Does anyone know how i could listen to the ClientIntentionPacket packet?
of course a normal packet listener won't work because the player hasen't been created yet
yeah but I don't have to change the method definitions, just the lambdas
sure
Execution failed for task ':compileJava'.
Could not resolve all files for configuration ':compileClasspath'.
Could not resolve com.sk89q:worldguard:6.1.1-SNAPSHOT.
Required by:
project :
Could not resolve com.sk89q:worldguard:6.1.1-SNAPSHOT.
Unable to load Maven meta-data from http://maven.sk89q.com/repo/com/sk89q/worldguard/6.1.1-SNAPSHOT/maven-metadata.xml.
Could not get resource 'http://maven.sk89q.com/repo/com/sk89q/worldguard/6.1.1-SNAPSHOT/maven-metadata.xml'.
Could not GET 'http://maven.sk89q.com/repo/com/sk89q/worldguard/6.1.1-SNAPSHOT/maven-metadata.xml'. Received status code 522 from server: <none>
- Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.
how to fix this proplem
alr old
last update was before 5 years
What
What
I am currently working on a anti cheat plugin. I need help with the plugin, as I dont know how to let the plugin execute commands (like ban or kick) in the console
which context does it need?
hmm?
there's any plugin have custom anti cheat why u would make it
also u can get src and edit it
Would anyone have a idea about this
You have to add the command and it's arguments and permissions to plugin.yml then include a Java method annotaed with @EvenHandler IIRC that denotes your commands functionality. You then have to register the command to your plugin in onStart similar to events but I forget the specific method for that
Huh
Did u even read what they were trying to do
onStart
bruh just spent 20 mins at work debugging why applying a cooldown of Integer.MAX_VALUE doesn't work
int overflow moment
fuck rad's not here
does anyone have code for layering components on titles with negative space
the logic completely fucks itself because titles are center aligned not left-align
if I send some text back it sends the previous text forward
for some reason
mongodb just does not want to behave
and i have no clue what im doing wrong
java.lang.ClassCastException: class java.util.UUID cannot be cast to class java.lang.String (java.util.UUID and java.lang.String are in module java.base of loader 'bootstrap')
public void initMongoBounty(String uuid, Map<UUID, BountyData> bounties){
Document doc = new Document();
doc.put("uuid", uuid);
doc.put("bounties", bounties);
getBountyCollection().replaceOne(Filters.eq("uuid", uuid), doc, new ReplaceOptions().upsert(true)); <-- problem line
}
im not even casting UUID to string
Hello, how can I automatically publish a plugin jar to spigot with a gradle task ?
meanwhile the spigot guide
public void initMongoRank(UUID uuid, String prefix, String suffix, int permLevel, ArrayList<String> permissions) {
Document doc = new Document();
doc.put(“uuid”, uuid.toString());
doc.put(“prefix”, prefix);
doc.put(“suffix”, suffix);
doc.put(“permLevel”, permLevel);
doc.put(“permissions”, permissions);
getRankCollection().replaceOne(Filters.eq(“uuid”, uuid.toString()), doc, new ReplaceOptions().upsert(true));
}
It’s the map
It’s trying to convert the uuid key to a string
Iirc there’s a setting to enable complex keys
You can just set the block there to fire
but it lights random blocks right
in which directory do i put files like images ?
whichever one u feel like
unless its server-icon.png, that one goes in the same directory as ur server jar
unless u set it dynamically, then it doesnt matter again
how are you obtaining the image in code
idk
or getClass().getResource if ur accessing from an instance
its just how java decided to be idk
oh wait
i just wanted the path
is ur image inside the jar or in the plugin directory
yeah inside the jar
oh okay yeah u gotta access it from a class instance then
which class
like new File("images/img.png") ? its just not how java jars work sadly
i dont understand why
because it uses the given class's ClassLoader to resolve the path inside the jar
you could also use your plugin instance for it, as there is an utility method in JavaPlugin
(i.e. JavaPlugin#getResource)
so whats the difference between class.getResource and JavaPlugin#getResource
nothing, the one in java plugin is just an utility method that uses the PluginClassLoader directly
getResourceAsStream my beloved
shush
hi guys, im making a core plugin which ofc needs alot of GUI's. Whats the best way to manage GUIS and the most useful GUI Builder API, or should i make a custom one? Thanks!
?gui
maybe this idk
reinvent the wheel, u know u want to
Nah all the cool people are using dialogs now
Hello, how can I automatically publish a plugin jar to spigot with a gradle task ?
I believe some people have made automatic changelog generators for updates, if anything but you can't really do the update and publication automatically without doing some sophisticated scraping
MD will bonk you
anyone capable of doing that level of scraping wouldn't be asking how to do it anyway, so I don't think it is an issue lol
He will find out
Probably when you mess up and it publishes 100 updates in the span of 5 minutes
I don't think most people would be able to get past cloudflare captcha, but who knows
that makes me think, are the internal endpoints captcha-protected as well, ig if you don't have the right cookies it just fails the request even if you provide a valid authorization header
Oops
depends
if there's a gui lib that meets your needs go for it
I wrote all my own shit because there's no GUI lib that fullfils my needs
if I am listening to a teleport event for portal uses, and I use event#setTo, will players get a loading screen like they would traveling through a vanilla portal?
''' Execution failed for task ':compileJava'.
Could not resolve all files for configuration ':compileClasspath'.
Could not resolve com.sk89q:worldguard:6.1.1-SNAPSHOT.
Required by:
project :
Could not resolve com.sk89q:worldguard:6.1.1-SNAPSHOT.
Unable to load Maven meta-data from http://maven.sk89q.com/repo/com/sk89q/worldguard/6.1.1-SNAPSHOT/maven-metadata.xml.
Could not get resource 'http://maven.sk89q.com/repo/com/sk89q/worldguard/6.1.1-SNAPSHOT/maven-metadata.xml'.
Could not GET 'http://maven.sk89q.com/repo/com/sk89q/worldguard/6.1.1-SNAPSHOT/maven-metadata.xml'. Received status code 522 from server: <none>
- Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
'''
how can i fix this proplem ?
buddy posting the same exact shit again
why are you trying to import worldguard 6
it's like pre-1.13
im useing 1.12.2 bro
Didn’t i give you the correct repo
?howold 1.12
?howold 1.12.2
Minecraft 1.12.2 is 7 years, 9 months old.
so i should change this in build.gradle >?
i like this version
it's completely fine
im sorry but what should i change https://sharetext.io/0b4a8047
Just learned about encapsulation and I was breaking it
So I fixed my issue with methods
Gj
I'm trying to create a custom nametag with a combination of scoreboard teams prefix with a modified gameprofile name. I'm able to modify the gameprofile name using the PLAYER_INFO Add_player packet and and see the updated name, but doing this removes the teams prefix. Anyone know anything about this?
I'm sending a sequence of packets, remove entity -> player info add player (modified gameprofile created here) -> entity destroy -> entity spawn. The last two packets are to simulate a respawn so players can see the modified name
Wondering if I just need to send scoreboard packets in the sequence, or run some sort of refresh on the scoreboard since im using remove and add entities packet
If your goal is just a custom nametag, spawning a text display entity and adding it as a passenger to the player will work
It does ya, we handle all the teleporting ourselves so we just respawn the nametags when they teleport. If you run other plugins that solution probably won’t work
https://i.imgur.com/VdrM964.png
Heya! Im learning how to code Java and so I'm following the steps that the guide states however. As you see my Book class has encapsulated variables and so I use methods to change the objects data
Am I doing this all wrong?
Below is the usage for my methods:
https://i.imgur.com/mPEtyKC.png
I was wondering if I shouldn't return a value making my method type void or if I am doing it correctly because the video says to use void
Generally setters return void
While getters return the value they are designed to get
And java conventions generally have them named getXyz and setXyz
anyone know how to make a mob spawn naturally in a mob he can't?
like spawning ghasts in the end
or any libraries that can help
- Replace an existing mob when it spawns
- Make your own spawning system
- Hack away at NMS
Builder style would like to have a word with you
im trying to spawn ghasts in the end and it keeps spawning infinitely

?
with replacing an existing mob
u could replace an enderman spawn with ghast at a random chance % idk
i did that and worked in a first time
but later i wanted to replace all enderman with a enderman which has a custom name and it started spawning infinitely
ah, the good old infinite ghast glitch
(i made that up)
maybe u could check against the endermans name before u spawn the ghast? idk
like if the name is custom dont try to spawn ghast
the problem is that the endermans keep spawning infinitely too
im blessing chatgpt to help me and he said im cooked 🙏
that is how the end works yes
not how you think
D:
it spawns like 5000 endermans in 10 seconds
i dont even think once
idk how u managed the infinite enderman part
unless u do spawn an enderman for ... every enderman spawned
but atp u should replace said enderman in a creature spawn event then maybe check for custom name for the ghast part
i reckon a spawn overflow must be trivial to avoid
im gonna see that
You cause a loop
Spawning something in the spawn event then triggers another spawn event
Check the spawn reason
?jd-s hm
(Or use a Boolean to ignore the spawn you explicitly cause)
oh i thought u could outright replace the entity in CreatureSpawnEvent
i see now its immutable
this is why AI is a scam fr
fr
You can modify it, but not change the type
Ye
im just gonna spawn the mob near the player every 20 seconds to simulate the natural spawn 🙏
how did we come to this resolution
well
i did it
i added that 1 in 5 endermans spawns an extra mob which will be a creeper and in 1 in 10 endermans will be ghast
works good
i should add random charged creeper chance to my smp
50% random enough
charged invisible creeper with amplified explosion radius

I mean that’s almost how natural spawning works
Good enough
Ship it
Setters return void, Getters return the type, right?
today i will forego conventional databasing and instead store player configs directly inside PDC
👀 I mean... not always
But generally yes
Yeah there are definitely exceptions
Sometimes a setter may return a Boolean to indicate if it actually changed something
Or maybe the previous value
Collection and Map go brrrrr
Any feedback is appreciated https://www.spigotmc.org/threads/thoughts-on-this-api-i-made.702774/#post-4881107
/j /lh
Clearly we should just add a CustomItemRegistry to spigot itself!!1
eh not a fan
I feel like if you're going to make a proper lib for this you should add support for item components and have some sort of legacy adapter that applies them to spigot meta
both paper and spigot modules because hard fork and whatever else
And at that point you're just reinventing itemstacks
Why stop at deserialization? What if I want to save an item to a config
what then?
and also... data version upgrades
Is it possible to change a player's item's item model via CUstomModelDataComponent, without having to re-set the item in-hand?
by reset do you mean remove the popping up animation?
Hey, There I am Looking For A Experienced Server Devloper Who Is Willling To Help My Server Grow If You Are Intrested please do Dm Me thanks (:
?services
If you wish to request or offer development/art/building/administration services, please do so at https://www.spigotmc.org/forums/services-recruitment-v2.54/
Why The Heck Would Anyone Type Like This
smh pay ur devs
They'll pay in exposure
and 50% revenue split (but they will make millions trust me)
how about I pay you in equity
the company will make millions in thr futute
trust me
for a map of <Object> whos key is a UUID [from <Player>], and <Object>'s life-time is only while <Player> is online, could i just make the key the <Player> for simplicity and avoid unnecessary lookup-by-UUID when accessing <Object> ?
as long as you destroy it when they leave, it's fine
ye <Object> is deleted in PlayerQuitEvent
yeah thats fine
Pog
isnt the reference also getting replaced when they die or something? or only when they leave?
oh u know what
i think teleporting across worlds breaks persistence doesnt it
Fuk
I don't know why, when i try to reduce the item amount in the recipe is getting multiplied and then back to what i want to intended.
This is the code in line 89
bros crafting diamond sword with emerald
its just example ;v
gah F it ill just keep lookup by UUID
yeah atleast you know the uuid lasts forever
or well, until microsofts servers are dead
True
ur code looks fine logically but is the ItemStack amount is being modified elsewhere?
in line 106
just that
Is there a reason why you dont actually use spigot recipes? Why are you modifying the crafting matrix yourself?
yea
because i want to make a custom recipe system that can know what amount the item is and etc
to be exactly i want to make like this plugin
https://modrinth.com/plugin/greatcrafts
ahem
What is the goal of your reduceMatrix method?
yeah, i read it and got that result
first clear the item in the crafting slot and then reduce exactly as ingredient amount in configuration then set item in crafting slot
Where do you call this method?
You might have a problem with cancelled events
Alright, now explain what we are seeing in this video. When are you clicking, and what are you expecting to happen?
When i try to click Result slot in crafting inventory, will check if this inventory is really crafting inventory or not and check if slot inventory is the result slot. i expect that will reduce the item in crafting slot exactly as ingredient amount configuration, ex:
Example:
Type: SHAPED
Shape:
- " E "
- " E "
- " S "
Ingredients:
E:
Item: emerald
Amount: 2
S:
Item: stick
Amount: 2
Result:
Item: mythicmobs:example_item
i really dont know if this really explains it
if this cant fix maybe i will stick with this and not touch it, again.
because in basic it just works as what i expected but has an error on item amount visual
what format is that
configuration?
spigot account?
?support
i emaild them?
yeah email them
ok thanks
How can I upload my plugin?
use Filezilla
I mean how big is it xD
No, but I say in spigot to know how it's done
Yea, but I think that can't be changed. Completely client side.
correct
its client side
whoa, cool. I'll check it out
whyy
Probably because some monkeys in the distant past discovered fire :)
Caused by: java.lang.ClassNotFoundException: be.artex.rolesffa.items.ChooseRole
at java.net.URLClassLoader.findClass(URLClassLoader.java:445) ~[?:?]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:102) ~[patched_1.8.8.jar:git-PaperSpigot-445]
Caused by: java.lang.ClassNotFoundException: be.artex.rolesffa.items.ChooseRole
Any ideas why i get this error? the class is in the jar.
What other library supports itemsadder, nexo and oraxen? If you know, tell me because I want to add this compatibility to my plugins
It basically is a lib for components, no? You can configure name, lore, cmd etc
Honnestly good Idea. I can add a fromItemStack that returns a configuration section.
And while I am reinventing itemstacks, the goal here is to have an easy way to support a Bunch of different plugins. Itemstacks really only work if you serialize them. But theres no way to go from "itemsadder:namespace:key" to an item without this
Doesn’t handle all the fancy new components
Durability, equipable, custom model, glider, etc
what i did was just fork every other custom item plugin to use my centralized item definition plugin, and the latter has them definable as yaml which gets parsed as json which gets parsed by mojang JsonOps into itemstacks
very flexible and i don't have to maintain any part of the parser myself
e.g.
components:
minecraft:custom_name: '{"extra":[{"bold":false,"color":"aqua","italic":false,"obfuscated":false,"strikethrough":false,"text":"Reactor Coolant Cell","underlined":false}],"text":""}'
minecraft:custom_data: '{PublicBukkitValues:{"slimefun:slimefun_item":"REACTOR_COLLANT_CELL"}}'
minecraft:profile:
name: CS-CoreLib
id:
- 357563355
- -1042141084
- -1799017745
- 522968250
properties:
- name: textures
value: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGU0MDczYmU0MGNiM2RlYjMxMGEwYmU5NTliNGNhYzY4ZTgyNTM3MjcyOGZhZmI2YzI5NzNlNGU3YzMzIn19fQ==
DataVersion: 4189
why even use yaml when half of the file is going to be json 😭
the item definitions are expected to go into a yaml plugin config
plus yaml is nicer to work with
has anchors and shit
there's also snbt strings that you could put into a yaml config, but those don't get any linting and won't be validated by e.g. yamllint
I always thought json as easier since Gson/Moshi make it pretty great to deserialize, just pass a type token to it and it'll figure shit out
on the source code side, for sure
on the editing the text file side, not so much
yaml is much more free form
eh, json has much more wider coverage, even browsers have tree-like views for json files
but at this point it is just a matter of preference I guess
shore but there's e.g. exactly one way to escape things in strings and it gets quite unwieldy
yaml for comparison has 3 or 4 and each one is specifically suited for certain kinds of strings and things to escape
Yaml is a superset of json
If you want to use json you're free to do so
is it now
yes, valid json is valid yaml
I never really connected the dots but I guess you could write yaml as if it was json given it supports in-line blocks like json with braces
yaml is practically just a ton of syntax sugar and human-friendly syntax additions on top of json
anyhow, ItemStacks have always been quite annoying of an object to serialize, hopefully data components take over all of their properties so it can be more easily standarized into simpler formats
this makes it much more difficult to work with programmatically (compare the snakeyaml vs org.json parsers for example) but much more human friendly
aren't itemstacks already completely composed of components?
Yes
I believe there is still some items which have special behavior that isn't described by components
PDC is annoying to deal with in serialization
PDC should've just become a wrapper around the custom data component for items
API wise, nothing would change
in the sense that all functions aren't data driven? yeah, you can't make something into a fishing rod with a component; but everything about a stack is serialized and deserialized and stored in-memory as components
oh yeah i also registered an itemstack subclass into the bukkit serialization system so that any plugin that reads an ItemStack directly from its config can use the json item definition syntax and have it work out of the box
in this way i didn't need to fork mythicmobs in particular
Icl, comments do fuck it up, since by specification they can just be anywhere and a library may pick their own range of support
Anchors are nice but like hella easy to make a yml document a shithole
Its also the fact that u can use block and flow style unrestrained that makes yaml goofy, esp when you work w others and they opt to use the other style out of nowhere for the sake of it
I do agree with this, yaml is supposed to make editing easier, but in practice this can really vary depending on what file you’re editing in what environment, sometimes the strictness of json helps more so than yamls leniency
anchors are also an easy way to crash a parser
the leniency definitely makes it more difficult to reason about what's going on and what's actually valid and what isn't
ye for sure
toml ftw
simple, standardized, no gimmicky logic with references mappings etc
i can bet that more than half of YAML features are not even known by average user
i prefer either json or toml, but i just use yaml for consistency with bukkit server implementations and plugins
You gotta be rage baiting atp, like sure there are some advantages with toml, but also some disadvantages, both in general and compared to yaml, for example anchors, but also who thought it was a great idea to let [table] and then [[arrtable]] for example, quite confusing and easy to mix up due to becoming an illusion potentially
toml is so fucking ass 😭
just like all of these formats, it just ends up looking strange when it comes to complex structures
I mean json works decently for complex structures, well imo
i knew you'd say this
json is for programmers, yaml is for end users, and toml is for code hipsters
what about hocon
edgy
fair
hocon is just json with comments, nobody using json cares about comments
{"success":false,message:"Failed to do the thing"} ftw
Caused by: java.lang.ClassNotFoundException: be.artex.rolesffa.items.ChooseRole
at java.net.URLClassLoader.findClass(URLClassLoader.java:445) ~[?:?]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:102) ~[patched_1.8.8.jar:git-PaperSpigot-445]
Caused by: java.lang.ClassNotFoundException: be.artex.rolesffa.items.ChooseRole
Any ideas why i get this error? the class is in the jar
are you sure you put the same jar in your server
mfw "__comment__": "hello"
I like naming my json comment fields "choco"
I just made a simple code in Java to test how much faster it can be than Skript (a different plugin I used to use to customize my server). When I run like 10,000 loops, it will take like ~3-4 seconds to load, but then it tells me that it took like 200ms. In the attached picture it took easily over 2 seconds to run the command. Does anyone know why this would happen?
ItemStack item = new ItemStack(Material.DIAMOND, 100);
ItemStack item2 = new ItemStack(Material.DIAMOND, 1);
for (int i=1; i <= loops; i++) {
p.getInventory().addItem(item);
for (int i2=1; i2 <= 100; i2++) {
p.getInventory().removeItem(item2);
}
}
How are you measuring time
with the System.currentTimeMillis()
any idea on how to stop command arguments from being sorted alphabetically with CCF
And how do you know it's not the client having to keep up with the packets
is that the issue? idk what it is
I'm just wondering if this is an accurate test
because it doesn't seem accurate
It's probably fine
Yes!
how can i upload a plugin in spigot
You click the post resource button
it most certainly isn't, but you also are not going to add and remove items a million times in one go
you should probably read that message at the top that is hidden behind the "RESOURCES" tab
Anyone know what website/wiki this information is located?
minecraft.wiki
thank you!
Vector vector = targetPlayer.getLocation().subtract(player.getLocation()).toVector();
vector.normalize();
vector.multiply(2);
vector.setY(vector.getY()+0.2);
targetPlayer.setVelocity(vector);
what is throwing exception here when 2 players are in the same location? what do i have to check
Make sure player!=targetplayer
I think it has something to do with infinity
if they're in the same location you're normalizing a (0, 0, 0) vector which results in a divide by 0 error
why doesnt they say it in docs
ig it should mention that in docs but it's usually just implied that arithmetic errors can occur with normalization
It does, in the length method?
Ah, Maybe not explicitly tho
Vector vector = targetPlayer.getLocation().subtract(player.getLocation()).toVector();
if (vector.isZero()) {
vector.setY(1);
} else {
vector.normalize();
vector.setX(vector.getX()*2);
vector.setZ(vector.getZ()*2);
if (vector.getY()<0.3) {
vector.setY(0.3);
}
}
what do you think
i coded particle api that allows you to create particles between 1.8+ but im not sure which nms interface should i choose for 1.13.
i mean :
i have R1, R2 and R3
Depends on the version
because it is only changed in these versions
yes
ParticleNativeAPI also uses same tactic
he uses bridge pattern
for this 3 different versions.
differences between 1.13 & 1.19
so no need implementation for other versions i assume.
does Player#get/setDisplayName persist across reconnect, or is it per-session?
need api doc to start specifying this sort of behaviour frfr
is there any way to force intellij to generate fluent getter/setters?
wdym?
What's wrong with the particle API in spigot ?
want to create animations that runs in all of versions. there is nothing wrong the spigot apis Enum api
its just study purpose API in general
i found it, you just need to select records style in intellij generate dialog menu
public Component name() {
return this.name;
}
public Component description() {
return this.description;
}
public ThemeLocations locations() {
return this.locations;
}
How to get players ping
i dont have any idea what you are doing now, i mean why use of Component instead of type of variable
Player.getPing()
i've had issues with lombok when dealing with frameworks
i just tend to use generate feature instead
since that's more compatible and ideally more readable for me since i see what class actually does without syntax sugar
this is syntax sugar for me tho
lombok is also bad
its verbose, and its clear what it does and its flexible enough for changes in the future
tbh ill just use record for this
more reasonable
Lombok hate? Ban
:/
still waiting for java to add Pair<> into standard lib
And Pair3, Pair4, Pair5... Pair9
have you seen collections static factory methods
its not as if they already do this
I mean that’s just to optimize against varargs
legacy java dev laughs in Map.Entry
STL enjoyers crying in the corner
why dont they do refactor just like they did with nio under different package
with different interface contracts like with splitting immutability
Java Collection Framework -> Mutable
Java Stream API -> Immutable (OOPFP)
give java 100 years and it might happen dovidas
Java records can be used for this
why does Iterator has remove() method by default
this is looks good to me actually
you cant support enhanced for loop without implementing remove() since it depends on old wacky interface that expects all iterators to be mutable
why you having problem with java i dont understand
Stream API being pure until its not 🙏
i mean mutable state & immutable state is just collaborators. leaving some windows open is not gonna fail you.
it shouldnt
why should i not enforce this at compile time by splitting of interfaces in the first place why should i implement a method which throws operation not supported exception
its just legacy contracts
java std lib is like microsoft windows - they keep painting new layers on top of rust
I mean yea dovidas its a known issue that java “breaks against” LSP with the entire collection mutability/immutability thingy, unless you consider subtle changes in Javadocs that have gradually been added
kotlin handles std lib way better
they dont even expose constructors for collection types
"Even Haskell supports controlled mutability with constructs like IORef and ST. Clojure has a Software Transactional Memory system. So even pure FP languages leave the door ajar when it's necessary for performance or real-world modeling."
Yea but isnt that still handled through an IO monad?
which makes it pure within the language still
with immutability, you have to create new objects constantly. and this is one of the major problem of fully immutable languages
Wrong
because creating objects is not cheap
I mean yes and no
nobody wants full immutability
we need compile time immutability, not runtime one
Wrong again
If creating objects weren't cheap langs like java wouldnt even exist
that doesnt mean you should bash GC
Haskell is so high level it doesnt have a control flow, if u specify creation of an object, it may not need underlying memory allocation just because u invoked some function or semantics that constructs an “object”
but still its not as if it takes seconds to create an object
nah its solves that problem in big picture (creating 5 domain model is more clean to me instead of 4000 data model )
if you have ecosystem like java in other fp languages you cannot wait that performance from that languages.
unlike java new Blah, haskell doesn’t impose object memory allocation
this is a very fundamental aspect of FP, there is no subjectivity here
.
you dont need full immutability, you generally target for immutability to support multithreaded operations, since read operations are by default thread-safe unless its values were cached in the CPU or in the registers (in which case if you care you can supply volatile keyword to fix that)
you just want to make immutability in a way that those threads cannot mutate at the time they're reading that
when i need data i create immutable classes (records), and when i need lambdas i use Stream API. thats it for me
I mean immutability is good for a lot more than multithreading
it should be balanced, for example i usually dont do setters but that doesnt mean i dont mutate some fields in encapsulated manner which can be read from getters
For one its a crucial aspect in functional programming that make FP programs heavily optimizable and possible to execute reasonably
I did not understand the relevance of our topic to multithreading in the context of being mutable and immutable.
Yea in procedural and object oriented, immutability is nice to write defensive code
read operations are by default thread safe you dont need to synchronize them
if you make data immutable you dont need to synchronize codeblocks across threads since all the threads will receive the same information from the class/field
Not always
but on a primitive level yea usually
but like this statement is just wrong
objectively, as said, look at haskell
can you explain creational design patterns intent, if objects creation is cheap. because you said its wrong
Read broski
i mean creating objects creates memory leak in some languages -> more object == more leak. because manual memory mangement is hard to handle when you have tons of objects.
and abstraction creates less object use & creation.
object creation does not alwaya imply that it footprints onto runtime in terms of ops, or memory allocation for that part, in procedural languages that is almost always true tho, tho severely untrue for logical or functional langs
(Ofc depends on what we define as an object)
hmm
Im not talking Java stream api fyi
There are other things that cause leaks aside from just the objects. Like File handles and the such. In java anything that needs resources typically is in the form of an object. In other languages this is not necessarily true and this is where memory managment can get overlooked because its not tied to a particular object.
How do you save irregular areas? You cant just save from Loc1 to Loc2 cause its not cube. Any easy way to do it ?
I always wondered how that was made
Do you just save a bunch of location pairs
depends on what the area is like
since you mentioned area rather than volume i assume we are talking about a 2d shape
but volume is a big boy term
people in this server barely know trigonometry to spawn 10 particles
What’s a triggernomitree?
this just shows that software engineering is more like art and not an actual science
is there any method inside bukkit api which returns Plugin's configuration file path?
i know that getConfig() returns plugin's directory config.yml, im just wondering if there's API way to know that
instead of relying on javadoc
new File(getDataFolder(), "config.yml") xddd
yea but that's essentially guessing by following javadocs
i wonder if there's getConfig().getFilePath() or smth
?jd-s
tbh it would be easy but good addition to FileConfiguration class to retrieve file path
it doesnt matter much since it won't change either way but its just good to enforce such constants into code
i think it also accepts a Reader which could result in a no-file situation
FileConfiguration that is
well that sucks since Reader is not necessarily for files
bad design choice i guess
what can i expect from 14 yr old api
i think a config constant also doesnt make sense since some plugins might not be configurable
so they too would have no file
or they may do config by other means than conventional config.yml
doesnt matter, the Y is probably not important
then how ?
you can just return Path which is not bound with any file existence
you use Files.exist(path) to check it with nio
yes i understand files in java
a file also need not actually exist with io.File either for stuff like File#exists
I have a method that successfully changes the current held item's Custom Model Data Component's Strings. However, it only works when I call it through the PlayerInteractEvent and not the PlayerSwapHeldItemsEvent, just curious why is that?
So I am guessing the PlayerInteractEvent sends a packet from server -> client, but is there a way to know which events send S2C packets?
Doubt that's the reason. Probably something from your code
really? I just copy pasted the method to fire from that other event, i made sure it fired too.
welp redempt finally blocked me it only took what? 5 years?
i dont think it matters whether the actual packets are s2c or c2s, if its an event in the spigot api you can listen for it and react accordingly. Maybe for some reason the swap event doesn't use the item correctly after its called, or maybe there are other plugins listening and changing the item after your listener
there are multiple ways of tackling this problem
which is what I call "storing a surface"
here's a really memory inefficient solution
store every point you need inside the cube
it's alright for really sparse cubes but not amazing
Here's another solution: store long lines
but how could you let user select that
that's a whole separate problem
here's another solution: write a fancy algorithm that converts your points into a bunch of cuboids in a way all of the mfit
(gl with that one)
A FileConfiguration doesn't hold any File field or anything, the entire thing just has a save(File) and load(File) so such method is not possible no exist
Here's another one: paletted container
it's basically storing your surface's points but instead of as a list of points, just a bunch of bits
and you just calc their position or something
really inefficient for sparse points but decent for something concentrated
there are a bunch of ways
some are great for disk storage but awful for cpu
some are great for cpu but awful for ram
some are average across all
do you also have mmany ways to handle user selecting the area 😭?
usually just involves worldedit and a mask
I did this for a prison server back in the day
basically fill the entire "mine" area with like glass or something
what's mask
think of it as a filter
or one of those baby toys with the shapes
that you gotta put the rectangle in the hole
that's basically a mask
in the square hole
only the right block fits
it just filters
if you make a mask for GLASS for example any block that is glass will pass it
any one that isn't gets left behind
you mean its selected?
how can you cleanly cancel a Player Jumping, now that they removed the Jump Boost 128 overflow thing?
can't you change the jump height with attributes?
yeah the attribute thingy
I saw "Jump_Strength" attribute but that is like "Horse_jump_strength" does that even work on players?
I just never even tried using that on a player cause it specifically says horse 😆
api version in your pom.xml/build.gradle?
it hasn't been updated in a hot second but can probably come in handy for reference on a few things
Thanks, Appreciate it. I'm trying to make a plugin that spawns client-sided entities and then allow the server to be able to call upon the entities
Cause I have ExecutableEvents. If I can just make a plugin that can convert normal entities to client-sided entities and vise-versa. it would be pretty neat and the possibilities would be pretty endless
tbh there's no need to make them client-side only, often times server-side entities which are hidden for most players using the entity visibility API works pretty well
client-side only entities are really only useful if you're like, doing custom entity tracking or the like where you don't depend on the server doing things
Ah alright, That makes sense. Thanks for the insight.
lol
is it a way to make BlockDisplay half-transparent? i was trying to add invisibility potion and add to one team player and this entity with team.setCanSeeFriendlyInvisibles(true), but BlockDisplay is not LivingEntity
can i detect players using multi accounts
idk if you call that like that in english but
coming to the server from a few accounts
yeah litebans does
its just using the ip thats all u can do
block vpns
how to check ip ?
just use litebans
Player#getAddress()#getHostAddress()
is this Player#getAddress()#getHostAddress()
litebans
lol
i recommend querying against a few dnsbl's
most proxies/vpn's are blacklisted on one or more of them
Hello. I have been trying to listen to the ClientIntentionPacket. I have try alot of things but can't get something to work
val server = MinecraftServer.getServer().connection
val field = ServerConnectionListener::class.java.getDeclaredField("f")
field.isAccessible = true
val orgininalInit: List<ChannelFuture> = field.get(server) as List<ChannelFuture>
orgininalInit.firstOrNull()?.channel()?.pipeline()?.addFirst(UUID.randomUUID().toString(), object : ChannelDuplexHandler() {
override fun channelRead(ctx: ChannelHandlerContext?, msg: Any?) {
if (msg is ClientIntentionPacket) {
println("WOW")
}
super.channelRead(ctx, msg)
}
override fun write(
ctx: ChannelHandlerContext?,
msg: Any?,
promise: ChannelPromise?
) {
if (msg is ClientIntentionPacket) {
println("WOW")
}
super.write(ctx, msg, promise)
}
})
field.set(server, orgininalInit)
Can someone have a look and see what i might be doing wrong?
Try doing it in java
won't change anything
It changes me being able to help
fine give me 5 min and i will change the code to java even thing its not that hard to read
public void test() throws NoSuchFieldException, IllegalAccessException {
ServerConnectionListener server = MinecraftServer.getServer().getConnection();
Field field = ServerConnectionListener.class.getDeclaredField("f");
field.setAccessible(true);
List<ChannelFuture> orginalInit = (List<ChannelFuture>) field.get(server);
orginalInit.get(0).channel().pipeline().addFirst(UUID.randomUUID().toString(), new ChannelDuplexHandler() {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if (msg instanceof ClientIntentionPacket) {
System.out.println("WOW" + msg);
}
super.write(ctx, msg, promise);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof ClientIntentionPacket) {
System.out.println("WOW" + msg);
}
super.channelRead(ctx, msg);
}
});
field.set(server, orginalInit);
}
let me see if i can find my old project where i injected into the netty pipeline
though i don't think doing that is necessary; iirc protocollib should be able to intercept status/pre-login packets as well
there just won't be a player object, it's some protoplayer or some shit
That would be great
you'll probably have to inject into the channel initializer considering it is a handshake packet
SOrry but i won't be using protocolib 😅
is there a reason you aren't using protocollib or packetevents other than just trying to do it by yourself
I'll tell you that doing this kind of thing by yourself becomes annoying if it is a public plugin, given setups that use viaversion/geyser stuff might need some more careful handling
you're also just using a random uuid as the handler which isn't optimal
Because i enjoying doing it myself. I learn more from doing it myself. I don't want to use depend on other peoples libs. I don't want to install unneed plugins on the server
PacketEvents is a library you can shade
oh i know
ik
That was just for testing
I want to get something working before adding it fully
doesn't look like i have it on this machine
That is really sad
Thanks anyways for looking. If you had a quick look does anything stand out?
it looks fine at a glance but depending on where you are in the pipeline you might not be getting passed a constructed packet object but a bytebuf or something instead; also maybe check if you're seeing any other packets going through, just not the intent packet
Let me check
if it is of any use, you can take PE's impl as reference: https://github.com/retrooper/packetevents/blob/2.0/spigot/src/main/java/io/github/retrooper/packetevents/injector/SpigotChannelInjector.java
OUT [id: 0x0d18813f, L:/127.0.0.1:25565 - R:/127.0.0.1:64474] getting this on channelRead when joining
Looking at it. It looks like i might be that they are injecting into the player channel and not server but i might be wrong here
they are injecting into all channels, look at injectServerChannel method
what it does is take the connection list in ServerConnectionListener and replace it with InjectedList which is a list which injects their handler whenever a channel is added
the issue with yours is probably just the fact that by the time you read it, the channel was already added to the connection list, you need to inject into the ChannelInitializer in order to be able to inject channels as they join or do what PacketEvents does and just replace the list with one that will inject the channels as they are added to the list
I assume there's a reason PacketEvents does it that way, might be something around injecting into the ChannelInitializer being flaky but I wouldn't know
I know in Paper it is easier since they have an internal API to do this
guys can i chnage jar plugin to src? Or this is impossible
you mean, decompiling a plugin?
alr
it isn't impossible, but it is a lossy process
why
that's just how it works
when you compile a program, the compiler will strip things like parameter names, comments and mangle some syntax sugar in the code (i.e. converting lambdas into anonymous classes)
So there is no point in decompile it
given a good decompiler, the last one isn't too bad but it still ends up looking funny if you aren't used to reading decompiled code
if you want decompiled sources (or any sources) you'll have to decompile it
and yeah it's generally the decompiler that sort of guesstimates the lambda into an anonymous class, as of java 9 or something they actually compile into distinct bytecode from anonymous classes
I've scrapped the decompile plugin idea. Lol
besides the point, though; point is that there's guesswork involved, because compilation intentionally "boils down" a lot of the things going on in the source code to get an optimal and concise representation of it in bytecode
i think if i make a new plugin its better 😂
depends a bit on the scope but if it's a small-mediumish plugin, probably yeah
and writing one from scratch is better practice anyway
All this happened because I took care of the jar file and deleted the src 😁
idk whats that
can we inject into brigadier in bungeecord?
the whole tab completion for me is kinda not working tbh
idk if using brigadier would make it better
maybe there's another reigon
You can give priority to this area.
and ur in Help-development go to help server
i use the api
nop
how u send a image
can you do something lke
Map<K, EntrySet<K,V>>
As far as I know Owner can normally destory and place block
if you don't have any basic programming knowledge its waste of time to decompile stuff.
?img
Can't send images? That's because you're not verified! Use !verify to complete verification.
Alternatively, you can upload screenshots to any image hosting site and share the link.
Here's some screenshot utilities that you can use to upload images.
Lightshot: https://prnt.sc
Imgur: https://imgur.com/upload
Flameshot: https://flameshot.org
Takes like 3min
guys i have an question.... should i make an vault similar api? called VaultNext?
No
sure you can make it yourself
like the original author did
it just takes time. there is always a better way to do things
The main point of Vault is that it's universal
yea
Making a similar idea will not get any adoption because vault already exists
i want an higher performance version and more modern thats why
yeah but if you want something for yourself. something unique. that you made.. then just do it xD
youll learn a lot.. and maybe redo a plugin a few times.. then itll be fine
Vault is a bit more bloated tho i mean it still supports dead plugins/apis
The plugins hook into vault it's not the other way around
I want to change the world but also I don't know anything about the world
type energy
You can start by going outside
you need to learn how to type faster if you want to place a zinger like that on me boy
On my phone rn
on your way to the pizza place
Was drinking some compal from the fridge
ah yes better get that 200cal in a bottle
I drank about 18 cal worth
and then you did that 100 more times
man actually I can barely make fun of you right now, I'm back up to 95kg
And I'm back at the gym
and I never left
Just had a long break
it stops being a long break after a year
check out reserve
it's exactly what you want
it's "more modern" and "more performant"
in extreme double quotes
a reinvention of the wheel that nobody needed or wanted and only a few tangentially related plugins like towny support because vault already exists
ye i thought about it ngl the idea was shit
that said if you have a heavily customized server, i.e. you either maintain or have forks of most of your plugins in-house, a custom eco service can be handy
vault does have some multi-server related problems and while the offline player/non-player account support is technically there, they're all second class citizens
i just wanted to make an better economy api since it does not have the givemoney function.
that's not within vault's purview
that'd be the responsibility of the eco plugin that actually implements the economy service
i know but since they added deposit and withdraw it would still be handy
those exist mostly as a way to allow the implementation to make those atomic
that said i for sure would like there to be an api method in there that an implementation could override to implement atomic transactions between two accounts
but even then deposit is very rarely expected to fail so just doing withdraw first and deposit after is "atomic" enough in 90% of cases
hey is version api access on spigot down right now
it's throwing 403
or did it change or something
it's been down for like a couple of hours I think
ok now mojang auth is down
the universe does not want me to work on plugins right now
i'm starting to regret implementing mojang auth on my cracked server
a good 40% of the players use it to skip authme and get locked out whenever this happens
How to delete my plugin in spigotmc web?
Report it and request it to be removed
I was working on backend economy stuff a while ago, using bigDecimal objects for balances... those should be wrapped up in atomics instead correct?
Is the reason I want a plugin to be private enough?
If it's your plugin, any reason is enough
isn't bigdecimal immutable
i mean atomic as in uh
suppose a transaction between accounts A and B where A sends money to B
this is atomic if no other operation apart from that transaction can take place in between money being removed from A and being deposited in B
we like having fun around here
as-is vault makes this impossible because in order to ensure it's atomic, you need to do it in a single api call; but vault doesn't have a "from a move to b" api method, only "take from a" and "add to b"
@Override
public boolean add(BigDecimal amount) {
this.balance = this.balance.add(amount);
return true;
}
@Override
public boolean subtract(BigDecimal amount) {
BigDecimal newBalance = this.balance.subtract(amount);
if (newBalance.compareTo(BigDecimal.ZERO) < 0) {
return false;
}
this.balance = newBalance;
return true;
}```
I'm just reassigning the object held in the balance object
so you're saying my vault rewrite should use the blockchain then
that gives me an idea
You can't but forum staff can, if it's your plugin they dont care about the reason they'll remove it if you request
Honestly no clue lol
the check-set are atomic here, but as a whole the get-check-set isn't
in a threaded environment you're liable to read an outdated balance twice, subtract from it two different amounts and set twice, each overwriting the result of the other
e.g. if two threads subtract(50) and subtract(100) concurrently, the result will either be a subtraction of 50, 100, or 150, depending on a race
if you're certain this is only ever used from a single thread, it's fine, but otherwise i'd recommend doing compare-and-set or making the method(s) synchronized
Hmm yeah, I'm validating this after the fact the modification has occurred with the transaction object, should probably do this beforehand
one of my favorite hobbies is making complex maps that ensure some things only happen once, then forgetting to register anything to them
I love doing it
I do it all day long every day
I mean to be fair my transaction objects are mainly used for audits
But the validation comes in when I compare balance objects against previous transactions that occurred within an account
synchronized methods 🤑
I know the java devs already fixed that bug with virtual threads but I still stay away from them lol
to make it thread safe without synchronization you can
private final AtomicReference<BigDecimal> balance;
@Override
public boolean subtract(BigDecimal amount) {
BigDecimal witness = this.balance.getPlain();
BigDecimal newBalance;
do {
newBalance = this.balance.subtract(amount);
if (newBalance.compareTo(BigDecimal.ZERO) < 0) {
return false;
}
} while (witness != (witness = this.balance.compareAndExchange(witness, newBalance)));
return true;
}
same with add, except without a limit check
right
I'm wondering if it's a flaw to hold accounts under the same bank object, used as a central runtime manager for related operations... Though I've been told more people would rather this be the case than handling a bank per player... Accounts are separated based on currency type so honestly I'm not sure. Central manager is probably the way to go now that I'm actually typing this out kek
uh why it it a list
No reason to have a bank per player when accounts are already typed by different currency types
No clue honestly
I probably was just writing fast
Haven't actually touched this project in a while, but since you brought up that eco stuff I was intrigued lol
consider Map<UUID, Map<CurrencyType, Account>> or one of those fancy table classes from google collections
alr i did request
Account already has a UUID reference, think it's needed to separate as such in the bank?
well i mean right now in Bank to get an account you have to manually loop over every account in the bank and one by one check if it has the right ownerId and currencyType
because you're storing them in a list
Yeah that's fair
not only is this inefficient (O(n) lookup time instead of O(1)), it makes it possible for there to be duplicate accounts with the same ownerId and currencyType
storing them in a map solves both problems
You are absolutely correct
apart from that, you're maintaining a ledger of transactions, which is nice
but in that case this'll not be enough; you probably want to make the addTransaction and other methods synchronized
Yeah, like I said earlier, transactions are mainly used for auditing and a bit of validation but that validation of the transaction was meant to happen after the fact a modification to the balance has occurred so that's flawed
Modifications to the balance should be saved until all the validations have cleared...
QOL enhancement: Audit Log UI's for staff/bank managers depending on the use case... I was thinking about writing in some sub module features that use the eco to make like a banker sim kek
one of the reasons i ditched vault was precisely proper audit log/transaction ledger support
The api is so goofy
My whole thing when writing this was to make it as user friendly as possible
Too many overloaded methods imo
magmaman was joking about making the eco service use a blockchain but in reality a transaction ledger is one of the most robust and reliable methods of maintaining an eco database
Considering database implementation, it'd be cool to do what luckperms did and make a web ui
For auditing more so than anything else
I feel like in game UI's would be enough but it'd be a cool "perk" if you will
the new dialog ui shit would probably fit the bill pretty nicely
Forgot about all that, still have to get around with messing with it
i'll eventually get to it as well, but currently i'm in the process of mustering my courage to peek at all my nms projects to see how much of them has exploded since 1.21.4
definitely will be useful for many things
Oh you'll only need therapy before and after
we'll see 🤡
5 yr minimum for sure
it's been fairly steady cruising recently but the item component update was a bit rough
hopefully paper devs haven't completely overhauled userdev again
I thought that was their specialty kek
Man I love talking shit about paper
Hmm I'm wondering if I shouldn't do 2 transaction objects, one for accounts and one for the bank, account transaction would hold the modification details where as the bank transaction would hold references to the account, type, description, etc
public variables bruh
and string hashes? bruh
how can i fetch one of those x,y,z
im confused
i assume that this is Map<String, List<Integer>>
or List<List<Integer>>
List<Map<String, Object>>
I think there's a getMapList() if I'm remembering correctly?
it's not a public variable numbnuts
I always put my class listeners in an inner public static class to the class it's made for
The Map key is generic too but it's always a string afaik
Value could be anything
In the case above they would be Integers, but you never know. User could enter shit data
smh this man doesn't even know how to write static classes for event listeners inside of other classes
he has yet to master the forbidden jutsu
i guess this is more reasonable what do you think ? @worldly ingot
That's up to you. In that case it's a List<List<Object>>
i mean List<List<Integer>>
oh shit nvidia is the first to the 4 trillion evaluation
Yeah, but again, any type. So <?>
ok i understand
man this thing is going to crash hard
I personally prefer the explicit nature of x/y/z keys, but the way you format it is preference
The - [] is probably easier to format for end users
yes
I hate how I have to use it
sometimes I regret not just doing json
but then I remember that I also hate json
and all is right with the world
is anyone else feeling like ai has kinda stagnated for dev work
I feel like there hasn't really been any meaningful update since sonnet 3.7 in february
and that's just when they started doing reasoning models
idk i still use gpt-4.1 mini or deepseek r1 for most of my coding assistant things and they perform well enough
