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.
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.
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