Skip to content

Commit

Permalink
feat: Add overlay skin rendering and configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
GeorgeV220 committed Nov 9, 2023
1 parent 17355e0 commit c1d6342
Showing 1 changed file with 69 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.georgev22.library.maps.HashObjectMap;
import com.georgev22.library.maps.ObjectMap;
import com.georgev22.library.yaml.file.FileConfiguration;
import com.georgev22.skinoverlay.SkinOverlay;
import com.georgev22.skinoverlay.exceptions.SkinException;
import com.georgev22.skinoverlay.handler.skin.MinecraftSkinRenderer;
Expand All @@ -11,6 +12,8 @@
import com.georgev22.skinoverlay.utilities.SerializableBufferedImage;
import com.georgev22.skinoverlay.utilities.Utilities;
import com.georgev22.skinoverlay.utilities.config.OptionsUtil;
import com.georgev22.skinoverlay.utilities.config.OverlayOptionsUtil;
import com.georgev22.skinoverlay.utilities.config.SkinConfigurationFile;
import com.georgev22.skinoverlay.utilities.interfaces.ImageSupplier;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import com.google.gson.*;
Expand Down Expand Up @@ -88,64 +91,115 @@ public abstract CompletableFuture<Boolean> updateSkin(
public CompletableFuture<Skin> retrieveOrGenerateSkin(@NotNull PlayerObject playerObject, @Nullable ImageSupplier imageSupplier, @NotNull SkinParts skinParts) {
UUID skinUUID = Utilities.generateUUID(skinParts.getSkinName() + playerObject.playerUUID().toString());
return skinOverlay.getSkinManager().exists(skinUUID).thenApply(result -> {
if (result && skinOverlay.getSkinManager().getEntity(skinUUID).join() instanceof Skin skin) {
if (result) {
skinOverlay.getLogger().info("Skin: " + skinUUID + " found for player: " + playerObject.playerName());
return skin;
return skinOverlay.getSkinManager().getLoadedEntities().get(skinUUID);
} else {
try {
if (imageSupplier == null) {
skinOverlay.getLogger().log(Level.SEVERE, "ImageSupplier cannot be null", new SkinException("ImageSupplier cannot be null"));
return null;
}

Image overlay = imageSupplier.get();
SkinConfigurationFile skinConfigurationFile = this.skinOverlay.getSkinFileCache().getCacheSkinConfig(skinParts.getSkinName());

BufferedImage currentSkin = this.getSkinImage(this.getProfileBytes(playerObject, null));
if (skinConfigurationFile == null) {
skinOverlay.getLogger().log(Level.SEVERE, "SkinConfigurationFile cannot be null", new SkinException("SkinConfigurationFile cannot be null"));
return null;
}

FileConfiguration fileConfiguration = skinConfigurationFile.getFileConfiguration();

BufferedImage currentSkin = this.getSkinImage(this.getProfileBytes(playerObject, this.skinOverlay.getSkinHook().getProperty(playerObject)));

SkinParts currentSkinParts = new SkinParts(new SerializableBufferedImage(currentSkin), "currentSkin");
currentSkinParts.createParts();

BufferedImage overlay = imageSupplier.get();

List<Part> overlaySkinParts = new ArrayList<>();
for (Part part : skinParts.getParts().values()) {
if (part.name().startsWith("Jacket")) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_OVERLAY_JACKET.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Hat")) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_OVERLAY_HAT.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Left_Sleeve")) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_OVERLAY_LEFT_SLEEVE.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Right_Sleeve")) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_OVERLAY_RIGHT_SLEEVE.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Left_Pants")) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_OVERLAY_LEFT_PANTS.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Right_Pants")) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_OVERLAY_RIGHT_PANTS.getBooleanValue(fileConfiguration)) {
continue;
}
}
overlaySkinParts.add(part);
}

List<Part> newSkinParts = new ArrayList<>();
for (Part part : currentSkinParts.getParts().values()) {
if (part.name().startsWith("Jacket")) {
if (!part.isEmpty() & !OptionsUtil.PARTS_OVERLAY_JACKET.getBooleanValue(skinParts.getSkinName())) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_PLAYER_JACKET.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Hat")) {
if (!part.isEmpty() & !OptionsUtil.PARTS_OVERLAY_HAT.getBooleanValue(skinParts.getSkinName())) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_PLAYER_HAT.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Left_Sleeve")) {
if (!part.isEmpty() & !OptionsUtil.PARTS_OVERLAY_LEFT_SLEEVE.getBooleanValue(skinParts.getSkinName())) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_PLAYER_LEFT_SLEEVE.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Right_Sleeve")) {
if (!part.isEmpty() & !OptionsUtil.PARTS_OVERLAY_RIGHT_SLEEVE.getBooleanValue(skinParts.getSkinName())) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_PLAYER_RIGHT_SLEEVE.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Left_Pants")) {
if (!part.isEmpty() & !OptionsUtil.PARTS_OVERLAY_LEFT_PANTS.getBooleanValue(skinParts.getSkinName())) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_PLAYER_LEFT_PANTS.getBooleanValue(fileConfiguration)) {
continue;
}
}
if (part.name().startsWith("Right_Pants")) {
if (!part.isEmpty() & !OptionsUtil.PARTS_OVERLAY_RIGHT_PANTS.getBooleanValue(skinParts.getSkinName())) {
if (!part.isEmpty() & !OverlayOptionsUtil.PARTS_PLAYER_RIGHT_PANTS.getBooleanValue(fileConfiguration)) {
continue;
}
}
newSkinParts.add(part);
}
MinecraftSkinRenderer minecraftSkinRenderer = new MinecraftSkinRenderer(newSkinParts.toArray(Part[]::new));
minecraftSkinRenderer.createFullSkinImage();

MinecraftSkinRenderer defaultSkinRenderer = new MinecraftSkinRenderer(newSkinParts.toArray(Part[]::new));
defaultSkinRenderer.createFullSkinImage();

MinecraftSkinRenderer overlaySkinRenderer = new MinecraftSkinRenderer(overlaySkinParts.toArray(Part[]::new));
overlaySkinRenderer.createFullSkinImage();

BufferedImage skinToBeGenerated = new BufferedImage(currentSkin.getWidth(), currentSkin.getHeight(), 2);
Graphics2D canvas = skinToBeGenerated.createGraphics();
canvas.drawImage(minecraftSkinRenderer.getFullSkinImage().getBufferedImage(), 0, 0, null);
canvas.drawImage(overlay, 0, 0, null);

canvas.drawImage(defaultSkinRenderer.getFullSkinImage().getBufferedImage(), 0, 0, null);
canvas.drawImage(overlaySkinRenderer.getFullSkinImage().getBufferedImage(), 0, 0, null);
canvas.dispose();

Texture texture = mineskinClient.generateUpload(skinToBeGenerated).get().data.texture;
if (texture == null) {
throw new SkinException("Texture cannot be null");
Expand Down Expand Up @@ -367,7 +421,7 @@ public SProperty getXUIDSkin(final String xuid) throws IOException {
* @throws InterruptedException When a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted
*/
public SProperty getJavaSkin(final PlayerObject playerObject) throws IOException, ExecutionException, InterruptedException {
if (skinOverlay.getSkinHook() != null && skinOverlay.getSkinHook().getProperty(playerObject) != null) {
if (skinOverlay.getSkinHook().getProperty(playerObject) != null) {
return skinOverlay.getSkinHook().getProperty(playerObject);
}
return skinOverlay.getDefaultSkinHook().getProperty(playerObject);
Expand Down

0 comments on commit c1d6342

Please sign in to comment.