package com.rs2.game.players;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

import com.rs2.util.Misc;

public class PlayerSave {

	/**
	 * Loading
	 **/
	public static int loadGame(Client player, String playerName, String playerPass) {
		return loadPlayerInfo(player, playerName, playerPass, true);
	}

	public static int loadPlayerInfo(Client player, String playerName, String playerPass, boolean doRealLogin)	{
		String line = "";
		String token = "";
		String token2 = "";
		String[] token3 = new String[3];
		boolean EndOfFile = false;
		int ReadMode = 0;
		BufferedReader characterfile = null;
		boolean File1 = false;

		if (player.playerName == null) {
			System.out.println("WARNING: called loadPlayerInfo with a Client who does not have a .playerName");
		}
		try {
			characterfile = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/data/characters/" + player.playerName + ".txt"));
			File1 = true;
		} catch (FileNotFoundException fileex1) {
		}

		if (File1) {
			// new File ("./characters/"+playerName+".txt");
		} else {
			if (playerName.equals(""))
			{
				//it's the .gitignore :P
				return 0;
			}
			Misc.println(playerName + ": character file not found.");
			player.newPlayer = false;
			return 0;
		}
		try {
			line = characterfile.readLine();
		} catch (IOException ioexception) {
			Misc.println(playerName + ": error loading file.");
			return 3;
		}
		while (EndOfFile == false && line != null) {
			line = line.trim();
			int spot = line.indexOf("=");
			if (spot > -1) {
				token = line.substring(0, spot);
				token = token.trim();
				token2 = line.substring(spot + 1);
				token2 = token2.trim();
				token3 = token2.split("\t+");
				switch (ReadMode) {
					case 1:
					    if (!doRealLogin)
							break;
						if (token.equals("character-password")) {
							if (playerPass.equalsIgnoreCase(token2) || passwordHash(playerPass).equalsIgnoreCase(token2)) {
								player.playerPass = token2; //Valid password
							} else {
							    System.out.println("hash doesn't match: " + passwordHash(playerPass).toLowerCase());
							    System.out.println("currently is: " + passwordHash(token2).toLowerCase());
	 							return 3; //Invalid password
							}
						}
						break;
					case 2:
						switch (token) {
							case "character-height":
								player.heightLevel = Integer.parseInt(token2);
								player.teleHeight = Integer.parseInt(token2);
								break;
							case "character-posx":
								player.teleportToX = Integer.parseInt(token2) <= 0 ? player.lastX : Integer.parseInt(token2);
								break;
							case "character-posy":
								player.teleportToY = Integer.parseInt(token2) <= 0 ? player.lastY : Integer.parseInt(token2);
								break;
							case "character-rights":
								player.playerRights = Integer.parseInt(token2);
								break;
							case "xp-rate":
								player.xpRate = Integer.parseInt(token2);
							case "last-ip":
								player.lastConnectedFrom = token2;
								break;
							case "isBot":
								player.isBot = Boolean.parseBoolean(token2);
								break;
							case "hideYell":
								player.hideYell = Boolean.parseBoolean(token2);
								break;
							case "blackMarks":
								player.blackMarks = Integer.parseInt(token2);
								break;
							case "lostCannon":
								player.lostCannon = Boolean.parseBoolean(token2);
								break;
							case "myBalls":
								player.getCannon().myBalls = Integer.parseInt(token2);
								break;
							case "ratsCaught":
								player.ratsCaught = Integer.parseInt(token2);
								break;
							case "cannonX":
								player.cannonX = Integer.parseInt(token2);
								break;
							case "cannonY":
								player.cannonY = Integer.parseInt(token2);
								break;
							case "removedTask0":
								player.removedTasks[0] = Integer.parseInt(token2);
								break;
							case "removedTask1":
								player.removedTasks[1] = Integer.parseInt(token2);
								break;
							case "removedTask2":
								player.removedTasks[2] = Integer.parseInt(token2);
								break;
							case "removedTask3":
								player.removedTasks[3] = Integer.parseInt(token2);
								break;
							case "SlayerMaster":
								player.SlayerMaster = Integer.parseInt(token2);
								break;
							case "slayerTask":
								player.slayerTask = Integer.parseInt(token2);
								break;
							case "slayerPoints":
								player.slayerPoints = Integer.parseInt(token2);
								break;
							case "taskAmount":
								player.taskAmount = Integer.parseInt(token2);
								break;
							case "cw-games":
								player.cwGames = Integer.parseInt(token2);
								break;
							case "crystal-bow-shots":
								player.crystalBowArrowCount = Integer.parseInt(token2);
								break;
							case "randomActions":
								player.randomActions = Integer.parseInt(token2);
								break;
							case "debugMode":
								player.debugMode = Boolean.parseBoolean(token2);
								break;
							case "global-damage":
								player.globalDamageDealt = Integer.parseInt(token2);
								break;
							case "skull-timer":
								player.skullTimer = Integer.parseInt(token2);
								break;
							case "recoilHits":
								player.recoilHits = Integer.parseInt(token2);
								break;
							case "brightness":
								player.brightness = Integer.parseInt(token2);
								break;
							case "spiritTree":
								player.spiritTree = Boolean.parseBoolean(token2);
								break;
							case "npcCanAttack":
								player.npcCanAttack = Boolean.parseBoolean(token2);
								break;
							case "rope":
								player.rope = Boolean.parseBoolean(token2);
								break;
							case "rope2":
								player.rope2 = Boolean.parseBoolean(token2);
								break;
							case "recievedMask":
								player.recievedMask = Boolean.parseBoolean(token2);
								break;
							case "recievedReward":
								player.recievedReward = Boolean.parseBoolean(token2);
								break;
							case "splitChat":
								player.splitChat = Boolean.parseBoolean(token2);
								break;
							case "hasPaid":
								player.hasPaid = Boolean.parseBoolean(token2);
								break;
							case "poison":
								player.poison = Boolean.parseBoolean(token2);
								break;
							case "closeTutorialInterface":
								player.closeTutorialInterface = Boolean
										.parseBoolean(token2);
								break;
							case "canWalkTutorial":
								player.canWalkTutorial = Boolean.parseBoolean(token2);
								break;
							case "needsNewTask":
								player.needsNewTask = Boolean.parseBoolean(token2);
								break;
							case "musicOn":
								player.musicOn = Boolean.parseBoolean(token2);
								break;
							case "barrowsNpcs":
								player.barrowsNpcs[Integer.parseInt(token3[0])][1] = Integer.parseInt(token3[1]);
								break;
							case "summonId":
								player.summonId = Integer.parseInt(token2);
								break;
							case "has-npc":
								player.hasNpc = Boolean.parseBoolean(token2);
								break;
							case "barrowsKillCount":
								player.barrowsKillCount = Integer.parseInt(token2);
								break;
							case "luthas":
								player.luthas = Boolean.parseBoolean(token2);
								break;
							case "village":
								player.village = Boolean.parseBoolean(token2);
								break;
							case "lastThieve":
								player.lastThieve = Long.parseLong(token2);
								break;
							case "homeTele":
								player.homeTele = Long.parseLong(token2);
								break;
							case "tutorial-progress":
								player.tutorialProgress = Integer.parseInt(token2);
								break;
							case "strongHold":
								player.strongHold = Boolean.parseBoolean(token2);
								break;
							case "filter":
								player.filter = Boolean.parseBoolean(token2);
								break;
							case "ratdied2":
								player.ratdied2 = Boolean.parseBoolean(token2);
								break;
							case "randomToggle":
								player.randomEventsEnabled = Boolean.parseBoolean(token2);
								break;
							case "questStages":
								player.questStages = Integer.parseInt(token2);
								break;
							case "cookAss":
								player.cookAss = Integer.parseInt(token2);
								break;
							case "bananas":
								player.bananas = Integer.parseInt(token2);
								break;
							case "sheepShear":
								player.sheepShear = Integer.parseInt(token2);
								break;
							case "runeMist":
								player.runeMist = Integer.parseInt(token2);
								break;
							case "doricQuest":
								player.doricQuest = Integer.parseInt(token2);
								break;
							case "blackKnight":
								player.blackKnight = Integer.parseInt(token2);
								break;
							case "shieldArrav":
								player.shieldArrav = Integer.parseInt(token2);
								break;
							case "pirateTreasure":
								player.pirateTreasure = Integer.parseInt(token2);
								break;
							case "romeo-juliet":
								player.romeojuliet = Integer.parseInt(token2);
								break;
							case "vampSlayer":
								player.vampSlayer = Integer.parseInt(token2);
								break;
							case "gertCat":
								player.gertCat = Integer.parseInt(token2);
								break;
							case "witchspot":
								player.witchspot = Integer.parseInt(token2);
								break;
							case "lostCity":
								player.lostCity = Integer.parseInt(token2);
								break;
							case "ectoTokens":
								player.ectoTokens = Integer.parseInt(token2);
								break;
							case "easterEvent":
								player.easterEvent = Integer.parseInt(token2);
								break;
							case "restGhost":
								player.restGhost = Integer.parseInt(token2);
								break;
							case "impsC":
								player.impsC = Integer.parseInt(token2);
								break;
							case "knightS":
								player.knightS = Integer.parseInt(token2);
								break;
							case "lastX":
								player.lastX = Integer.parseInt(token2);
								break;
							case "lastY":
								player.lastY = Integer.parseInt(token2);
								break;
							case "lastH":
								player.lastH = Integer.parseInt(token2);
								break;
							case "hasStarter":
								player.hasStarter = Boolean.parseBoolean(token2);
								break;
							case "canSpeak":
								player.canSpeak = Boolean.parseBoolean(token2);
								break;
							case "questPoints":
								player.questPoints = Integer.parseInt(token2);
								break;
							case "votePoints":
								player.votePoints = Integer.parseInt(token2);
								break;
							case "magic-book":
								player.playerMagicBook = Integer.parseInt(token2);
								break;
							case "special-amount":
								player.specAmount = Double.parseDouble(token2);
								break;
							case "selected-coffin":
								player.randomCoffin = Integer.parseInt(token2);
								break;
							case "isRunning":
								player.isRunning2 = Boolean.parseBoolean(token2);
								break;
							case "character-energy":
								player.playerEnergy = Integer.parseInt(token2);
								break;
							case "teleblock-length":
								player.teleBlockDelay = System.currentTimeMillis();
								player.teleBlockLength = Integer.parseInt(token2);
								break;
							case "lastYell":
								player.lastYell = Long.parseLong(token2);
								break;
							case "pc-points":
								player.pcPoints = Integer.parseInt(token2);
								break;
							case "magePoints":
								player.magePoints = Integer.parseInt(token2);
								break;
							case "autoRet":
								player.autoRet = Integer.parseInt(token2);
								break;
							case "flagged":
								player.accountFlagged = Boolean.parseBoolean(token2);
								break;
							case "lastLoginDate":
								player.lastLoginDate = Integer.parseInt(token2);
								break;
							case "hasBankpin":
								player.hasBankpin = Boolean.parseBoolean(token2);
								break;
							case "setPin":
								player.setPin = Boolean.parseBoolean(token2);
								break;
							case "pinRegisteredDeleteDay":
								player.pinDeleteDateRequested = Integer.parseInt(token2);
								break;
							case "requestPinDelete":
								player.requestPinDelete = Boolean.parseBoolean(token2);
								break;
							case "bankPin1":
								player.bankPin1 = Integer.parseInt(token2);
								break;
							case "bankPin2":
								player.bankPin2 = Integer.parseInt(token2);
								break;
							case "bankPin3":
								player.bankPin3 = Integer.parseInt(token2);
								break;
							case "bankPin4":
								player.bankPin4 = Integer.parseInt(token2);
								break;
							case "wave":
								player.waveId = Integer.parseInt(token2);
								break;
							case "ptjob":
								player.ptjob = Integer.parseInt(token2);
								break;
							case "creationAddress":
								player.creationAddress = token2;
								break;
							case "music":
								for (int j = 0; j < token3.length; j++) {
									player.getPlayList().unlocked[j] = Boolean.parseBoolean(token3[j]);
								}
								break;
							case "void":
								for (int j = 0; j < token3.length; j++) {
									player.voidStatus[j] = Integer.parseInt(token3[j]);
								}
								break;
							case "gwkc":
								player.killCount = Integer.parseInt(token2);
								break;
							case "fightMode":
								player.fightMode = Integer.parseInt(token2);
								break;
							case "ectofuntusWorshipped":
								player.ectofuntusWorshipped = Integer.parseInt(token2);
								break;
							case "graveyard-points":
								player.graveyardPoints = Integer.parseInt(token2);
								break;
							case "alchemy-points":
								player.alchemyPoints = Integer.parseInt(token2);
								break;
							case "enchantment-points":
								player.enchantmentPoints = Integer.parseInt(token2);
								break;
							case "telekinetic-points":
								player.telekineticPoints = Integer.parseInt(token2);
								break;
							case "telekinetic-mazes-solved":
								player.telekineticMazesSolved = Integer.parseInt(token2);
								break;
							case "unlocked-bones-to-peaches":
								player.unlockedBonesToPeaches = Boolean.parseBoolean(token2);
								break;
							case "discord-user-id":
								player.discordCode = token2;
								break;
						}
						break;
					case 3:
						if (token.equals("character-equip")) {
							player.playerEquipment[Integer.parseInt(token3[0])] = Integer.parseInt(token3[1]);
							player.playerEquipmentN[Integer.parseInt(token3[0])] = Integer.parseInt(token3[2]);
						}
						break;
					case 4:
						if (token.equals("character-look")) {
							player.playerAppearance[Integer.parseInt(token3[0])] = Integer	.parseInt(token3[1]);
						}
						break;
					case 5:
						if (token.equals("character-skill")) {
							player.playerLevel[Integer.parseInt(token3[0])] = Integer.parseInt(token3[1]);
							player.playerXP[Integer.parseInt(token3[0])] = Integer.parseInt(token3[2]);
						}
						break;
					case 6:
						if (token.equals("character-item")) {
							player.playerItems[Integer.parseInt(token3[0])] = Integer.parseInt(token3[1]);
							player.playerItemsN[Integer.parseInt(token3[0])] = Integer.parseInt(token3[2]);
						}
						break;
					case 7:
						if (token.equals("character-bank")) {
							player.bankItems[Integer.parseInt(token3[0])] = Integer.parseInt(token3[1]);
							player.bankItemsN[Integer.parseInt(token3[0])] = Integer.parseInt(token3[2]);
							player.bankItemsV[Integer.parseInt(token3[0])] = token3.length > 3 ? Integer.parseInt(token3[3]) : 1;
						}
						break;
					case 8:
						if (token.equals("character-friend")) {
							player.friends[Integer.parseInt(token3[0])] = Long.parseLong(token3[1]);
						}
						break;
					case 9:
						if (token.equals("character-ignore")) {
							player.ignores[Integer.parseInt(token3[0])] = Long.parseLong(token3[1]);
						}
						break;
				}
			} else {
				switch (line) {
					case "[ACCOUNT]":
						ReadMode = 1;
						break;
					case "[CHARACTER]":
						ReadMode = 2;
						break;
					case "[EQUIPMENT]":
						ReadMode = 3;
						break;
					case "[LOOK]":
						ReadMode = 4;
						break;
					case "[SKILLS]":
						ReadMode = 5;
						break;
					case "[ITEMS]":
						ReadMode = 6;
						break;
					case "[BANK]":
						ReadMode = 7;
						break;
					case "[FRIENDS]":
						ReadMode = 8;
						break;
					case "[IGNORES]":
						ReadMode = 9;
						break;
					case "[EOF]":
						try {
							characterfile.close();
						} catch (IOException ignored) {
						}
						return 1;
				}
			}
			try {
				line = characterfile.readLine();
			} catch (IOException ioexception1) {
				EndOfFile = true;
			}
		}
		try {
			characterfile.close();
		} catch (IOException ignored) {
		}
		if (doRealLogin)
			return 13;
		else
			return 14;
	}

