Résolu TileEntity Spawn mob
-
salut,
je revient avec mes concept bizard et je cherche a faire en sorte que un tileEntity spawn des mob avec un probabilité après un temps donné donc j’utilise une variable Time qui s’incrémente tout les tick le probleme c’est que je vois pas du tout comment faire pour faire spawner des mob dans la méthode OnUpdate
package virusz.tileEntity; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.world.World; import scala.util.Random; import virusz.block.BlockSpawnerSafeZone; import virusz.core.IAdaptableTile; import virusz.mob.zombie.EntityTermite; import virusz.mob.zombie.EntityZombSurvivor; import virusz.registry.EntityRegister; public class TileEntitySpawnersafeZone extends TileEntitySafeZone implements IAdaptableTile { private ItemStack stack; public int Time; public int random = (int) (Math.random()*(0+100)); public void readFromNBT(NBTTagCompound nbtTag) { super.readFromNBT(nbtTag); NBTTagList nbttaglist = nbtTag.getTagList("Blocks", 10); NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(0); this.stack = ItemStack.loadItemStackFromNBT(nbttagcompound1); } @Override public void updateEntity() { Time++; //67000 == 1H if(Time >= 67000){ Time=0; if(random>= 50 && random <=60){ System.out.println("OK"); } } } public void writeToNBT(NBTTagCompound nbtTag) { super.writeToNBT(nbtTag); NBTTagList nbttaglist = new NBTTagList(); if(this.stack != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); this.stack.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } nbtTag.setTag("Blocks", nbttaglist); } @Override public Block getBlockForTexture() { if(stack != null && stack.getItem() != null && Block.getBlockFromItem(stack.getItem()) != null) { return Block.getBlockFromItem(stack.getItem()); } return null; } @Override public int getBlockMetadataForTexture() { if(stack != null) { return stack.getItemDamage(); } return 0; } @Override public void setStack(ItemStack stack) { this.stack = stack; } public Packet getDescriptionPacket() { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.writeToNBT(nbttagcompound); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound); } public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); this.worldObj.markBlockRangeForRenderUpdate(this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord); } }
-
if(!worldObj.isRemote) { this.worldObj.spawnEntityInWorld(new EntityBlabla(this.worldObj); }
-
l’entité n’apparait pas sur mon block pourtant la probabilité fonctionne
-
Sers toi de la méthode :
instanceDeTonEntity.setLocationAndAngles(double x, double y, double z, float yaw, float pitch); -
ok ça fonctionne j’avais oublier ce détail XD
Encore une fois merci a vous tous
-
Par-contre ta variable random n’est pas idéale car elle unique et reste inchangée à chaque nouvelle instance de ton TileEntity. Ce que je veux dire c’est qu’il aurait mieux fallu la placer dans une autre méthode afin qu’elle puisse être modifiée. Par-exemple la mettre dans ta méthode updateEntity() aurait permit qu’elle n’ait pas toujours la même valeur. Je ne sais pas si tu me comprends mais debug, et envoies des messages dans la console et tu verras que pour chaque TileEntity dans le monde ta variable random est la même, elle ne change jamais.
Pareil autre détail à propos de tes varaibles, ta variable Time devrait être stockée dans le NBTTagCompound de ton TileEntity afin d’être unique à chaque instance. Là par exemple ta variable est universelle et du coup chaque TileEntity affichera ce message
System.out.println(“OK”);
En même temps.
Pour finir ça rejoint le premier problème, si tu ne souhaites pas que chaque TileEntity ait la même proba, ajoute et enregistre ta variable random dans le NBTTagCompound de ton TileEntity -
@‘Julot10085’:
Par-contre ta variable random n’est pas idéale car elle unique et reste inchangée à chaque nouvelle instance de ton TileEntity. Ce que je veux dire c’est qu’il aurait mieux fallu la placer dans une autre méthode afin qu’elle puisse être modifiée. Par-exemple la mettre dans ta méthode updateEntity() aurait permit qu’elle n’ait pas toujours la même valeur. Je ne sais pas si tu me comprends mais debug, et envoies des messages dans la console et tu verras que pour chaque TileEntity dans le monde ta variable random est la même, elle ne change jamais.
Pareil autre détail à propos de tes varaibles, ta variable Time devrait être stockée dans le NBTTagCompound de ton TileEntity afin d’être unique à chaque instance. Là par exemple ta variable est universelle et du coup chaque TileEntity affichera ce message
System.out.println(“OK”);
En même temps.
Pour finir ça rejoint le premier problème, si tu ne souhaites pas que chaque TileEntity ait la même proba, ajoute et enregistre ta variable random dans le NBTTagCompound de ton TileEntityYep merci je ré ouvre en vitesse le topic pour savoir si il y a un moyen de préciser le nombre d entité a spawner sur le block pour la var random j ai déjà remarquer le probleme et je viens de le corriger pour les nbttag j’avais juste pas écrit les lignes je viens des les ajouter aussi x)
-
j’ai fini par trouve un moyen en créant un méthode avec this.worldObj.spawnEntityInWorld(new EntityBlabla(this.worldObj); et la position et en la faisant boucler le nombre d’entité désiré