Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
5972a00
Initial work on heads (cherrypick + new!)
aakatz3 Dec 17, 2020
b8a5bf6
Beta of the mojang api stuff
aakatz3 Dec 20, 2020
8dae48a
Bump classgraph from 4.8.92 to 4.8.98
dependabot-preview[bot] Dec 24, 2020
7d74d10
Merge branch 'master' into feat/heads-mojangapi-users
aakatz3 Dec 25, 2020
3db73ff
Merge remote-tracking branch 'origin/master' into feat/heads-mojangap…
aakatz3 Dec 25, 2020
004fbf0
Fixed the stupidity of textures as enums and wrote some fun stuff
aakatz3 Dec 26, 2020
b014f6b
force gradle to uff-8
aakatz3 Dec 26, 2020
329515f
Test the enums so coverage isnt mad
aakatz3 Dec 26, 2020
ab69d97
more api work before changing pc
aakatz3 Dec 28, 2020
67a9c4b
More tests, use MHF, Start skullbuilder refactor
aakatz3 Dec 29, 2020
680655b
Allow generating frames for javadoc
aakatz3 Dec 30, 2020
8c113ec
Test updates (mocked bukkit); javadoc frames
aakatz3 Dec 30, 2020
ac010e4
typo
aakatz3 Dec 30, 2020
0b15f04
More test work
aakatz3 Dec 30, 2020
b6f0496
Add javadoc to ci
aakatz3 Dec 30, 2020
6d4bcec
javadoc
aakatz3 Dec 31, 2020
c4a023e
update licence, start on zach comments
aakatz3 Jan 2, 2021
0fb226b
Minor refactor, javadoc
aakatz3 Jan 4, 2021
c44992f
Refactor Texture validation to it's own class
aakatz3 Jan 4, 2021
b278a81
Bump mockito-core from 3.6.28 to 3.7.0
dependabot-preview[bot] Jan 5, 2021
8c6b7b5
Little more work before back to phone for a while?
aakatz3 Jan 5, 2021
786590d
try to fix docs
aakatz3 Jan 6, 2021
cacaefb
Finish javadoc
aakatz3 Jan 9, 2021
ade9f94
Merge branch 'master' into dependabot/gradle/io.github.classgraph-cla…
aakatz3 Jan 9, 2021
223a6f9
Merge remote-tracking branch 'origin/dependabot/gradle/org.mockito-mo…
aakatz3 Jan 9, 2021
84c0b3b
Merge remote-tracking branch 'origin/dependabot/gradle/io.github.clas…
aakatz3 Jan 9, 2021
6b4316f
Add mocked bukkit stuff, remove extra old enums
aakatz3 Jan 9, 2021
42b1739
PlayerSelector & better math util
kokumaji Jan 11, 2021
d16c439
Merge remote-tracking branch 'origin/yeen-cherrypick' into feat/heads…
aakatz3 Jan 11, 2021
3aaa25b
Add lots of javadoc
aakatz3 Jan 11, 2021
6fc4385
Infer Nullity
aakatz3 Jan 11, 2021
263164b
Prepare for new tests, add docs
aakatz3 Jan 16, 2021
26c8415
Bug fixups
aakatz3 Jan 22, 2021
614816b
javadoc 1
aakatz3 Jan 29, 2021
e6a97e1
Merge master
aakatz3 Jan 31, 2021
94683c6
Fix licence after merge
aakatz3 Feb 2, 2021
aa23150
Change how textures are implemented to a json we generate
aakatz3 Feb 8, 2021
7f2cab7
Cleanup
aakatz3 Feb 8, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@ dependencies {

compileOnly 'com.destroystokyo.paper:paper-api:1.16.4-R0.1-SNAPSHOT'
compileOnly 'net.md-5:bungeecord-api:1.16-R0.4-SNAPSHOT'

implementation 'org.jetbrains:annotations:20.1.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'io.github.classgraph:classgraph:4.8.92'
implementation 'com.github.seancfoley:ipaddress:5.3.3'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'

// JUnit 5 Testing
testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright (c) 2020 DumbDogDiner <dumbdogdiner.com>. All rights reserved.
* Licensed under the MIT license, see LICENSE for more information...
*/
package com.dumbdogdiner.stickyapi.bukkit.item.generator;

import com.destroystokyo.paper.profile.PlayerProfile;
import com.destroystokyo.paper.profile.ProfileProperty;
import com.dumbdogdiner.stickyapi.common.util.textures.MobHead;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;

import java.util.UUID;

public class MobHeadGenerator {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MobHeadBuilder?

private SkullMeta meta = (SkullMeta) (new ItemStack(Material.PLAYER_HEAD, 1)).getItemMeta();
private PlayerProfile profile = Bukkit.createProfile(new UUID(0,0), null);



public MobHeadGenerator(MobHead head){
profile.setName(head.getName());
profile.setProperty(new ProfileProperty("texture", head.getTexture()));
meta.setPlayerProfile(profile);
meta.setDisplayName(head.getName());
}

public ItemStack getHead(){
return getHead(1);
}

public ItemStack getHead(int amount){
ItemStack head = new ItemStack(Material.PLAYER_HEAD, amount);
head.setItemMeta(meta);
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Copyright (c) 2020 DumbDogDiner <dumbdogdiner.com>. All rights reserved.
* Licensed under the MIT license, see LICENSE for more information...
*/
package com.dumbdogdiner.stickyapi.bukkit.item.generator;

import com.destroystokyo.paper.profile.PlayerProfile;
import com.destroystokyo.paper.profile.ProfileProperty;
import com.dumbdogdiner.stickyapi.bukkit.user.StickyUserBukkit;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import com.google.gson.Gson;

import java.net.URL;
import java.util.Base64;
import java.util.UUID;

public class PlayerHeadGenerator {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PlayerHeadBuilder?

private SkullMeta meta = (SkullMeta) (new ItemStack(Material.PLAYER_HEAD, 1)).getItemMeta();

PlayerProfile ownerProfile;

public PlayerHeadGenerator(UUID playerId){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public PlayerHeadGenerator(UUID playerId){
public PlayerHeadGenerator(@NotNull UUID playerId) {

Use annotations please, this is for Kotlin support.

meta.setOwningPlayer(Bukkit.getOfflinePlayer(playerId));
ownerProfile = Bukkit.getServer().createProfile(playerId);
}

public PlayerHeadGenerator(Player player){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public PlayerHeadGenerator(Player player){
public PlayerHeadGenerator(@NotNull Player player) {

this(Bukkit.getOfflinePlayer(player.getUniqueId()));
}

public PlayerHeadGenerator(StickyUserBukkit player){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There must be a better way to do this aside from implementing an API-specific user.

meta.setOwningPlayer(player.getAsBukkitPlayer());
ownerProfile = player.getAsBukkitPlayer().getPlayerProfile();
}

public PlayerHeadGenerator(OfflinePlayer player){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public PlayerHeadGenerator(OfflinePlayer player){
public PlayerHeadGenerator(@NotNull OfflinePlayer player) {

meta.setOwningPlayer(player);
ownerProfile = Bukkit.createProfile(player.getUniqueId());
}

public PlayerHeadGenerator(ItemStack head){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public PlayerHeadGenerator(ItemStack head){
public PlayerHeadGenerator(@NotNull ItemStack head) {

if(head.getType() != Material.PLAYER_HEAD && head.getType() != Material.PLAYER_WALL_HEAD)
throw new IllegalArgumentException("head must be a player head or player wall head");
meta = (SkullMeta) head.getItemMeta();
meta.getPlayerProfile();
if(!ownerProfile.hasTextures()){
if(!ownerProfile.complete()){
throw new IllegalArgumentException("Invalid player profile attached to the head, with no UUID or textures!");
}
}
}


public void setTexture(URL textureURL){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public void setTexture(URL textureURL){
public void setTexture(@NotNull URL textureURL) {

// {"textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/63d621100fea5883922e78bb448056448c983e3f97841948a2da747d6b08b8ab"}}}
class textures {
SKIN skn;
public textures(String url){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public textures(String url){
public textures(@NotNull String url) {

skn = new SKIN(url);
}
class SKIN{
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class SKIN{
class SKIN {

String url;
public SKIN(String s){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public SKIN(String s){
public SKIN(String s) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public SKIN(String s){
public SKIN(@NotNull String s) {

url = s;
}
}
}

setTexture(new String(Base64.getEncoder().encode(new Gson().toJson(new textures(textureURL.toString())).getBytes())));
}

/**
* Set the texture with a pre-encoded string
* @param texture Base64 string of the json of texture location
*/
public void setTexture(String texture){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public void setTexture(String texture){
public void setTexture(String texture) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public void setTexture(String texture){
public void setTexture(@NotNull String texture) {

ownerProfile.setProperty(new ProfileProperty("texture", texture));
meta.setPlayerProfile(ownerProfile);
}

public ItemStack getHead(){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public ItemStack getHead(){
public ItemStack getHead() {

return getHead(1);
}

public ItemStack getHead(int amount){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public ItemStack getHead(int amount){
public ItemStack getHead(int amount) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public ItemStack getHead(int amount){
public ItemStack getHead(@NotNull int amount) {

ItemStack head = new ItemStack(Material.PLAYER_HEAD, amount);
head.setItemMeta(meta);
return null;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright (c) 2020 DumbDogDiner <dumbdogdiner.com>. All rights reserved.
* Licensed under the MIT license, see LICENSE for more information...
*/
package com.dumbdogdiner.stickyapi.bukkit.user;

import com.dumbdogdiner.stickyapi.bukkit.item.generator.PlayerHeadGenerator;
import com.dumbdogdiner.stickyapi.common.user.StickyUser;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public class StickyUserBukkit extends StickyUser {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought we decided not to do this?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We definitely decided not to do this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this still here?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should be gone in latest

public StickyUserBukkit(Player p) {
super(p.getUniqueId(), p.getName());
}

public StickyUserBukkit(OfflinePlayer p) {
super(p.getUniqueId(), p.getName());
}

public StickyUserBukkit(StickyUser p){
super(p);
}

public StickyUserBukkit(UUID uniqueId){
super(uniqueId);
}

public boolean isOnline(){
return getAsOfflinePlayer().isOnline();
}

public boolean isBanned(){
return getAsOfflinePlayer().isBanned();
}

public boolean playSound(@NotNull Location location, @NotNull Sound sound, float v, float v1){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public boolean playSound(@NotNull Location location, @NotNull Sound sound, float v, float v1){
public boolean playSound(@NotNull Location location, @NotNull Sound sound, float v, float v1) {

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A more explicit variable name for v and v1 would also be nice. I have no idea what those are.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@NotZachery this is your code, I moved it here

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v is volume and v1 is pitch according to Spigot's javadoc

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't matter who wrote it, a more explicit variable name would be preferable.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

if(!isOnline())
return false;
getAsBukkitPlayer().playSound(location, sound, v, v1);
return true;
}

public boolean sendMessage(String [] msgs){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public boolean sendMessage(String [] msgs){
public boolean sendMessage(String[] msgs) {

if(!isOnline())
return false;
getAsBukkitPlayer().sendMessage(msgs);
return true;
}

public boolean sendMessage(String msg){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public boolean sendMessage(String msg){
public boolean sendMessage(String msg) {

if(!isOnline())
return false;
getAsBukkitPlayer().sendMessage(msg);
return true;
}

public boolean sendRawMessage(String msg){
if(!isOnline())
return false;
getAsBukkitPlayer().sendRawMessage(msg);
return true;
}

public ItemStack getHead(){
return getHead(1);
}
public ItemStack getHead(int amt){
PlayerHeadGenerator gen = new PlayerHeadGenerator(this);
return gen.getHead(amt);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (c) 2020 DumbDogDiner <dumbdogdiner.com>. All rights reserved.
* Licensed under the MIT license, see LICENSE for more information...
*/
package com.dumbdogdiner.stickyapi.bungeecord.user;

import com.dumbdogdiner.stickyapi.common.user.StickyUser;
import com.dumbdogdiner.stickyapi.common.webapis.MojangAPI;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;

import java.util.UUID;

public class StickyUserBungee extends StickyUser {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see above

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See above again

public StickyUserBungee(UUID uniqueId) {
super(uniqueId);
}

public StickyUserBungee(ProxiedPlayer p) {
super(p.getUniqueId(), p.getName());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright (c) 2020 DumbDogDiner <dumbdogdiner.com>. All rights reserved.
* Licensed under the MIT license, see LICENSE for more information...
*/
package com.dumbdogdiner.stickyapi.common.user;

import com.dumbdogdiner.stickyapi.bukkit.user.StickyUserBukkit;
import com.dumbdogdiner.stickyapi.common.cache.Cacheable;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;

import java.util.UUID;

public class StickyUser implements Cacheable {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see above

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem with a class like this is it effectively does nothing. Craftbukkit caches players, and this is doing this too i.e. it will barely be any quicker. Yes, if the server needs to fetch an entire profile, the stock implementation will be slower. However, there are better ways to do this than how it's being done here. We have discussed having plugin APIs before, but I vote this is the best solution. It is much better to exchange what data a plugin needs with another than to extend everything, despite not needing 90% of that information.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is very useful to cache OFFLINE users especially. Every plugin's user should have a few specific methods, namely getters for UUID, and if it's done via inheritance, it allows a plugin api to generically take any other plugin's user and compare stuff.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need to do that if you have plugins implement methods that take UUIDs. The plugins can cache their own data on offline users.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A lot of the time, retrieving cached offline user data for each plugin will require a database request, there's no real way to get around that. If they're written properly, they'll then cache that themselves.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For retrieving just user names and the last login time from bukkit doesn't require a database. A plugin can be written to use one, but it doesn't have to.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as the root class vs passing UUIDs:
I just feel that this:

StickyWalletUser swu = getTransactionUser(something); // just go with it mkay
StickyCommands.getInstance().isAFK(swu);

or

(new StickyCommands.User(getTransactionUser(something))).isAFK();

is cleaner than

(new StickyCommands.User(getTransactionUser(something).getUniqueId())).isAFK();

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aakatz3 StickyCommands.getInstance().getUser(UUID).isAfk() (or smth like this) This is a very reasonable way of getting a user object from a different plugin.

StickyCommands.getInstance().isAFK(swu); doing this defeats the point of it being an object, why not just store the UUIDs in a hashmap (UUID, Boolean) at that point?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bump

@Getter
protected UUID uniqueId;

@Getter
protected String name;

public StickyUser(UUID uniqueId) {
this.uniqueId = uniqueId;
this.name = null;
}

public StickyUser(StickyUser p){
uniqueId = p.getUniqueId();
name = p.getName();
}

protected StickyUser(UUID uniqueId, String userName) {
this.uniqueId = uniqueId;
this.name = userName;
}


public Player getAsBukkitPlayer(){
return Bukkit.getPlayer(uniqueId);
}

public OfflinePlayer getAsOfflinePlayer(){
return Bukkit.getOfflinePlayer(uniqueId);
}

public StickyUserBukkit getAsBukkitUser(){
return new StickyUserBukkit(this);
}

@Override
public String getKey() {
return uniqueId.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -288,4 +288,12 @@ public static UUID hyphenateUUID(@NotNull String uuid) {
return UUID.fromString(uuid);
}
}

public static String unhyphenateUUID(@NotNull UUID uuid){
return unhyphenate(uuid.toString());
}

public static String unhyphenate(@NotNull String str){
return str.replace("-","");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Copyright (c) 2020 DumbDogDiner <dumbdogdiner.com>. All rights reserved.
* Licensed under the MIT license, see LICENSE for more information...
*/
package com.dumbdogdiner.stickyapi.common.util.textures;

import lombok.Getter;

public enum DefaultSkins {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move to resources please.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What format should these be in in resources? SQLite DB??

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JSON.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if this was moved to resources, please remove this class

STEVE("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"),
ALEX("iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFhElEQVR4Xu1a328UVRjdR6UUKJFIKL90oa4Vs1TwgRItUvlljMYSjVIDBAzUloZkg5pIDFWJUE3UpyaQiokJSWM0PPjrwcAjT/2fPufc2TN++82dGcruTrfbOcnJ3L33u7f3nPvd2dm5LZUyMLitV8Bdm59wV5bBHRt65JNj1VTa8VYcKLi6Y72jNgCEyMlDe+Wbk/ujK9hVBlD8wJY1iQaUy+UGoq4rDODq223Auq43QItFBoB6O6wKA3ziswwYqwx0jwEU/vzWta6Mu781wMeuMYDCNZkZ+ivPRztex6HSv0ZAiHquv8eJfam8QV7cGbK6s1de2B7eBypbe9yNELGogwGMQx/0xRho57g0Kuk5ws4nd2gDwD3b1zkhELhvV5+7kvh8eHCjjAxucnEwhDHogzqOow1Ie46w88kdbtKbw1ULhQfC+rHS/Nwrf89ekvvf1+Th3Izc/64WlK/Ib5+ekv27N7oYxKIP+kbbJRgTY0Nw2nOEnU/ucCu1JUjlbevCVe0PtwLK1Wf75NcvLsif16fd9feZaZmvfSj/ztZk/uM3HRGDWPRBX5QxFsbE56znCDuf3MFUDbfBWik//aTceH9Y5s8fkeHKU048MPbKrPx19aITjzIAUxCDWPRBX4yhx9RiuT30drDzyR3RZIMVC9O2T66PDcncmdfk5qkDgbij8sfVc/LPV7Xo6+3BzUvyy+QxmQme+RGDWPRBX4zB1acBPvEdYwDTHml7brQqP02+LbfPvx79oPnx9Ggg8JB8dvjlBv5w+lX58uQBF4NY9EFfjOG2QH07UHzSc4SdT+7grzeKnr943K3otx8clCvHq3L5yB6ZHh10YsHP39onX7970BFlxCD254kTru/tj94Ir/XxaCQzgKRxdj7LjvdOLIpmpVJpoI2PYXEx9jAUPRQFbaWzZ9OZhYWFcBwwKGNLvjO0O7ra8CWjFQbYR2KyJQZQfJ2r24AgA7R49zeaRSsMsKnfzi3QtAF7KzUBB54Zd9ejw3cbqNts+/DQrJSuXfuf4+NSunVLSnfuuBsmvip580Sdo44HUQdR5L17Ifk5KZ4xtp39ySxQ4OMYALo/OjEREmVOvG5CJJ4T0vGgFq3JcXQsBbIPDbXtj2NAksCsdu8EOUlMEBmhRep40E5Ykyusx7eG2XY7RhayBGa1u7TnBFDWf5wG6LqkeMZBoC5bgTqb8soAHYN9rxkJITF5LZpl1utYGmBFq/54KCNvBA9f+P2hiTodY9ut3hh8BlCczoBEA7QYmKEN8AnThnEL+PrUU91nwNzl8Ugg61tqgM2AtPaYILv63LPWAKatR7Q2RIuzBuDqM8DV12Os3hgoLElgpgF2D2YZYL8FfLEJBtgVtgb4tojVG8OjGJDWHjOAgqwofk6L91CLSzLAZsiSDBgZGREwSSDrGTc1NdXASBCuzABSr36SATqeMSwH/bQ4a4AzQRnAdr1FrN4YKCxJYFa73iK4WgNBd7NUBuibKttdDLdJQN6EkwygSF+GLJsBvgxqMCEQlhbPGF1nV7jhBhjQd49YkgEFChQoUKBAgQIFChQoUKBAgQLNounDVbwVauXhZ95o2gBz/r/6DNAZsNiGf4BoN1pqwEIb/gWm1eDLTf2WV9O+BOXbXjJ6nU7qV+m+/yewZwfLjUc1IKndidLnBDz9pRG6XZ8krSQD0tpjBmhxMCGtvSsNaPX5f7uhxfkEWgPs8bo+1PCd7fkOPjTtfHIHxfmOupZiQNbRV0cbkJbiWe3WAH2sZQ1ghvBYbEUZQNp2e7hJYVEmqNX3bRE7n9yRJTCr3aa4zwBtUscZwFPjJIGsTzpdbhB/Jr7HG7JDGdQxWyDr+Dyr3bfCOgtWhQGkE6pucK5sMqTVBvwH+QeX13iz8VkAAAAASUVORK5CYII=");

@Getter
private final String texture;
DefaultSkins(String t) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
DefaultSkins(String t) {
DefaultSkins(@NotNull String t) {

this.texture = t;
}
}
Loading