#dev-general
1 messages · Page 293 of 1
time to learn
o
give me an example chunk populator in json
Pretty bare bones rn
{
"plains": {
"tree-variations": [
"t001.schematic",
"t002.schematic",
"t003.schematic",
"t004.schematic"
]
}
}
"plains" is this a dynamic name, or does it refer to something like an enum?
It refers to the biome name
So yes an enum
Not using anything yet, just have it as a base
ok well
Not sure what's better kek
Let me show you my entire TreePopulator class so you can see what I'm doing rn https://paste.helpch.at/wuyiviquyi.java
Need to fix my damn wildcards smh
ok
make this class
public final class BiomePopulator {
private Set<File> treeVariations;
public Set<File> getTreeVariations() {
return treeVariations;
}
}```
then have a Map<Biome, BiomePopulator>
instead of your map<biome, list>
have you added gson to the project yet?
I have not no
'com.google.code.gson:gson:4.2.3'
wait no 4.2.3 is the latest guice version
just figure out what the latest ver is via +
gson might be 4.2.7
Yea was gonna say
Yeye I checked myself
ok, once it's added
add this annotation to the treeVariations field in the BiomePopulator
@JsonAdapter(TreeVariationsDeserializer.class)```
Gimme a tad, need to figure out the proper structure so it doesn't become a mess instantly
well yesn't
oh you meant packages?
yea
I save it yea
Well save as in copy it
It's not modifiable when the plugin is running if that's what you're asking
here's what I use:
saving: serializers
loading: deserializers
saving & loading: adapters
you'll want to go with adapters
that's where you create your TreeVariationsAdapter.class (which is renamed from TreeVariationsDeserializer.class)
Okay yea I'll restructure this later properly
yup
yeah implement the methods
have a constant
private static final Type TYPE = new TypeToken<Set<String>>>() {}.getType();```
might be too many >
Indeed
if you had guice you could just Types.setOf(String.class);
One day you'll convince me
in your deserialize method, we want to convert your json element into a set file
to do that, we first need to convert it to a set string
and we do that via the json deserialization context
context.deserialize(jsonelement, TYPE)
that'll return a Set<String>
mhm
if you can't convert that set string into a set file yourself you need help
so do that
and tell me when you're done
Already did it
good
lol
now onto the serialization
convert your set file into a set string
then pass it into the context.serialize
you don't need to provide the type this time
to do so is redundant
although you can if you want
I'll just provide the type
k
aight so that class should be finished now
in your tree populator class, we need a gson instance
Any specific settings?
private static final Gson GSON = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
.create();```
mhm
getParsedChunkPopulatorFile() show me this method
@Nullable
public JSONObject getParsedChunkPopulatorFile() {
final JSONParser parser = new JSONParser();
try {
return (JSONObject) parser.parse(new FileReader(getChunkPopulatorFile().getPath()));
} catch (final ParseException | IOException ignored) {
return null;
}
}
that file reader is auto closeable btw and should be in a try with resources
actually parse might close it
¯_(ツ)_/¯
anyway
maybe move the gson instance to the class with that method
then just go
o yeah
GSON.fromJson(reader, new TypeToken<Map<Biome, BiomePopulator>>() {}.getType())
position: center iirc
that'll return a map
so ur returning a map instead of a JSONObject
d;gson gson#fromjson(reader, type)
public <T> T fromJson(java.io.Reader json, java.lang.reflect.Type typeOfT)
throws JsonSyntaxException, JsonIOException```
This method deserializes the Json read from the specified reader into an object of the specified type. This method is useful if the specified object is a generic type. For non-generic objects, use fromJson(Reader, Class) instead. If you have the Json in a String form instead of a Reader, use fromJson(String, Type) instead.
typeOfT - The specific genericized type of src. You can obtain this type by using the TypeToken class. For example, to get the type for Collection<Foo>, you should use: Type typeOfT = new TypeToken<Collection<Foo>>(){}.getType();
json - the reader producing Json from which the object is to be deserialized
JsonSyntaxException - if json is not a valid representation for an object of type
JsonIOException - if there was a problem reading from the Reader
an object of type T from the json. Returns null if json is at EOF.
okie cool so you can provide a reader there
wasn't 100% sure
and it doesn't say if it closes or not so you should definitely put the reader in a try with resources
Okay did that
try it out
actually
still won't quite work
the issue is now that gson doesn't convert your string to upper case for enum serialization
and since you're using a map instead of a proper object, we have to create an adapter for the whole map, not just the enum (afaik, although you could try just the enum if you want)
so
d;gson gsonbuilder#registertypeadapter(adapter, type)
public GsonBuilder registerTypeAdapter(java.lang.reflect.Type type, java.lang.Object typeAdapter)```
Configures Gson for custom serialization or deserialization. This method combines the registration of an TypeAdapter, InstanceCreator, JsonSerializer, and a JsonDeserializer. It is best used when a single object typeAdapter implements all the required interfaces for custom serialization with Gson. If a type adapter was previously registered for the specified type, it is overwritten.
This registers the type specified and no other types: you must manually register related types! For example, applications registering boolean.class should also register Boolean.class.
typeAdapter - This object must implement at least one of the TypeAdapter, InstanceCreator, JsonSerializer, and a JsonDeserializer interfaces.
type - the type definition for the type adapter being registered
a reference to this GsonBuilder object to fulfill the "Builder" pattern
use that method in the builder
type is the same type you're providing in GSON.fromJson
for the type adapter
make a new class called
MapThingyAdapter
idk think of a better name for it
PopulatorsAdapter perhaps
implement json serializer & deserializer again, with Map<Biome, BiomePopulator>
have a constant type for
Map<String, BiomePopulator>
go through map and convert the key string to Biome
k
idk if you're still learning streams but here's a little stream for it
I mean I'm pretty familiar with streams If i do say so myself
map.entrySet().stream()
.collect(Collectors.toMap(entry -> Biome.valueOf(entry.getKey().toUpperCase()), Map.Entry::getValue));```
Yikes Piggy, why u use this
Biome.valueOf
exception if it's not a valid one
then use something else
usually I have an immutable map in my enums
Map<String, Enum> NAMES
and I just use that
d;info
@CheckReturnValue @Nonnull
AuditableRestAction<Emote> createEmote(@Nonnull String name, @Nonnull Icon icon, @Nonnull Role... roles)
throws InsufficientPermissionException```
Creates a new Emote in this Guild.
If one or more Roles are specified the new Emote will only be available to Members with any of the specified Roles (see Member.canInteract(Emote))
For this to be successful, the logged in account has to have the MANAGE_EMOTES Permission.
++Unicode emojis are not included as Emote!++
Note that a guild is limited to 50 normal and 50 animated emotes by default. Some guilds are able to add additional emotes beyond this limitation due to the MORE_EMOJI feature (see Guild.getFeatures()).
Due to simplicity we do not check for these limits.
Possible ErrorResponses caused by the...
This description has been shortened as it was too long.
roles - The Roles the new Emote should be restricted to If no roles are provided the Emote will be available to all Members of this Guild
name - The name for the new Emote
icon - The Icon for the new Emote
InsufficientPermissionException - If the logged in account does not have the MANAGE_EMOTES Permission
AuditableRestAction - Type: Emote
do you mean add new emotes to the server, or add an emote to a message?
do you have a file for the pic
what do u have
oh well
get the link of the emote
do u know how to do that
cool
open an input stream to the url
URL#openStream
new URL(string)
then with the input stream
Icon.from(stream)
and pass that icon to the add emote method
if something doesn't work
feels bad
¯_(ツ)_/¯
ask in the jda discord efe
Smh
Noice java.lang.StackOverflowError: null
bukkit scheduler
Not that optimized
Does not implement Executor
So can’t be used for CompletableFuture
Unless you wrap it
Which is horrific
do you guys think you can help me generate a new dimension like the aether, https://www.spigotmc.org/resources/aether-generator.65845/ (or help me with this one's configuration) so I can have custom biomes and structures in it? -this plugin already support replaceable schematics but i can't figure them out for some reason.
The scheduler is fine lol
yeah it's not that bad
anyone know why I have so much unused memory? Let me know if you need more details, not sure what I need to provide for this problem, out of my league here
calling gc manually doesn't help
could calling gc manually be the cause of this?
just realised that popup covers some numbers
better pic
what's wrong with unused memory?
it'll never be used in this app
once everything is loaded, that's it
nothing new will ever be loaded
actually that's not true sorry
but it'll definitely never need 6.4gb
-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 adding these flags helped
usage is down to 2.5gb, which is far more acceptable
@quiet depot what’s your entire start script?
this is it atm
-agentpath:/opt/yourkit/YourKit-JavaProfiler-2020.9/bin/linux-x86-64/libyjpagent.so=disablestacktelemetry,exceptions=disable,delay=10000 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=15 -Xms128M -Xmx8G
well those are the args
Lower a Xmx
Any idea how to efficiently group pairs?
nah
the program needs a high amount of ram during iniitalization
after that though, it goes down
like
1 2
2 3
1 3
Those would be 1 group
1 2 3
Ahh okay
I'm getting good results with these args anyway
not noticing any speed differences, but I'm only using 2gb now
so that's a pro and a pro
Yeah you can’t prevent it’s allocation if you need it initially
because I read these flags would slow it down
Before I go implementing it, I have a quick question:
I have a class that has 6 independent boolean flags
would it be more performant to use a single number and binary representation for the flags or should I go with 6 booleans?
distinct()?
uh there would be many groups tho
for eg:
1 3
2 3
1 2
6 9
5 4
5 7
8 9
would reduce to
1 2 3
4 5 7
6 8 9
bitmasking is more efficient but 6 booleans isn't exactly slow
so yugi do you also need to order them?
Yeah that’s insignificant performance you are talking about @empty flint
Order doesnt matter, just the grouping
Booleans make it easier for you to understand so that is the better choice
Especially due to them being loaded into memory
right, what kind of performance difference are we talking?
distinct would be fine yugi
but distinct wont result in the different groups tho
Lists.partition
The thing is that I don't expect to ever touch the code again once it's done, the class is getting an abstraction layer on top towards the user anyhow so it doesn't matter in terms of "understandability"
cant do that piggy
the groups are defined by each pair, so like if a and b is a pair, a and b must be in the same group
ah
final Map<Integer, Set<Integer>> ints = new HashMap<>();
for (Pair<Integer, Integer> pair : pairs) {
final int i1 = pair.one();
final int i2 = pair.two();
final Set<Integer> group1 = ints.get(i1);
if (group1 != null) {
group1.put(i2);
continue;
}
final Set<Integer> group2 = ints.get(i2);
if (group2 != null) {
group2.put(i1);
continue;
}
final Set<Integer> addendum = new HashSet<>();
addendum.add(i1);
addendum.add(i2);
ints.put(i1, addendum);
ints.put(i2, addendum);
}```
untested
might work
might not
Basically 0 @empty flint
o.o
Alrighty
to get the groups, ints.values()
the map keys are useless for the end result
you only want the values
mhm
if performance is necessary for this application, use a primitive map & set impl
Rivers do be looking great
IntelliJ at it once again with its pipe broken exception 🥲
Yup works
Seems to have some duplication but that shouldnt matter for the final result
You fucking nonce that looks like the first time I messed with WorldEdit
No we rn Fefo
The dirt patches do be looking good (if the stone was sand or something lol)
I need to take a different approach for this
Ahh
just wrap .values() into a hashset
o.o
barely noticable
the only time it might make a difference is if you had a lot of objects
in which case the bitmask would be more memory efficient

Pog
@obtuse gale Much better
Tremendous
fastutil and trove have primitive impls
not sure about the rest
do your research
and tell me which ever one you end up on
and then also tell me if the one you end up on has support for custom hashing techniques on their hashsets/hashmaps, because I'm using trove
and trove obviously aint it according to those graphs
I need to handle biome type setting myself, then it's gonna look neat
Yes
How would one implement a system of settings where there is a basic set of global settings, a set of user group settings and a set of user settings that are getting progressively more important. So user settings override user group settings which override global settings. Should each of those be implemented as their own objects and kept track of separately? How would one change the user settings if global settings change and the user hasn't made specific changes themselves?
simply initialize the user object with the default values
and override them with the user values
so say you have settings A, B and C, the user overrides setting A, but then the global setting B changes its value. That change should propagate
sure but what if the defaults change? How would I propagate that change? I'd have to keep track of every single instance of settings and I potentially have thousands of them, depending on the number of user groups and users.
the user wouldn't like it if you suddenly change his settings though
user doesn't get a say in the matter
then why do you have user settings
if the user has no say of his settings then why would it matter to have defaults
since they can't be changed
I don't think I'm totally understanding you
Oh only the global settings change the user hasn't specified explicitly
So there's kind of a blueprint to follow but if the user wants a specific thing to be different, that overrides the blueprint
but what if he follows the default blueprint because he likes the default one
and you change it
public final class Settings {
public static final Settings DEFAULT_SETTINGS = new Settings(true);
private Boolean likesCake;
public Settings(@Nullable Boolean likesCake) {
this.likesCake = likesCake;
}
public boolean likesCake() {
return likesCakes == null ? SETTINGS.likesCake() : likesCake;
}
public void setLikesCake(boolean value) {
likesCake = value;
}
}```
idk just an example
probs not perfect
then they have to change it back, tough luck
fair enough
right, that's kind of what I had in mind as well
The thing is there's more than 2 layers
it's not just global/user
it's more like global -> user group -> user subgroup -> user
so there'd have to be 4 different null comparisons to find the first one which isn't null
you should probably look at this from a database standpoint and not code wise
I am trying to do both and my head hurts 😦
That's why I asked here
I'd prefer a way to have the value in O(1) time
start with a prototype instead of already trying to figure out the best thing
start with a simple database diagram
I have a complex one already xD
my head hurts too
the database thing works, it's just the implementation that I'm worried about because it can't take too long
i've written 4.7K words of documentation today
and i'm only half done
scrap that probably like a 10th
this is just a wiki
still gotta write actual javadocs
start with a basic implementation and only improve if it's necessary
what the fuck for? 4.7k is like 4.6k more than I'd read on any given occasion xD
looks good
means people know I can write documentation
something to show off to employers
I think I have an idea, please tell me if I'm stupid or not, @frigid badge
One table that holds the global settings.
Another table holds a reference to the global settings with the same settings columns, plus an additional column defining if the specific settings are for user group or user settings etc.
If the default settings get overruled by the user or group, the value is not null. If it's null, the default settings get applied.
Setting(id, name)
SettingValue(id, setting_id, user_id, value) idk.
visualise it https://dbdiagram.io
Perhaps? I mean, it you wanted it type safe maybe just one big table, depending how many settings you have
Niall that website has dark theme
lol
@frigid badge You wanted diagram?
Oh I just realised what I've made doesnt include groups or such as blocky wanted
Bruh IntelliJ the "expert" ide fails me once again
me too
except that invaliding caches fixed it 😄
bruh ima use eclipse srsly
what version r u on piggy?
latest
no
same 😄
u guys using ultimate?
thx again for showing me the github student dev pack xD
ye
dkim in case you haven't noticed already, you can get a free domain from the pack
well, 3 free domains
wait oo
No need for ultimate when eclipse exists
that's how I first got https://piggypiglet.me
its only 1 year tho
discounted on the following years
and I don't want to pay for a domain i wont use :p
ah
.me is very cheap
it's not
iirc
it's like the same as any other domain
if not a little more expensive
my p1g.pw is cheap af though iirc
Less than $5 a year
wtf
did they lower the price?
my renewal costed $15
that was discounted btw
I can't remember if it was usd or aud
I guess renewal is a different prices than buying on namecheap, i do remember paying around 15 to renew as well
25?
is it namecheap?
yeah don't worry it won't be 25 for you dkim
it'll only be $15 for you
my namecheap is bugged
I have to message support every year to get them to fix it
what domain r u getting
I recommend just getting the free domain, then transferring it to cloudflare registrar
you'll have to pay for an extra year to transfer it
but you're basically getting 2 years for the price of one
oo true
keep in mind though cloudflare registrar doesn't support all domains
so it really matters which ur planning on getting
also dayum
might just renew that now even though it's not due till september
yeah cloudflare doesn't support .me :/
what do you use for piggypiglet.me?
namecheap
ok, Ima try that one ty for helping 😄
cloudflare registrar is the best for cheapest prices
they just don't support many domains :/
oh btw conclure
with the namecheap thing
.me is free, and lots of other things are heavily discounted
ah ooo that's awesome
oh, not lots
just a few things
discounts on first year registration: .io / .tech / .com / .website
$24.88 .io
$0.48 .tech
$8.88 .com
$0.48 .website
dkim19375.tech
.website XDD
Isnt that just for github pages?
no
it's a domain
idk what they're talking about with the github pages thing on nc.me
it's a fully functional domain
you can use it for anything
oh so it asking us to point it to a github page while registering doesnt matter?
damn I didnt take it till now just because of that xD welp
I assume so
awesome
Wait lemme show
The Namecheap Education Program offers a free domain and website to university students worldwide.
what does the info say
That link
ah
help chat git labs server.
wonder how easy it would be to write a similar platform from scratch
@Override
public List<String> onTabComplete(@NotNull final CommandSender sender, @NotNull final Command command, @NotNull final String s, final String[] args) {
if (args.length == 0) {
*statement1*
}
}
Shouldn't statement1 be executed if i have no arguments? Like for example if it was assigned to command video if i do /video , it should do statement1 right cause there aren't any arguments
Not quite
null?
Tab suggestions aren't fired until you fully type the command name + a space
I mean it depends on how you did it
/cmd ksbdi is no different in args length than /cmd
But it is different from /cmd ksdbi (2)
Because of the space
tab completer dumb af
In that last case args would be { "ksdbi", "" }
why would it be like this
lmao
its so confusing
xD
so i should make something to trim all the empty strings
out of my args
Why wouldn't? By the time you are already typing the next argument the args length increases, because you are typing the next argument
so space counts an argument?
I think it counts as an empty string, yes
It literally just whatevs.split("\\s") I think
well my current implementation
@Override
public List<String> onTabComplete(@NotNull final CommandSender sender, @NotNull final Command command, @NotNull final String s, final String[] args) {
if (args.length == 0) {
return Arrays.asList("start", "stop", "load", "set");
} else if (args.length == 1) {
if (args[0].equalsIgnoreCase("set")) {
return Arrays.asList("screen-dimension", "itemframe-dimension", "starting-map", "dither");
} else if (args[0].equalsIgnoreCase("load")) {
return Collections.singletonList("[Youtube Link or Video File Here]");
}
} else if (args.length == 2) {
if (args[1].equalsIgnoreCase("screen-dimension")) {
return Collections.singletonList("[Width:Height]");
} else if (args[1].equalsIgnoreCase("itemframe-dimension")) {
return Collections.singletonList("[Width:Height]");
} else if (args[1].equalsIgnoreCase("starting-map")) {
return Collections.singletonList("[Map ID]");
} else if (args[1].equalsIgnoreCase("dither")) {
return Arrays.stream(DitherSetting.values()).map(DitherSetting::name).collect(Collectors.toList());
}
}
return null;
}
requires that no spaces exist
Yeah you're off by 1 lol
yeah
why dont they just do like
.split(" ")
how is the first space even necessary tho
They.. do
\s accounts for all whitespaces, not exclusively ' ' but '\t', '\n', '\r' and other bs
oh bruh
I mean a b c when split is { "a", "b", "", "", "c" }

