#help-development
1 messages · Page 1282 of 1
maybe
Does anyone have any suggestions on how to implement a bot system to give the impression that the server is full? Having more bots according to the number of players so that the bots can be communicative, have actions, etc.
are you trying to develop a plugin to do this or are you asking if there's an existing solution for it
because either way the answer is that it's futile
instead of trying to fake a community, what you can do is try and create a story-based server where players have to interact with NPCs
that way it doesn't feel that empty

even if you try to commercialize it they don't bring in enough to make a living
and there is competition in the market
I already do this but even so, for example, I get 40 players in the opening and I feel that 40 don't enter because there aren't enough players.
if you don't try then you'll never know whether it is actually viable
it most likely is, you just have to find the niche where players feel like they belong
I'm speaking from experience buddy
a lot of $$ is needed
making a spoofer also needs a bunch of money
a lot of money for what, the most money you'll need when you start is to host the server
the rest you can make-do by sacrificing your time
I already have my own community and I have over 1000 members on discord. I've tried to engage with a well-made trailer etc but I still got the same number of players that I usually get 40, and a lot of people don't play because 40 is not enough
not if I do it myself
it isn't about the amount of players, it is about the experience
Yeah good luck with that
40 concurrent players is a lot if there's a tight community around it
I get 40 on openings but 20 is what I get every day
Spoofers get pretty complex specially if you're running a proxied network and/or want the fake players to actually chat
hence why I said they're not worth it
players won't feel compelled by number going up, they'll feel compelled when they have more actual people to interact with
the proxy part is the easiest. the hard part is the other part you said, they chatting etc
they go pvp too
ultimately, it is up to you. My take on it is that it is wasted effort
building a community takes a lot of time, so you'll just have to bear that in mind
this usually just means your server isn't that engaging
eh, that's more than most people get on an opening
I got like 5 players on my first few servers lol, and they just stuck around because I gave them items
There are no players because it is expensive to invest in media
investing in media is a form of attracting people, but making them part of the community takes a whole different skillset
No, I just mean players don't stay on the server. Nothing to do with media
a good product advertises itself
I always hated that quote, because it is hardly true and even more so for minecraft servers were a few big servers have the monopoly on players
What is the premise of the server and what sets it apart from other servers?
a good product doesn't necessarily advertise itself, otherwise the whole marketing career would be pointless
There are millions of players who aren't playing these servers and are sparsely spread across other servers. I don't think it's a moot point
anyways my point being- players will stay on your server if it is fun and engaging
If you aren't retaining players it simply means your server isn't engaging
And bots won't help keeping people online
and the biggest issue is, even if you make it engaging, then you have to figure out how to commercialize it if that's your end goal
so yeah, hard problems to think about
Yeah only thing bots will do is maybe get more people to join initially, but doesn't help retention
For figuring out if its engaging, you can ask your friends or other people to playtest
bots can hurt retention by making the community feel dead
dead internet theory becoming more real by the second
Let them give you constructive feedback to improve.
One mistake I made is seeing my own project through pink glasses, thinking its perfect, but I was just too blinded but what I wanted it to be without it actually being it
In fact, they keep playing. We had 35 players at the opening and we keep 20+ every day. Some players who stopped playing were precisely due to lack of players and many people did not enter the opening because they wanted more than 40 players.
our server is raiding and pvp, but we have such a high retention rate because it has new systems and really captivating systems. what i really need is visibility on social platforms
I just asked a clan for feedback on the server and they really thought the server was amazing and said they were playing alone because their clan stopped playing and those same clans who stopped playing said the server was really good but stopped playing because they thought the server would get more players and those players didn't even play Minecraft anymore.
Ah that makes sense , factions type stuff is a hard market to get into
adjust the goals a little, implement some smoother movement/attack skill libraries, and it'll get you pretty far
It's like factions but an even more niche niche
Is there any room for pve content?
but this is software to put server side?
yes
the issue with factions is that it is a gamemode that inherently needs a lot of players, so you ca't really do much if you don't have a lot of players from the get-go
a server is just another computer
has pve and quests system
it's not a plugin, if that's what you're asking
you'll need a box with some python and other libraries installed
mine is rust
and an api key to your llm provider of choice
rust is better than factions in this aspect
that is just factions with a theme, I've never played rust without friends lol
no, because factions you normally invade when there are players from the enemy faction online because when they are online they have valuable things in the base. in rust no
and in rust there is pve. in factions there is no
well, whatever it is that your server does, if it has a pve aspect but as per feedback, players just want to do normal factions-like activities, it could very well be that the PvE aspect of the server isn't as well-developed
then again, as someone said before, factions is a hard market to get into because even if you have a well-developed PvE ecosystem, most seasoned players just want to play factions without changing the rules they already know, so you do have to find a balance there
the problem with gamemodes like factions and skyblock is the lack of originality imo
SaberFactions and SSB2 came out and it was a no-brainer to use them
It went from "who can make the best plugin" to "who can optimize it best"
I don't really like gamemodes where I have to actively interact with players so I cannot say honestly, I've briefly played factions before and didn't like it
Skyblock I did play HP's because of course, everyone played HP's skyblock
I got addicted to it for a good while, but stopped at some point and went back to bedwars where I belong
you didn't like facitons because you had to play with players but you like bedwars? lmao
bedwars literally you can only play if you have players
I never party with anyone, I only play duos with whoever HP feels like placing me with
that's usually some newb, but it doesn't matter. If I can't carry them through the whole session then it's a skill issue
how do you make sure the npc (citizens) stays there? and not spawn another one on reload?
i mean i got npc information in config so i need to spawn them but i dont wanna spawn an npc 2 times
Ah thats bitter :/ But I think bots still won't help, like illusion said it will most likely have a negative impact
rather than trying to make them appear as players, how about embracing the npc aspect; if they can chat and do pvp and execute simple tasks, i probably wouldn't mind recruiting some into my faction
add the Spawned trait to them
what does it dooo
declaration: package: net.citizensnpcs.api.trait.trait, class: Spawned
then toss some extra game mechanics at them, like having to provide them with quarters and resources or something and you get uh
what's what mod with the self-building npc villages
millionaire or something
that but factions, that ought to be new and niche
alternatively, hire 40 third world country children with robux to play on your server
this is probably easier and cheaper
uhm...
actually whenever i enable my plugin i probably should spawn them again cause
the config changes
so should i just remove them at onDisable or what
you should create a trait for that instead
I recommend reading the wiki about it
more specifically the persistence API part
Millenaire
npc:
- name: "Kowal"
world: "world"
x: 0
y: 70
z: 0
pitch: 0 #optional
yaw: 0 #optional
this is the yml
idk if you understand
but there is a list of them
i dont really imagine how that would work
that kind of thing is already saved on Citizens's storage if you add the Spawned trait to it
no need to save it yourself
I am unsure whether Citizens has a way to configure your own storage for NPCs, that way you don't have to reinvent the wheel
you could make your own Spawned trait which essentially saves to a custom DataKey instead of Citizens's default one
try asking in their discord, maybe they'll know better how to handle that kind of thing
oki doki
2025-06-09 19:33:52 49923 [Warning] Aborted connection 49923 to db: 'unconnected' user: 'unauthenticated' host: 'connecting host' (Out of memory.)
i think i fd up something
out of mem, smells like a memory leak
why do these servers have lgbtqia flags
221/4096mb used
because they support the movement, that's all
or im dumb and it doesnt work like that
out of mem doesn't necessarily mean it is out of total memory, but rather that it can't allocate more than what it was allowed to use
ah
i think i know what could be the problem
i use self hosted pterodactyl panel and to restart servers i use restart button
could it be it and the db connection doesnt get shutdown?
even tho its in ondisable?
not sure honestly, I don't even know what you're using for db connections
hikari mariadb driver
I was hoping to make a plugin work with both spigot and bungee. I found I could use submodules, but I found very little content online about how to do so. I was hoping someone could help me a bit to do this with gradle
because it's pride month again and the agents of SATAN are coming out of their hiding
it should be fairly straightforward if you follow gradle documentation on multiple-project configurations (they call modules projects for whatever reason)
this can also be caused by e.g. trying to allocate an overly-large string/array
Alright thank you I will check it out!
i mean it has worked and now it started showing these errors
they dont showup for ~10h after restarting db
coolll
a bit misleading thoguht
I do recommend not asking that question in these discords directly since that'll probably just get you a punishment
a lot of trolls often come and attack servers with the logo so even if it is a genuine question, it might come off just another troll attempting to well, do what they want to do
im not gonna point a finger to the person that created that connector BUT that person created shutdown method where there is lets say 100 connections he creates new connection and closes that connection and done server is down and we left with 100 connections
thats where the mem leak appears
i hope so
it could just be you forgetting to close connections tbh
make sure to use a try with resources for all database connections
let the hikaricp pool handle the rest
yeah
thats what i did now
didnt think of that at first because as I said I didnt even know how it worked because it wasnt me who created it
uhmm i just asked dont ban me
😨
well, I said in those discords, not this one lol. As long as it is genuine it should be okay anyway
how do you guys handle configurations of the plugins?
do you generally create a class/interface which will be populated with the elements the program might need to read, or do you instead make interface/class for plugin and a factory class for it which will be populated with configuration values via factory method?
@NullMarked
public interface Configuration {
interface Messages {
Component registered();
Component unregistered();
Component fail();
Component success();
Component unavailable();
}
Messages messages();
}
vs
public interface Plugin {
// methods
static Plugin load() {
// load plugin implementation from plugin's "config.yml" and dont expose config values
}
}
i feel like hiding configuration is cleaner as Plugin wouldn't need to expose values that might be needed in the plugin's object instances
Idk I just use configurate lol
this looks awful though
i can't imagine every message being its own method
Just make it a constant
I would either go an enum or a record for each message
Also this is random but I just found out enums can implement interfaces yesterday lmao
yeah, it's pretty handy
you can have enum constants which override methods, and that makes it rather powerful
Yeah
why bother with constants when you can just not expose those fields in a first case
just inject those components through constructor inside plugin factory when loading from config file
it even reflects reloading the plugin which is done via command
it isn't about exposing the fields, but maintaining a standard in place
it is immediately clear what I am trying to do for anyone when I do Messages.SUCCESS.send(player, context)
and then I can just go to Messages class and inspect the message keys
but you will only use the message once or maybe twice. also enums are kinda global, dependency injection through constructor allows you to swap text components
why would I want to swap them, messages should be set in stone the moment I start the server
localization based on player
if i need to send the player an arbitrary message i'll accept an arbitrary message as a parameter, possibly with type information about the formatting parameters required
code-wise I mean, you still should be able to change the message on a configuration
otherwise, DI for messages is just completely overkill
the player-based localization should be encapsulated in the Message object and resolved when send is called
no point passing around different message instances for that
Or you can handle that in a packet listener
Might be better in some cases
Alternatively use a resource pack and just use actual translations
will be cleaner in the message class since you can make more informed assumptions about what's going on
resource packs for localization sounds like ugh
I mean if you already have one it’s not bad
myeah that's fair on both sides; i wouldn't set one up for translations, but if i already required one, it'd be the ideal way of going about translations
supposing you have a pipeline in place to make sure your players always get the newest version of the pack and aren't missing any localization keys...
You can do fallbacks
I mean, you should be always versioning that type of stuff so you know what players are receiving
i just recently started to follow YAGNI a lot. If your plugin needs to setup commands, why expose all those manager, localization classes inside plugin interface when you can just expose command instances which the glue code factories will use to hook it up to bukkit
that sounds like extremism
a bukkit plugin is a simple enough system that you can just repeat yourself enough times about this kind of stuff
it all depends on how integrated you want it to be, you could get away by making a global system by using things like service loaders and what not but it ends up complicating the pipeline for no reason if you aren't working with multiple people
my goal is to always make a plugin behave as expected, regardless of what design philosophies I might impose in my code
users will expect messages to be in a locale file inside the plugin data folder, so that's what I do
Nah I make sure my plugins behave wildly
Oh sory hah..
move the locale file each time the server starts to a different location
HideAndSeekLocale the plugin
Now we’re talking
i feel like the more your code resembles black box functionality the better since then you have strong type checking in place and more info embedded into types
I was going to follow up with this but I ended up getting distracted:
Now, whatever design philosophies I might impose on my source, that's up to me and it all depends on how much I want to pat myself on the head for the complexity I've developed, because if I actually wanted to be productive I wouldn't even think about it any more than just creating the locale file
instead of generalizing functionality into low level managers you should make it as high level as possible and then move to managers if you really need it for polymorphism (for example for api's)
I feel like you probably should get a job at a company using Jakarta EE
you'll get tired of the mental gymnastics people do with code around enterprise software
plugins simply don't require that much thought on them
what is the recommended max pool size for db connections?
10000000000000000000000000000000
are you asking for your connection pool or how many you allow in the db in general
If you're syncing player inventories into a db every time a item is added / removed then its gna be higher than whena player joins / leaves
for the db, you allow as many as your resources allow
for the connection pool, as Emily stated it depends
everything is stored in cache until player leaves the server completely
redis ofc
So you're syncing inventories?
Then what's the usecase?
god damn, log4shell was 3 and a half years ago
it feels like it was yesterday
why do i keep doing this to myself
is this the connection pool for a single plugin or the whole server
it will be saving skyblock island data and other plugins like friends plugin on proxy, saving player data like if they left with with vanish, flymode, etc
single plugin
then just play around with the value, start at 10 or something and see how that scales
idk its not really made rn, uhh like its members, coops, location, id
and what is the default?
Not sure tbh
it depends™
do you think you'll have more than 10 concurrent connections at a time? If so, up it
by concurrent I mean connections that haven't been returned to the pool once their query was executed
try to visualize a concurrent situation and roughly guess how many connections it might need based on the server population and the usage of the function
blindly guessing it just doesnt work
10
xD
got damn
More threads = more fast, so this seems accurate
"Not enough connections"? I don't know why all these DBAs exist when you can just crank the number of connections in the pool.
Lol
Is there any way to adjust the activation or tracking range of an individual mob?
probably
any idead why suddendly minestom server starts to throw this error:
Exception in thread "main" java.lang.RuntimeException: java.lang.StringIndexOutOfBoundsException: Index -1 out of bounds for length 0
at net.minestom.server.registry.DynamicRegistryImpl.loadStaticSnbtRegistry(DynamicRegistryImpl.java:247)
at net.minestom.server.registry.DynamicRegistry.create(DynamicRegistry.java:108)
at net.minestom.server.item.enchant.Enchantment.createDefaultRegistry(Enchantment.java:33)
at net.minestom.server.ServerProcessImpl.<init>(ServerProcessImpl.java:123)
at net.minestom.server.MinecraftServer.updateProcess(MinecraftServer.java:84)
at net.minestom.server.MinecraftServer.init(MinecraftServer.java:78)
at lt.breakout.gateway.Server.main(Server.java:22)
Caused by: java.lang.StringIndexOutOfBoundsException: Index -1 out of bounds for length 0
... 6 more
whilst trying to run the server?
i dont get it stack trace, traces it back to MinecraftServer.init()
https://paste.md-5.net/umilubuxuz.cs
i need help
With?
so im trying to make the axe throable with a right click but when i do it, its just stuck in the air
and not moving either
What's the new cool nbt lib people use for standalone projects nowadays?
querz/nbt is giving me validation errors on valid nbt I cba making abandonware work
NBT-API doesn't have a standalone version afaik
and making my own takes so much effort to make and maintain
adventure-nbt i suppose
Does it do SNBT parsing?
sure
idk
fuck it we try
got nothing to lose
oh then you totally got nothing to lose
like, what is 5 minutes anyway
round it up to the nearest 60 minutes
I've been here for 6 hours already :)
goal is to serve husksync data over a rest api
woa
except instead of just serving raw json / snbt
I'm decoding the item components, rendering it as html with adventure-webui
and then serving them :)
along with a bunch of player data
TagStringIO is a horrible name for a compund parser btw
no intellisense when I do StringIO or TagIO
i can only assume it works given it was updated for the 1.21....5? .4? snbt changes
we're running it all in .4
so who cares
also found it absolutely comical that husksync's dumping thing is called Toilet
lol
I’m going to call all my memory dumps toilet dumps
I love writing stubs
yay adventure-nbt works
Any standalone itemstack apis :3
please don't make me write a datacomponent system
alright boys I'm writing a datacomponent system
Does mojang still use json for serializing item names or is it snbt now 🤔
this only took 7 hours
@slender elbow you lied this doesn't handle some empty tags properly
it has code for it
for some reason it no worky?
I managed to get it to read a negative index
ah it shits the bed with byte arrays
I'll just make it save items in snbt makes it easier to serve too
it still shits the bed
Extracting the radix when it's the entirety of the builder makes the builder empty
fetching the last char causes and IOOBE
and it's a regular ass snbt string nothing crazy
The only nbt parser that has reliably worked is the nbt linter I use
I think it's because it's detecting "0b" as the beginning of a binary string instead of it just the byte 0
yup that's it
how do i make density 3 the max you can get from an etable
✨ datapacks ✨
nevermind, I don't know if you can limit it there
You can change the enchant level in EnchantItemEvent
not sure what to do with it showing the value tho
What datapacks?
is there an easy way to make players look like other mobs? including their vision and interactions?
actually screw the interaction.. I just want a player to look like a zombie
Vision as in like spectator mode?
You can try using libsdisguises
But for the spectator vision, it’s kind of hard to implement from what I remember
You have to send a fake death packet and spawn a fake entity
all good then it's not needed
its only for one video so I don't want anything that needs too much work
any gradle users here? how can i restructure zipped distribution directories using distribution plugin (which bundled with application plugin) in gradle?
i want bin/ folder to be at the root directory of zipped distribution file
Is uuid and ip the only possible way at all to identify a player? Verifying it’s actually you
What’s a good way to verify it’s you without needing to fill in a password? Currently I’m making sure uuid = name
Some ip seems to be dynamic, therefor that can’t be the reliable way
You can't
Cuz people can just spoof your name and join your server to have admin perms. With bungeecord
So I’m making sure the admins name matches their real uuid
They can spoof uuid, or name. One of them can be swapped and that lets someone join bungeecord subserver to have staff perms
they can't spoof uuid as thats verified by Mojang
Yes they can lol. Bungeecord subservers are set to offline mode
then you have failed to setup your servers
location approximation.
backend servers should have no direct link to the outside
and yes, this is true, your Bungeecord subservers are all validated through the proxy.
You aren’t understanding. Someone can create their own proxy then use your servers ip:port to the backend, this lets them have their own bungeecord setup yet be on your server. Thus allowing them to have offline mode to spoof their uuid as a staff member
Your servers shoudl not be accessible via an ip:port
Which is why you use Bungeeguard or only allow your Bungee to connect
you have failed to correctly configure your servers
This will still be the case if someone spoofs their own proxy
It’s possible to any server, unless their server ip is masked by some thing like tcpshield, or using bungeeguard
Ok then what would you do to prevent that?
Firewalls exist
or you just have everything on the same machine and don't expose the servers in the first place
You aren’t understanding. You can use bungeecord and join the bungeecord ip, that lets you join a subserver
Your servers shoudl only be accessible vcia your proxy. ie all on localhost ports
I’m using 0.0.0.0 ip on my subserver
What exactly aren't we understanding
127.0.0.1 is localhost
My bad I am using that
then its impossible to directly connect to any of yoru subservers
Bungeeguard got a data breach leaking servers tokens, this allowed someone to do it to my server
impossible. localhost is not externally routed
it is physically impossible to connect to a localhost without going through a proxy
Bungeeguard did have an exploit that has been fixed
but if you only let localhost through that wouldn't be a problem
?paste your proxy config
yes, thats how they got through. i didnt see the patch until a day ago
servers use bungeeguard to prevent this hack
but they had a data breach leaking everyones tokens
well whatever it is it worked for hackers lol
you should prevent your backend servers from being exposed to the internet
There is no need for them to be
how so? i have it on that ip in my bungee config you see
Get all traffic through the proxy
by using a firewall
^^
i am
It's not setup correctly
get new tokens for bungeeguard
if people can connect without the proxy
if someone can join on the backend , your firewall is somehow not correctly configured
your bungee config is fine, but are your server setyups?
they also have to bind to 127
so this is where its incorrect?
put 127.0.0.1 their
or localhost
if you proxy is on the same server as your bungee
easier to memorize
else it binds to default
ok ill give it a try next restart. but anyways, still thinking of a plugin to put on the subserver that would prevent someones name using your uuid
its really not needed
you can do that but if your server is bound on localhost is 100% fixed
good to have in case, cuz for example I had bungeeguard working for 10 years but all of a sudden it had this exploit
thats because your backend servers are binding to all available ips
thats why in the first place you should never expose the backends to public
this is unsafe unless you use VPN with database even in that case thats sketchy
with the current setup im not able to add the ip+port to my minecraft list, because i didnt input any ip in the properties
so yes it is already localhost
right now you need bungee to join it, so thats how the hackers do it... they just launch their own bungee and put your backend ip in their config - exactly how we setup our own bungee
If the firewall is configured and the server is only bound to localhost
The only way they could setup their own bungeecord would be to do it on your machine
and then expose that
in which case you already have a way worse situation at hand
yoru servers have no IP and I'm sure that is the same as 0.0.0.0 so bind to all available IPs
they will listen to anything on the correct port
specify 127.0.0.1 or localhost an ONLY your bungee will be able to passthrough
well all i know is i am not able to add my bungee ip+subserver port to my minecraft server list, and yes they are on the same host, someone managed to still join the backend
thats so stupid, in that case they wouldnt need their own bungee, they would just direct connect using the ip and port lol
Your understanding of the whole point of a proxy is completely backwards
ik, minecraft needs to design a different proxy auth
uhh no, im saying ur point is stupid
im saying thats not factual
the whole premise of a proxy is to have a single entrypoint, with no way around it, to facilitate a connection.
correct you can not add a subserver on teh main IP as you shoudl never have a dirrect connection to a server.
No one outside of the closed system should be able to even maintain a connection to your subservers, let alone create their own bungee???
if you could your servers are directly accessible and vulnerable, as you have found
right, i tried to add it and it didnt let me connect to my backend server by using the public ip and its port. so that is setup right
What happened when you did
just bind to the correct localhost and you will not have issues
i dont think bungeecord, or any proxy software for that matter, would get so far, if it had such a blatant vulnerability.
I'm sure if you pay a few million they will let you
unless bungeeguard is preventing the backend server from showing up on the server list. seems like it already is localhost when not assigning it a ip
just use velocity and velocity forwarding and don't worry about it
its not localhost if you did not specify an ip
no IP = bind to all available interfaces
including localhost
Starting Minecraft server on *:25565 it says that when i start it
ok will try to change it
thats strange tho since it wont let me add my backend server to the minecraft server list tho
that would be bungeeguard
Bungeeguard still lets you add it to the server list
it does?
You just won't be able to connect iirc
I've never used bungeeguard so do not know
I guess it could be blocking the ping as well
it wont let me ping it, ye
You can remove Bungeeguard and make sure it won't let you ping without it
and then add it back
however, just fix your backend server bindings to localhost and your issue is done
but as you see, just never know.. therefor to be safe I figured id ask a smart way to make sure even if someone did manage to spoof your uuid to their name that they couldnt become you. i figure just use a command to link your real name to your real uuid then if anyone elses name uses that uuid it kicks
raaaah velocity
That fix won't help
existing problem, existing solution
Velocity just has Bungeeguard like solution builtin
it does, but it's implemented more reliably
you're still "supposed" to put the backend behind a firewall/tunnel so it's not exposed to the internet at all, but that's tinfoil-hattery; just the velocity key is sufficient
if you can and know how to set up a firewall or a private network by all means do so but it's not strictly necessary
feel like bungeecord should come with that feature like velocity does. silly it would ever be a possibility for someone to do this exploit. and thats something that has gone on for a decade. and sure i can go into detail setting up the proxy to use localhost, but im sure the majority dont.
🤦♂️ its not an exploit man
alright well, you know what i mean. a capability
Its literally in the instalation guide for bungee
Most don;t seem to read the post instal section though
thats if its on the same machine. 🤷♀️ oh well. thanks. i input localhost as the ip in the properties
you can use any ip big brain
which is extremely common since for example a minecraft host would require you to use a public ip for each
securing bungee on shared hosting is ass
If you're dealing with shared hosts, yeah that will suck
yeah needs a firewall to be secure really
depends how their network is handled though. If they're on the same subnet adding the ip will work, if not you're gonna have to ask their support or get a dedi
suppose im glad im not using shared. but uhh, yikes its scary this is such a feature you can do backend joining anyones server thats on a minecraft host
Anyone can enter your home if you leave the door open
i will enter your home even if you lock it
Idk what the original conversation was. But if it's about the players being able to join directly to the server thats because it's just a proxy forwarding all the packets to other servers. So the end server has no way to distinguish between what is a forwarded packet and what isn't
thats why online mode has to be disabled too, otherwise auth will fail since the source and destination ip's don't match
The ideal setup is that you only whitelist your proxy server and block all other traffic
Either with a software or with a hardware firewall
Hello there, is there a way to add end dimension sky and effects to overworld in mc 1.21 ?
i think it's bound to world type
you can send a respawn packet with a different dimension type and it'll work
people have said that you can also change it with a custom biome but I doubt anyone wants to deal with that
oh wow, it's this easy
Oh?
Anyone know how to remove the permission of writing in the chat i using EssentialsXChat & LuckPerm
i don't think essxchat has a permission for chatting altogether
you'd need to ask essentials support
do you have any other chat plugins ?
There’s essentials.chat.local for local chat
But idk if that applies if you don’t have local chat configured
i mean, you can also just mute them, lol
I want at the first connection they cant talk need to do the little intro receive rank and then talk
Why does "world#locateNearestStructure" (with unexplored tag false) not always return the nearest structure? I am using Structure.FORTRESS, and I am plugging in my location to the location of the fortress (the locations that locateNearestStructure returns) into these distance squared:
Dist A: 619139.8055829474 | Dist B: 1522.0620079845075
but for some reason it returns location A
I’ve messed with that bit of api before and was never able to get solid results
Is there any easier way to actually find the closest nether fortress to the player?
Not without your own searching algo I don’t think, it’s sorta like the conversations API… it works but just barley
I have the code doing distance Integer.MAX_INT, but also explored flag set to false
I thought it would just do like, "explore the entire nether, and return the closest fortress to the player, regardless of whether it has been explored or not yet"
It believe it starts at the location provided and does a spiral search
And just returns the first valid one it finds
It should work the same as the locate command
stash shows it just calling a nms method to find it
Hi, I'm trying to make some generation world using terrain control into making only one biome on the world map. Is there somebody who knows the plugin ?
TerrainControl is pretty old, OpenTerrainGenerator is the more updated version
However if you just want a single vanilla biome you can use the api
Assuming you are in a somewhat recent version
the locate command also returns the far one which shows "797 blocks away" and then I move one block closer to the close fortress and it jumps to "19 blocks away"
It's not the case, it's why I use this plugin :/
I'm in 1.8
Doesn’t vanilla have single biome worlds
It does
Granted idk if that existed in 1.8
But is there cases to do it in 1.8 ?
Oh my bad
Ok thanks
typical Mojank
idk, that sounds like some seed changing stuff or having the closest structure being generated in an old version
@EventHandler
public void onNPCRightClick(NPCRightClickEvent event ){
if (event.getNPC() == null || !event.getNPC().hasTrait(BlacksmithTrait.class)) return;
//doSomething
}
// Create an NPC
NPCRegistry registry = CitizensAPI.getNPCRegistry();
NPC npc = registry.createNPC(EntityType.PLAYER, "Steve");
npc.addTrait(BlacksmithTrait.class);
npc.spawn(new Location(Bukkit.getWorld("world"), 100, 80, 100,90,90));
does anyone know why it doesnt work ?
like what even is that
[19:09:45] [Craft Scheduler Thread - 2/ERROR]: Got an error with a html body connecting to https://api.minecraftservices.com/minecraft/profile/lookup/bulk/byname: <html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>Microsoft-Azure-Application-Gateway/v2</center>
</body>
</html>
i dont understand anything
profile api likes to fail at times
can't say I've ever had it do that to me personally but I've seen a bunch of reports of 403s
what exacly does that mean ??
403 means forbidden
in this case it just didn't want to process your request
The api call that was ran was the server looking up the uuid, skin information etc
from the name
[Citizens] Cannot register a null trait. Was it registered properly?
as far as I know there's not much you can do about it
yeah that's something else
Was it registered properly?
oh.. how do you do that
Citizens has an extensive API for working with NPCs. Make sure you always are using an up-to-date build of the CitizensAPI to ensure that your plugin works with the latest release of Citizens.
Hello, I need help. I have already asked LuckPerms support but they couldn't help me either because I have set everything up correctly. Unfortunately, the ranks are not displayed correctly in the TAP list and they said I have to change something, but I have no idea about it. Can someone please help me.
that was NOT something else
that was the problem
now it works
Hi, its possible to show ∞ while effect applied? I got this:
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE,0,true, true, true ));
But it still showing duration. I know thats basically infinite, but its small detail for me if its possible to show the infinite symbol.
Use the infinite constant instead of max value
declaration: package: org.bukkit.potion, class: PotionEffect
Im blind lol, didnt notice that. thanks!
idk, i registered the class in onEnable and it works now
i mean
event.getNPC().hasTrait(BlacksmithTrait.class)
this was the problem
i guess
not registered BlacksmithTrait
Hello, let me ask this directly, is there a way to setAcceleration to a fireball through the API in pre-1.21 era?
Yeah I think it was direction before. Fireballs fucking suck
uhm.. okay but when i realodad, it says it couldnt load the "trait" for npc id: somenumber, and i get this message agsin. when i spawn new npcs it works, after reload not
yes yes
hm not sure what would cause that
does it happen during a restart?
or just when you reload
i can check
Thanks to you both. So if I set the direction to a normalized vector multiplied by some scalar it will apply the direction and acceleration, acting as the fireball motion mover XYZ?
it doenst work on stop
But I do remember that setDirection used to use gaussian algorithm which made the thing unpredictable, I think that changed using the setDirection?
Hey, if I am using SignedVelocity and on the backend I got a plugin listener on AsyncPlayerChatEvent, is that why SignedVelocity cannot cancel the message?
Do you know of a technique that involves creating a vehicle with realistic movement, a real rotation of the vehicle and not just eye tracking, like the vehicle's mod?
The boat on land seems like a good solution, but it's too slow, and I don't see how to make it faster, or is there a plugin that exists?
listen to the vehicle control packets/user input for key presses of A and D and make the vehicle behave accordingly
if it's a car just pressing the buttons won't make it rotate, you also need to move backward or forward
if it's a tank with tracks or some shit then it might rotate in place
This is not exactly my question, I am looking for a way to create an alternative to the center of gravity of an object, here a vehicle to be able to create a realistic rotate system
intersect the vehicle mesh with the terrain and apply force vectors perpendicular to the intersecting terrain geometry at the positions of intersection, then convert those forces to a rotation around the center of mass
easier said than done unfortunately 🥺
is there a particular part of it that you're having trouble with
to code all this in general, yes, the management of vectors, and the velocity can easily cause rollbacks and visual bugs
I need to make mob spawners work regardless of light level. Is there any way to do this?
otherwise, I like the movements of the boats, like increasing their speed on the ground
why not use modelengine
it had a mount controller
i don't remember if it has rigid body physics
great
my computer just tried to melt down to a puddle
ran so hot it bricked itself
Hmm
To create a realistic rotating système ?
Hey there
Ive been working on setting up a server, and i want my alt to be able to join and leave without messages, as well as vanish on join. however, another mystery plugin seems to be overriding my essentials permissions for this, and my custom plugin for this.
My question is, is there some kind of debug i can run that is deeper than essentials debug mode and server logs so that i can see what is sending join and leave messages when i have silent join and leave permimssions, or is there a way to override whatever is sending them and cancel the messages anyway.
Cheers
Its a massive plugin list so i cant really remove them all and test them 1 by 1
Since you asked about overriding, you would just need to set your own EventHandler to have ther highest priority, do what you need, or nothing, and then cancel the event.
?paste
Your question seems #help-server related, so I'm trying to see how it might fit here, in the case that it was intentional.
There's a really cursed way to debug it
development of a plugin to override?
and a couple less cursed ways
i tried this but it didnt work
https://paste.md-5.net/qavucanuje.java
This is #help-development So I imagined thats what u were asking
because u didnt explicitly state anything development wise.
mb
lol not really either.
im interested
You could do this from an admin perspective, and not a development perspective.
A plugin like "invsee" wouldnt do it.
Cursed way #1: instrumentation
im interested in anything that helps
Use something like Bytebuddy to make an interceptor that detects setWhatever calls on that given event class
drawbacks: it's incredibly cursed
Cursed way #2: extend the pluginManager, override callEvent, do your filtering and call a modified version of the event
pros: it's less hacky than instrumentation
cons: not by much and it's more convoluted to write
Cursed way #3: Create that same modified version of the event, but call it yourself, assume plugins will handle it
pros: less jank
cons: you might need to use fake players otherwise a lot can break
Rule out what could not be possibly doing it.
Then, copy the join message, and try to do a grep search for your plugins folder, in the hopes the join message is a message.yml string literal. For example, an unknown plugin might send:
Howdy <player> welcome to...
Just do a grep search for :
grep -rP --include="*.yml" "Howdy\s+.+?\s+welcome to\.\.\." .
This is like the easiest method.
If a plugin is giving you a join message, that plugin probably has a config
This is lowkey how I've debugged any case where an unknown plugin is doing something.
it gives me my rank prefix, followed by the default "player" left the game
its not a unique join or leave message
i cant do a grep search, its on a server panel and i dont have access to command line 😦
i was kind of hoping there was something i could do to see whats interacting with playerjoinevent
but thats probably not possible
Well this would do that
"that given class" would be the event
You can print out the handlerlist and manually check out the code
doing it with bytebuddy gives you fine control (ie run this method every time setWhatever is called)
You can then print out the stacktrace to figure out what plugin did it
You will have to fight with classloaders tho
thx for help guys, i just translated and installed a random polish plugin and that seemed to override whatever was happening lol
How can I get the value and the discount? I basically need the 9 and the 3
I assume the value comes from checking the item's amount, but how do I get the discount?
There is a TradeOffer class?
I think?
yeah these discounts are tied to the player not the villager?
There is MerchantRecipe, but it doesnt take an instance to a player meaning you cant get the per player discount
I'm not sure. I only cured the villager
get the Merchant/MerchantRecipe from the view
villager.getRecipe(0) already returns the MerchantRecipe
nope
💀
What happened to my brain
huh?
isnt it -3?
no
bruh i don't know how to read
xDDD
Yes it's the fuck that specific one, I agree
Do you know if there’s any way to get this discount without trading, or how to get the data that leads to giving that discount to the player? It’s to replicate the villager a long time later
Do you have the excuse that you haven’t slept yet? xD
I am the excuse
lmao
no you can't
you have to be in a trade
I guess I can try to replicate this (fabric mapping)
If it gives you a discount, it must be based on something
There's a function for making a villager shake his head?????
I need this for real life
The order of the factors does not affect the product
How i can create ItemDisplay for specific Player? (With ProtocolLib cuz idk)
you don't need to use protocollib
Use https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Entity.html#setVisibleByDefault(boolean)
declaration: package: org.bukkit.entity, interface: Entity
Thanks
me and my homies dont like protocol lib
how to trigger left click in player interact event while spectating?
it seems in newer versions this isn't triggered
?xy ?
okay, is there some other way to simulate a left click?
while spectating?
playerinteract event works while facing a block
huh?
"simulate left click"
Do you mean force player to spectate something ?
I don't understand what you're trying to accomplish by "simulating left click"
Or even what it means
actually let me repharse it
if you are in GameMode SPECTATE and right click a player you are seeing through his eyes, what i want is on left click to open a spectator menu of my own
in older versions player interact event just worked
but now it doesn't trigger
investigate if a packet is ever sent I guess
if it's not then you're out of luck for newer versions ?
Could also just be spigot bug if the packet is sent
i could see the client just not sending an interact packet when spectating
actually this is interesting, I had a similar issue
on an older version even
there's an event for that, the PlayerAnimationEvent
interact is fired whenever a player swing packet is sent usually, yeah
there are other scenarios were the interact event is sent and whatever you're doing might be triggering a false negative
so what is the difference between the events?
the player interact event covers more interaction cases than the swing one
and you can't get the interacted element on the animation event, you'd have to raytrace
does arm swing only count for stuff like mining and the sorts? or does it trigger when they walk too 🤔
it triggers whenever the arm swing animation happens, that's pretty much on every interaction except maybe when you're looking at air with an item
do you mean tge view bobbing?
does the event trigger alongside the interact event?
yes, for the most part
depends what you define as swinging
but the arms move when players walk/run
^^
can be disabled even
weird to call it view bobbing?
that's what Minecraft calls it
are you referring to the 3rd person arm swinging? As in when you see a player walk and their arms swing? Because that's also purely client-sided as far as players go
because the whole view bobs
ok....doesn't bob when you have others looking
i have no idea what you're talking about then
obviously the arms swinging
you can see players arms swing whether it be your own or others?
the 3rd person swinging of both arms?
yeah, that's just the walking animation, doesn't count as arm swinging
the server is unaware of that
still weird to call it view bobbing, animation is more appropriate lol
these are two different things, view bobbing is the mild screen shake when you walk in 1st person and the 3rd person walking animation is just well, the walking animation
well you don't have to be in 3rd person, since you can observe other players have the animation. Anyways, you answered the question though
was just curious as to what counted as swinging lol
obviously
for yourself yes it does require the 3rd person camera view
not like you are going to be in 2nd person view
it's still 3rd person regardless
why not
I am going to play the game as if I am hearing it from the background
it is actually the hand that shakes, not the screen
I haven't had this feature enabled in forever so I forgot
I hate bobbing effects so I generally disable such things in all my games
yeah, bobbing effects and blurred FOVs are my enemy
don't know how people can play like that
ah, motion blur, hate that too especially when you need to pay attention to whats going on
nothing like, everything getting blurry and then suddenly dying to something on the ground because your vision was blurred unnecessarily XD
the Outlast experience
why do i feel like java beans are kinda awful concept
getter and setter for everything is abuse of oop
its basically separates logic from the data and smells like more procedural approach
sure it works but yuck
enterprise java is a mess
Hello. Is anyone else experiencing 403 error issues connecting to the Minecraft Login API? 403 Forbidden Microsoft-Azure-Application-Gateway/v2
it is just a standard to promote modularity and code resuability
not all standards are equal, but at minimum there must be a standard though
you know what promotes modularity and code reusability?
procedural programming
not necessarily and not exactly its primary purpose
enterprise java is something straight out of the horror movie
it barely resembles anything that modern java introduced since java 8
its like stuck in 2000s
not sure what you mean
EE builds upon SE
which means everything in SE is present in EE, just EE has more to it that is tailored to enterprise level stuff like web servers or distributed systems
maybe it's because it is
JavaBeans spec doesnt even comply with records
and it doesn't have to
not sure what records has to do with anything
i just hate javabeans as a concept
then don't use it?
im forced to
yes
not sure what you expected when taking a job as a java developer
🥲
if you wanna play with all the fancy new features modern java enterprise has to offer, go to a startup until it goes bankrupt the following year
and then go to a new one
and so forth
until you get lucky and find one that sticks around 🙂
and then when you are in one of the top corporate spot because you were one of the few to stick around, you can then be responsible for forcing old standards on everyone else 😉
and the cycle will repeat itself just with someone else
hello, sorry for the response after 5 days 😭, I tried to get the server and send data to it, still didnt receive it
i mean at core oop wasnt about objects, classes, encapsulation and yada yada all of that- it was about sending messages between objects
initially at least
and i dont think setters + getters is abuse- or I mean enlighten me why itd be that way :>
because you essentially separate data from behaviour
"i just don't like them, it constrains my design ideals" ahh moment
at this point just use structs from c
for some brave soul, this is the bungee side, sending the message, you could try to figure it out and stop my suffering 💀
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("VANISH");
out.writeUTF(vanish ? "on" : "off");
out.writeUTF(player.getName());
System.out.println("vanish message - " + player.getName());
player.getServer().sendData("staff:vanish", out.toByteArray());
}```
^ this actually does send, but the paper does NOT receive it:
```@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
//if (!channel.equals("aa:main")) return;
plugin.getLogger().log(Level.FINE, "fired onPluginMessageReceived event");
try (ByteArrayInputStream byteIn = new ByteArrayInputStream(message);
DataInputStream in = new DataInputStream(byteIn)) {
String subChannel = in.readUTF();
if (subChannel.equals("VANISH")) {
String action = in.readUTF();
String targetName = in.readUTF();
Player target = Bukkit.getPlayerExact(targetName);
if (target != null) {
boolean vanish = action.equalsIgnoreCase("on");
for (Player p : Bukkit.getOnlinePlayers()) {
if (vanish) {
p.hidePlayer(plugin, target);
} else {
p.showPlayer(plugin, target);
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}```
yea but object oriented code doesnt really deal with separation of data and behavior
principally that is
lso you basically cant encapsulate private behaviour within java beans classes because internals are being exposed to the public via getters
I don't see how this is true
theoretically yeah, but in traditional sense encapsulation is one of the principles of traditional oop
i mean yea assuming you're forced to only orient urself with the canonical pattern of a jbean
and how/where are you registering the channels
but thats rarely the case id argue for
even at larger corps
you are confusing data hiding with encapsulation
well you use getters and setters to manipulate the data on the container which makes it anemic in a sense that now your classes only define data and not behaviour just like normal classes do
you can use fields but at that point public getters exposing internal just defeats the whole purpose of instance methods to begin with
Spigot:
getServer().getMessenger().registerOutgoingPluginChannel(this, "staff:vanish");```
Bungee:
```getProxy().registerChannel("staff:vanish");```
encapsulation involves combining data (attributes or properties) and the methods (functions) that operate on that data into a single unit
that's the thing, java beans classes like 99% time does the operations outside the class
java bean follows OOP in the most strict sense of the definition
via the getters/setters
that makes it anemic in a way that breaks encapsulation of internals
dont get me wrong, thats for java beans- where ur data objects are just classes with a set fields and a getter+setter per field; however those ideas and principles are not by any means homomorphic to object orientation as a paradigm
so i should change "VANISH" to "staff:vanish" right? (im fairly new to messaging plugins from plugins, sorry 😭)
i feel like you're blaming the paradigm due to one interpretation of the paradigm dovidas
no, the "mcwistaff:vanish"
yeah this
to "staff:vanish"
oh yeah mb, i misstyped it, doesnt work even with it changed to "staff:vanish"
its just feels wrong to manipulate data using behaviour from the outside class scope, at this point you can just have public fields and manipulate those fields altogether
for me it closely resembles programming to a struct
all jbeans classes do most of the time is just store data
i mean u lose polymorphism and ability to utilize implementation inheritance (not that impl inheritance always is good but thats besides the point)
more so, your code is less defended, when you have a getter as a middle man you have a layer of protection at least
i feels it just a compromise for reflections api to parse those classes externally via libs like jakarta
a hack in some sort
code looks okay, when are you sending the plugin message to the server? when are you calling that method?
you mean for the properties?
on /vanish <-- doesnt fire
on ServerConnected event <-- doesnt fire
because java has those built in and intended to be used. The way java beans uses them is not the only way they can be used.
the connected event is probably too early to send it, though i don't know when bungee exactly sends the registration to the server but it's late in the login process
command should work, proxy command, right?
yes, proxy command, does not fire either way, but does send a message that the player vanished
ik wording is a bit lame from me what i wanted to say that to parse jbeans by utilizing reflections api you need some kind of convention of how the data should be manipulated and declaring getters/setters and no args constructor is the easiest to impl
jbeans is just a convention to manipulate data from the outside of classes scope in a sense. i just dont like it that now the responsibility of data behaviour is on some kind of reflections layer and not explicitly declared inside class. DX and quickness to implement over proper syntax for frameworks wins
i guess i can do it with redis and not with "messanger"?
the earliest is right after login
this would be when the brand channel is established in the plugin channels
specifically the server sends it right after this packet is sent
client does the same thing
the protocol allows it anytime during play yeah
that is, technically a payload for any channel can be sent, but the server has that funny channel registration logic, the proxy first needs to send the register payload, then you can send your payload on your channel
reflection is not strictly necessary however java beans are designed so that tools and applications can interact with it dynamically at runtime and to be interacted by other applications from the outside etc. This means you wouldn't necessarily know anything about the Java bean at compile time, however there are times where you possibly could and therefore wouldn't need reflection in that sense.
@chrome beacon
someone responder this, but they havent responded now and i need to know
do you know what this could mean? (i tried today and it still says the same thing)
what are you trying to do
Oh. Im just adding a trait to an npc but it says it couldnt be loaded at startup
what trait, and what's the error exactly
My own
ah, you triggered one of their WAF rules
not much you can do about that except contact mojang support and ask them to unblock you
it might only be for a few days if you're lucky
contact mojang support and ask them to unblock your IP
but what could i do, where are the rules
contact Mojang support, and possibly build a caching system in the event ur sending the same request multiple times
they aren't public, you just happened to trigger one of them by testing your plugin too many times probably}
if anything, Citizens's docs could probably warn people about that, I don't know
i just spawned like 22 npcs
yeah, that must be it
whyyyy
it's weird though, if it was the same name then it should be hitting the gameprofile cache
it was steve, then i spawned 2 with different names
repeatedly
i mean like a 3 times
yeah i forgot
but its 3
mm I love reworking my menu lib a billion times
task for today was to reinvent pagination to allow for partial shifts
the one where you reimplemented NMS?
yeah
apparently we have a fancy ass menu that paginates
BUT the pagination is partial and works in weird conditions
and some elements start offset to others
how did I fuck this up
does this use texture pack ?
ofc
Yeah fts I'm changing pagination to effectively work in all directions
Basically making a 2d game engine atp
"we have 2d game engine at home"
2d game engine at home
i got U
i got some fuck ass graphics library ive been workin on
Loose emulation of OpenGL using Java AWT. Contribute to winnpixie/glawt development by creating an account on GitHub.
but dont actually consider it.. sux lol
😭😭😭
i originally called it awtogl (awt-to-gl "auto gl") but i was like that sucks
so then i called glawt ("glaut")
you know what else sucks
the whole repo
hey is anyone can help me for just create an npc with nms 1.21.1
I should make pokemon in this little tiny 9x6 screen
True
if i ever find a server where i can play pokemon in my inventory and like
the grass block (not the dirt one with grass layer like the actual grass item) is just straight up the grass
fantasy rpg server with a gameboy color
i might lose my shit from laughing so hard
idk why but that just seems so like Lol to me
I might make a demo if I actually get this to render items
I still need to make a title layer system
and the camera's clipping too soon fml
I mean nothing stops me from just rendering the entirety of pokemon with fonts why tf do I need this
what is the event for interact with entity event since PlayerInteractAtEntityEvent seems to miss the getEntity part
getRightClicked
thx
Just use the citizens api
image: node:latest
stages:
- deploy
services: []
deploy:
stage: deploy
only:
- no-masters
tags:
- mcscans_runner
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- echo "$ENCODED_SSH_KEY" | base64 -d > ~/.ssh/id_ed25519
- chmod 600 ~/.ssh/id_ed25519
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_ed25519
- ssh-keyscan -H $PROD_SERVER_IP >> ~/.ssh/known_hosts
script:
- echo "Deploying via SSH..."
- rsync -avz --exclude=".git" ./ root@$PROD_SERVER_IP:/var/www/api/
environment: production
``` do you guys have any idea why this pipeline would be stuck on `Checking pipeline status` in gitlab
is the mcscans_runner active
yeah it was running but I didn't see it pick up any jobs
can you show the gitlab runner list output
I can in like 1 hour sorry im getting food atm
root@ns3124261:~# sudo gitlab-runner list
Runtime platform arch=amd64 os=linux pid=33696 revision=4e717029 version=18.0.3
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
ns3124261 Executor=shell Token=REDACTED URL=https://0xacab.org``` my config atp is ```yml
# This file is a template, and might need editing before it works on your project.
# You can copy and paste this template into a new `.gitlab-ci.yml` file.
# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
#
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/development/cicd/templates/
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/node/tags/
image: node:latest
# pls work?
stages:
- deploy
deploy:
stage: deploy
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- echo "$ENCODED_SSH_KEY" | base64 -d > ~/.ssh/id_ed25519
- chmod 600 ~/.ssh/id_ed25519
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_ed25519
- ssh-keyscan -H $PROD_SERVER_IP >> ~/.ssh/known_hosts
script:
- echo "Deploying via SSH..."
- rsync -avz --exclude=".git" ./ root@$PROD_SERVER_IP:/var/www/api/
environment: production
and this is my runner configs
# cat /etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0
connection_max_age = "15m0s"
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "ns3124261"
url = "https://0xacab.org"
id = 1658
token = "REDACTED"
token_obtained_at = 2025-06-12T08:40:02Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "shell"
tags = ["mcscans_runner"]
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]```
the mcscans runner has the shell executor
yeah
is it not supposed to
i only put shell commands in the yml file so idk