Jump to content

Recommended Posts

Posted

Hey everybody,

I have some information which I'm currently storing in a global variable in my block's class. The idea is that every time the block is placed down, a number stored in this global variable increments. This is important for reasons which I won't explain here ;)

Problem is, the global variable is deleted when the game is quit (as I had expected) and I need this value to stick around for when the game is next re-opened. I also need the value to be stored per world, so it can be say 7 in one and 12 in another. I know some mods use txt files in the the world save to store info, so maybe I could do something like that? Otherwise, is there something like a Javascript Cookie or localStorage storage object in Java which I could use to store this value?

Thanks in advance :)

-Toastrackenigma

  • Like 1
Posted

Well, because say I want a block to output an int I have stored in it to the chat (just as a test), this isn't working:

public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) {
	int testthis = worldSave.readFromNBT("testthis");
	if (world.isRemote) {
		player.addChatMessage(new ChatComponentTranslation("Number: "+testthis));
	}
	return true;
}

Here's the worldSave.java file:

package com.toastrackenigma.techcraft;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.WorldSavedData;
import net.minecraft.world.World;

public class worldSave extends WorldSavedData{

private static final String ID = "techcraft";
private int loadstoneChannels = 0;

public worldSave() {
	super(ID);
}

public worldSave(String identifier) {
	super(identifier);
}

@Override
public void readFromNBT(NBTTagCompound nbt) {
	loadstoneChannels = nbt.getInteger("loadstoneChannels");
}

@Override
public void writeToNBT(NBTTagCompound nbt) {
	nbt.setInteger("loadstoneChannels", loadstoneChannels);
}

public int newChannel() {
	markDirty();
	return loadstoneChannels++;
}

public static worldSave get(World world) {
	worldSave data = (worldSave)world.loadItemData(worldSave.class, ID);
	if (data == null) {
		data = new worldSave();
		world.setItemData(ID, data);
	}
	return data;
}

}

I know it's because the readFromNBT function has a void return type, but when I change it from void to int and add a return statement it throws errors at me.

Posted

You never call the NBT methods (readFromNBT, writeToNBT) yourself. Minecraft does that for you.

Good to know.

You get your WorldSavedData from the world and the read the data you want from it, using the fields you declared.

So how do I actually do that? I've got this far:

worldSave worldsave = worldSave.get(world);

This gives me back a random string which looks like this com.toastrackenigma.techcraft.worldSave@26d68a6e (the number on the end is different on the client then it is on the server). How do I use this?

Posted

****Insert quote here, none of the editor buttons are working, who knows why?****

I know that, I just wasn't thinking about this worldSave thing the same way for some reason. I now have:

worldSave worldsave = worldSave.get(world);
int thesave = worldsave.newChannel();

While this counts up from zero every time it's called, when I close the game and reopen it the variable's forgotten, which kindof defeats the whole point.

Posted

****Editor buttons still not working****

markDirty() is being called. Here's the worldsave.newChannel() code:

public int newChannel() {
markDirty();
return loadstoneChannels++;
}

I think I've posted the whole worldSave file earlier this post.

Posted

Whenever I'm on a site and the editor buttons don't work it makes me cringe because one of the first projects I did when I learnt how to program was make one that worked properly. It only took me < 1 hour and it never did this to anyone :)

 

I've sorta fixed the problem myself, I put that code into my item and used onRightClick and it worked (incremented each time I right clicked and when I opened MC again continued where it left off). However, what would I do if I wanted it in my Mod's main class (where I had it initially)? I get that there is no reference to world in there, so how do I give it one?

 

Thanks for all of your help :)

Posted

I'm trying to make something a little similar to the way Applied Energistics's Quantum Entangled Singularities work: I want it to be that every time that you perform the crafting recipe the item's damage value goes up one, i.e.

GameRegistry.addShapelessRecipe(new ItemStack(Techcraft.magnetHalf, 2, , new Object[] { Techcraft.magnetItem});

Replacing 8 with the damage value. So, the first time you craft this the damage on both of these is 1, then the next time it's 2, etc. Pretty much only two are ever going to have the same damage, so they're a linked pair.

I was going to store the damage in the WorldSavedData part :)

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.