	public static String passwordHash(String token2) {
	    String hashed = "HAS HAS FAILED!";
		try {
			MessageDigest digest = MessageDigest.getInstance("MD5");
			byte[] hash = digest.digest(token2.getBytes(StandardCharsets.UTF_8));

			hashed = Base64.getEncoder().encodeToString(hash);

			digest = MessageDigest.getInstance("SHA-256");
			hash = digest.digest(hashed.getBytes(StandardCharsets.UTF_8));

			hashed = Base64.getEncoder().encodeToString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return hashed;
	}

	/**
	 * Saving
	 **/
	public static boolean saveGame(Player player) {
		if (!player.saveFile || player.newPlayer || !player.saveCharacter) {
			// System.out.println("first");
			return false;
		}
		if (player.playerName == null
				|| PlayerHandler.players[player.playerId] == null) {
			// System.out.println("second");
			return false;
		}
		player.playerName = player.playerName2;
		int tbTime = (int) (player.teleBlockDelay - System.currentTimeMillis() + player.teleBlockLength);
		if (tbTime > 300000 || tbTime < 0) {
			tbTime = 0;
		}

		BufferedWriter characterfile = null;
		try {
			String filePath = System.getProperty("user.dir") + "/data/characters/" + player.playerName + ".txt";
			new File(filePath).getParentFile().mkdir();
			characterfile = new BufferedWriter(new FileWriter(filePath));

			/* ACCOUNT */
			characterfile.write("[ACCOUNT]");
			characterfile.newLine();
			characterfile.write("character-username = " + player.playerName);
			characterfile.newLine();
			if (player.playerPass.length() < 40) {
				player.playerPass = passwordHash(player.playerPass);
			}
			characterfile.write("character-password = " + player.playerPass);
			characterfile.newLine();
			characterfile.newLine();

			/* CHARACTER */
			characterfile.write("[CHARACTER]");
			characterfile.newLine();
			characterfile.write("character-height = " + player.heightLevel);
			characterfile.newLine();
			characterfile.write("character-posx = " + player.absX);
			characterfile.newLine();
			characterfile.write("character-posy = " + player.absY);
			characterfile.newLine();
			characterfile.write("character-rights = " + player.playerRights);
			characterfile.newLine();
			characterfile.write("xp-rate = " + player.xpRate);
			characterfile.newLine();
			characterfile.write("last-ip = " + player.connectedFrom);
			characterfile.newLine();
			characterfile.write("isBot = " + player.isBot);
			characterfile.newLine();
			characterfile.write("hideYell = " + player.hideYell);
			characterfile.newLine();
			characterfile.write("hasStarter = " + player.hasStarter);
			characterfile.newLine();
			characterfile.write("bankPin1 = " + player.bankPin1);
			characterfile.newLine();
			characterfile.write("bankPin2 = " + player.bankPin2);
			characterfile.newLine();
			characterfile.write("bankPin3 = " + player.bankPin3);
			characterfile.newLine();
			characterfile.write("bankPin4 = " + player.bankPin4);
			characterfile.newLine();
			characterfile.write("hasBankpin = " + player.hasBankpin);
			characterfile.newLine();
			characterfile.write("pinRegisteredDeleteDay = " + player.pinDeleteDateRequested);
			characterfile.newLine();
			characterfile.write("requestPinDelete = " + player.requestPinDelete);
			characterfile.newLine();
			characterfile.write("lastLoginDate = " + player.lastLoginDate);
			characterfile.newLine();
			characterfile.write("setPin = " + player.setPin);
			characterfile.newLine();
			characterfile.write("hasPaid = " + player.hasPaid);
			characterfile.newLine();
			characterfile.write("lostCannon = " + player.lostCannon);
			characterfile.newLine();
			characterfile.write("ratsCaught = " + player.ratsCaught);
			characterfile.newLine();
			characterfile.write("cannonX = " + player.cannonX);
			characterfile.newLine();
			characterfile.write("cannonY = " + player.cannonY);
			characterfile.newLine();
			characterfile.write("myBalls = " + player.getCannon().myBalls);
			characterfile.newLine();
			characterfile.write("poison = " + player.poison);
			characterfile.newLine();
			characterfile.write("spiritTree = " + player.spiritTree);
			characterfile.newLine();
			characterfile.write("npcCanAttack = " + player.npcCanAttack);
			characterfile.newLine();
			characterfile.write("rope = " + player.rope);
			characterfile.newLine();
			characterfile.write("rope2 = " + player.rope2);
			characterfile.newLine();
			characterfile.write("recievedMask = " + player.recievedMask);
			characterfile.newLine();
			characterfile.write("recievedReward = " + player.recievedReward);
			characterfile.newLine();
			characterfile.write("global-damage = " + player.globalDamageDealt);
			characterfile.newLine();
			characterfile.write("brightness = " + player.brightness);
			characterfile.newLine();
			characterfile.write("closeTutorialInterface = " + player.closeTutorialInterface);
			characterfile.newLine();
			characterfile.write("canWalkTutorial = " + player.canWalkTutorial);
			characterfile.newLine();
			characterfile.write("village = " + player.village);
			characterfile.newLine();
			characterfile.write("lastThieve = " + player.lastThieve);
			characterfile.newLine();
			characterfile.write("homeTele = " + player.homeTele);
			characterfile.newLine();
			characterfile.write("strongHold = " + player.strongHold);
			characterfile.newLine();
			characterfile.write("character-energy = " + (int) Math.ceil(player.playerEnergy));
			characterfile.newLine();
			characterfile.write("crystal-bow-shots = " + player.crystalBowArrowCount);
			characterfile.newLine();
			characterfile.write("splitChat = " + player.splitChat);
			characterfile.newLine();
			characterfile.write("canSpeak = " + player.canSpeak);
			characterfile.newLine();
			for (int b = 0; b < player.barrowsNpcs.length; b++) {
				characterfile.write("barrowsNpcs = " + b + "\t" + Math.max(0, player.barrowsNpcs[b][1]));
				characterfile.newLine();
			}
			characterfile.write("questStages = " + player.questStages);
			characterfile.newLine();
			characterfile.write("SlayerMaster = " + player.SlayerMaster);
			characterfile.newLine();
			String music = "";
			for (boolean element : player.getPlayList().unlocked) {
				music += element + "\t";
			}
			characterfile.write("music = " + music.trim());
			characterfile.newLine();
			characterfile.write("randomActions = " + player.randomActions);
			characterfile.newLine();
			characterfile.write("blackMarks = " + player.blackMarks);
			characterfile.newLine();
			characterfile.write("tutorial-progress = " + player.tutorialProgress);
			characterfile.newLine();
			characterfile.write("skull-timer = " + player.skullTimer);
			characterfile.newLine();
			characterfile.write("recoilHits = " + player.recoilHits);
			characterfile.newLine();
			characterfile.write("lastX = " + player.lastX);
			characterfile.newLine();
			characterfile.write("lastY = " + player.lastY);
			characterfile.newLine();
			characterfile.write("lastH = " + player.lastH);
			characterfile.newLine();
			for (int i = 0; i < player.removedTasks.length; i++) {
				characterfile.write("removedTask" + i + " = " + player.removedTasks[i]);
				characterfile.newLine();
			}
			characterfile.write("creationAddress = " + player.creationAddress);
			characterfile.newLine();
			characterfile.write("has-npc = " + player.hasNpc);
			characterfile.newLine();
			characterfile.write("summonId = " + player.summonId);
			characterfile.newLine();
			characterfile.write("questPoints = " + player.questPoints);
			characterfile.newLine();
			characterfile.write("votePoints = " + player.votePoints);
			characterfile.newLine();
			characterfile.write("bananas = " + player.bananas);
			characterfile.newLine();
			characterfile.write("magic-book = " + player.playerMagicBook);
			characterfile.newLine();
			characterfile.write("special-amount = " + player.specAmount);
			characterfile.newLine();
			characterfile.write("musicOn = " + player.musicOn);
			characterfile.newLine();
			characterfile.write("needsNewTask = " + player.needsNewTask);
			characterfile.newLine();
			characterfile.write("luthas = " + player.luthas);
			characterfile.newLine();
			characterfile.write("selected-coffin = " + player.randomCoffin);
			characterfile.newLine();
			characterfile.write("runeMist = " + player.runeMist);
			characterfile.newLine();
			characterfile.write("blackKnight = " + player.blackKnight);
			characterfile.newLine();
			characterfile.write("shieldArrav = " + player.shieldArrav);
			characterfile.newLine();
			characterfile.write("cookAss = " + player.cookAss);
			characterfile.newLine();
			characterfile.write("pirateTreasure = " + player.pirateTreasure);
			characterfile.newLine();
			characterfile.write("ptjob = " + player.ptjob);
			characterfile.newLine();
			characterfile.write("doricQuest = " + player.doricQuest);
			characterfile.newLine();
			characterfile.write("impsC = " + player.impsC);
			characterfile.newLine();
			characterfile.write("knightS = " + player.knightS);
			characterfile.newLine();
			characterfile.write("sheepShear = " + player.sheepShear);
			characterfile.newLine();
			characterfile.write("romeo-juliet = " + player.romeojuliet);
			characterfile.newLine();
			characterfile.write("gertCat = " + player.gertCat);
			characterfile.newLine();
			characterfile.write("lostCity = " + player.lostCity);
			characterfile.newLine();
			characterfile.write("ectoTokens = " + player.ectoTokens);
			characterfile.newLine();
			characterfile.write("easterEvent = " + player.easterEvent);
			characterfile.newLine();
			characterfile.write("cw-games = " + player.cwGames);
			characterfile.newLine();
			characterfile.write("witchspot = " + player.witchspot);
			characterfile.newLine();
			characterfile.write("restGhost = " + player.restGhost);
			characterfile.newLine();
			characterfile.write("vampSlayer = " + player.vampSlayer);
			characterfile.newLine();
			characterfile.write("RatDied2 = " + player.ratdied2);
			characterfile.newLine();
			characterfile.write("debugMode = " + player.debugMode);
			characterfile.newLine();
			characterfile.write("randomToggle = " + player.randomEventsEnabled);
			characterfile.newLine();
			characterfile.write("teleblock-length = " + tbTime);
			characterfile.newLine();
			characterfile.write("pc-points = " + player.pcPoints);
			characterfile.newLine();
			characterfile.write("lastYell = " + player.lastYell);
			characterfile.newLine();
			characterfile.write("slayerTask = " + player.slayerTask);
			characterfile.newLine();
			characterfile.write("taskAmount = " + player.taskAmount);
			characterfile.newLine();
			characterfile.write("magePoints = " + player.magePoints);
			characterfile.newLine();
			characterfile.write("autoRet = " + player.autoRet);
			characterfile.newLine();
			characterfile.write("barrowsKillCount = " + player.barrowsKillCount);
			characterfile.newLine();
			characterfile.write("slayerPoints = " + player.slayerPoints);
			characterfile.newLine();
			characterfile.write("flagged = " + player.accountFlagged);
			characterfile.newLine();
			characterfile.write("wave = " + player.waveId);
			characterfile.newLine();
			characterfile.write("gwkc = " + player.killCount);
			characterfile.newLine();
			characterfile.write("isRunning = " + player.isRunning2);
			characterfile.newLine();
			characterfile.write("fightMode = " + player.fightMode);
			characterfile.newLine();
			characterfile.write("ectofuntusWorshipped = " + player.ectofuntusWorshipped);
			characterfile.newLine();
			characterfile.write("graveyard-points = " + player.graveyardPoints);
			characterfile.newLine();
			characterfile.write("alchemy-points = " + player.alchemyPoints);
			characterfile.newLine();
			characterfile.write("enchantment-points = " + player.enchantmentPoints);
			characterfile.newLine();
			characterfile.write("telekinetic-points = " + player.telekineticPoints);
			characterfile.newLine();
			characterfile.write("telekinetic-mazes-solved = " + player.telekineticMazesSolved);
			characterfile.newLine();
			characterfile.write("unlocked-bones-to-peaches = " + player.unlockedBonesToPeaches);
			characterfile.newLine();
			String voidStatus = "";
			for (int voidS : player.voidStatus){
				voidStatus += voidS + "\t";
			}
			characterfile.write("void = " + voidStatus.trim());
			characterfile.newLine();
			characterfile.write("discord-user-id = " + player.discordCode);
			characterfile.newLine();
			characterfile.newLine();

			/* EQUIPMENT */
			characterfile.write("[EQUIPMENT]");
			characterfile.newLine();
			for (int i = 0; i < player.playerEquipment.length; i++) {
				characterfile.write("character-equip = " + i + "\t" + player.playerEquipment[i] + "\t" + player.playerEquipmentN[i]);
				characterfile.newLine();
			}
			characterfile.newLine();

			/* LOOK */
			characterfile.write("[LOOK]");
			characterfile.newLine();
			for (int i = 0; i < player.playerAppearance.length; i++) {
				characterfile.write("character-look = " + i + "\t" + player.playerAppearance[i]);
				characterfile.newLine();
			}
			characterfile.newLine();

			/* SKILLS */
			characterfile.write("[SKILLS]");
			characterfile.newLine();
			for (int i = 0; i < player.playerLevel.length; i++) {
				characterfile.write("character-skill = " + i + "\t" + player.playerLevel[i] + "\t" + player.playerXP[i]);
				characterfile.newLine();
			}
			characterfile.newLine();

			/* ITEMS */
			characterfile.write("[ITEMS]");
			characterfile.newLine();
			for (int i = 0; i < player.playerItems.length; i++) {
				if (player.playerItems[i] > 0) {
					characterfile.write("character-item = " + i + "\t" + player.playerItems[i] + "\t" + player.playerItemsN[i]);
					characterfile.newLine();
				}
			}
			characterfile.newLine();

			/* BANK */
			characterfile.write("[BANK]");
			characterfile.newLine();
			for (int i = 0; i < player.bankItems.length; i++) {
				if (player.bankItems[i] > 0) {
					characterfile.write("character-bank = " + i + "\t" + player.bankItems[i] + "\t" + player.bankItemsN[i] + (player.isBot ? "\t" + player.bankItemsV[i] : ""));
					characterfile.newLine();
				}
			}
			characterfile.newLine();

			/* FRIENDS */
			characterfile.write("[FRIENDS]");
			characterfile.newLine();
			for (int i = 0; i < player.friends.length; i++) {
				if (player.friends[i] > 0) {
					characterfile.write("character-friend = " + i + "\t" + player.friends[i]);
					characterfile.newLine();
				}
			}
			characterfile.newLine();

			characterfile.write("[IGNORES]");
			characterfile.newLine();
			for (int i = 0; i < player.ignores.length; i++) {
				if (player.ignores[i] > 0) {
					characterfile.write("character-ignore = " + i + "\t" + player.ignores[i]);
					characterfile.newLine();
				}
			}
			characterfile.newLine();
			
			/* EOF */
			characterfile.write("[EOF]");
			characterfile.newLine();
			characterfile.close();
		} catch (IOException ioexception) {
			Misc.println(player.playerName + ": error writing file.");
			return false;
		}
		return true;
	}

}
