Jump to content

Recommended Posts

Posted

Hi everyone, I am making a mod to add a basic sky dimension, using only forge. Could someone walk me through from scratch how to start? I could never find a decent explanation, documentation, or tutorial.

Posted

I looked. I would love one on there too....

But I don't really know how to do it in the first place :P

I will add a tutorial on how to use METADATA blocks to have many blocks under one ID while still using Forge's Infinite Sprites.

Posted

I will add a tutorial on how to use METADATA blocks to have many blocks under one ID while still using Forge's Infinite Sprites.

Meh, no real point anymore honestly, unless you are dynamically creating things like RP2's microblocks, we have 4096 IDs now.  And if we are lucky then 1.3 or 1.4 will drop metadata (wishful thinking anyway).

Posted

We have no tutorials for that yet, but we would love one placed on the wiki!  (*hint*hint*)

 

i made a tutorial on minecraft forum, but when i went to put it on here, they'd deleted my topic for no reason :S

Posted

Could you rewrite it? That would be awesome. I am arguing with my friend over whether or not to use the Dimension API, but I want to stay all-forge.  ;D

Posted

Haha that friend would be me.

The Dimensions API is horribly outdated as the last Forge it worked with was 1.4...

However it's coded for Minecraft 1.2.5 so that would make it easier to make it work with the latest Forge :)

Posted

dimensions with forge are very easy.

 

post what you currently have and ill help you out with the rest (i believe you sent me a message on MinecragtForums aswell ;)

Posted

right, well firstly look in the dimension manager class, if you know how to code, you should be able to understand what to do by looking in there

Posted

 

 

I'm also trying to create an new Dimension, but every time I try to click on my Teleporter Block it says "Entering Dimension" and when it's done loading I get this Error:

 

2 mods loaded
Minecraft Forge 3.3.7.135
FML vnull.null.null.null
Forge Mod Loader version null.null.null.null for Minecraft null
mod_dim : Available (src)
mod_MinecraftForge : Available (src)


      Minecraft has crashed!      
      ----------------------      

Minecraft has stopped running because it encountered a problem.




--- BEGIN ERROR REPORT 699fbf70 --------
Generated 11.07.12 11:29

Minecraft: Minecraft 1.2.5
OS: Windows Vista (x86) version 6.0
Java: 1.7.0_05, Oracle Corporation
VM: Java HotSpot(TM) Client VM (mixed mode), Oracle Corporation
LWJGL: 2.4.2
OpenGL: GeForce GT 130M/PCI/SSE2 version 3.3.0, NVIDIA Corporation

java.lang.NullPointerException
at net.minecraft.src.ChunkProvider.loadChunk(ChunkProvider.java:115)
at net.minecraft.src.ChunkProvider.provideChunk(ChunkProvider.java:128)
at net.minecraft.src.World.getChunkFromChunkCoords(World.java:648)
at net.minecraft.src.World.getBlockId(World.java:563)
at net.minecraft.client.Minecraft.preloadWorld(Minecraft.java:2199)
at net.minecraft.client.Minecraft.changeWorld(Minecraft.java:2085)
at net.minecraft.client.Minecraft.usePortal(Minecraft.java:1996)
at net.minecraft.src.BlockLeoPort.onBlockClicked(BlockLeoPort.java:16)
at net.minecraft.src.PlayerControllerSP.clickBlock(PlayerControllerSP.java:82)
at net.minecraft.client.Minecraft.clickMouse(Minecraft.java:1351)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:1795)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:822)
at net.minecraft.client.Minecraft.run(Minecraft.java:750)
at java.lang.Thread.run(Thread.java:722)
--- END ERROR REPORT c5ca824a ----------


 

I think it's a problem with the worldProvider, so here is the Code:

package net.minecraft.src;

public class WorldProviderLEO extends WorldProvider{

@Override
public String getSaveFolder() {
	return "DIM-LEO";
}

@Override
public String getWelcomeMessage() {
	return "Entering LEO";
}

@Override
public String getDepartMessage() {
	return "Leaving LEO";
}

public boolean canRespawnHere(){
	return true;
}

public IChunkProvider getChunkProvider()
    {
        return new ChunkProviderLEO();
    }

}

 

And just to be sure the Code of my other classes:

 

 

mod_dim:

package net.minecraft.src;

import net.minecraft.src.forge.DimensionManager;

public class mod_dim extends BaseMod{

public static final Block BlockPortal = new BlockLeoPort(160, Material.portal);


public static final WorldProvider wpLEO = new WorldProviderLEO();


@Override
public void load() {
	ModLoader.registerBlock(BlockPortal);
	BlockPortal.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/portal.png");
	ModLoader.addName(BlockPortal, "Portal");
	ModLoader.addRecipe(new ItemStack(BlockPortal, 1), new Object [] {"#", Character.valueOf('#'), Block.dirt});

	DimensionManager.registerDimension(10, wpLEO, true);

}

@Override
public String getVersion() {
	// TODO Auto-generated method stub
	return null;
}



}

 

BlockLeoPort:

package net.minecraft.src;

import net.minecraft.client.Minecraft;

public class BlockLeoPort extends Block {

protected BlockLeoPort(int par1, Material par2Material) {
	super(par1, par2Material);
	// TODO Auto-generated constructor stub
}

public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) {
	Minecraft mc = ModLoader.getMinecraftInstance();
	TeleporterLEO tl = new TeleporterLEO();

	mc.usePortal(10, tl);

	System.out.println("click");

}

public void onBlockClicked(World par1World, int par2, int par3, int par4, Entity par5Entity) {
	Minecraft mc = ModLoader.getMinecraftInstance();
	TeleporterLEO tl = new TeleporterLEO();

	mc.usePortal(10, tl);

	System.out.println("click");

	par5Entity.setFire(1);
}

public void onBlockActivated(World par1World, int par2, int par3, int par4, Entity par5Entity) {
	Minecraft mc = ModLoader.getMinecraftInstance();
	TeleporterLEO tl = new TeleporterLEO();

	mc.usePortal(10, tl);

	System.out.println("act");

	par5Entity.setFire(1);
}

}

 

TeleporterLEO:

package net.minecraft.src;

import java.util.Random;

public class TeleporterLEO extends Teleporter
{
//The Teleporter class handles finding existing portals and generating new ones. It pinpoints
//the location to which the player should be teleported when traveling across dimensions.

private Random random;

public TeleporterLEO()
{
	random = new Random();
}

public void placeInPortal(World world, Entity entity)
{
	if (placeInExistingPortal(world, entity))
	{
		return;
	}
	else
	{
		createPortal(world, entity);
		placeInExistingPortal(world, entity);
		return;
	}
}

public boolean placeInExistingPortal(World world, Entity entity)
{
	char c = '\200';
	double d = -1D;
	int i = 0;
	int j = 0;
	int k = 0;
	int l = MathHelper.floor_double(entity.posX);
	int i1 = MathHelper.floor_double(entity.posZ);
	for (int j1 = l - c; j1 <= l + c; j1++)
	{
		double d1 = ((double)j1 + 0.5D) - entity.posX;
		for (int j2 = i1 - c; j2 <= i1 + c; j2++)
		{
			double d3 = ((double)j2 + 0.5D) - entity.posZ;
			for (int k2 = 128 - 1; k2 >= 0; k2--)
			{
				if (world.getBlockId(j1, k2, j2) != 4)
				{
					continue;
				}
				for (; world.getBlockId(j1, k2 - 1, j2) == 4; k2--) { }
				double d5 = ((double)k2 + 0.5D) - entity.posY;
				double d7 = d1 * d1 + d5 * d5 + d3 * d3;
				if (d < 0.0D || d7 < d)
				{
					d = d7;
					i = j1;
					j = k2;
					k = j2;
				}
			}
		}
	}

	if (d >= 0.0D)
	{
		int k1 = i;
		int l1 = j;
		int i2 = k;
		double d2 = (double)k1 + 0.5D;
		double d4 = (double)l1 + 0.5D;
		double d6 = (double)i2 + 0.5D;
		if (world.getBlockId(k1 - 1, l1, i2) == 4)
		{
			d2 -= 0.5D;
		}
		if (world.getBlockId(k1 + 1, l1, i2) == 4)
		{
			d2 += 0.5D;
		}
		if (world.getBlockId(k1, l1, i2 - 1) == 4)
		{
			d6 -= 0.5D;
		}
		if (world.getBlockId(k1, l1, i2 + 1) == 4)
		{
			d6 += 0.5D;
		}
		entity.setLocationAndAngles(d2, d4, d6, entity.rotationYaw, 0.0F);
		entity.motionX = entity.motionY = entity.motionZ = 0.0D;
		return true;
	}
	else
	{
		return false;
	}
}

public boolean createPortal(World world, Entity entity)
{
	byte byte0 = 16;
	double d = -1D;
	int i = MathHelper.floor_double(entity.posX);
	int j = MathHelper.floor_double(entity.posY);
	int k = MathHelper.floor_double(entity.posZ);
	int l = i;
	int i1 = j;
	int j1 = k;
	int k1 = 0;
	int l1 = random.nextInt(4);
	for (int i2 = i - byte0; i2 <= i + byte0; i2++)
	{
		double d1 = ((double)i2 + 0.5D) - entity.posX;
		for (int j3 = k - byte0; j3 <= k + byte0; j3++)
		{
			double d3 = ((double)j3 + 0.5D) - entity.posZ;
			for (int k4 = 128 - 1; k4 >= 0; k4--)
			{
				if (!world.isAirBlock(i2, k4, j3))
				{
					continue;
				}
				for (; k4 > 0 && world.isAirBlock(i2, k4 - 1, j3); k4--) { }
				label0:
					for (int k5 = l1; k5 < l1 + 4; k5++)
					{
						int l6 = k5 % 2;
						int i8 = 1 - l6;
						if (k5 % 4 >= 2)
						{
							l6 = -l6;
							i8 = -i8;
						}
						for (int j9 = 0; j9 < 3; j9++)
						{
							for (int k10 = 0; k10 < 4; k10++)
							{
								for (int l11 = -1; l11 < 4; l11++)
								{
									int j12 = i2 + (k10 - 1) * l6 + j9 * i8;
									int l12 = k4 + l11;
									int j13 = (j3 + (k10 - 1) * i8) - j9 * l6;
									if (l11 < 0 && !world.getBlockMaterial(j12, l12, j13).isSolid() || l11 >= 0 && !world.isAirBlock(j12, l12, j13))
									{
										break label0;
									}
								}
							}
						}

						double d5 = ((double)k4 + 0.5D) - entity.posY;
						double d7 = d1 * d1 + d5 * d5 + d3 * d3;
						if (d < 0.0D || d7 < d)
						{
							d = d7;
							l = i2;
							i1 = k4;
							j1 = j3;
							k1 = k5 % 4;
						}
					}
			}
		}
	}

	if (d < 0.0D)
	{
		for (int j2 = i - byte0; j2 <= i + byte0; j2++)
		{
			double d2 = ((double)j2 + 0.5D) - entity.posX;
			for (int k3 = k - byte0; k3 <= k + byte0; k3++)
			{
				double d4 = ((double)k3 + 0.5D) - entity.posZ;
				for (int l4 = 128 - 1; l4 >= 0; l4--)
				{
					if (!world.isAirBlock(j2, l4, k3))
					{
						continue;
					}
					for (; l4 > 0 && world.isAirBlock(j2, l4 - 1, k3); l4--) { }
					label1:
						for (int l5 = l1; l5 < l1 + 2; l5++)
						{
							int i7 = l5 % 2;
							int j8 = 1 - i7;
							for (int k9 = 0; k9 < 4; k9++)
							{
								for (int l10 = -1; l10 < 4; l10++)
								{
									int i12 = j2 + (k9 - 1) * i7;
									int k12 = l4 + l10;
									int i13 = k3 + (k9 - 1) * j8;
									if (l10 < 0 && !world.getBlockMaterial(i12, k12, i13).isSolid() || l10 >= 0 && !world.isAirBlock(i12, k12, i13))
									{
										break label1;
									}
								}
							}

							double d6 = ((double)l4 + 0.5D) - entity.posY;
							double d8 = d2 * d2 + d6 * d6 + d4 * d4;
							if (d < 0.0D || d8 < d)
							{
								d = d8;
								l = j2;
								i1 = l4;
								j1 = k3;
								k1 = l5 % 2;
							}
						}
				}
			}
		}
	}
	int k2 = k1;
	int l2 = l;
	int i3 = i1;
	int l3 = j1;
	int i4 = k2 % 2;
	int j4 = 1 - i4;
	if (k2 % 4 >= 2)
	{
		i4 = -i4;
		j4 = -j4;
	}
	if (d < 0.0D)
	{
		if (i1 < 70)
		{
			i1 = 70;
		}
		if (i1 > 128 - 10)
		{
			i1 = 128 - 10;
		}
		i3 = i1;
		for (int i5 = -1; i5 <= 1; i5++)
		{
			for (int i6 = 1; i6 < 3; i6++)
			{
				for (int j7 = -1; j7 < 3; j7++)
				{
					int k8 = l2 + (i6 - 1) * i4 + i5 * j4;
					int l9 = i3 + j7;
					int i11 = (l3 + (i6 - 1) * j4) - i5 * i4;
					boolean flag = j7 < 0;
					world.setBlockWithNotify(k8, l9, i11, flag ? Block.cobblestone.blockID : 0);
				}
			}
		}
	}
	for (int j5 = 0; j5 < 4; j5++)
	{
		world.editingBlocks = true;
		//You can add your own portal's generation here (and delete all the code up to
		//"world.editingBlocks = false"). This particular portal is like a Nether portal, but with
		//sandstone instead of obsidian, and obviously the Taiga portal block instead of the Nether
		//one.
		for (int j6 = 0; j6 < 4; j6++)
		{
			for (int k7 = -1; k7 < 4; k7++)
			{
				int l8 = l2 + (j6 - 1) * i4;
				int i10 = i3 + k7;
				int j11 = l3 + (j6 - 1) * j4;
				boolean flag1 = j6 == 0 || j6 == 3 || k7 == -1 || k7 == 3;
				world.setBlock(l8, i10, j11, 4);
			}
		}

		world.editingBlocks = false;
		for (int k6 = 0; k6 < 4; k6++)
		{
			for (int l7 = -1; l7 < 4; l7++)
			{
				int i9 = l2 + (k6 - 1) * i4;
				int j10 = i3 + l7;
				int k11 = l3 + (k6 - 1) * j4;
				world.notifyBlocksOfNeighborChange(i9, j10, k11, world.getBlockId(i9, j10, k11));
			}
		}
	}

	return true;
}
}

 

 

 

 

 

 

 

 

Edit:

 

I think the WorldProvider was not what causes the Problem.Now I think it was the ChunkProvider. I've changed a few thinks and now I get this Error:

 

2 mods loaded
Minecraft Forge 3.3.7.135
FML vnull.null.null.null
Forge Mod Loader version null.null.null.null for Minecraft null
mod_dim : Available (src)
mod_MinecraftForge : Available (src)


      Minecraft has crashed!      
      ----------------------      

Minecraft has stopped running because it encountered a problem.




--- BEGIN ERROR REPORT 699fbf70 --------
Generated 13.07.12 09:25

Minecraft: Minecraft 1.2.5
OS: Windows Vista (x86) version 6.0
Java: 1.7.0_05, Oracle Corporation
VM: Java HotSpot(TM) Client VM (mixed mode), Oracle Corporation
LWJGL: 2.4.2
OpenGL: GeForce GT 130M/PCI/SSE2 version 3.3.0, NVIDIA Corporation

java.lang.NullPointerException
at net.minecraft.src.PlayerControllerSP.onPlayerDestroyBlock(PlayerControllerSP.java:49)
at net.minecraft.src.PlayerControllerSP.clickBlock(PlayerControllerSP.java:87)
at net.minecraft.client.Minecraft.clickMouse(Minecraft.java:1351)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:1795)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:822)
at net.minecraft.client.Minecraft.run(Minecraft.java:750)
at java.lang.Thread.run(Thread.java:722)
--- END ERROR REPORT fa404cdf ----------

 

The ChunkProvider now looks like this:

 

package net.minecraft.src;

import java.util.List;
import java.util.Random;

public class ChunkProviderLEO implements IChunkProvider {

    private World worldObj;
    private Random random;
    private final boolean useStructures;
    private MapGenVillage villageGen = new MapGenVillage(1);


    public ChunkProviderLEO(World par1World, long par2, boolean par4)
    {
        this.worldObj = par1World;
        this.useStructures = par4;
        this.random = new Random(par2);
    }

    private void generate(byte[] par1ArrayOfByte)
    {
        int var2 = par1ArrayOfByte.length / 256;

        for (int var3 = 0; var3 < 16; ++var3)
        {
            for (int var4 = 0; var4 < 16; ++var4)
            {
                for (int var5 = 0; var5 < var2; ++var5)
                {
                    int var6 = 0;

                    if (var5 == 0)
                    {
                        var6 = Block.bedrock.blockID;
                    }
                    else if (var5 <= 2)
                    {
                        var6 = Block.dirt.blockID;
                    }
                    else if (var5 == 3)
                    {
                        var6 = Block.grass.blockID;
                    }

                    par1ArrayOfByte[var3 << 11 | var4 << 7 | var5] = (byte)var6;
                }
            }
        }
    }


    public Chunk loadChunk(int par1, int par2)
    {
        return this.provideChunk(par1, par2);
    }

    public Chunk provideChunk(int par1, int par2)
    {
        byte[] var3 = new byte[32768];
        this.generate(var3);
        Chunk var4 = new Chunk(this.worldObj, var3, par1, par2);

        BiomeGenBase[] var5 = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, par1 * 16, par2 * 16, 16, 16);
        byte[] var6 = var4.getBiomeArray();

        for (int var7 = 0; var7 < var6.length; ++var7)
        {
            var6[var7] = (byte)var5[var7].biomeID;
        }

        var4.generateSkylightMap();
        return var4;
    }

    public boolean chunkExists(int par1, int par2)
    {
        return true;
    }

    public void populate(IChunkProvider par1IChunkProvider, int par2, int par3)
    {
        this.random.setSeed(this.worldObj.getSeed());
        long var4 = this.random.nextLong() / 2L * 2L + 1L;
        long var6 = this.random.nextLong() / 2L * 2L + 1L;
        this.random.setSeed((long)par2 * var4 + (long)par3 * var6 ^ this.worldObj.getSeed());

    }

    public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate)
    {
        return true;
    }


    public boolean unload100OldestChunks()
    {
        return false;
    }

    public boolean canSave()
    {
        return true;
    }

    public String makeString()
    {
        return "LEOLevelSource";
    }


    public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4)
    {
        //BiomeGenBase var5 = this.worldObj.getBiomeGenForCoords(par2, par4);
        //return var5 == null ? null : var5.getSpawnableList(par1EnumCreatureType);
    	return null;
    }


    public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5)
    {
        return null;
    }

}

 

When I reenter the save I spawn in some Blocks, so I die after a few seconds. When I respawn I spawn so high over the ground, that I die by the falldamage.

I think the Problem now is the Teleporter, but I can't find what causes the Problem, so could someone please help me? For the Teleporter´s Code look in the Spoiler above.

 

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.