Les choses étranges du code de Minecraft
-
Je vais plutôt parler du code Forge cette fois :
L’event ChunkDataEvent.Load est propagé lorsque les données NBT d’un Chunk sont chargé.
L’event ChunkDataEvent.Save est propagé lorsque les données NBT d’un Chunk sont sauvegardée.L’event ChunkEvent.Load est propagé lorsqu’un Chunk est chargé
L’event ChunkEvent.Unload est propagé lorsqu’un Chunk est déchargé.ChunkDataEvent.Load est propagé AVANT ChunkEvent.Load.
Donc dans mon handler de ChunkDataEvent.Load, je charge les données, mais j’en fais quoi ??!
Puis qu’imaginons que le Chunk ne soit finalement pas chargé, je n’ai aucun moyen de le savoir.
ChunkEvent.Load ne va pas être propagé, et ChunkEvent.Unload non plus.Je pense faire un point sur le forum officiel de Forge. Si toutefois vous avez des explications, je prends !

-
Dans le BlockPortal :
for (blockpos1 = pos; !World.doesBlockHaveSolidTopSurface(worldIn, blockpos1) && blockpos1.getY() > 0; blockpos1 = blockpos1.down()) { ; }Ça aurait pas été mieux une boucle while ?
-
Une boucle for pour ça est valide.
En passant c’était surement une boucle while au début et Fernflower a du mal décompiler, c’est possible.
-
Mojang fait des API pour ensuite faire des conditions uniques dans les classes mères, voici un exemple pour le rendu du beacon, de la table d’enchantement et du coffre :
(TileEntity:399)@SideOnly(Side.CLIENT) public AxisAlignedBB getRenderBoundingBox() { AxisAlignedBB bb = INFINITE_EXTENT_AABB; // On prend un truc infini pour le beacon (la condition est plus bas) Block type = getBlockType(); if (type == Blocks.enchanting_table) // Si c'est une table d'enchant { bb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1); } else if (type == Blocks.chest || type == Blocks.trapped_chest) // Si c'est un coffre { bb = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord, zCoord - 1, xCoord + 2, yCoord + 2, zCoord + 2); } else if (type != null && type != Blocks.beacon) // Si le bloc n'est pas null et que ce n'est pas un beacon { AxisAlignedBB cbb = type.getCollisionBoundingBoxFromPool(worldObj, xCoord, yCoord, zCoord); // On prend la boîte de collision if (cbb != null) { bb = cbb; } } return bb; } -
Du-coup comme dit dans la shoutbox c’est Forge qui ajoute ça et non Mojang et Forge fait ça pour éviter d’avoir trop de patch.
-
A moi a moi, je ne ses pas si c’est forge ou minecraft mais dans le code de l’endercrystal:
public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) { if (this.isEntityInvulnerable()) { return false; } else { if (!this.isDead && !this.worldObj.isRemote) { this.health = 0; if (this.health <= 0) { this.setDead(); if (!this.worldObj.isRemote) { this.worldObj.createExplosion((Entity)null, this.posX, this.posY, this.posZ, 6.0F, true); } } } return true; } } -
Je vois aucun problème dans le code que tu as donné.
-
Mettre la vie a 0 puis check si elle est inférieur ou égal à 0. Normal.
-
Quand on comprend pas le code c’est normal de dire des trucs chelou comme ça
-
(Quelque peu hors-sujet mais le Moteur MyBB vient de m’envoyer un MP de suivi pour ce sujet… MP commençant par "SCAREX, "…)
-
What ? Screenshot ?
-
@‘robin4002’:
What ? Screenshot ?
:::

::: -
Scarex aurait-il des acces root? xD
-
Euh j’étais pas au courant
Envoyé de mon SM-G920F en utilisant Tapatalk
-
Je crois que cette fonctionnalité a un soucis x)
-
protected ModelResourceLocation(int p_i46078_1_, String … p_i46078_2_) { super(0, new String[] {p_i46078_2_[0], p_i46078_2_[1]}); this.variant = StringUtils.isEmpty(p_i46078_2_[2]) ? "normal" : p_i46078_2_[2].toLowerCase(); }Un argument inutile dans le constructeur
-
Regarde que ce soit pas une correction forge
-
C’est à dire ? Comment faire ?
-
Je pensais que c’était un patch forge, mais en fait non, donc c’est Mojang
-
Ma nouvelle découverte concerne le code de forge cette fois-ci, je vous laisse découvrir le code afin de ne pas spoiler :
private static Map<pair<item, integer="">, Class> tileItemMap = Maps.newHashMap(); public static void renderTileItem(Item item, int metadata) { Class tileClass = tileItemMap.get(Pair.of(item, metadata)); if (tileClass != null) { TileEntitySpecialRenderer r = TileEntityRendererDispatcher.instance.getSpecialRendererByClass(tileClass); if (r != null) { r.renderTileEntityAt(null, 0, 0, 0, 0, -1); } } } /** * @deprecated Will be removed as soon as possible, hopefully 1.9. */ @Deprecated public static void registerTESRItemStack(Item item, int metadata, Class TileClass) { tileItemMap.put(Pair.of(item, metadata), TileClass); }Ceci est du code de minecraft 1.10.2, ici nous pouvons voir qu’il faut enregistrer un TESR avec une TileEntity afin de faire le rendu spécial d’un item. Donc si vous voulez faire un rendu spécial, vous devez créer une TileEntity avec rien dedans (de plus vous ne pouvez pas créer une TileEntity pour plusieurs items à rendre car vous n’avez pas l’instance de l’item en paramètre, donc 1 rendu spécial = une tile entity).</pair<item,>