What the fuck
my orchestral conductor is telling me to do yoga
????
"Winds/Brass, try to wear clothing that you can comfortably move around and stretch in, and if you have a yoga mat/towel nearby, have that ready as well!"
I mean tbf he isn't wrong lol
lmao
XD
so mean
😭
[10:59:14] [Client thread/FATAL] [FML]: Suppressed additional 2 model loading errors for domain dragonmounts
[10:59:14] [Client thread/FATAL] [FML]: Suppressed additional 3 model loading errors for domain twilightforest
ok
ok
ok
you realize this aint modded
lmao
athough twilight forest is an epic mod
very ebic
ok
ok
ok
https://paste.helpch.at/irezoqusaq.md
When the server decides to crash when you join, then when you leave it stops crashing, then when you join it crashes again, then when you leave it stops
:c
lol
does anyone know why what i posted in #general-plugins doesnt work?
....
fat ass
😳
might want to ask in the paper discord
lol
even tho i gave it 3gb
You might find https://elixir-lang.org helpful
i already know exiler. couldnt you just tell me whats wrong with it? thats why i asked, not for people to send me tutorials of coding. not to be rude but this is like the third time its happened and its getting annoying to me.
lol
just be patient and don't ask in other channels
because this aint the right place to ask
fat dic
yum
lol I think someone had mentioned Haskell earlier
emacs lisp
INDEED
sometimes I wish. sometimes I don't
hmm spigot is kinda broken. https://i.imgur.com/6hnZ0Ym.png https://i.imgur.com/sErmJog.png
lmao
https://www.youtube.com/watch?v=jBxRGcDmfWA ignore the fact that its in python
First YT vid? Hope its alright hahaha, feel free to reach out if anything's wrong!!!
Thanks (for non copyright music):
https://www.youtube.com/watch?v=IGNwBFUeNXk&list=PL6k57M9aVcIIARkqPG06AapxZ99yqepds&index=4
► Music Credi...
Thursday is the day you updated the plugin lol
but december 8th isn't thursday
I wanted to use this input api
sooooo
But I noticed it includes HandlerList.unregisterAll

Ain' that dangerous
/**
* When this method is called all the events in this input handler are
* unregistered<br>
* Only use if necesary. The class unregisters itself when it has finished/the
* player leaves
*/
read
🙂
wait
wot
yes
waiiiitt a second
I said updated not releasing dkim
but the release date on there is always the latest
it was my other update in dec 8
that should show the latest update
date
but it shows my other update date
like not the latest. the one before
here
better view
That's odd lol
spigot being spigot. nothing wrong there xD
because why would you even do that?
Got a question
why would you bump 2 year old topics? XD
It's 8 month old
still.
like make your own thread or find other new ones
ah I see. well idk
maybe contact the one who posted
also you can reply
but you'll probably get some kind of warning if it wasn't actually needed
lmao
Wat
lmao
@prisma wave @onyx loom @old wyvern @hot hull @ocean quartz @quiet depot @distant sun joining?
you don't deserve to
@remote goblet @half harness @obtuse gale
anyway, anyone know why my gradle takes a really long time to build
hmm who else usually joins?
bbAnNeD
@lunar cypress @steel heart
ban incoming
thats the only one i win at
didn't make the lobby
Its boring 😬
😔
Sorry
ok
oh @forest pecan
this feels like an issue
wot
3m 7s
I think everyone is in
bad pc
can we get Glare to accept my PR? xD https://i.imgur.com/po37ULX.png
☹️
i get longer sometimes
watch in 2 years ori
this feels kinda easy and hard at the same time lmao
What?
wait
easy
join coc
i suck at anything outside of spigot plugins
but I understood the thing we have to do
Whose Coc
COC is life
do we enjoy?
ours
❤️ coc
why does it do this
gradle.... bad...? 😳
am I going crazy? I can't even turn around a matrix. smh
by turn around I mean flip

