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;
importnet.minecraft.entity.EntityEggInfo;
importnet.minecraft.entity.EntityList;
importnet.minecraft.entity.EnumCreatureType;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.biome.BiomeGenBase;
importnet.minecraftforge.common.DimensionManager;
importnet.minecraftforge.common.DungeonHooks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
importcpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
importcpw.mods.fml.common.network.NetworkMod;
importcpw.mods.fml.common.registry.EntityRegistry;
importcpw.mods.fml.common.registry.GameRegistry;
importcpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid = “Tutorial_Tutorialmod”, name = “Tutorial”, version = “1.0”)
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public classTutorial
{
       @SidedProxy(clientSide = “tutorial.ClientProxyTutorial”, serverSide = “tutorial.CommonProxyTutorial”)
       publicstatic CommonProxyTutorial proxy;
      
       staticint startEntityId= 300;
      
       publicstatic intdimension = 20;
      
       publicstatic Block portal;
      
       publicstatic Item portalPlacer;
      
       publicstatic BiomeGenBase tutorialBiome;
      
       @Init
       publicvoid load(FMLInitializationEvent event)
       {
             proxy.registerRenderThings();
            
             tutorialBiome = newBiomeGenTutorial(53).setColor(2900485).setBiomeName(“Tutorial Biome”).setTemperatureRainfall(1F, 0.5F).setMinMaxHeight(0.2F, 1F);
            
             GameRegistry.addBiome(tutorialBiome);
            
             portalPlacer = newItemPortalPlacer(5000).setIconIndex(0).setItemName(“tutorial”);
            
             LanguageRegistry.addName(portalPlacer, “Portal Placer”);
             
             portal = newBlockPortalTutorial(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(newItemStack(Block.blockGold, 2), new Object[]
             {
                    “XXX”,
                    “XZX”,
                    “XXX”,
                    ‘X’, Item.coal, ‘Z’, newItemStack(Item.dyePowder, 1, 15)
             });
            
             DungeonHooks.addDungeonMob(“Tutorial”, 50);
       }
      
       publicstatic intgetUniqueEntityId()
       {
             do
             {
                    startEntityId++;
             }
             while(EntityList.getStringFromID(startEntityId) != null);
                   
             return startEntityId;
       }
      
       publicstatic voidregisterEntityEgg(Class <? extendsEntity> 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 16×16 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;
importnet.minecraft.entity.EntityEggInfo;
import net.minecraft.entity.EntityList;
importnet.minecraft.entity.EnumCreatureType;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
importnet.minecraft.world.biome.BiomeGenBase;
importnet.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.DungeonHooks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
importcpw.mods.fml.common.SidedProxy;
importcpw.mods.fml.common.event.FMLInitializationEvent;
importcpw.mods.fml.common.network.NetworkMod;
importcpw.mods.fml.common.registry.EntityRegistry;
importcpw.mods.fml.common.registry.GameRegistry;
importcpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid = “Tutorial_Tutorialmod”, name = “Tutorial”, version = “1.0”)
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public classTutorial
{
       publicstatic finalString modid = “Tutorial_Tutorialmod”;
      
       @SidedProxy(clientSide = “tutorial.ClientProxyTutorial”, serverSide = “tutorial.CommonProxyTutorial”)
       publicstatic CommonProxyTutorial proxy;
      
       staticint startEntityId= 300;
      
       publicstatic intdimension = 20;
      
       publicstatic Block portal;
      
       publicstatic Item portalPlacer;
      
       publicstatic BiomeGenBase tutorialBiome;
      
       @Init
       publicvoid load(FMLInitializationEvent event)
       {
             proxy.registerRenderThings();
            
             tutorialBiome = newBiomeGenTutorial(53).setColor(2900485).setBiomeName(“Tutorial Biome”).setTemperatureRainfall(1F, 0.5F).setMinMaxHeight(0.2F, 1F);
            
             GameRegistry.addBiome(tutorialBiome);
            
             portalPlacer = newItemPortalPlacer(5000).setUnlocalizedName(“tutorial”);
            
             LanguageRegistry.addName(portalPlacer, “Portal Placer”);
            
             portal = newBlockPortalTutorial(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(newItemStack(Block.blockGold, 2), new Object[]
             {
                    “XXX”,
                    “XZX”,
                    “XXX”,
                    ‘X’, Item.coal, ‘Z’, newItemStack(Item.dyePowder, 1, 15)
             });
            
             DungeonHooks.addDungeonMob(“Tutorial”, 50);
       }
      
       publicstatic intgetUniqueEntityId()
       {
             do
             {
                    startEntityId++;
             }
             while(EntityList.getStringFromID(startEntityId) != null);
                   
             return startEntityId;
       }
      
       publicstatic voidregisterEntityEgg(Class <? extendsEntity> 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;

importcpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.client.registry.RenderingRegistry;
importnet.minecraftforge.client.MinecraftForgeClient;
public classClientProxyTutorial extendsCommonProxyTutorial
{
       @Override
       publicvoid registerRenderThings()
       {
             MinecraftForgeClient.preloadTexture(“/tutorialblocks.png”);
             MinecraftForgeClient.preloadTexture(“/tutorialitems.png”);
             RenderingRegistry.registerEntityRenderingHandler(EntityTutorial.class, newRenderTutorial(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;

importcpw.mods.fml.client.registry.ClientRegistry;
importcpw.mods.fml.client.registry.RenderingRegistry;
importnet.minecraftforge.client.MinecraftForgeClient;
public classClientProxyTutorial extendsCommonProxyTutorial
{
       @Override
       publicvoid registerRenderThings()
       {
             RenderingRegistry.registerEntityRenderingHandler(EntityTutorial.class, newRenderTutorial(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 16×16 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;
importnet.minecraft.block.material.Material;
importnet.minecraft.creativetab.CreativeTabs;
public classBlockTutorialBlock extends Block
{
       publicBlockTutorialBlock(int id, int texture)
       {
             super(id, texture, Material.cloth);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       publicString 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;
importnet.minecraft.client.renderer.texture.IconRegister;
importnet.minecraft.creativetab.CreativeTabs;
public classBlockTutorialBlock extends Block
{
       publicBlockTutorialBlock(int id)
       {
             super(id, Material.cloth);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       publicvoid 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;
importnet.minecraft.block.BlockPortal;
import net.minecraft.client.renderer.texture.IconRegister;
importnet.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
importnet.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;
public classBlockPortalTutorial extendsBlockPortal
{
       publicBlockPortalTutorial(int id)
       {
             super(id);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       publicvoid registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon(Tutorial.modid+ “:” + this.getUnlocalizedName2());
    }
      
       publicvoid updateTick(World par1World, int par2, intpar3, int par4, Random par5Random)
       {
       }
      
       publicvoid onEntityCollidedWithBlock(World par1World, int par2, int par3, intpar4, 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)));
                           }
                    }
             }
       }
      
       publicboolean tryToCreatePortal(World par1World, int par2, int par3, intpar4)
    {
        bytevar5 = 0;
        bytevar6 = 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;
        }
    }
      
       publicvoid randomDisplayTick(World par1World, int par2, int par3, intpar4, Random par5Random)
    {
       
    }
      
       publicvoid onNeighborBlockChange(World par1World, int par2, int par3, intpar4, 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;
importnet.minecraft.block.BlockPortal;
import net.minecraft.client.renderer.texture.IconRegister;
importnet.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
importnet.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;
public classBlockPortalTutorial extendsBlockPortal
{
       publicBlockPortalTutorial(int id)
       {
             super(id);
             this.setCreativeTab(CreativeTabs.tabBlock);
       }
      
       publicvoid registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon(Tutorial.modid+ “:” + this.getUnlocalizedName2());
    }
      
       publicvoid updateTick(World par1World, int par2, intpar3, int par4, Random par5Random)
       {
       }
      
       publicvoid onEntityCollidedWithBlock(World par1World, int par2, int par3, intpar4, 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)));
                           }
                    }
             }
       }
      
       publicboolean tryToCreatePortal(World par1World, int par2, int par3, intpar4)
    {
        byteb0 = 0;
        byteb1 = 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;
        }
    }
      
       publicvoid randomDisplayTick(World par1World, int par2, int par3, intpar4, Random par5Random)
    {
       
    }
      
       publicvoid onNeighborBlockChange(World par1World, int par2, int par3, intpar4, int par5)
    {
        byteb0 = 0;
        byteb1 = 1;
        if(par1World.getBlockId(par2 – 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID)
        {
            b0 = 1;
            b1 = 0;
        }
        inti1;
        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.portale 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

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">