Jump to content

[1.7.10]MapGenStructure locations not getting saved when minecraft exits[Solved]


Tschallacka

Recommended Posts

I have a structure generation in my mod

 

public class MapGenEntropyTemple extends MapGenStructure {
}

 

and it works beautifully, it generates the entropy temple as it should.

 

There is only one caveat, the MapGenStructureData doesn't get saved the moment minecraft closes and then gets started again.

 

Al the locations I could poll(very accurately, I have my boundingboxes fit nice and tight around my sections)

 

StuffLoader.worldGenerator.genEntropyTemple.hasStructureAt(player.worldObj,(int)player.posX, (int)player.posY, (int)player.posZ)

 

suddenly return false in the new minecraft session.

 

So they return true in the minecraft play session that generated the entropy temple.

But if the world is reloaded in a freshly (rebooted) minecraft, the lists are empty.

 

I kinda need to know what the trigger is so I can make sure minecraft actually saves the locations of the gen structure. This also is the cause why sometimes only half my entropy temples render, because it doesn't save its progress as it should to file.

 

So I might be missing something, a trigger, a value, and i'm hoping someone here knows what to do.

 

 

I have tried to trace it, and I found this in MapGenStructure

 

this.field_143029_e = (MapGenStructureData)p_143027_1_.perWorldStorage.loadData(MapGenStructureData.class, this.func_143025_a());

            if (this.field_143029_e == null)
            {
                this.field_143029_e = new MapGenStructureData(this.func_143025_a());
                p_143027_1_.perWorldStorage.setData(this.func_143025_a(), this.field_143029_e);
            }

 

and it seems to save and set everything, register it to the perWorldstorage, so it should be saved on world nbt save run. since i'm polling on player tick where the player is.

 

Yet when I poll the file directly after a minecraft restart, I get

 

x = (MapGenStructureData)player.worldObj.perWorldStorage.loadData(MapGenStructureData.class, "EntropyTemple");
				NBTTagCompound y = new NBTTagCompound();
				x.writeToNBT(y);
				MagicCookie.log.warn(y.toString());

{Features:{},} 

 

 

package tschallacka.magiccookies.worldgen.entropytemple;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import tschallacka.magiccookies.MagicCookie;
import tschallacka.magiccookies.settings.Preferences;
import net.minecraft.entity.monster.EntityBlaze;
import net.minecraft.entity.monster.EntityMagmaCube;
import net.minecraft.entity.monster.EntityPigZombie;
import net.minecraft.entity.monster.EntitySkeleton;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.gen.structure.MapGenStructure;
import net.minecraft.world.gen.structure.StructureBoundingBox;
import net.minecraft.world.gen.structure.StructureComponent;
import net.minecraft.world.gen.structure.StructureStart;

public class MapGenEntropyTemple extends MapGenStructure
{

    private List<BiomeGenBase.SpawnListEntry> spawnList = new ArrayList<BiomeGenBase.SpawnListEntry>();
    private ArrayList<String> entitySpawns = new ArrayList<String>();
    private int spawnCounter = 0;

    public MapGenEntropyTemple()
    {
    	this.spawnList.add(new BiomeGenBase.SpawnListEntry(EntitySkeleton.class, 10, 4, 12));
        this.spawnList.add(new BiomeGenBase.SpawnListEntry(EntityBlaze.class, 10, 4, );
        //this.spawnList.add(new BiomeGenBase.SpawnListEntry(EntityPigZombie.class, 5, 4, 4));
        this.spawnList.add(new BiomeGenBase.SpawnListEntry(EntityMagmaCube.class, 3, 4, );
        this.entitySpawns.add("Skeleton");
        this.entitySpawns.add("Blaze");
        this.entitySpawns.add("Skeleton");
        this.entitySpawns.add("LavaSlime");
        this.entitySpawns.add("Skeleton");
        
    }
    public List<String> getSpawnEntities() {
    	return this.entitySpawns;
    }
    /** Unique save name for structure, used in MapGenStructure.func_143027_a() for loading/setting save handler **/
    public String func_143025_a()
    {
        return "EntropyTemple";
    }
    
    public boolean hasStructureAt(World world, int x, int y, int z)
    {
    	if(this.worldObj == null)
    		this.worldObj = world;
        return this.hasStructureAt(x, y, z);
    }

    public List getSpawnList()
    {
        return this.spawnList;
    }

    protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ)
    {
    	
        int x = chunkX >> 4;
        int z = chunkZ >> 4;
        this.rand.setSeed((long)(x ^ z << 4) ^ this.worldObj.getSeed());
        this.rand.nextInt();
        final boolean canSpawn = this.rand.nextInt( != 0 ? 
        												false : 
        												(chunkX != (x << 4) + 4 + this.rand.nextInt( ? 
        														false : 
        															chunkZ == (z << 4) + 4 + this.rand.nextInt();
        //boolean canSpawn = false;
        /*++this.spawnCounter;
        if(this.spawnCounter == (4096*45)) {
        	canSpawn = true;
        	this.spawnCounter = 0;
        	//MagicCookie.log.warn("Can spawn structure? "+(chunkX*16) + " : "+(chunkZ*16) +" =" + canSpawn);
        }*/
         
        return canSpawn; 
    }

    protected StructureStart getStructureStart(int chunkX, int chunkZ)
    {
        return new MapGenEntropyTemple.Start(this.worldObj, this.rand, chunkX, chunkZ);
    }

    public static class Start extends StructureStart
        {
    	
            public Start() {}

            public Start(World world, Random rand, int chunkX, int chunkZ)
            {
                super(chunkX, chunkZ);																	//zelfde als ChunkX * 16
                // retrieve the singular start piece
                StructureEntropyTemplePieces.Start start = new StructureEntropyTemplePieces.Start(rand, (chunkX << 4) + 2, (chunkZ << 4) + 2);
                // add the singular start piece to the components
                this.components.add(start);
                // place the blocks into the list. The entire primary structure is being built here.
                // the arraylist is being filled here, but also the list of components filled with the same things
                // This only utilised the primary pieces list
                start.buildComponent(start, this.components, rand);
                if(Preferences.entropyTempleSpawnLogging) {
                	MagicCookie.log.info("Entropy temple spawned at " + start.getBoundingBox().toString());
                }

                this.updateBoundingBox();
                //MagicCookie.log.warn("Complete structure bounding box = ");
                //MagicCookie.log.warn(this.getBoundingBox().toString());
                this.setRandomHeight(world, rand, 70, 128);
            }
        }
}

 

 

So, anyone know which methond/function I should trigger in MapGenStructure to make sure it saves to disk and gets read to disk? Any event handlers I should hook into for this?

 

Of course I can make my own save handlers for my own purposes, but i'd rather have it that this works so minecraft can keep my rather sizeable structures in account when placing nether fortresses or other generated structures.

 

It does that now in the same session, but not if the minecraft server or single player client gets restarted.

How much wood could a woodchuck chuck if a wood chuck could chuck wood - Guybrush Treepwood

 

I wrote my own mod ish... still a few bugs to fix. http://thaumcraft.duckdns.org/downloads/MagicCookies-1.0.6.4.jar

Link to comment
Share on other sites

for those wondering how, you need to invoke func_143026_a of MapGenStructure in your structure gen class when you give back the start piece in the  protected StructureStart getStructureStart(int chunkX, int chunkZ) method.

 

 

How much wood could a woodchuck chuck if a wood chuck could chuck wood - Guybrush Treepwood

 

I wrote my own mod ish... still a few bugs to fix. http://thaumcraft.duckdns.org/downloads/MagicCookies-1.0.6.4.jar

Link to comment
Share on other sites

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.