Skip to content

Commit 6e6f8d2

Browse files
committed
Added logging for custom skull textures (fixes #70)
1 parent cb09dde commit 6e6f8d2

14 files changed

Lines changed: 312 additions & 21 deletions

File tree

src/main/java/net/coreprotect/bukkit/BukkitAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ public class BukkitAdapter implements BukkitInterface {
6363
public static final int BUKKIT_V1_19 = 19;
6464
public static final int BUKKIT_V1_20 = 20;
6565
public static final int BUKKIT_V1_21 = 21;
66+
public static final int BUKKIT_V26_0 = 2600;
67+
68+
public static int getAdapterVersion(int major, int minor) {
69+
return major == 1 ? minor : (major * 100) + minor;
70+
}
6671

6772
/**
6873
* Initializes the appropriate Bukkit adapter based on the server version.
@@ -89,6 +94,7 @@ public static void loadAdapter() {
8994
ADAPTER = new Bukkit_v1_20();
9095
break;
9196
case BUKKIT_V1_21:
97+
case BUKKIT_V26_0:
9298
default:
9399
ADAPTER = new Bukkit_v1_21();
94100
break;

src/main/java/net/coreprotect/database/Database.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ private static void createMySQLTableStructures(String prefix, Statement statemen
399399
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int, z int, action tinyint, color int, color_secondary int, data tinyint, waxed tinyint, face tinyint, line_1 varchar(100), line_2 varchar(100), line_3 varchar(100), line_4 varchar(100), line_5 varchar(100), line_6 varchar(100), line_7 varchar(100), line_8 varchar(100)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
400400

401401
// Skull
402-
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, owner varchar(255), skin varchar(255)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
402+
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, owner varchar(255), skin text) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
403403

404404
// User
405405
index = ", INDEX(user), INDEX(uuid)";

src/main/java/net/coreprotect/database/logger/SkullBreakLogger.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.sql.PreparedStatement;
44
import java.sql.ResultSet;
5-
import java.util.Locale;
65

76
import org.bukkit.block.BlockState;
87
import org.bukkit.block.Skull;
@@ -31,9 +30,9 @@ public static void log(PreparedStatement preparedStmt, PreparedStatement prepare
3130
String skullOwner = "";
3231
String skullSkin = null;
3332
int skullKey = 0;
34-
if (skull.hasOwner()) {
35-
skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull);
36-
skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull);
33+
skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull);
34+
skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull);
35+
if ((skullOwner != null && skullOwner.length() > 0) || (skullSkin != null && skullSkin.length() > 0)) {
3736
ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner, skullSkin);
3837
if (Database.hasReturningKeys()) {
3938
resultSet.next();

src/main/java/net/coreprotect/database/logger/SkullPlaceLogger.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.sql.PreparedStatement;
44
import java.sql.ResultSet;
5-
import java.util.Locale;
65

76
import org.bukkit.Material;
87
import org.bukkit.block.BlockState;
@@ -33,9 +32,9 @@ public static void log(PreparedStatement preparedStmt, PreparedStatement prepare
3332
Skull skull = (Skull) block;
3433
String skullOwner = "";
3534
String skullSkin = null;
36-
if (skull.hasOwner()) {
37-
skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull);
38-
skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull);
35+
skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull);
36+
skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull);
37+
if ((skullOwner != null && skullOwner.length() > 0) || (skullSkin != null && skullSkin.length() > 0)) {
3938
ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner, skullSkin);
4039
if (Database.hasReturningKeys()) {
4140
resultSet.next();

src/main/java/net/coreprotect/database/statement/SkullStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static void getData(Statement statement, BlockState block, String query)
5252
}
5353

5454
String skin = resultSet.getString("skin");
55-
if (owner != null && skin != null && skin.length() > 0) {
55+
if (skin != null && skin.length() > 0) {
5656
PaperAdapter.ADAPTER.setSkullSkin(skull, skin);
5757
}
5858
}

src/main/java/net/coreprotect/paper/PaperAdapter.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import org.bukkit.Bukkit;
77
import org.bukkit.Location;
8+
import org.bukkit.OfflinePlayer;
89
import org.bukkit.Server;
910
import org.bukkit.block.Sign;
1011
import org.bukkit.block.Skull;
@@ -30,6 +31,7 @@ public class PaperAdapter implements PaperInterface {
3031
public static final int PAPER_V1_19 = BukkitAdapter.BUKKIT_V1_19;
3132
public static final int PAPER_V1_20 = BukkitAdapter.BUKKIT_V1_20;
3233
public static final int PAPER_V1_21 = BukkitAdapter.BUKKIT_V1_21;
34+
public static final int PAPER_V26_0 = BukkitAdapter.BUKKIT_V26_0;
3335

3436
public static void loadAdapter() {
3537
int paperVersion = ConfigHandler.SERVER_VERSION;
@@ -53,10 +55,15 @@ public static void loadAdapter() {
5355
PaperAdapter.ADAPTER = new Paper_v1_17();
5456
break;
5557
case PAPER_V1_20:
58+
PaperAdapter.ADAPTER = new Paper_v1_20();
59+
break;
5660
case PAPER_V1_21:
57-
default:
5861
PaperAdapter.ADAPTER = new Paper_v1_20();
5962
break;
63+
case PAPER_V26_0:
64+
default:
65+
PaperAdapter.ADAPTER = new Paper_26_0();
66+
break;
6067
}
6168
}
6269

@@ -82,7 +89,12 @@ public void teleportAsync(Entity entity, Location location) {
8289

8390
@Override
8491
public String getSkullOwner(Skull skull) {
85-
return skull.getOwningPlayer().getUniqueId().toString();
92+
OfflinePlayer player = skull.getOwningPlayer();
93+
if (player == null || player.getUniqueId() == null) {
94+
return null;
95+
}
96+
97+
return player.getUniqueId().toString();
8698
}
8799

88100
@Override
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package net.coreprotect.paper;
2+
3+
import java.util.UUID;
4+
5+
import org.bukkit.block.Skull;
6+
7+
import com.destroystokyo.paper.profile.ProfileProperty;
8+
9+
import io.papermc.paper.datacomponent.item.ResolvableProfile;
10+
import net.coreprotect.config.Config;
11+
import net.coreprotect.utility.ErrorReporter;
12+
13+
public class Paper_26_0 extends Paper_v1_20 {
14+
15+
@Override
16+
public String getSkullOwner(Skull skull) {
17+
ResolvableProfile profile = skull.getProfile();
18+
if (profile == null) {
19+
return null;
20+
}
21+
22+
UUID uuid = profile.uuid();
23+
if (uuid != null) {
24+
return uuid.toString();
25+
}
26+
27+
String owner = profile.name();
28+
if (Config.getGlobal().MYSQL && owner != null && owner.length() > 255) {
29+
return owner.substring(0, 255);
30+
}
31+
32+
return owner;
33+
}
34+
35+
@Override
36+
public void setSkullOwner(Skull skull, String owner) {
37+
if (owner == null || owner.length() == 0) {
38+
return;
39+
}
40+
41+
ResolvableProfile.Builder builder = copyProfile(skull.getProfile(), true);
42+
if (owner.length() >= 32 && owner.contains("-")) {
43+
builder.uuid(UUID.fromString(owner));
44+
}
45+
else if (owner.length() <= 16) {
46+
builder.name(owner);
47+
}
48+
else {
49+
super.setSkullOwner(skull, owner);
50+
return;
51+
}
52+
53+
skull.setProfile(builder.build());
54+
}
55+
56+
@Override
57+
public String getSkullSkin(Skull skull) {
58+
ResolvableProfile profile = skull.getProfile();
59+
if (profile != null) {
60+
for (ProfileProperty property : profile.properties()) {
61+
String skin = SkullSkin.getStorageValue(property);
62+
if (skin != null) {
63+
return skin;
64+
}
65+
}
66+
}
67+
68+
return super.getSkullSkin(skull);
69+
}
70+
71+
@Override
72+
public void setSkullSkin(Skull skull, String skin) {
73+
try {
74+
if (skin == null || skin.length() == 0) {
75+
return;
76+
}
77+
78+
ProfileProperty property = SkullSkin.getTexturesProperty(skin);
79+
if (property == null) {
80+
String skinUrl = SkullSkin.getSkinUrl(skin);
81+
if (skinUrl == null) {
82+
return;
83+
}
84+
85+
property = new ProfileProperty("textures", SkullSkin.getTexturesPropertyValue(skinUrl));
86+
}
87+
88+
ResolvableProfile.Builder builder = copyProfile(skull.getProfile(), false);
89+
builder.addProperty(property);
90+
skull.setProfile(builder.build());
91+
}
92+
catch (Exception e) {
93+
ErrorReporter.report(e);
94+
}
95+
}
96+
97+
private ResolvableProfile.Builder copyProfile(ResolvableProfile profile, boolean includeSkin) {
98+
ResolvableProfile.Builder builder = ResolvableProfile.resolvableProfile();
99+
if (profile == null) {
100+
return builder;
101+
}
102+
103+
if (profile.uuid() != null) {
104+
builder.uuid(profile.uuid());
105+
}
106+
if (profile.name() != null) {
107+
builder.name(profile.name());
108+
}
109+
if (profile.skinPatch() != null) {
110+
builder.skinPatch(profile.skinPatch());
111+
}
112+
113+
for (ProfileProperty property : profile.properties()) {
114+
if (includeSkin || !SkullSkin.isTexturesProperty(property)) {
115+
builder.addProperty(property);
116+
}
117+
}
118+
119+
return builder;
120+
}
121+
122+
}

src/main/java/net/coreprotect/paper/Paper_v1_20.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,14 @@ public String getLine(Sign sign, int line) {
3131

3232
@Override
3333
public String getSkullOwner(Skull skull) {
34-
String owner = skull.getPlayerProfile().getName();
35-
if (skull.getPlayerProfile().getId() != null) {
36-
owner = skull.getPlayerProfile().getId().toString();
34+
PlayerProfile playerProfile = skull.getPlayerProfile();
35+
if (playerProfile == null) {
36+
return null;
37+
}
38+
39+
String owner = playerProfile.getName();
40+
if (playerProfile.getId() != null) {
41+
owner = playerProfile.getId().toString();
3742
}
3843
else if (Config.getGlobal().MYSQL && owner != null && owner.length() > 255) {
3944
return owner.substring(0, 255);
@@ -44,7 +49,11 @@ else if (Config.getGlobal().MYSQL && owner != null && owner.length() > 255) {
4449

4550
@Override
4651
public void setSkullOwner(Skull skull, String owner) {
47-
if (owner != null && owner.length() >= 32 && owner.contains("-")) {
52+
if (owner == null || owner.length() == 0) {
53+
return;
54+
}
55+
56+
if (owner.length() >= 32 && owner.contains("-")) {
4857
skull.setPlayerProfile(Bukkit.createProfile(UUID.fromString(owner)));
4958
}
5059
else {
@@ -54,7 +63,12 @@ public void setSkullOwner(Skull skull, String owner) {
5463

5564
@Override
5665
public String getSkullSkin(Skull skull) {
57-
URL skin = skull.getPlayerProfile().getTextures().getSkin();
66+
PlayerProfile playerProfile = skull.getPlayerProfile();
67+
if (playerProfile == null) {
68+
return null;
69+
}
70+
71+
URL skin = playerProfile.getTextures().getSkin();
5872
if (skin == null) {
5973
return null;
6074
}
@@ -65,9 +79,22 @@ public String getSkullSkin(Skull skull) {
6579
@Override
6680
public void setSkullSkin(Skull skull, String skin) {
6781
try {
82+
if (skin == null || skin.length() == 0) {
83+
return;
84+
}
85+
86+
String skinUrl = SkullSkin.getSkinUrl(skin);
87+
if (skinUrl == null) {
88+
return;
89+
}
90+
6891
PlayerProfile playerProfile = skull.getPlayerProfile();
92+
if (playerProfile == null) {
93+
playerProfile = Bukkit.createProfile(UUID.randomUUID());
94+
}
95+
6996
PlayerTextures textures = playerProfile.getTextures();
70-
textures.setSkin(URI.create(skin).toURL());
97+
textures.setSkin(URI.create(skinUrl).toURL());
7198
playerProfile.setTextures(textures);
7299
skull.setPlayerProfile(playerProfile);
73100
}

0 commit comments

Comments
 (0)