Thread: 592 Matrix not saving character looks

Page 1 of 2 12 LastLast
Results 1 to 10 of 13
  1. #1 592 Matrix not saving character looks 
    Registered Member
    Join Date
    Feb 2010
    Posts
    70
    Thanks given
    1
    Thanks received
    4
    Rep Power
    0
    Just trying to figure out if anyone knows how to fix the problem with the 592 matrix release, you can change the clothes, but upon wearing an item it will revert back to the original character design upon logging in for the first time

    I Found a way to kind of get it to save, however, it will keep switching the hair styles depending on what item you're wearing in a slot, so tops will change to a style, gloves will change a style etc.

    Problem: https://i.imgur.com/0HslTNp.png - Then reverts once wielding/wearing an item https://i.imgur.com/bnEvX7P.png



    Appearence.java:

    Code:
    package com.rs.game.player;
    
    import java.io.Serializable;
    
    import com.rs.cache.loaders.NPCDefinitions;
    import com.rs.game.World;
    import com.rs.game.item.Item;
    import com.rs.io.OutputStream;
    import com.rs.utils.Utils;
    
    public class Appearence implements Serializable {
    
    	private static final long serialVersionUID = 7655608569741626586L;
    
    	private transient int renderEmote;
    	private int title;
    	private int[] lookI;
    	private byte[] colour;
    	private boolean male;
    	private transient boolean glowRed;
    	private transient byte[] appeareanceData;
    	private transient byte[] md5AppeareanceDataHash;
    	private transient short transformedNpcId;
    	private transient boolean hidePlayer;
    
    	private transient int forcedWeapon, forcedShield, forcedAmulet;
    
    	private transient Player player;
    
    	public Appearence() {
    		male = true;
    		renderEmote = -1;
    		title = 0;
    		resetAppearence();
    	}
    
    	public void setGlowRed(boolean glowRed) {
    		this.glowRed = glowRed;
    		generateAppearenceData();
    	}
    
    	public void setPlayer(Player player) {
    		this.player = player;
    		transformedNpcId = -1;
    		renderEmote = -1;
    		forcedWeapon = forcedShield = forcedAmulet = -1;
    		if (lookI == null)
    			resetAppearence();
    		else
    			for (int i = 0; i < lookI.length; i++) { // temp fix
    				if (lookI[i] >= 16384 || lookI[i] < 0) {
    					resetAppearence();
    					break;
    				}
    			}
    	}
    
    	public void transformIntoNPC(int id) {
    		transformedNpcId = (short) id;
    		generateAppearenceData();
    	}
    
    	public void switchHidden() {
    		hidePlayer = !hidePlayer;
    		generateAppearenceData();
    	}
    
    	public void setHidden(boolean hidden) {
    		hidePlayer = hidden;
    		generateAppearenceData();
    	}
    
    	public boolean isHidden() {
    		return hidePlayer;
    	}
    
    	public boolean isGlowRed() {
    		return glowRed;
    	}
    
    	public void generateAppearenceData() {
    		OutputStream stream = new OutputStream();
    		int flag = 0;
    		if (!male)
    			flag |= 0x1;
    		if (transformedNpcId >= 0 && NPCDefinitions.getNPCDefinitions(transformedNpcId).aBoolean3190)
    			flag |= 0x2;
    		stream.writeByte(flag);
    		stream.writeByte(title);
    		stream.writeByte(player.hasSkull() ? player.getSkullId() : -1); // pk//icon
    		stream.writeByte(player.getPrayer().getPrayerHeadIcon()); // prayer icon
    		// npc
    		if (transformedNpcId >= 0) {
    			stream.writeShort(-1); // 65535 tells it a npc
    			stream.writeShort(transformedNpcId);
    			stream.writeByte(0);
    		} else {
    			for (int index = 0; index < 4; index++) {
    				if (index == Equipment.SLOT_WEAPON && forcedWeapon != -1)
    					stream.writeShort(16384 + forcedWeapon);
    				else if (index == Equipment.SLOT_AMULET && forcedAmulet != -1)
    					stream.writeShort(16384 + forcedAmulet);
    				else {
    					Item item = player.getEquipment().getItems().get(index);
    					if (item == null)
    						stream.writeByte(0);
    					else
    						stream.writeShort(16384 + item.getId());
    				}
    			}
    			Item item = player.getEquipment().getItems().get(Equipment.SLOT_CHEST);
    			stream.writeShort(item == null ? 0x100 + lookI[2] : 16384 + item.getId());
    			item = player.getEquipment().getItems().get(Equipment.SLOT_SHIELD);
    			if (item == null || forcedShield != -1) {
    				if (forcedShield == -1)
    					stream.writeByte(0);
    				else
    					stream.writeShort(16384 + forcedShield);
    			} else
    				stream.writeShort(16384 + item.getId());
    			item = player.getEquipment().getItems().get(Equipment.SLOT_CHEST);
    			if (item == null || !Equipment.hideArms(item))
    				stream.writeShort(0x100 + lookI[3]);
    			else
    				stream.writeByte(0);
    			item = player.getEquipment().getItems().get(Equipment.SLOT_LEGS);
    			stream.writeShort(item == null ? 0x100 + lookI[5] : 16384 + item.getId());
    			item = player.getEquipment().getItems().get(Equipment.SLOT_HAT);
    			if ((item == null || !Equipment.hideHair(item)))
    				stream.writeShort(0x100 + lookI[0]);
    			else
    				stream.writeByte(0);
    			item = player.getEquipment().getItems().get(Equipment.SLOT_HANDS);
    			stream.writeShort(item == null ? 0x100 + lookI[4] : 16384 + item.getId());
    			item = player.getEquipment().getItems().get(Equipment.SLOT_FEET);
    			stream.writeShort(item == null ? 0x100 + lookI[6] : 16384 + item.getId());
    			// tits for female, bear for male
    			item = player.getEquipment().getItems().get(male ? Equipment.SLOT_HAT : Equipment.SLOT_CHEST);
    			if (item == null || (male && Equipment.showBear(item)))
    				stream.writeShort(0x100 + lookI[1]);
    			else
    				stream.writeByte(0);
    
    		}
    
    		for (int index = 0; index < colour.length; index++)
    			// colour length 5
    			stream.writeByte(colour[index]);
    
    		stream.writeShort(getRenderEmote());
    		stream.writeString(Utils.formatPlayerNameForDisplay(player.getDisplayName()));
    		boolean pvpArea = World.isPvpArea(player);
    		stream.writeByte(pvpArea ? player.getSkills().getCombatLevel() : player.getSkills().getCombatLevelWithSummoning());
    		stream.writeByte(pvpArea ? player.getSkills().getCombatLevelWithSummoning() : 0);
    		stream.writeByte(-1); // higher level acc name appears in front :P
    		stream.writeByte(transformedNpcId >= 0 ? 1 : 0); // to end here else id
    		// need to send more
    		// data
    		if (transformedNpcId >= 0) {
    			NPCDefinitions defs = NPCDefinitions.getNPCDefinitions(transformedNpcId);
    			stream.writeShort(defs.anInt876);
    			stream.writeShort(defs.anInt842);
    			stream.writeShort(defs.anInt884);
    			stream.writeShort(defs.anInt875);
    			stream.writeByte(defs.anInt875);
    		}
    
    		// done separated for safe because of synchronization
    		byte[] appeareanceData = new byte[stream.getOffset()];
    		System.arraycopy(stream.getBuffer(), 0, appeareanceData, 0, appeareanceData.length);
    		byte[] md5Hash = Utils.encryptUsingMD5(appeareanceData);
    		this.appeareanceData = appeareanceData;
    		md5AppeareanceDataHash = md5Hash;
    	}
    
    	public int getSize() {
    		if (transformedNpcId >= 0)
    			return NPCDefinitions.getNPCDefinitions(transformedNpcId).size;
    		return 1;
    	}
    
    	public void setRenderEmote(int id) {
    		this.renderEmote = id;
    		generateAppearenceData();
    	}
    
    	public int getRenderEmote() {
    		if (renderEmote >= 0)
    			return renderEmote;
    		if (transformedNpcId >= 0)
    			return NPCDefinitions.getNPCDefinitions(transformedNpcId).renderEmote;
    		return player.getEquipment().getWeaponRenderEmote();
    	}
    
    	public void resetAppearence() {
    		lookI = new int[7];
    		colour = new byte[5];
    		male();
    	}
    
    	public void male() {
    		lookI[0] = 8; // Hair
    		lookI[1] = 14; // Beard
    		lookI[2] = 18; // Torso
    		lookI[3] = 26; // Arms
    		lookI[4] = 34; // Bracelets
    		lookI[5] = 38; // Legs
    		lookI[6] = 42; // Shoes~
    
    		colour[2] = 15;
    		colour[1] = 15;
    		colour[0] = 5;
    		male = true;
    	}
    
    	public void female() {
    		lookI[0] = 223; // Hair
    		lookI[1] = 1000; // Beard
    		lookI[2] = 57; // Torso
    		lookI[3] = 65; // Arms
    		lookI[4] = 68; // Bracelets
    		lookI[5] = 77; // Legs
    		lookI[6] = 80; // Shoes
    
    		colour[2] = 16;
    		colour[1] = 16;
    		colour[0] = 3;
    		male = false;
    	}
    
    	public byte[] getAppeareanceData() {
    		return appeareanceData;
    	}
    
    	public byte[] getMD5AppeareanceDataHash() {
    		return md5AppeareanceDataHash;
    	}
    
    	public boolean isMale() {
    		return male;
    	}
    
    	public void setLook(int i, int i2) {
    		lookI[i] = i2;
    	}
    
    	public void setColor(int i, int i2) {
    		colour[i] = (byte) i2;
    	}
    
    	public void setMale(boolean male) {
    		this.male = male;
    	}
    
    	public void setHairStyle(int i) {
    		lookI[0] = i;
    	}
    
    	public void setTopStyle(int i) {
    		lookI[2] = i;
    	}
    
    	public void setBootsStyle(int i) {
    		lookI[6] = i;
    	}
    
    	public int getTopStyle() {
    		return lookI[2];
    	}
    
    	public int getArmsStyle() {
    		return lookI[3];
    	}
    
    	public int getWristStyle() {
    		return lookI[4];
    	}
    
    	public int getLegsStyle() {
    		return lookI[5];
    	}
    
    	public void setArmsStyle(int i) {
    		lookI[3] = i;
    	}
    
    	public void setWristsStyle(int i) {
    		lookI[4] = i;
    	}
    
    	public void setLegsStyle(int i) {
    		lookI[5] = i;
    	}
    
    	public int getHairStyle() {
    		return lookI[0];
    	}
    
    	public void setBeardStyle(int i) {
    		lookI[1] = i;
    	}
    
    	public int getBeardStyle() {
    		return lookI[1];
    	}
    
    	public void setSkinColor(int color) {
    		colour[4] = (byte) color;
    	}
    
    	public int getSkinColor() {
    		return colour[4];
    	}
    
    	public void setHairColor(int color) {
    		colour[0] = (byte) color;
    	}
    
    	public void setTopColor(int color) {
    		colour[1] = (byte) color;
    	}
    
    	public void setLegsColor(int color) {
    		colour[2] = (byte) color;
    	}
    
    	public int getTopColor() {
    		return colour[1];
    	}
    
    	public int getLegsColor() {
    		return colour[2];
    	}
    
    	public int getHairColor() {
    		return colour[0];
    	}
    
    	public int getBootColor() {
    		return colour[3];
    	}
    
    	public void setBootsColor(int color) {
    		colour[3] = (byte) color;
    	}
    
    	public void setColours(byte[] colours) {
    		this.colour = colours;
    	}
    
    	public byte[] getColours() {
    		return colour;
    	}
    
    	public void setTitle(int title) {
    		this.title = title;
    		generateAppearenceData();
    	}
    
    	public boolean isNPC() {
    		return transformedNpcId != -1;
    	}
    
    	public int getForcedWeapon() {
    		return forcedWeapon;
    	}
    
    	public void setForcedWeapon(int forcedWeapon) {
    		this.forcedWeapon = forcedWeapon;
    		generateAppearenceData();
    	}
    
    	public int getForcedShield() {
    		return forcedShield;
    	}
    
    	public void setForcedShield(int forcedShield) {
    		this.forcedShield = forcedShield;
    		generateAppearenceData();
    	}
    
    	public int getForcedAmulet() {
    		return forcedAmulet;
    	}
    
    	public void setForcedAmulet(int forcedAmulet) {
    		this.forcedAmulet = forcedAmulet;
    		generateAppearenceData();
    	}
    
    	public int[] getLooks() {
    		return lookI;
    	}
    }
    Playerlook.java:

    Code:
    package com.rs.game.player.content;
    
    import java.util.TimerTask;
    
    import com.rs.cache.loaders.ClientScriptMap;
    import com.rs.cache.loaders.GeneralRequirementMap;
    import com.rs.cores.CoresManager;
    import com.rs.game.Animation;
    import com.rs.game.Graphics;
    import com.rs.game.player.Player;
    import com.rs.game.tasks.WorldTask;
    import com.rs.game.tasks.WorldTasksManager;
    import com.rs.utils.Logger;
    
    public final class PlayerLook {
    
    	public static void openCharacterCustomizing(Player player) {
    		showBooth(player);
    		player.getPackets().sendRootInterface(900, 0);
    //		player.getPackets().sendIComponentSettings(900, 73, 0, ClientScriptMap.getMap(2348).getSize() * 2, 0);
    //		player.getPackets().sendIComponentSettings(900, 66, 0, 130, 0);
    
    	}
    
    	public static void handleCharacterCustomizingButtons(Player player, int buttonId, int slotId) {
    		boolean male = player.getAppearence().isMale();
    		final int SKIN = 0;
    		final int HAIR = 1;
    		final int BEARD = 2;
    		final int TOP = 3;
    		final int SLEEVES = 4;
    		final int HANDS = 5;
    		final int LEGS = 6;
    		final int BOOTS = 7;
    
    		if (buttonId == 81) { // confirm
    			player.getPackets().sendRootInterface(player.getInterfaceManager().hasRezizableScreen() ? 746 : 548, 0);
    			player.getTemporaryAttributtes().remove("design_option");
    			player.getAppearence().generateAppearenceData();
    			hideBooth(player);
    
    		} else if (buttonId == 27) {
    			setDesign(player, 0, buttonId - 103);
    
    		} else if (buttonId == 15 || buttonId == 20) {
    			setGender(player, buttonId == 15);
    			CoresManager.fastExecutor.schedule(new TimerTask() {
    				@Override
    				public void run() {
    					try {
    						WorldTasksManager.schedule(new WorldTask() {
    
    							@Override
    							public void run() {
    								if (player.isDead())
    									return;
    								player.getPackets().sendRunScriptBlank(2731);
    							}
    						});
    					} catch (Throwable e) {
    						Logger.handle(e);
    					}
    				}
    			}, 600);
    
    		} else if (buttonId >= 33 && buttonId <= 61) {
    			int option = (buttonId - 33) / 4;
    			player.getTemporaryAttributtes().put("design_option", option);
    		} else if (buttonId == 73) { // color
    			int colourIndex = (slotId - 1) / 2;
    			Integer designIndex = (Integer) player.getTemporaryAttributtes().get("design_option");
    			if (designIndex == SKIN || designIndex == null) {
    				setSkin(player, colourIndex);
    			} else if (designIndex == HAIR) {
    				player.getAppearence().setHairColor(ClientScriptMap.getMap(2345).getIntValue(colourIndex));
    
    			} else if (designIndex == TOP) {
    				player.getAppearence().setTopColor(ClientScriptMap.getMap(2349).getIntValue(colourIndex));
    			} else if (designIndex == LEGS) {
    				player.getAppearence().setLegsColor(ClientScriptMap.getMap(2351).getIntValue(colourIndex));
    			} else if (designIndex == BOOTS) {
    				player.getAppearence().setBootsColor(ClientScriptMap.getMap(1589).getIntValue(colourIndex) - 3680);
    			}
    		} else if (buttonId == 66) { // styles
    			int styleIndex = (slotId - 2) / 3;
    			Integer designIndex = (Integer) player.getTemporaryAttributtes().get("design_option");
    
    			if (designIndex == HAIR || designIndex == null) {
    				// 2341 female hair styles
    				int hairId = GeneralRequirementMap.getMap(ClientScriptMap.getMap(!male ? 2341 : 2338).getIntValue(styleIndex)).getIntValue(791);
    				player.getAppearence().setHairStyle(hairId);
    
    			} else if (designIndex == BEARD && male) {
    				int beardId = ClientScriptMap.getMap(703).getIntValue(styleIndex);
    				player.getAppearence().setBeardStyle(beardId);
    			} else if (designIndex == TOP) {
    				int topId = ClientScriptMap.getMap(male ? 690 : 1591).getIntValue(styleIndex);
    				player.getAppearence().setTopStyle(topId);
    			} else if (designIndex == SLEEVES) {
    				int sleeves = ClientScriptMap.getMap(male ? 711 : 693).getIntValue(styleIndex);
    				player.getAppearence().setArmsStyle(sleeves);
    			} else if (designIndex == HANDS) {
    				int wristId = ClientScriptMap.getMap(male ? 749 : 751).getIntValue(styleIndex);
    				player.getAppearence().setWristsStyle(wristId);
    			} else if (designIndex == LEGS) {
    				int legsId = ClientScriptMap.getMap(male ? 1586 : 1607).getIntValue(styleIndex);
    				player.getAppearence().setLegsStyle(legsId);
    			} else if (designIndex == BOOTS) {
    				int bootsIndex = ClientScriptMap.getMap(male ? 1136 : 1137).getIntValue(styleIndex);
    				player.getAppearence().setBootsStyle(bootsIndex);
    			}
    
    		}
    
    	}
    
    	public static void setGender(Player player, boolean male) {
    		if (player.getAppearence().isMale() == male)
    			return;
    
    		if (!male)
    			player.getAppearence().female();
    		else
    			player.getAppearence().male();
    		player.getAppearence().generateAppearenceData();
    	}
    
    	public static void setSkin(Player player, int index) {
    		player.getAppearence().setSkinColor(ClientScriptMap.getMap(748).getIntValue(index));
    	}
    
    	public static void setDesign(Player player, int index1, int index2) {
    		int map1 = ClientScriptMap.getMap(3278).getIntValue(index1);
    		if (map1 == 0)
    			return;
    		boolean male = player.getAppearence().isMale();
    		int map2Id = GeneralRequirementMap.getMap(map1).getIntValue((male ? 1169 : 1175) + index2);
    		if (map2Id == 0)
    			return;
    		GeneralRequirementMap map = GeneralRequirementMap.getMap(map2Id);
    		for (int i = 1182; i <= 1186; i++) {
    			int value = map.getIntValue(i);
    			if (value == -1)
    				continue;
    			player.getAppearence().setLook(i - 1180, value);
    		}
    		for (int i = 1187; i <= 1190; i++) {
    			int value = map.getIntValue(i);
    			if (value == -1)
    				continue;
    			player.getAppearence().setColor(i - 1186, value);
    		}
    		if (!player.getAppearence().isMale())
    			player.getAppearence().setBeardStyle(player.getAppearence().getHairStyle());
    
    	}
    
    	public static void handleMageMakeOverButtons(Player player, int buttonId) {
    		if (buttonId == 14 || buttonId == 16 || buttonId == 15 || buttonId == 17)
    			player.getTemporaryAttributtes().put("MageMakeOverGender", buttonId == 14 || buttonId == 16);
    		else if (buttonId >= 20 && buttonId <= 27) {
    
    			int skin;
    
    			if (buttonId == 20)
    				skin = 7;
    			else
    				skin = buttonId - 21;
    
    			player.getTemporaryAttributtes().put("MageMakeOverSkin", skin);
    		} else if (buttonId == 36) {
    			Boolean male = (Boolean) player.getTemporaryAttributtes().remove("MageMakeOverGender");
    			Integer skin = (Integer) player.getTemporaryAttributtes().remove("MageMakeOverSkin");
    			player.closeInterfaces();
    			if (male == null || skin == null)
    				return;
    			if (male == player.getAppearence().isMale() && skin == player.getAppearence().getSkinColor())
    				player.getDialogueManager().startDialogue("MakeOverMage", 2676, 1);
    			else {
    				player.getDialogueManager().startDialogue("MakeOverMage", 2676, 2);
    				if (player.getAppearence().isMale() != male) {
    					if (player.getEquipment().wearingArmour()) {
    						player.getDialogueManager().startDialogue("SimpleMessage", "You cannot have armour on while " + "changing your gender!");
    						return;
    					}
    					if (male)
    						player.getAppearence().resetAppearence();
    					else
    						player.getAppearence().female();
    				}
    				player.getAppearence().setSkinColor(skin);
    				player.getAppearence().generateAppearenceData();
    			}
    		}
    	}
    
    	public static void handleHairdresserSalonButtons(Player player, int buttonId, int slotId) {// Hair
    		// and
    		// color
    		// match
    		// button
    		// count
    		// so
    		// just
    		// loop
    		// and
    		// do ++, but cant find button ids
    		if (buttonId == 6)
    			player.getTemporaryAttributtes().put("hairSaloon", true);
    		else if (buttonId == 7)
    			player.getTemporaryAttributtes().put("hairSaloon", false);
    		else if (buttonId == 18) {
    			player.closeInterfaces();
    		} else if (buttonId == 10) {
    			Boolean hairSalon = (Boolean) player.getTemporaryAttributtes().get("hairSaloon");
    			if (hairSalon != null && hairSalon) {
    				int value = (int) ClientScriptMap.getMap(player.getAppearence().isMale() ? 2339 : 2342).getKeyForValue(slotId / 2);
    				if (value == -1)
    					return;
    				player.getAppearence().setHairStyle(value);
    			} else if (player.getAppearence().isMale()) {
    				int value = ClientScriptMap.getMap(703).getIntValue(slotId / 2);
    				if (value == -1)
    					return;
    				player.getAppearence().setBeardStyle(value);
    			}
    		} else if (buttonId == 16) {
    			int value = ClientScriptMap.getMap(2345).getIntValue(slotId / 2);
    			if (value == -1)
    				return;
    			player.getAppearence().setHairColor(value);
    		}
    	}
    
    	// interface 900 is char customize
    
    	public static void openMageMakeOver(Player player) {
    		player.getInterfaceManager().sendInterface(205);
    		player.getPackets().sendIComponentText(205, 36, "CONFIRM(0 GOLD)");
    		player.getVarsManager().sendVarBit(6098, player.getAppearence().isMale() ? 0 : 1);
    		player.getVarsManager().sendVarBit(6099, player.getAppearence().getSkinColor());
    		player.getTemporaryAttributtes().put("MageMakeOverGender", player.getAppearence().isMale());
    		player.getTemporaryAttributtes().put("MageMakeOverSkin", player.getAppearence().getSkinColor());
    	}
    
    	public static void handleThessaliasMakeOverButtons(Player player, int buttonId, int slotId) {
    
    		if (buttonId == 91)
    			player.getTemporaryAttributtes().put("ThessaliasMakeOver", 0);
    		else if (buttonId == 92) {
    			// if (ClientScriptMap.getMap(
    			// player.getAppearence().isMale() ? 690 : 1591)
    			// .getKeyForValue(player.getAppearence().getTopStyle()) >= 32) {
    			player.getTemporaryAttributtes().put("ThessaliasMakeOver", 1);
    			// } else
    			// player.getSocialManager().sendGameMessage(
    			// "You can't select different arms to go with that top.");
    		} else if (buttonId == 93)
    			player.getTemporaryAttributtes().put("ThessaliasMakeOver", 3);
    		else if (buttonId == 87) { // confirm
    			player.getTemporaryAttributtes().put("makeover_confirm", Boolean.TRUE);
    			player.closeInterfaces();
    		} else if (buttonId >= 81 && buttonId <= 85) { // set part
    			Integer stage = (Integer) player.getTemporaryAttributtes().get("ThessaliasMakeOver");
    			if (stage == null || stage == 0) {
    				int offset = player.getAppearence().isMale() ? 14 : 11;
    
    				player.getAppearence().setTopStyle((int) ClientScriptMap.getMap(player.getAppearence().isMale() ? 690 : 1591).getIntValue(slotId >= offset ? (slotId - offset) : slotId));
    				player.getAppearence().setArmsStyle(player.getAppearence().isMale() ? 26 : 65); // default
    				player.getAppearence().setWristsStyle(player.getAppearence().isMale() ? 34 : 68); // default
    			} else if (stage == 1) { // arms
    				int offset = player.getAppearence().isMale() ? 12 : 11;
    				player.getAppearence().setArmsStyle((int) ClientScriptMap.getMap(player.getAppearence().isMale() ? 711 : 693).getIntValue(slotId >= offset ? (slotId - offset) : slotId));
    			} else {
    				int offset = player.getAppearence().isMale() ? 11 : 16;
    				player.getAppearence().setLegsStyle((int) ClientScriptMap.getMap(player.getAppearence().isMale() ? 1586 : 1607).getIntValue(slotId >= offset ? slotId - offset : slotId));
    			}
    			player.getAppearence().generateAppearenceData();
    
    		} else if (buttonId == 79) {// color
    			Integer stage = (Integer) player.getTemporaryAttributtes().get("ThessaliasMakeOver");
    			if (stage == null || stage == 0 || stage == 1)
    				player.getAppearence().setTopColor(ClientScriptMap.getMap(2349).getIntValue(slotId - 29));
    			else if (stage == 3)
    				player.getAppearence().setLegsColor(ClientScriptMap.getMap(2349).getIntValue(slotId - 29));
    		}
    		player.getAppearence().generateAppearenceData();
    	}
    
    	public static void openThessaliasMakeOver(final Player player) {
    		if (player.getEquipment().wearingArmour()) {
    			player.getDialogueManager().startDialogue("SimpleNPCMessage", 548, "You're not able to try on my clothes with all that armour. Take it off and then speak to me again.");
    			return;
    		}
    		player.getInterfaceManager().sendInterface(729);
    		showBooth(player);
    		int[] oldLooks = new int[player.getAppearence().getLooks().length];
    		byte[] oldColours = new byte[player.getAppearence().getColours().length];
    		System.arraycopy(player.getAppearence().getLooks(), 0, oldLooks, 0, player.getAppearence().getLooks().length);
    		System.arraycopy(player.getAppearence().getColours(), 0, oldColours, 0, player.getAppearence().getColours().length);
    
    		player.getTemporaryAttributtes().put("old_styles", oldLooks);
    		player.getTemporaryAttributtes().put("old_colours", oldColours);
    
    		player.getPackets().sendRunScriptBlank(333); // scroll bars
    		player.getPackets().sendIComponentText(729, 88, "Free!");
    		player.getTemporaryAttributtes().put("ThessaliasMakeOver", 0);
    		for (int i = 0; i < 80; i++) {
    			player.getPackets().sendHideIComponent(729, i, false);
    		}
    		// unlock tops
    		player.getPackets().sendIComponentSettings(729, 81, 0, ClientScriptMap.getMap(689).getSize() * 2, 0);
    		// unlock wrists
    		player.getPackets().sendIComponentSettings(729, 83, 0, ClientScriptMap.getMap(702).getSize() * 2, 0);
    		// unlock legs
    		player.getPackets().sendIComponentSettings(729, 85, 0, (ClientScriptMap.getMap(1585).getSize() * 2) + 9, 0);
    		// unlock colors
    		player.getPackets().sendIComponentSettings(729, 79, 0, ClientScriptMap.getMap(2348).getSize() * 2, 0);
    
    		player.setCloseInterfacesEvent(new Runnable() {
    
    			@Override
    			public void run() {
    				int[] oldStyles = (int[]) player.getTemporaryAttributtes().remove("old_styles");
    				byte[] oldColours = (byte[]) player.getTemporaryAttributtes().remove("old_colours");
    
    				if (player.getTemporaryAttributtes().containsKey("makeover_confirm")) {
    					player.getDialogueManager().startDialogue("SimpleNPCMessage", 548, "A marvellous choice. You look splendid!");
    					player.getTemporaryAttributtes().remove("ThessaliasMakeOver");
    					player.getTemporaryAttributtes().remove("makeover_confirm");
    				} else {
    					for (int i = 0; i < oldStyles.length; i++) {
    						player.getAppearence().setLook(i, oldStyles[i]);
    					}
    
    					for (int j = 0; j < oldColours.length; j++) {
    						player.getAppearence().setColor(j, oldColours[j]);
    					}
    
    					player.getAppearence().generateAppearenceData();
    
    				}
    				hideBooth(player);
    			}
    
    		});
    	}
    
    	public static void openHairdresserSalon(final Player player) {
    		if (player.getEquipment().getHatId() != -1) {
    			player.getDialogueManager().startDialogue("SimpleNPCMessage", 598, "I'm afraid I can't see your head at the moment. Please remove your headgear first.");
    			return;
    		}
    		if (player.getEquipment().getWeaponId() != -1 || player.getEquipment().getShieldId() != -1) {
    			player.getDialogueManager().startDialogue("SimpleNPCMessage", 598, "I don't feel comfortable cutting hair when you are wielding something. Please remove what you are holding first.");
    			return;
    		}
    
    		showBooth(player);
    		player.getInterfaceManager().sendInterface(309);
    		player.getPackets().sendIComponentSettings(309, 10, 0, ClientScriptMap.getMap(player.getAppearence().isMale() ? 2339 : 2342).getSize() * 2, 0);
    		player.getPackets().sendIComponentSettings(309, 16, 0, ClientScriptMap.getMap(2345).getSize() * 2, 0);
    		player.getPackets().sendIComponentText(309, 20, "Free!");
    		player.getTemporaryAttributtes().put("hairSaloon", true);
    		player.setCloseInterfacesEvent(new Runnable() {
    
    			@Override
    			public void run() {
    				player.getDialogueManager().startDialogue("SimpleNPCMessage", 598, "An excellent choise, " + (player.getAppearence().isMale() ? "sir" : "lady") + ".");
    				player.setNextAnimation(new Animation(-1));
    				player.getAppearence().getAppeareanceData();
    				player.getTemporaryAttributtes().remove("hairSaloon");
    				hideBooth(player);
    			}
    
    		});
    	}
    
    	public static void openYrsaShop(final Player player) {
    		if (player.getEquipment().getBootsId() != -1) {
    			player.getDialogueManager().startDialogue("SimpleNPCMessage", 1301, "I don't feel comfortable helping you try on new boots when you are wearing some already.", "Please remove your boots first.");
    			return;
    		}
    		player.getInterfaceManager().sendInterface(728);
    		player.getPackets().sendIComponentText(728, 87, "No Cost");
    		player.getTemporaryAttributtes().put("YrsaBoot", 0);
    		player.getTemporaryAttributtes().put("old_shoe_colour", player.getAppearence().getBootColor());
    		player.getPackets().sendIComponentSettings(728, 84, 0, 11, 0);
    		player.setCloseInterfacesEvent(new Runnable() {
    
    			@Override
    			public void run() {
    				int oldShoeColour = (int) player.getTemporaryAttributtes().remove("old_shoe_colour");
    
    				if (player.getTemporaryAttributtes().containsKey("yrsashoes_confirm")) {
    					player.getDialogueManager().startDialogue("SimpleNPCMessage", 548, "Hey, They look great!");
    					player.getTemporaryAttributtes().remove("YrsaBoot");
    					player.getTemporaryAttributtes().remove("yrsashoes_confirm");
    
    				} else {
    					player.getAppearence().setBootsColor(oldShoeColour);
    					player.getAppearence().generateAppearenceData();
    				}
    
    			}
    		});
    	}
    
    	public static void handleYrsaShoes(Player player, int componentId, int slotId) {
    		if (componentId == 86) {
    			player.getTemporaryAttributtes().put("yrsashoes_confirm", Boolean.TRUE);
    			player.closeInterfaces();
    		} else if (componentId == 84) {// setting the colors.
    			player.getAppearence().setBootsColor(slotId >= 6 ? slotId - 6 : slotId);
    			player.getAppearence().generateAppearenceData();
    		}
    	}
    
    	public static void showBooth(Player player) {
    		player.getTemporaryAttributtes().put("showing_booth", true);
    		player.setNextAnimation(new Animation(11623));
    		player.setNextGraphics(new Graphics(1181));
    		WorldTasksManager.schedule(new WorldTask() {
    
    			@Override
    			public void run() {
    				if (player.hasFinished() || player.isDead() || !player.getTemporaryAttributtes().containsKey("showing_booth")) {
    					stop();
    					return;
    				}
    				player.setNextGraphics(new Graphics(1182));
    			}
    		}, 1, 0);
    
    	}
    
    	public static void hideBooth(Player player) {
    		player.getTemporaryAttributtes().remove("showing_booth");
    		player.setNextAnimation(new Animation(-1));
    		player.setNextGraphics(new Graphics(1183));
    	}
    
    	private PlayerLook() {
    
    	}
    
    }
    Reply With Quote  
     

  2. #2  
    Contributor

    clem585's Avatar
    Join Date
    Sep 2013
    Posts
    3,788
    Thanks given
    706
    Thanks received
    702
    Rep Power
    570
    So the bug happens when you equip an item and the logout/login thing is fixed? Can you post the code related to equiping items?
    Project thread
    Reply With Quote  
     

  3. #3  
    Registered Member
    Join Date
    Feb 2010
    Posts
    70
    Thanks given
    1
    Thanks received
    4
    Rep Power
    0
    No, it still resets when you log in/ log out etc. It just never saves the playerlook at all. I'm pretty sure the ID's are in playerlook?
    Reply With Quote  
     

  4. #4  
    Respected Member


    Kris's Avatar
    Join Date
    Jun 2016
    Age
    26
    Posts
    3,638
    Thanks given
    820
    Thanks received
    2,642
    Rep Power
    5000
    Code:
    	public void setPlayer(Player player) {
    		this.player = player;
    		transformedNpcId = -1;
    		renderEmote = -1;
    		forcedWeapon = forcedShield = forcedAmulet = -1;
    		if (lookI == null)
    			resetAppearence();
    		else
    			for (int i = 0; i < lookI.length; i++) { // temp fix
    				if (lookI[i] >= 16384 || lookI[i] < 0) {
    					resetAppearence();
    					break;
    				}
    			}
    	}
    (This method is from your code above)

    This method is executed when you log in. The player passed as a param is the character file loaded up. Make sure you set the current player's fields to the loaded-character values(the lookI and colour arrays specifically). After that it should save just fine(or rather, load just fine - it's saving it to the file as is just fine, it's just not loading it properly).
    Reply With Quote  
     

  5. #5  
    Contributor

    clem585's Avatar
    Join Date
    Sep 2013
    Posts
    3,788
    Thanks given
    706
    Thanks received
    702
    Rep Power
    570
    Quote Originally Posted by Kris View Post
    Code:
    	public void setPlayer(Player player) {
    		this.player = player;
    		transformedNpcId = -1;
    		renderEmote = -1;
    		forcedWeapon = forcedShield = forcedAmulet = -1;
    		if (lookI == null)
    			resetAppearence();
    		else
    			for (int i = 0; i < lookI.length; i++) { // temp fix
    				if (lookI[i] >= 16384 || lookI[i] < 0) {
    					resetAppearence();
    					break;
    				}
    			}
    	}
    (This method is from your code above)

    This method is executed when you log in. The player passed as a param is the character file loaded up. Make sure you set the current player's fields to the loaded-character values(the lookI and colour arrays specifically). After that it should save just fine(or rather, load just fine - it's saving it to the file as is just fine, it's just not loading it properly).
    I don't think that's the issue. The setPlayer method is just used to a store a local reference to the player (and reset some stuff in this specific case). You don't have to do stuff like:

    Code:
    this.lookI = player.lookI;
    Because that data is already loaded through deserialization. It must be resetAppearence(); getting called somewhere, unless Appearence is reassigned each time the player logs in.
    Project thread
    Reply With Quote  
     

  6. #6  
    Registered Member
    Join Date
    Feb 2010
    Posts
    70
    Thanks given
    1
    Thanks received
    4
    Rep Power
    0
    I was able to get the character to SAVE, however, without legs: https://i.imgur.com/vbgyI4G.png

    I sort of took what I did with my 530 appearance in a way having to individually load it within the confirm button itself for each set appearance, so like legs/torso etc. This ended up saving, and I can log out and log in this way with this, However I'm not sure where to go from here

    Code:
    public static void handleCharacterCustomizingButtons(Player player, int buttonId, int slotId) {
    		boolean male = player.getAppearence().isMale();
    		final int SKIN = 0;
    		final int HAIR = 1;
    		final int BEARD = 2;
    		final int TOP = 3;
    		final int SLEEVES = 4;
    		final int HANDS = 5;
    		final int LEGS = 6;
    		final int BOOTS = 7;
    
    		if (buttonId == 81) { // confirm
    			player.getPackets().sendRootInterface(player.getInterfaceManager().hasRezizableScreen() ? 746 : 548, 0);
    			player.getTemporaryAttributtes().remove("design_option");
    			player.getAppearence().generateAppearenceData();
    			player.getAppearence().setLook(HANDS, 5);// this in specific I added, the number was more so just putting it there for a test. 
    			hideBooth(player);
    Reply With Quote  
     

  7. #7  
    Contributor

    clem585's Avatar
    Join Date
    Sep 2013
    Posts
    3,788
    Thanks given
    706
    Thanks received
    702
    Rep Power
    570
    Quote Originally Posted by Aliases View Post
    I was able to get the character to SAVE, however, without legs: https://i.imgur.com/vbgyI4G.png

    I sort of took what I did with my 530 appearance in a way having to individually load it within the confirm button itself for each set appearance, so like legs/torso etc. This ended up saving, and I can log out and log in this way with this, However I'm not sure where to go from here

    Code:
    public static void handleCharacterCustomizingButtons(Player player, int buttonId, int slotId) {
    		boolean male = player.getAppearence().isMale();
    		final int SKIN = 0;
    		final int HAIR = 1;
    		final int BEARD = 2;
    		final int TOP = 3;
    		final int SLEEVES = 4;
    		final int HANDS = 5;
    		final int LEGS = 6;
    		final int BOOTS = 7;
    
    		if (buttonId == 81) { // confirm
    			player.getPackets().sendRootInterface(player.getInterfaceManager().hasRezizableScreen() ? 746 : 548, 0);
    			player.getTemporaryAttributtes().remove("design_option");
    			player.getAppearence().generateAppearenceData();
    			player.getAppearence().setLook(HANDS, 5);// this in specific I added, the number was more so just putting it there for a test. 
    			hideBooth(player);
    I think your ids are wrong, you're probably corrupting your appearance data:

    Code:
    		lookI[0] = 48; // Hair
    		lookI[1] = 57; // Beard
    		lookI[2] = 57; // Torso
    		lookI[3] = 65; // Arms
    		lookI[4] = 68; // Bracelets
    		lookI[5] = 77; // Legs
    		lookI[6] = 80; // Shoes
    Project thread
    Reply With Quote  
     

  8. #8  
    Respected Member


    Kris's Avatar
    Join Date
    Jun 2016
    Age
    26
    Posts
    3,638
    Thanks given
    820
    Thanks received
    2,642
    Rep Power
    5000
    Quote Originally Posted by clem585 View Post
    I don't think that's the issue. The setPlayer method is just used to a store a local reference to the player (and reset some stuff in this specific case). You don't have to do stuff like:

    Code:
    this.lookI = player.lookI;
    Because that data is already loaded through deserialization. It must be resetAppearence(); getting called somewhere, unless Appearence is reassigned each time the player logs in.
    Right, didn't read into it properly. Too used to the json/non-shit serializations that I forgot how matrix does it entirely.
    I don't really remember what the issue with matrix is so I'm of no use here.
    Reply With Quote  
     

  9. #9  
    Registered Member
    Join Date
    Feb 2010
    Posts
    70
    Thanks given
    1
    Thanks received
    4
    Rep Power
    0
    Quote Originally Posted by clem585 View Post
    I think your ids are wrong, you're probably corrupting your appearance data:

    Code:
    		lookI[0] = 48; // Hair
    		lookI[1] = 57; // Beard
    		lookI[2] = 57; // Torso
    		lookI[3] = 65; // Arms
    		lookI[4] = 68; // Bracelets
    		lookI[5] = 77; // Legs
    		lookI[6] = 80; // Shoes
    So using those ID's just completely set the character as a woman instead of a male, however, in the same clothing. So something is definitely wrong with the ID's here
    Reply With Quote  
     

  10. #10  
    Contributor

    clem585's Avatar
    Join Date
    Sep 2013
    Posts
    3,788
    Thanks given
    706
    Thanks received
    702
    Rep Power
    570
    Quote Originally Posted by Aliases View Post
    So using those ID's just completely set the character as a woman instead of a male, however, in the same clothing. So something is definitely wrong with the ID's here
    Yea these are female IDs on the right. I'm talking about the left indexes (0-6). You're using different ones:

    Code:
    		final int SKIN = 0;
    		final int HAIR = 1;
    		final int BEARD = 2;
    		final int TOP = 3;
    		final int SLEEVES = 4;
    		final int HANDS = 5;
    		final int LEGS = 6;
    		final int BOOTS = 7;
    Project thread
    Reply With Quote  
     

Page 1 of 2 12 LastLast

Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. Replies: 5
    Last Post: 04-16-2016, 04:14 PM
  2. Matrix characters not saving?
    By ozarka cody in forum Help
    Replies: 7
    Last Post: 03-14-2014, 08:57 AM
  3. Player looks will not save?
    By neva doubted in forum Help
    Replies: 3
    Last Post: 12-27-2011, 03:15 AM
  4. [PI] character right not saving
    By Syndicate in forum Help
    Replies: 2
    Last Post: 07-02-2011, 07:34 PM
  5. Replies: 3
    Last Post: 09-14-2008, 07:12 AM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •