Italian Modding 1.4.7: Updating to 1.5.1

In questo tutorial ti mostrerò come aggiornare il tuo source code da MC 1.4.7 a MC 1.5.1
Non mostrerò ogni singolo piccolo dettaglio sull’aggiornamento, ma coprirò tutto ciò a cui sono andato in contro io aggiornando il mio source code.
La prima cosa che devi fare è installare MCP correttamente. Non spiegherò nel dettaglio come farlo qui. Puoi vedere come farlo qui http://www.youtube.com/watch?v=yV3zXKGX4OE !!!Il video è in inglese!!!
Nel prossimo passo dovresti copiare il source code dal vecchio MCP al nuovo MCP. Per farlo devi seguire le seguenti istruzioni:
1)      Vai nella cartella del tuo vecchio MCP.
2)      Apri la cartella src e minecraft.
3)      Devi copiare tutte le cartelle che hai creato ovvero tutto tranne cpw , ibxm , net e paulscode.
4)      Incollale nella cartella minecraft sotto src del nuovo MCP.
5)      Apri Eclipse nel nuovo MCP.
Adesso si comincia a cambiare il codice.
Quanto aprirai la tua Workspace di Eclipse dovresti vedere che ci sono molti errori. I file che modificherai sicuramente saranno: ClientProxy, mod file e tutti i file degli oggetti e dei blocchi. Noi partiremo dal file della mod in sé. Questo è il codice del file di MC 1.4.7

package tutorial;

import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityEggInfo;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.DungeonHooks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid = "Tutorial_Tutorialmod", name = "Tutorial", version = "1.0")
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public class Tutorial
{
       @SidedProxy(clientSide = "tutorial.ClientProxyTutorial", serverSide = "tutorial.CommonProxyTutorial")
       public static CommonProxyTutorial proxy;
      
       static int startEntityId = 300;
      
       public static int dimension = 20;
      
       public static Block portal;
      
       public static Item portalPlacer;
      
       public static BiomeGenBase tutorialBiome;
      
       @Init
       public void load(FMLInitializationEvent event)
       {
             proxy.registerRenderThings();
            
             tutorialBiome = new BiomeGenTutorial(53).setColor(2900485).setBiomeName("Tutorial Biome").setTemperatureRainfall(1F, 0.5F).setMinMaxHeight(0.2F, 1F);
            
             GameRegistry.addBiome(tutorialBiome);
            
             portalPlacer = new ItemPortalPlacer(5000).setIconIndex(0).setItemName("tutorial");
            
             LanguageRegistry.addName(portalPlacer, "Portal Placer");
             
             portal = new BlockPortalTutorial(3500, 1).setBlockName("portal");
             GameRegistry.registerBlock(portal, "Wuppy29_Portal");
             LanguageRegistry.addName(portal, "Custom Portal");
            
             EntityRegistry.registerModEntity(EntityTutorial.class, "Tutorial", 1, this, 80, 3, true);
            
             EntityRegistry.addSpawn(EntityTutorial.class, 10, 2, 4, EnumCreatureType.monster, BiomeGenBase.desert, BiomeGenBase.desertHills, BiomeGenBase.forest);
            
              LanguageRegistry.instance().addStringLocalization("entity.Tutorial_Tutorialmod.Tutorial.name", "Tutorial");
            
             registerEntityEgg(EntityTutorial.class, 0x7A65CF, 0x4DF200);
            
             DimensionManager.registerProviderType(dimension, WorldProviderTutorial.class, false);
             DimensionManager.registerDimension(dimension, dimension);
            
             GameRegistry.addRecipe(new ItemStack(Block.blockGold, 2), new Object[]
             {
                    "XXX",
                    "XZX",
                    "XXX",
                    'X', Item.coal, 'Z', new ItemStack(Item.dyePowder, 1, 15)
             });
            
             DungeonHooks.addDungeonMob("Tutorial", 50);
       }
      
       public static int getUniqueEntityId()
       {
             do
             {
                    startEntityId++;
             }
             while(EntityList.getStringFromID(startEntityId) != null);
                   
             return startEntityId;
       }
      
       public static void registerEntityEgg(Class <? extends Entity> entity, int primaryColor, int secondaryColor)
       {
             int id = getUniqueEntityId();
             EntityList.IDtoClassMapping.put(id, entity);
             EntityList.entityEggs.put(id, new EntityEggInfo(id, primaryColor, secondaryColor));
       }
}

Una cosa molto importante dell’aggiornamento è che non ci sono più sprite sheets (ovvero un file con tutti gli sprite). Ogni singola immagine deve avere un file immagine 16x16 a parte. Ci sono alcune regole da seguire con queste immagini ma ce ne occuperemo dopo, ora dobbiamo aggiustare il nostro source code.
Visto che non ci sono più sprite sheets nel source code non abbiamo più bisogno del codice che dica a Java dove deve guardare nello sprite sheet. Questo vuol dire che non devi più utilizzare .setIconIndex() quando identifichi gli oggetti. Coi blocchi eravamo soliti a settare la posizione dello sprite nel costruttore, così devi rimuovere il secondo numero nel costruttore per i blocchi di questo file. All’inizio avrai ancora degli errori, ma li correggeremo dopo.
Per correggere gli errori su .setBlockName e .setItemName devi semplicemente convertirli entrambi in .setUnlocalizedName.
Ora dovresti aver aggiustato la maggior parte degli errori nel file principale della mod. Se ne sono creati un po’ nel costruttore dei blocchi, ma li aggiusteremo in tra qualche minuto. Primo devi fare una nuova variabile all’inizio del file della mod. 

public static final String modid = "Tutorial_Tutorialmod";

Probabilmente ti stai chiedendo come mai lo stai facendo. Questo perché in ogni blocco e ogni oggetto ne avrai bisogno. Un’altra coda che dovresti fare è andate sul tuo @Mod e cambiare modid = “blah” a modid  = Tutorial.modid ovvero il file della mod . la variabile appena creata.
Il file ora dovrebbe sembrare a questo:

package tutorial;

import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityEggInfo;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.DungeonHooks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid = "Tutorial_Tutorialmod", name = "Tutorial", version = "1.0")
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public class Tutorial
{
       public static final String modid = "Tutorial_Tutorialmod";
      
       @SidedProxy(clientSide = "tutorial.ClientProxyTutorial", serverSide = "tutorial.CommonProxyTutorial")
       public static CommonProxyTutorial proxy;
      
       static int startEntityId = 300;
      
       public static int dimension = 20;
      
       public static Block portal;
      
       public static Item portalPlacer;
      
       public static BiomeGenBase tutorialBiome;
      
       @Init
       public void load(FMLInitializationEvent event)
       {
             proxy.registerRenderThings();
            
             tutorialBiome = new BiomeGenTutorial(53).setColor(2900485).setBiomeName("Tutorial Biome").setTemperatureRainfall(1F, 0.5F).setMinMaxHeight(0.2F, 1F);
            
             GameRegistry.addBiome(tutorialBiome);
            
             portalPlacer = new ItemPortalPlacer(5000).setUnlocalizedName("tutorial");
            
             LanguageRegistry.addName(portalPlacer, "Portal Placer");
            
             portal = new BlockPortalTutorial(3500).setUnlocalizedName("portal");
             GameRegistry.registerBlock(portal, "Wuppy29_Portal");
             LanguageRegistry.addName(portal, "Custom Portal");
            
             EntityRegistry.registerModEntity(EntityTutorial.class, "Tutorial", 1, this, 80, 3, true);
            
             EntityRegistry.addSpawn(EntityTutorial.class, 10, 2, 4, EnumCreatureType.monster, BiomeGenBase.desert, BiomeGenBase.desertHills, BiomeGenBase.forest);
            
              LanguageRegistry.instance().addStringLocalization("entity.Tutorial_Tutorialmod.Tutorial.name", "Tutorial");
            
             registerEntityEgg(EntityTutorial.class, 0x7A65CF, 0x4DF200);
            
             DimensionManager.registerProviderType(dimension, WorldProviderTutorial.class, false);
             DimensionManager.registerDimension(dimension, dimension);
            
             GameRegistry.addRecipe(new ItemStack(Block.blockGold, 2), new Object[]
             {
                    "XXX",
                    "XZX",
                    "XXX",
                    'X', Item.coal, 'Z', new ItemStack(Item.dyePowder, 1, 15)
             });
            
             DungeonHooks.addDungeonMob("Tutorial", 50);
       }
      
       public static int getUniqueEntityId()
       {
             do
             {
                    startEntityId++;
             }
             while(EntityList.getStringFromID(startEntityId) != null);
                   
             return startEntityId;
       }
      
       public static void registerEntityEgg(Class <? extends Entity> entity, int primaryColor, int secondaryColor)
       {
             int id = getUniqueEntityId();
             EntityList.IDtoClassMapping.put(id, entity);
             EntityList.entityEggs.put(id, new EntityEggInfo(id, primaryColor, secondaryColor));
       }
}

Ora vai sul file ClientProxy. Quello di MC 1.4.7 dovrebbe essere così:

package tutorial;

import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraftforge.client.MinecraftForgeClient;

public class ClientProxyTutorial extends CommonProxyTutorial
{
       @Override
       public void registerRenderThings()
       {
             MinecraftForgeClient.preloadTexture("/tutorialblocks.png");
             MinecraftForgeClient.preloadTexture("/tutorialitems.png");
             RenderingRegistry.registerEntityRenderingHandler(EntityTutorial.class, new RenderTutorial(new ModelTutorial(), 0.3F));
       }
}

Visto che non stiamo più usando gli sprite sheets dovresti rimuovere le linee di codice che sono .preloadTexture.
Questa cosa non da errori di per sé, ma ti rallenterà e forse farà anche crashare MC.
Dopo che hai cambiato il tutto dovrebbe essere così:

package tutorial;

import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraftforge.client.MinecraftForgeClient;

public class ClientProxyTutorial extends CommonProxyTutorial
{
       @Override
       public void registerRenderThings()
       {
             RenderingRegistry.registerEntityRenderingHandler(EntityTutorial.class, new RenderTutorial(new ModelTutorial(), 0.3F));
       }
}

La prossima parte non centra con il source code. Questa parte è anch’essa molto noiosa.
La prima cosa che devi sapere è che devi fare una struttura di cartelle dove metterai le tue immagini. La struttura dovrebbe essere come questa: mods\[mod id]\textures
In questa cartella puoi avere la cartella blocks , per i blocchi e items , per gli oggetti. Se utilizzi del modelli avrai anche bisogno della cartella models.
Ora vai nel tuo vecchio sprite sheet e taglia immagini 16x16 per ogni blocco (faccia e metadata) e oggetti (metadata). Il nome di questi file è così importante come la struttura di cartelle. Devi dare alle immagini gli stessi nomi che hai dato ai blocchi (o oggetti) su .setUnlocalizedName. Se hai degli oggetti o blocchi con la metadata devi aggiungere il numero associato alla metadata dopo del nome. Stessa cosa per le texture per faccia. Se hai blocchi dagli 2 numeri con uno spazio in messo ma fai attenzione a metterli nel giusto ordine ogni volta. Non coprirò la parte delle texture ecc. ma devi aggiungere il numero della metadata/side dopo il nome dell’immagine.
La struttura delle cartelle e i nomi sono molto importanti. Se metti un oggetto nella cartella dei blocchi non funzionerà. Se la tua cartella dei blocchi si chiama block invece di blocks anche questo non funzionerà. Ci sono certe regole da seguire, ma renderà la scrittura del codice molto più semplice. Dopo che hai finito tutto con le texture puoi mettere la cartella mods nel minecraft.jar della cartella jars sotto MCP.
Un’altra cosa che si fa notare è il fatto che devi cambiare la linea che cerca la texture per quell’oggetto o blocco, dopotutto l’hai cambiata.
Ora, la parte più noiosa e difficoltosa è fatta! La prossima parte si riferisce ad ogni singolo file di blocchi o oggetti e aggiungere un semplice metodo. Se hai fatto la parte dei nomi e delle texture correttamente questo metodo è lo stesso per ogni blocco e oggetto che non ma facce speciali o metadata. Questo è ciò che devi aggiungere in ogni file.

public void registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon(Tutorial.modid + ":" + this.getUnlocalizedName2());
    }

Quello era il metodo per i blocchi, per renderlo compatibile con gli oggetti sostituisci a this.blockIcon questo this.iconIndex.
Una cosa che non abbiamo fatto prima è aggiustare gli errori nel file dei blocchi. Questo è il codice che ho aggiunto sul metodo registerIcons

package tutorial;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;

public class BlockTutorialBlock extends Block
{
       public BlockTutorialBlock(int id, int texture)
       {
             super(id, texture, Material.cloth);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       public String getTextureFile()
    {
            return "/tutorialblocks.png";
    }
}

Adesso devi rimuovere il secondo int nel costruttore. Dovrai anche rimuovere il super. Dopo di ciò puoi anche rimuovere il metodo getTextureFile.
Il tutto dovrebbe essere così.

package tutorial;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;

public class BlockTutorialBlock extends Block
{
       public BlockTutorialBlock(int id)
       {
             super(id, Material.cloth);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       public void registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon(Tutorial.modid + ":" + this.getUnlocalizedName2());
    }
}

Per gli oggetti devi fare lo stesso, ma il nome del metodo è updateIcons e this.blockIcon è cambiato in this.iconIndex.

Tranne per le persone che hanno dimensioni o blocchi che vanno piazzati in una certa maniera tutto gli errori dovrebbero essere spariti. Se non hai altri errori puoi andare alla fine di questo tutorial. Da qui in poi parlerò delle dimensioni.
Quando guardi il tuo codice vedrai degli errosi sul tuo BlockPortal, Teleporter e ChunkProvider.
Cominciamo aggiustando il blocco.
Questo è il file da cui sono partito.

package tutorial;

import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.BlockPortal;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;

public class BlockPortalTutorial extends BlockPortal
{
       public BlockPortalTutorial(int id)
       {
             super(id);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       public void registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon(Tutorial.modid + ":" + this.getUnlocalizedName2());
    }
      
       public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
       {

       }
      
       public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
       {
             if (par5Entity.ridingEntity == null && par5Entity.riddenByEntity == null)
             {
                    if (par5Entity instanceof EntityPlayerMP)
                    {
                           EntityPlayerMP thePlayer = (EntityPlayerMP) par5Entity;
                           if (par5Entity.dimension != Tutorial.dimension)
                           {
                                  thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, Tutorial.dimension, new TeleporterTutorial(thePlayer.mcServer.worldServerForDimension(Tutorial.dimension)));
                           }
                           else
                           {
                                  thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, 0, new TeleporterTutorial(thePlayer.mcServer.worldServerForDimension(0)));
                           }
                    }
             }
       }
      
       public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4)
    {
        byte var5 = 0;
        byte var6 = 0;

        if (par1World.getBlockId(par2 - 1, par3, par4) == Block.sandStone.blockID || par1World.getBlockId(par2 + 1, par3, par4) == Block.sandStone.blockID)
        {
            var5 = 1;
        }

        if (par1World.getBlockId(par2, par3, par4 - 1) == Block.sandStone.blockID || par1World.getBlockId(par2, par3, par4 + 1) == Block.sandStone.blockID)
        {
            var6 = 1;
        }

        if (var5 == var6)
        {
            return false;
        }
        else
        {
            if (par1World.getBlockId(par2 - var5, par3, par4 - var6) == 0)
            {
                par2 -= var5;
                par4 -= var6;
            }

            int var7;
            int var8;

            for (var7 = -1; var7 <= 2; ++var7)
            {
                for (var8 = -1; var8 <= 3; ++var8)
                {
                    boolean var9 = var7 == -1 || var7 == 2 || var8 == -1 || var8 == 3;

                    if (var7 != -1 && var7 != 2 || var8 != -1 && var8 != 3)
                    {
                        int var10 = par1World.getBlockId(par2 + var5 * var7, par3 + var8, par4 + var6 * var7);

                        if (var9)
                        {
                            if (var10 != Block.sandStone.blockID)
                            {
                                return false;
                            }
                        }
                        else if (var10 != 0 && var10 != Block.fire.blockID)
                        {
                            return false;
                        }
                    }
                }
            }

            par1World.editingBlocks = true;

            for (var7 = 0; var7 < 2; ++var7)
            {
                for (var8 = 0; var8 < 3; ++var8)
                {
                    par1World.setBlockWithNotify(par2 + var5 * var7, par3 + var8, par4 + var6 * var7, this.blockID);
                }
            }

            par1World.editingBlocks = false;
            return true;
        }
    }
      
       public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
       
    }
      
       public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
       {
             byte var6 = 0;
             byte var7 = 1;

             if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID)
             {
                    var6 = 1;
                    var7 = 0;
             }

             int var8;

             for (var8 = par3; par1World.getBlockId(par2, var8 - 1, par4) == this.blockID; --var8)
             {
                    ;
             }

             if (par1World.getBlockId(par2, var8 - 1, par4) != Block.sandStone.blockID)
             {
                    par1World.setBlockWithNotify(par2, par3, par4, 0);
             }
             else
             {
                    int var9;

                    for (var9 = 1; var9 < 4 && par1World.getBlockId(par2, var8 + var9, par4) == this.blockID; ++var9)
                    {
                           ;
                    }

                    if (var9 == 3 && par1World.getBlockId(par2, var8 + var9, par4) == Block.sandStone.blockID)
                    {
                           boolean var10 = par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID;
                           boolean var11 = par1World.getBlockId(par2, par3, par4 - 1) == this.blockID || par1World.getBlockId(par2, par3, par4 + 1) == this.blockID;

                           if (var10 && var11)
                           {
                                  par1World.setBlockWithNotify(par2, par3, par4, 0);
                           }
                           else
                           {
                                  if ((par1World.getBlockId(par2 + var6, par3, par4 + var7) != Block.sandStone.blockID || par1World.getBlockId(par2 - var6, par3, par4 - var7) != this.blockID) && (par1World.getBlockId(par2 - var6, par3, par4 - var7) != Block.sandStone.blockID || par1World.getBlockId(par2 + var6, par3, par4 + var7) != this.blockID))
                                  {
                                        par1World.setBlockWithNotify(par2, par3, par4, 0);
                                  }
                           }
                    }
                    else
                    {
                           par1World.setBlockWithNotify(par2, par3, par4, 0);
                    }
             }
       }
}

Se guardi gli errori ti accorgerai che hanno a che fare col piazzare I blocchi.
Tutti gli errori sono in tryToCreatePortal e onNeighborBlockChange. Il modo più facile per aggiustare tutto ciò è sovrascrivere questi 2 metodi con quelli di BlockPortal (vanilla minecraft) e rimpiazzare l’ossidiana con il blocco che si vuole utilizzare.
La ragione per la quale ci sono quegli errori è che il metodo
.setBlockWithNotify è cambiato. Ci sono nuovi metodi che fanno le cose per te.
Ecco lo stesso file ma con gli errori corretti.

package tutorial;

import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.BlockPortal;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;

public class BlockPortalTutorial extends BlockPortal
{
       public BlockPortalTutorial(int id)
       {
             super(id);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       public void registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon(Tutorial.modid + ":" + this.getUnlocalizedName2());
    }
      
       public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
       {

       }
      
       public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
       {
             if (par5Entity.ridingEntity == null && par5Entity.riddenByEntity == null)
             {
                    if (par5Entity instanceof EntityPlayerMP)
                    {
                           EntityPlayerMP thePlayer = (EntityPlayerMP) par5Entity;
                           if (par5Entity.dimension != Tutorial.dimension)
                           {
                                  thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, Tutorial.dimension, new TeleporterTutorial(thePlayer.mcServer.worldServerForDimension(Tutorial.dimension)));
                           }
                           else
                           {
                                  thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, 0, new TeleporterTutorial(thePlayer.mcServer.worldServerForDimension(0)));
                           }
                    }
             }
       }
      
       public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4)
    {
        byte b0 = 0;
        byte b1 = 0;

        if (par1World.getBlockId(par2 - 1, par3, par4) == Block.sandStone.blockID || par1World.getBlockId(par2 + 1, par3, par4) == Block.sandStone.blockID)
        {
            b0 = 1;
        }

        if (par1World.getBlockId(par2, par3, par4 - 1) == Block.sandStone.blockID || par1World.getBlockId(par2, par3, par4 + 1) == Block.sandStone.blockID)
        {
            b1 = 1;
        }

        if (b0 == b1)
        {
            return false;
        }
        else
        {
            if (par1World.getBlockId(par2 - b0, par3, par4 - b1) == 0)
            {
                par2 -= b0;
                par4 -= b1;
            }

            int l;
            int i1;

            for (l = -1; l <= 2; ++l)
            {
                for (i1 = -1; i1 <= 3; ++i1)
                {
                    boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3;

                    if (l != -1 && l != 2 || i1 != -1 && i1 != 3)
                    {
                        int j1 = par1World.getBlockId(par2 + b0 * l, par3 + i1, par4 + b1 * l);

                        if (flag)
                        {
                            if (j1 != Block.sandStone.blockID)
                            {
                                return false;
                            }
                        }
                        else if (j1 != 0 && j1 != Block.fire.blockID)
                        {
                            return false;
                        }
                    }
                }
            }

            for (l = 0; l < 2; ++l)
            {
                for (i1 = 0; i1 < 3; ++i1)
                {
                    par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l, Tutorial.portal.blockID, 0, 2);
                }
            }

            return true;
        }
    }
      
       public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
       
    }
      
       public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
    {
        byte b0 = 0;
        byte b1 = 1;

        if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID)
        {
            b0 = 1;
            b1 = 0;
        }

        int i1;

        for (i1 = par3; par1World.getBlockId(par2, i1 - 1, par4) == this.blockID; --i1)
        {
            ;
        }

        if (par1World.getBlockId(par2, i1 - 1, par4) != Block.sandStone.blockID)
        {
            par1World.setBlockToAir(par2, par3, par4);
        }
        else
        {
            int j1;

            for (j1 = 1; j1 < 4 && par1World.getBlockId(par2, i1 + j1, par4) == this.blockID; ++j1)
            {
                ;
            }

            if (j1 == 3 && par1World.getBlockId(par2, i1 + j1, par4) == Block.sandStone.blockID)
            {
                boolean flag = par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID;
                boolean flag1 = par1World.getBlockId(par2, par3, par4 - 1) == this.blockID || par1World.getBlockId(par2, par3, par4 + 1) == this.blockID;

                if (flag && flag1)
                {
                    par1World.setBlockToAir(par2, par3, par4);
                }
                else
                {
                    if ((par1World.getBlockId(par2 + b0, par3, par4 + b1) != Block.sandStone.blockID || par1World.getBlockId(par2 - b0, par3, par4 - b1) != this.blockID) && (par1World.getBlockId(par2 - b0, par3, par4 - b1) != Block.sandStone.blockID || par1World.getBlockId(par2 + b0, par3, par4 + b1) != this.blockID))
                    {
                        par1World.setBlockToAir(par2, par3, par4);
                    }
                }
            }
            else
            {
                par1World.setBlockToAir(par2, par3, par4);
            }
        }
    }
}

Adesso c’è da aggiustare ChunkProvider. Li si possono vedere 3 errori. Il primo è aggiustabile mettendo il mouse sopra ChunkProvider e cliccando add unimplemented methods. Cliccando ciò siete sicuri che metterà valori validi. Non è sempre così, ma questa volta si.
I prossimi 2 errori sono in populate. Per aggiustare basta semplicemente rimuovere WithNotify nei 2 metodi usati.
Adesso rimane solo 1 file, Teleporter.
Visto la complessità generale del codice, metodi cambiati ed alter code, è più semplice copiare il codice dal file Teleporter (Vanilla Minecraft).
Ora premi Ctrl + F e cerca obsidian. Rimpiazzalo con il blocco che vuoi utilizzare per il portale. Dopo di ciò fai lo stesso per
Block.portal e cambialo nel blocco che desideri.

Questo dovrebbe essere tutto per aggiornare la tua mod e che sia pronta per la nuova versione mi minecraft. Se c’è qualcosa che ho saltato o c’è MC 1.5.2 editerò questo tutorial. Ora devo solo ricominciare i tutorial dalla versione 1.4.7 alla 1.5.1.

Questo è l’ultimo tutorial della 1.4.7

Quando sei pronto torna indietro alla lista dei tutorial qui: http://wuppy29.blogspot.nl/2013/03/forge-modding-151.html

Geen opmerkingen:

Een reactie posten