Bucket et Liquide
-
@‘SCAREX’:
t’es sûr que c’est pas un problème de synchronisation ?
Comment puis-je savoir si c’est problème de synchronisation ?
-
Si tu mets un block à côté de ta source et que ta source ré-apparaît c’est qu’il y a un problème de synchronisation
-
Non, ce n’est pas un problème de synchronisation: le liquide disparait réellement.
[edit] :
Non, c’est bon pour le troisième problème, je n’avais pas vu que j’ai mis un world.setBlockToAir(pos) au mauvaise endroit ! -
Regarde le code plus précisément en faisant click droit “Open call hierarchy” sur la fonction qui vide le seau
-
Pour le premier problème, j’ai trouvé une solution toute simple : faire un extends de ShapedOreRecipe.
Voici le code:public class ShapedOreRecipeWithoutRemain extends ShapedOreRecipe { public ShapedOreRecipeWithoutRemain(Block result , Object[] recipe) { super(result, recipe); } public ShapedOreRecipeWithoutRemain(Item result , Object[] recipe) { super(result, recipe); } public ShapedOreRecipeWithoutRemain(ItemStack result , Object[] recipe) { super(result, recipe); } @Override public ItemStack[] getRemainingItems(InventoryCrafting inv) { return new ItemStack[inv.getSizeInventory()]; } }Il reste donc plus que le deuxième problème.
-
Pourquoi faire une autre classe et pas utiliser ShapedOreRecipes directement ?
Pour le deuxième problème, créée un Material en prenant exemple sur celui de la lave. -
C’est parce que ShapedOreRecipe laisse un seau vide dans la table de craft si on fait un craft avec un seau plain. Donc comme je veux faire un craft avec un seau d’eau qui donne un autre seau, je ne vaux pas qu’il rest un seau vide dans la table de craft et ```java
@Override
public ItemStack[] getRemainingItems(InventoryCrafting inv)
{
return new ItemStack[inv.getSizeInventory()];
}permet de ne rien laisser dans la table de craft.(A part les item qu'il y a en trop pour le craft comme une buche de bois si on en met 2 dans un slot) Pour le deuxième problème, ce sont les entités qui gèrent le déplacement et les dégats dans les liquides : dans onUpdate(), il vérifient si le block dans lequel il est à pour material material.lava et dans ce cas, l'entité est ralentie et est en feu. -
1. ça va être difficile. Le système de craft de Minecraft n’est pas du tout prévu pour ça.
2. LivingUpdateEvent -> si le bloc au coordonnée de ton entité est ton bloc tu ralenti l’entité.
-
@‘robin4002’:
1. ça va être difficile. Le système de craft de Minecraft n’est pas du tout prévu pour ça.
2. LivingUpdateEvent -> si le bloc au coordonnée de ton entité est ton bloc tu ralenti l’entité.
C’est une bonne idée pour mon deuxième problème d’utiliser LivingUpdateEvent, je vais tester ça. (Et j’ai déjà trouvé une solution, un peut plus haut pour le premier problème)
-
Pour le 1), ah oui autant pour moi.
Pour le 2), oui bonne idée. -
J’ai fait quelque chose avec LivingUpdateEvent mais avec beaucoup d’entités, ça fait vite du lag.
:::@SubscribeEvent public void onLivingUpdate(LivingUpdateEvent event) { EntityLivingBase entity = event.entityLiving; BlockPos pos = new BlockPos(entity); World world = entity.worldObj; boolean inTarmac = false; AxisAlignedBB bBox = entity.getEntityBoundingBox(); if (bBox == null) return; Iterable <blockpos>iterable = BlockPos.getAllInBox(new BlockPos(bBox.minX, bBox.minY, bBox.minZ), new BlockPos(bBox.maxX, bBox.maxY, bBox.maxZ)); Iterator <blockpos>iterator = iterable.iterator(); while (iterator.hasNext()) { BlockPos testPos = iterator.next(); System.out.println("Test…" + testPos); if (world.getBlockState(testPos).getBlock() == BlockMod.tarmacLiquid) { inTarmac = true; break; } } if (inTarmac) { entity.setFire(1); entity.motionX *= 0.2f; entity.motionY *= 0.5f; entity.motionZ *= 0.2f; } }:::
Si quelqu’un a un moyen plus simple et moins couteux en ressources, je suis preneur !</blockpos></blockpos>
-
Pourquoi tout ça ?
Un simple :
if(world.getBlockState(new BlockPos(entity.posX, entity.posY, entity.posZ).getBlock() == BlockMod.tarmacLiquid)
suffit. -
J’ai fait ce truc compliqué pour détecter tous les blocks en collision avec l’entité. Si je met
if(world.getBlockState(new BlockPos(entity.posX, entity.posY, entity.posZ).getBlock() == BlockMod.tarmacLiquid)
ça va juste détecter le block au pieds de l’entité. Donc je sais pas si c’est vraiment mieux. -
if(world.getBlockState(new BlockPos(entity.posX, entity.posY, entity.posZ).getBlock() == BlockMod.tarmacLiquid || world.getBlockState(new BlockPos(entity.posX, entity.posY, entity.posZ).up().getBlock() == BlockMod.tarmacLiquid)
devrait être suffisant. -
Merci ! Comme ça, ça lag moins !
J’ai un dernier petit problème, je pence pas que ce soir trais important mais bon. Quand je prend mon liquide en item, sa texture c’est un block noir et rose (au lieux de l’item plat du liquide).
Voici le code que j’ai mit pour définir le model du liquide (pris sur un tuto):Item item = Item.getItemFromBlock(fluid); final ModelResourceLocation resLoc = new ModelResourceLocation(ModMaxyFactory.MOD_ID + ":" + fluid.getUnlocalizedName().substring(5), "tarmacliquid"); ModelBakery.addVariantName(item); ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition() { @Override public ModelResourceLocation getModelLocation(ItemStack stack) { return resLoc; } }); ModelLoader.setCustomStateMapper(fluid, new StateMapperBase() { @Override protected ModelResourceLocation getModelResourceLocation(IBlockState p_178132_1_) { return resLoc; } });et voici le blockstate de mon liquide :
{ "forge_marker": 1, "defaults": { "model": "forge:fluid", "transform": "forge:default-item" }, "variants": { "tarmacliquid" : [{ "custom": { "fluid": "fluid_tarmac" } }] } }Dites moi si il y a des choses à changer.
-
Salut, pourrais-tu me passer tout ton code de liquide pour que je puisse voir de mon côté, merci.

-
@‘elx9000’:
Salut, pourrais-tu me passer tout ton code de liquide pour que je puisse voir de mon côté, merci.

Il n’y a pas grand chose de plus que je pourrais ajouter. C’est deux lignes peuvent peut-être être utiles :
fluidTarmac = new Fluid("fluid_tarmac", new ResourceLocation("maxyfactory:blocks/tarmac"), new ResourceLocation("maxyfactory:blocks/tarmac_flowing")).setTemperature(800); tarmacLiquid = ((BlockFluidClassic) new TarmacLiquid(FluidMod.fluidTarmac, MaterialMod.liquid).setUnlocalizedName("tarmacLiquid")).setTickRate(20).setQuantaPerBlock(5).setTemperature(800);TarmacLiquid est just un extends de BlockFluidClassic.(La class de forge qui permet de faire des liquides simplement)
-
Merci je vais voir ce que je peux faire
-
Pourrais - tu me passer exactement tout ton code (même la plus petite ligne), j’ai beaucoup de mal à recréer ton fluide.
Merci d’avance.
-
Dans FMLPreInitializationEvent, il y a :
:::Fluid fluidTarmac = new Fluid("fluid_tarmac", new ResourceLocation("maxyfactory:blocks/tarmac"), new ResourceLocation("maxyfactory:blocks/tarmac_flowing")).setTemperature(800); FluidRegistry.registerFluid(fluidTarmac); Block tarmacLiquid = ((BlockFluidClassic) new BlockFluidClassic(FluidMod.fluidTarmac, MaterialMod.liquid).setUnlocalizedName("tarmacLiquid")).setTickRate(20).setQuantaPerBlock(5).setTemperature(800); GameRegistry.registerBlock(tarmacLiquid, "tarmacLiquid"); Item itemTarmacLiquid = Item.getItemFromBlock(tarmacLiquid); final ModelResourceLocation resLoc = new ModelResourceLocation("maxyfactory:fluid_tarmac", "tarmacliquid"); ModelBakery.addVariantName(item); ModelLoader.setCustomMeshDefinition(itemTarmacLiquid, new ItemMeshDefinition() { @Override public ModelResourceLocation getModelLocation(ItemStack stack) { return resLoc; } }); ModelLoader.setCustomStateMapper(itemTarmacLiquid, new StateMapperBase() { @Override protected ModelResourceLocation getModelResourceLocation(IBlockState p_178132_1_) { return resLoc; } });:::
Dans FMLInitializationEvent (coté client), il y a ça :
:::Item itemTarmacLiquid = Item.getItemFromBlock(tarmacLiquid); Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(itemTarmacLiquid, 0, new ModelResourceLocation("maxyfactory:" + itemTarmacLiquid.getUnlocalizedName().substring(5), "inventory"));:::