Skip to content

Commit 0be85a6

Browse files
committed
my changes
1 parent 0883ed5 commit 0be85a6

File tree

1 file changed

+61
-1
lines changed

1 file changed

+61
-1
lines changed

src/main/java/cn/nukkit/entity/data/Skin.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
import com.nimbusds.jose.shaded.json.JSONValue;
99
import lombok.ToString;
1010

11+
import javax.imageio.ImageIO;
1112
import java.awt.*;
12-
import java.awt.image.BufferedImage;
13+
import java.awt.image.*;
14+
import java.io.File;
15+
import java.io.IOException;
1316
import java.nio.charset.StandardCharsets;
17+
import java.time.LocalDateTime;
18+
import java.time.format.DateTimeFormatter;
1419
import java.util.List;
1520
import java.util.*;
1621

@@ -121,16 +126,71 @@ public void generateSkinId(String name) {
121126
this.skinId = UUID.nameUUIDFromBytes(data) + "." + name;
122127
}
123128

129+
void dumpSkinData(RenderedImage skinImage) {
130+
try {
131+
LocalDateTime time = LocalDateTime.now();
132+
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy_MM_dd_HH_mm_ss");
133+
File dir = new File("dumped_skins");
134+
if (!dir.exists()) {
135+
dir.mkdir();
136+
}
137+
ImageIO.write(skinImage, "png", new File(dir, time.format(dateTimeFormatter) + ".png"));
138+
} catch (IOException e) {
139+
e.printStackTrace();
140+
}
141+
}
142+
143+
BufferedImage imageFromData(int width, int height, byte[] data) {
144+
DataBuffer buffer = new DataBufferByte(data, data.length);
145+
WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, 4 * width, 4, new int[]{0, 1, 2, 3}, null);
146+
ColorModel cm = new ComponentColorModel(ColorModel.getRGBdefault().getColorSpace(), true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);
147+
return new BufferedImage(cm, raster, true, null);
148+
}
149+
124150
public void setSkinData(byte[] skinData) {
151+
int width;
152+
int height;
153+
switch (skinData.length) {
154+
case SINGLE_SKIN_SIZE:
155+
width = 64;
156+
height = 32;
157+
break;
158+
case DOUBLE_SKIN_SIZE:
159+
width = 64;
160+
height = 64;
161+
break;
162+
case SKIN_128_64_SIZE:
163+
width = 128;
164+
height = 64;
165+
break;
166+
case SKIN_128_128_SIZE:
167+
width = 128;
168+
height = 128;
169+
break;
170+
default:
171+
throw new IllegalArgumentException("Invalid skin");
172+
}
173+
BufferedImage image = imageFromData(width, height, skinData);
174+
dumpSkinData(image);
175+
Server.getInstance().getLogger().info("Saved a player's skin from byte array.");
176+
125177
setSkinData(SerializedImage.fromLegacy(skinData));
126178
}
127179

128180
public void setSkinData(BufferedImage image) {
181+
dumpSkinData(image);
182+
Server.getInstance().getLogger().info("Saved a player's skin from buffered image.");
183+
129184
setSkinData(parseBufferedImage(image));
130185
}
131186

132187
public void setSkinData(SerializedImage skinData) {
133188
Objects.requireNonNull(skinData, "skinData");
189+
190+
BufferedImage image = imageFromData(skinData.width, skinData.height, skinData.data);
191+
dumpSkinData(image);
192+
Server.getInstance().getLogger().info("Saved a player's skin from serialized image.");
193+
134194
this.skinData = skinData;
135195
}
136196

0 commit comments

Comments
 (0)