Update x2
This commit is contained in:
parent
96fd964539
commit
10ac29ba47
@ -2,8 +2,6 @@ package alterwain.offlineskin;
|
||||
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.gui.options.components.BooleanOptionComponent;
|
||||
import net.minecraft.client.option.BooleanOption;
|
||||
import net.minecraft.core.lang.I18n;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
@ -12,7 +10,7 @@ import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
|
||||
import static alterwain.offlineskin.OfflineSkinMod.configPath;
|
||||
import static alterwain.offlineskin.OfflineSkinMod.*;
|
||||
|
||||
public class GuiSkinChanger extends GuiScreen {
|
||||
|
||||
@ -22,6 +20,8 @@ public class GuiSkinChanger extends GuiScreen {
|
||||
private GuiButton modelType;
|
||||
private GuiButton hasCape;
|
||||
|
||||
private I18n stringtranslate;
|
||||
|
||||
|
||||
public GuiSkinChanger(GuiScreen parent) {
|
||||
super(parent);
|
||||
@ -29,42 +29,75 @@ public class GuiSkinChanger extends GuiScreen {
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
I18n stringtranslate = I18n.getInstance();
|
||||
OfflineSkinMod.readConfig();
|
||||
stringtranslate = I18n.getInstance();
|
||||
this.controlList.clear();
|
||||
this.controlList.add(this.modelType = new GuiButton(3, this.width / 2 - 100, this.height / 4 + 2, 200, 20, stringtranslate.translateKey("gui.options.page.edit_skin.button.model_slim")));
|
||||
this.controlList.add(this.hasCape = new GuiButton(4, this.width / 2 - 100, this.height / 4 - 10 + 30 + 4, 200, 20, stringtranslate.translateKey("gui.options.page.edit_skin.button.has_cape_yes")));
|
||||
this.controlList.add(this.modelType = new GuiButton(3, this.width / 2 - 100, this.height / 4 + 2, 200, 20, skinModel ? stringtranslate.translateKey("gui.options.page.edit_skin.button.model_slim") : stringtranslate.translateKey("gui.options.page.edit_skin.button.model_fat")));
|
||||
this.controlList.add(this.hasCape = new GuiButton(4, this.width / 2 - 100, this.height / 4 - 10 + 30 + 4, 200, 20, showCape ? stringtranslate.translateKey("gui.options.page.edit_skin.button.has_cape_yes") : stringtranslate.translateKey("gui.options.page.edit_skin.button.has_cape_no")));
|
||||
this.controlList.add(this.buttonLoadSkin = new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 12, stringtranslate.translateKey("gui.options.page.edit_skin.button.load_skin")));
|
||||
this.controlList.add(this.buttonLoadCape = new GuiButton(1, this.width / 2 - 100, this.height / 4 - 10 + 50 + 18 + 20 + 4, 200, 20, stringtranslate.translateKey("gui.options.page.edit_skin.button.load_cape")));
|
||||
this.controlList.add(this.buttonClose = new GuiButton(2, this.width / 2 - 100, this.height / 4 + 120 + 12, stringtranslate.translateKey("gui.options.page.edit_skin.button.close")));
|
||||
}
|
||||
|
||||
|
||||
private void processSkin() {
|
||||
File skin = OfflineSkinMod.chooseFile();
|
||||
if (skin == null) return;
|
||||
try {
|
||||
OfflineSkinMod.skinImage = ImageIO.read(skin);
|
||||
Files.copy(skin.toPath(), new File(configPath, "skin.png").toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void processCape() {
|
||||
File cape = OfflineSkinMod.chooseFile();
|
||||
if (cape == null) return;
|
||||
try {
|
||||
OfflineSkinMod.capeImage = ImageIO.read(cape);
|
||||
Files.copy(cape.toPath(), new File(configPath, "cape.png").toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void processClose() {
|
||||
this.mc.displayGuiScreen(this.getParentScreen());
|
||||
}
|
||||
|
||||
private void processModelType() {
|
||||
skinModel = !skinModel;
|
||||
this.modelType.displayString = skinModel ? stringtranslate.translateKey("gui.options.page.edit_skin.button.model_slim") : stringtranslate.translateKey("gui.options.page.edit_skin.button.model_fat");
|
||||
writeConfig();
|
||||
}
|
||||
|
||||
private void processHasCape() {
|
||||
showCape = !showCape;
|
||||
this.hasCape.displayString = showCape ? stringtranslate.translateKey("gui.options.page.edit_skin.button.has_cape_yes") : stringtranslate.translateKey("gui.options.page.edit_skin.button.has_cape_no");
|
||||
writeConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buttonPressed(GuiButton button) {
|
||||
try {
|
||||
if (button.enabled) {
|
||||
if (button.id == 2) {
|
||||
this.mc.displayGuiScreen(this.getParentScreen());
|
||||
} else if (button.id == 0) { // skin
|
||||
File skin = OfflineSkinMod.chooseFile();
|
||||
if (skin != null) {
|
||||
OfflineSkinMod.skinImage = ImageIO.read(skin);
|
||||
Files.copy(skin.toPath(), new File(configPath, "skin.png").toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
} else if (button.id == 1) { // cape
|
||||
File cape = OfflineSkinMod.chooseFile();
|
||||
if (cape != null) {
|
||||
OfflineSkinMod.capeImage = ImageIO.read(cape);
|
||||
Files.copy(cape.toPath(), new File(configPath, "cape.png").toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
} else if(button.id == 3) { // model type
|
||||
|
||||
} else if(button.id == 4) { // hasCape
|
||||
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if(!button.enabled) return;
|
||||
switch (button.id) {
|
||||
case 0:
|
||||
processSkin();
|
||||
break;
|
||||
case 1:
|
||||
processCape();
|
||||
break;
|
||||
case 2:
|
||||
processClose();
|
||||
break;
|
||||
case 3:
|
||||
processModelType();
|
||||
break;
|
||||
case 4:
|
||||
processHasCape();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -16,7 +16,10 @@ import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.OpenOption;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
@ -29,17 +32,24 @@ public class OfflineSkinMod implements ModInitializer, GameStartEntrypoint, Reci
|
||||
public static File configPath = new File(Global.accessor.getMinecraftDir(), "config/offlineskin");
|
||||
public static BufferedImage skinImage;
|
||||
public static BufferedImage capeImage;
|
||||
public static Boolean showCape = false;
|
||||
public static Boolean skinModel = false;
|
||||
public static final Map<String, SkinConfig> skins = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
LOGGER.info("ExampleMod initialized.");
|
||||
LOGGER.info("OfflineSkins initialized.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeGameStart() {
|
||||
configPath.mkdirs();
|
||||
try {
|
||||
if(!new File(configPath, "pref.conf").exists()) {
|
||||
writeConfig();
|
||||
} else {
|
||||
readConfig();
|
||||
}
|
||||
if(!new File(configPath, "skin.png").exists()) {
|
||||
BufferedImage i = ImageIO.read(Objects.requireNonNull(OfflineSkinMod.class.getClassLoader().getResourceAsStream("char.png")));
|
||||
ImageIO.write(i, "png", new File(configPath, "skin.png"));
|
||||
@ -70,6 +80,7 @@ public class OfflineSkinMod implements ModInitializer, GameStartEntrypoint, Reci
|
||||
|
||||
public static File chooseFile() {
|
||||
JFileChooser fileChooser = new JFileChooser();
|
||||
fileChooser.setAcceptAllFileFilterUsed(false);
|
||||
FileFilter filter = new FileNameExtensionFilter("PNG File","png");
|
||||
fileChooser.addChoosableFileFilter(filter);
|
||||
int returnValue = fileChooser.showOpenDialog(null);
|
||||
@ -97,4 +108,24 @@ public class OfflineSkinMod implements ModInitializer, GameStartEntrypoint, Reci
|
||||
}
|
||||
return baos.toByteArray();
|
||||
}
|
||||
|
||||
public static void writeConfig() {
|
||||
try {
|
||||
Files.write(new File(configPath, "pref.conf").toPath(), (showCape + ";" + skinModel).getBytes(), StandardOpenOption.CREATE);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void readConfig() {
|
||||
try {
|
||||
String s = new String(Files.readAllBytes(new File(configPath, "pref.conf").toPath()));
|
||||
String[] args = s.split(";");
|
||||
if( args.length != 2 ) return;
|
||||
showCape = Boolean.parseBoolean(args[0]);
|
||||
skinModel = Boolean.parseBoolean(args[1]);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,9 +14,9 @@ import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
@Mixin(NetClientHandler.class)
|
||||
public abstract class NetClientHandlerMixin extends NetHandler implements SkinRequestHandler {
|
||||
@Shadow @Final private NetworkManager netManager;
|
||||
@Shadow(remap = false) @Final private NetworkManager netManager;
|
||||
|
||||
@Shadow @Final private Minecraft mc;
|
||||
@Shadow(remap = false) @Final private Minecraft mc;
|
||||
|
||||
@Override
|
||||
public void offlineSkinChanger$handleSkinRequest(Packet244SkinRequest request) {
|
||||
@ -25,12 +25,12 @@ public abstract class NetClientHandlerMixin extends NetHandler implements SkinRe
|
||||
if( request.isRequestSkin() && OfflineSkinMod.skinImage != null ) {
|
||||
skin = OfflineSkinMod.imageToBytes(OfflineSkinMod.skinImage);
|
||||
}
|
||||
if( request.isRequestCape() && OfflineSkinMod.capeImage != null ) {
|
||||
if( request.isRequestCape() && OfflineSkinMod.capeImage != null && OfflineSkinMod.showCape ) {
|
||||
cape = OfflineSkinMod.imageToBytes(OfflineSkinMod.capeImage);
|
||||
}
|
||||
this.netManager.addToSendQueue(new Packet245SkinResponse(mc.thePlayer.username,
|
||||
skin,
|
||||
cape,
|
||||
false));
|
||||
OfflineSkinMod.skinModel));
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.Shadow;
|
||||
@Mixin(NetServerHandler.class)
|
||||
public abstract class NetServerHandlerMixin extends net.minecraft.core.net.handler.NetHandler implements net.minecraft.core.net.ICommandListener,
|
||||
SkinResponseHandler {
|
||||
@Shadow
|
||||
@Shadow(remap = false)
|
||||
private net.minecraft.server.MinecraftServer mcServer;
|
||||
|
||||
@Override
|
||||
|
@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
@Mixin(OptionsPages.class)
|
||||
public abstract class OptionsPagesMixin {
|
||||
@Final
|
||||
@Shadow
|
||||
@Shadow(remap = false)
|
||||
@Mutable
|
||||
private static Minecraft mc;
|
||||
|
||||
|
@ -1,9 +1,7 @@
|
||||
package alterwain.offlineskin.mixin;
|
||||
|
||||
import alterwain.offlineskin.OfflineSkinMod;
|
||||
import alterwain.offlineskin.SendInfo;
|
||||
import alterwain.offlineskin.packet.Packet244SkinRequest;
|
||||
import alterwain.offlineskin.packet.Packet246SkinSet;
|
||||
import net.minecraft.server.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.server.player.PlayerManager;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
@ -24,7 +22,7 @@ public abstract class PlayerManagerMixin {
|
||||
|
||||
@Inject(method = "addPlayer", at = @At("HEAD"), remap = false)
|
||||
private void onAddPlayer(EntityPlayerMP player, CallbackInfo ci) {
|
||||
player.playerNetServerHandler.sendPacket(new Packet244SkinRequest(true, true, false));
|
||||
player.playerNetServerHandler.sendPacket(new Packet244SkinRequest(true, true, true));
|
||||
new SendInfo(player).start();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package alterwain.offlineskin.mixin;
|
||||
|
||||
import alterwain.offlineskin.OfflineSkinMod;
|
||||
import net.minecraft.client.render.ImageParser;
|
||||
import net.minecraft.client.render.PlayerSkinParser;
|
||||
import net.minecraft.client.render.block.model.BlockModel;
|
||||
@ -45,8 +46,13 @@ public abstract class PlayerRendererMixin extends LivingRenderer<EntityPlayer> {
|
||||
|
||||
public void drawFirstPersonHand(EntityPlayer player) {
|
||||
player.skinURL = "offlineSkinLocal:"+player.username;
|
||||
this.mainModel = player.slimModel ? this.modelSlim : this.modelThick;
|
||||
this.modelBipedMain = player.slimModel ? this.modelSlim : this.modelThick;
|
||||
if(OfflineSkinMod.skins.containsKey(player.username)) {
|
||||
this.mainModel = OfflineSkinMod.skins.get(player.username).getModelType() ? this.modelSlim : this.modelThick;
|
||||
this.modelBipedMain = OfflineSkinMod.skins.get(player.username).getModelType() ? this.modelSlim : this.modelThick;
|
||||
} else {
|
||||
this.mainModel = player.slimModel ? this.modelSlim : this.modelThick;
|
||||
this.modelBipedMain = player.slimModel ? this.modelSlim : this.modelThick;
|
||||
}
|
||||
this.modelBipedMain.onGround = 0.0F;
|
||||
this.modelBipedMain.isRiding = false;
|
||||
this.modelBipedMain.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
|
||||
|
@ -14,16 +14,16 @@ import java.util.Map;
|
||||
@Mixin(RenderEngine.class)
|
||||
public abstract class RenderEngineMixin implements ForceDownloadHandler {
|
||||
|
||||
@Shadow
|
||||
@Shadow(remap = false)
|
||||
private Map<String, DownloadedTexture> downloadedTextures;
|
||||
|
||||
@Shadow
|
||||
@Shadow(remap = false)
|
||||
public abstract int allocateAndSetupTexture(BufferedImage bufferedimage);
|
||||
|
||||
@Shadow
|
||||
@Shadow(remap = false)
|
||||
public abstract void bindTexture(int i);
|
||||
|
||||
@Shadow
|
||||
@Shadow(remap = false)
|
||||
public abstract int getTexture(String name);
|
||||
|
||||
@Override
|
||||
@ -68,7 +68,7 @@ public abstract class RenderEngineMixin implements ForceDownloadHandler {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
DownloadedTexture texture = (DownloadedTexture)this.downloadedTextures.get(url);
|
||||
DownloadedTexture texture = this.downloadedTextures.get(url);
|
||||
if (texture == null) {
|
||||
texture = new DownloadedTexture(null, imageParser);
|
||||
if( url.startsWith("offlineSkinLocal") ) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user