transpose
🥲
can we have a rematch? I hate arrays
Sure
lmao i think its possible
make new lobby please .brb
@static zealot
@prisma wave you comin?
😂
lol
didnt have time
however, the fast way is to use a binary search
or self balanced tree
wish i had time for more opitmization
share code please
divisibility by 4
wdym
oh
yea true
damn
🥲
I was on stackexchange.com trying to figure out forumals and shit
lol
damn. I think I'll kill myself and pray I'll become an asian in my next life then. because I hate maths
I love it but hate to have to use it
🥲
Where are you from beat?
I think you can start yugi
born in us, but im the first person to be a citizen. both of my parents are born in China
so yeah
im Chinese
ah
||leading 0s?||
hmm
what are you* doing for the difference?
oh
damn I give up
bruh wha xD
yeah same
might be the integer size
i tried long
tried BigInteger
My life is nothing but pain
didnt work
try BigInteger
didn't work
ah
yeah
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
System.out.println(((a-b) + "" + (a*b) + "" + (a+b)).replaceAll("^0+(?!$)", ""));
}
yeah don't worry about it
lmao
I just did a lot of ctrl+z
and went with first instance
that worked
with first options
lmao
yea its probably overflow
but like I tried biginteger and long and it was just overflowing
yup
lmao
i think i know
I am confusiion
i think i know!!
YES
okay
it fit all the examples
how am i gonna write this code
lmao

ugly af for kotlin but it works
i give up
lmao
🖐️🖐️
shut up and share code sometime
🥲
no he not
God that was aweful
haskel killing him
Debugging is haskell is fun
make new lobby.
🥲
will be ready soon
imagine using modulo
lmao
(i & 1) == 0
😻
"You've joined the coc50870851 channel. Send a message to say hello!"
thats a lotta cocs!
yes easy
just be organized
almost
😉
;-;
I literally can't figure anything out. I had one idea and I know its wrong but same idea keeps poping off in my head
table?
thats what im doing
and was doing
submitted 😄
for th epast minute
alrighty
tf is COC chat
ciao
in game chat
adios
oh
@static zealot
same lmfao
theres probably a really clean way to do this
but im too lazy to figure it out
yeah same. well I knew how to improve mine lmao. just 1 line instead of 2 and no double loop.
1 more
Alrighty
ok xD
not doing this one
u didn't do shortest 👀
👀
uh
hmm interesting
I dont want to do binary

yeah I saw it xD I'm just wondering what the hell the formula or whatever is
lol
:))
help me in #bot-commands
why do I keep going for the messy solutions ?
why blitz lol
i give up
There we go
think that's it for tonight. gn
gn
why
gn