Jump to content

Lesen und Schreiben von Dateien funktioniert nicht


Recommended Posts

Hallo,

Ich versuche gerade, eine kleine Mod zu schreiben, um eine limitierte Anzahl an Leben für eine PvP-Umgebung zu realisieren.
Dafür habe ich mir eine HashMap erstellt, die ich beim ServerStopped-Event in eine Datei speichern will.

Und nun zum Problem:
Ich habe mir eine save()-Methode geschrieben, die die HashMap in eine Datei schreiben soll und lese die Datei zum Debugging in der selben Methode noch einmal aus.
Diese Methode wird bei ServerStopped-Event ausgeführt.
Dann habe ich eine init()-Methode, die die Datei wieder auslesen und das Ausgelesene in der HashMap speichern soll und somit allen die Anzahl an Leben wiedergeben, die sie beim Speichern der Welt hatten.
Diese Methode wird beim ServerStarted-Event ausgeführt.

Wenn ich nun in eine neue Welt einlogge, dann funktioniert alles perfekt, sobald ich jedoch Speichere & Schließe und wieder in die selbe Welt einlogge habe ich 0 Leben, egal, wie viele ich vorher hatte...
Das Lustige ist, dass der Debug-Code der save()-Methode mir sagt, dass ich die entsprechend richtige Anzahl Leben hätte, wohingegen mir dann der exakt selbe Code in der init()-Methode 0 Leben ausgibt...

Ich kann mir das einfach nicht erklären, ich hab keine Ahnung, was ich falsch mache...
Danke für Hilfe.

Hier der relevante Code (Gibt es keine Spoiler?) :
 

public class Lifes
{
	private static HashMap<String, Byte> playerLifes = new HashMap<String, Byte>();

	/* ————————————————————————————————————————————————————— */

	// On ServerStarted
	public static void init() throws IOException
	{
		Reference.lifeData = new File(Reference.dataDir, "lifes.dat");
		if (!Reference.lifeData.exists())
		{
			// Create the life-data and exit
			Reference.lifeData.createNewFile();
			return;
		}
		try
		{
			DataInputStream datain = new DataInputStream(new FileInputStream(Reference.lifeData));
			int entries = datain.readInt();
			for (int i = 0; i < entries; i++)
			{
				String uuid = datain.readUTF();
				byte lifes = datain.readByte();

				playerLifes.put(uuid, lifes);

				if (Config.debugLogging)
					Logger.info(uuid + " has " + lifes + " lifes left");
			}
			datain.close();
		}
		catch (EOFException ex)
		{
			if (Config.debugLogging)
				Logger.warn("lifes.dat-File empty! (This is not an Error!)");
		}
	}

	// On ServerStopped
	public static void save()
	{
		try
		{
			DataOutputStream dataout = new DataOutputStream(new FileOutputStream(Reference.lifeData));
			dataout.writeInt(playerLifes.size());
			for (Entry<String, Byte> entry : playerLifes.entrySet())
			{
				String uuid = entry.getKey();
				byte lifes = entry.getValue();

				dataout.writeUTF(uuid);
				dataout.writeByte(lifes);

				if (Config.debugLogging)
					Logger.info("Map: " + uuid + " has " + lifes + " lifes left");
			}
			dataout.flush();
			dataout.close();

			if (Config.debugLogging)
			{
				DataInputStream datain = new DataInputStream(new FileInputStream(Reference.lifeData));

				int entries = datain.readInt();
				for (int i = 0; i < entries; i++)
				{
					String uuid = datain.readUTF();
					byte lifes = datain.readByte();

					Logger.info("File: " + uuid + " has " + lifes + " lifes left");
				}
				datain.close();
			}

		}
		catch (Exception ex)
		{
			throw new RuntimeException(ex);
		}
	}
}

// Collection of useful variables
public class Reference
{
public static final String MODID = "pvputils";
public static final String NAME = "PvP Utilities";
public static final String VERSION = "0.0.1";
public static final String DEPENDENCIES = "required-after:Forge@[10.13.4.1448,)";
public static final String MCVERSIONS = "[1.7, 1.7.10]";
public static final String COMMON_PROXY = "rsge.mods.pvputils.proxies.Common";
public static final String CLIENT_PROXY = "rsge.mods.pvputils.proxies.Client";

public static String configPath;
public static File configFile;
public static File dataDir;
public static File lifeData;
}

public class PvPUtils
{
[...]

	@EventHandler
	public void serverLoaded(FMLServerStartedEvent e)
	{
		// Data initialization
		try
		{
			if (Config.lifesEnabled)
			{
				Reference.dataDir = new File(DimensionManager.getCurrentSaveRootDirectory(), Reference.MODID);
				if (!Reference.dataDir.exists())
					Reference.dataDir.mkdirs();
				Lifes.init();
			}
		}
		catch (Exception ex)
		{
			throw new RuntimeException(ex);
		}
	}
}

 

Edited by Rsge
Rechtschreibfehler im Titel
Link to comment
Share on other sites

  • 1 month later...

Tut mir leid, ich kenne mich nicht mit Hashmaps aus, aber kleiner Tipp, es gibt Spoiler :)

[spoiler]Ich bin ein Spoiler.[/spoiler]

Ich bin ein Spoiler.

(Ist halt nicht in der Leiste, wieso auch immer.)

Allerdings teste mal das: Wenn du aus der Welt rausgehst, guck mal in die Datei, die du erstellt hast und guck, ob sie leer ist, beziehungsweise nicht deine Hashmap enthält. Wenn nicht, dann liegt es am Laden. Wenn sie leer ist, guck dir nochmal die Schreibfunktion an. Wenn sie nicht leer ist, versuche mal, mit System.out.println(); die Hashmap-Entry anzeigen zu lassen. Wenn das nicht funktioniert, ist das Laden nicht in Ordnung, wenn das funktioniert, guck die mal die Lebensetzfunktion an (oder so ;)). Das hilft echt, auch wenn du vielleicht denkst "Aber dann weiß ich doch immer noch nicht, was los ist!", es hilft oft bei der Problembehebung! :)

MFG David

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B