Comment faire une lance ?
-
Comme pour n’importe quelle entité. Il faut faire un render.
-
Oui je sais mais tu n’aurais pas un tuto, je suis vraient débutant dans le milieu x)
-
http://www.minecraftforgefrance.fr/showthread.php?tid=648#classe2
+
http://www.minecraftforgefrance.fr/showthread.php?tid=648#classe4
C’est le même principe, sauf qu’au lieu d’utiliser RenderBiped il faut utiliser directement Render. Tu peux aussi t’inspirer des autres rendus de Minecraft. -
J’ai pris un peut du tuto et la class RenderArrow de minecraft en la modifiant et il me reste un problème au niveau du ClientProxy, Je met cette ligne dans le ClientProxy :
RenderingRegistry.registerEntityRenderingHandler(EntitySpear.class, new RenderSpear(new ModelBase(), 0.5F));
et il ne l’accepte pas au niveau du ModelBase.
Class principale : ```java
package com.quantumsheep.arkcraft;import java.awt.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import com.quantumsheep.arkcraft.entity.EntityGiantSpider;
import com.quantumsheep.arkcraft.entity.EntitySpear;
import com.quantumsheep.arkcraft.lib.CommonProxy;
import com.quantumsheep.arkcraft.lib.EntityEventHandler;
import com.quantumsheep.arkcraft.lib.References;
import com.quantumsheep.arkcraft.weapons.WeaponSpear;import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import net.minecraft.client.gui.Gui;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.item.Item;
import net.minecraft.item.Item.ToolMaterial;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.EnumHelper;@Mod(modid = References.MODID, name = “ArkCraft Mod”, version = References.VERSION)
public class ArkCraftMod {
@Instance(“arkcraft”)
public static ArkCraftMod instance;@SidedProxy(clientSide = References.Client, serverSide = References.Common)
public static CommonProxy proxy;public static Item weaponSpear;
public static final Logger LOGGER = LogManager.getLogger(References.NAME);
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
weaponSpear = new WeaponSpear().setUnlocalizedName(“weaponSpear”).setTextureName(References.MODID + “:weaponSpear”).setCreativeTab(CreativeTabs.tabMaterials);GameRegistry.registerItem(weaponSpear, “weapon_spear”);
}@EventHandler
public void init(FMLInitializationEvent event)
{
EntityRegistry.registerGlobalEntityID(EntitySpear.class, “entitySpear”, EntityRegistry.findGlobalUniqueEntityId(), new Color(0, 255, 0).getRGB(), new Color(255, 0, 0).getRGB());
EntityRegistry.registerModEntity(EntitySpear.class, “entitySpear”, 420, this.instance, 40, 1, true);EntityRegistry.registerGlobalEntityID(EntityGiantSpider.class, “giantSpider”, EntityRegistry.findGlobalUniqueEntityId(), 0x7AE8FF, 0x47FFE2);
MinecraftForge.EVENT_BUS.register(new EntityEventHandler());
proxy.registerRender();
}@EventHandler
public void postInit(FMLPostInitializationEvent event)
{}
}WeaponSpear : ```java package com.quantumsheep.arkcraft.weapons; import com.quantumsheep.arkcraft.ArkCraftMod; import com.quantumsheep.arkcraft.entity.EntitySpear; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntitySnowball; import net.minecraft.init.Items; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; public class WeaponSpear extends Item { public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime) { int j = this.getMaxItemUseDuration(stack) - useTime; float f = (float)j / 5.0F; f = (f * f + f * 2.0F) / 3.0F; if ((double)f < 0.1D) { return; } if (f > 1.0F) { f = 1.0F; } EntitySpear entityarrow = new EntitySpear(world, player, f * 2.0F); if (f == 1.0F) { entityarrow.setIsCritical(true); } world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); player.setCurrentItemOrArmor(0, null); player.inventory.markDirty(); if (!world.isRemote) { world.spawnEntityInWorld(entityarrow); } } public ItemStack onEaten(ItemStack p_77654_1_, World p_77654_2_, EntityPlayer p_77654_3_) { return p_77654_1_; } public int getMaxItemUseDuration(ItemStack p_77626_1_) { return 72000; } public EnumAction getItemUseAction(ItemStack p_77661_1_) { return EnumAction.bow; } public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { ArrowNockEvent event = new ArrowNockEvent(p_77659_3_, p_77659_1_); MinecraftForge.EVENT_BUS.post(event); if (event.isCanceled()) { return event.result; } if (p_77659_3_.capabilities.isCreativeMode || p_77659_3_.inventory.hasItem(ArkCraftMod.weaponSpear)) { p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); } return p_77659_1_; } }
ModelSpear : ```java
package com.quantumsheep.arkcraft.models;import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;public class ModelSpear extends ModelBase
{
//fields
ModelRenderer Shape1;public ModelSpear()
{
textureWidth = 64;
textureHeight = 32;Shape1 = new ModelRenderer(this, 0, 0);
Shape1.addBox(0F, 23F, 0F, 14, 1, 1);
Shape1.setRotationPoint(-1F, 0F, 7F);
Shape1.setTextureSize(64, 32);
Shape1.mirror = true;
setRotation(Shape1, 0F, 1.570796F, 0F);
}public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
{
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5);
Shape1.render(f5);
}private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
{
super.setRotationAngles(f, f1, f2, f3, f4, f5, null);
}
}RenderSpear : ```java package com.quantumsheep.arkcraft.render; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.quantumsheep.arkcraft.entity.EntitySpear; import com.quantumsheep.arkcraft.lib.References; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class RenderSpear extends Render { private static final ResourceLocation spearTextures = new ResourceLocation("textures/entity/arrow.png"); private static final String __OBFID = "CL_00000978"; /** * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic * (Render<t extends="" entity)="" and="" this="" method="" has="" signature="" public="" void="" func_76986_a(t="" entity,="" double="" d,="" d1,<br=""> * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(EntitySpear p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { this.bindEntityTexture(p_76986_1_); GL11.glPushMatrix(); GL11.glTranslatef((float)p_76986_2_, (float)p_76986_4_, (float)p_76986_6_); GL11.glRotatef(p_76986_1_.prevRotationYaw + (p_76986_1_.rotationYaw - p_76986_1_.prevRotationYaw) * p_76986_9_ - 90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(p_76986_1_.prevRotationPitch + (p_76986_1_.rotationPitch - p_76986_1_.prevRotationPitch) * p_76986_9_, 0.0F, 0.0F, 1.0F); Tessellator tessellator = Tessellator.instance; byte b0 = 0; float f2 = 0.0F; float f3 = 0.5F; float f4 = (float)(0 + b0 * 10) / 32.0F; float f5 = (float)(5 + b0 * 10) / 32.0F; float f6 = 0.0F; float f7 = 0.15625F; float f8 = (float)(5 + b0 * 10) / 32.0F; float f9 = (float)(10 + b0 * 10) / 32.0F; float f10 = 0.05625F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); float f11 = (float)p_76986_1_.arrowShake - p_76986_9_; if (f11 > 0.0F) { float f12 = -MathHelper.sin(f11 * 3.0F) * f11; GL11.glRotatef(f12, 0.0F, 0.0F, 1.0F); } GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); GL11.glScalef(f10, f10, f10); GL11.glTranslatef(-4.0F, 0.0F, 0.0F); GL11.glNormal3f(f10, 0.0F, 0.0F); tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)f6, (double)f8); tessellator.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)f7, (double)f8); tessellator.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)f7, (double)f9); tessellator.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)f6, (double)f9); tessellator.draw(); GL11.glNormal3f(-f10, 0.0F, 0.0F); tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)f6, (double)f8); tessellator.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)f7, (double)f8); tessellator.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)f7, (double)f9); tessellator.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)f6, (double)f9); tessellator.draw(); for (int i = 0; i < 4; ++i) { GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); GL11.glNormal3f(0.0F, 0.0F, f10); tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-8.0D, -2.0D, 0.0D, (double)f2, (double)f4); tessellator.addVertexWithUV(8.0D, -2.0D, 0.0D, (double)f3, (double)f4); tessellator.addVertexWithUV(8.0D, 2.0D, 0.0D, (double)f3, (double)f5); tessellator.addVertexWithUV(-8.0D, 2.0D, 0.0D, (double)f2, (double)f5); tessellator.draw(); } GL11.glDisable(GL12.GL_RESCALE_NORMAL); GL11.glPopMatrix(); } /** * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. */ protected ResourceLocation getEntityTexture(EntitySpear p_110775_1_) { return spearTextures; } /** * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. */ protected ResourceLocation getEntityTexture(Entity p_110775_1_) { return this.getEntityTexture((EntitySpear)p_110775_1_); } /** * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic * (Render<t extends="" entity)="" and="" this="" method="" has="" signature="" public="" void="" func_76986_a(t="" entity,="" double="" d,="" d1,<br=""> * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { this.doRender((EntitySpear)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); } } ```</t></t>
-
Pourquoi ModelBase ? Ton modèle s’appelle ModelSpear. Et le code de rendu n’est pas bon pour ce que tu veux faire, le rendu de la flèche rend directement la flèche et non un modèle.
-
J’ai remplacer comme ça : ```java
RenderingRegistry.registerEntityRenderingHandler(EntitySpear.class, new RenderSpear(ModelSpear(), 0.5F));Et ça ne fonctionne pas, il me met une erreur sur ModelSpear. Tu n'aurais pas un code qui me montrerais comment faire ? :'(
-
Un exemple de rendu :
https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/client/renderer/RenderSatelite.java
Le modèle ne passe pas par le constructeur, donc c’est enregistré directement comme ça :
https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/core/ClientProxy.java#L81 -
Ok, c’est bon, le model se génère bien, seul problème c’est que la lance est décalée et quand je la lance elle se tp plus en hauteur…
-
Après il faut changer comment est rendu ton model avec des translations et des rotations. Il faut juste vérifier que le problème ne soit qu’au rendu et pas au niveau de la hitbox, fait F3+B pour voir les hitbox.
-
C’est la même Hitbox qu’une flèche c’est bizarre que ça ne fonctionne pas… Voilà mon model Techne en pièce jointe (Modèle provisoire).
-
Personne n’a de solution à ce décalage ? :'(___Ah et nouveau problème (Triple poste oklm), Quand j’utilise n’importe quel autre item que je créer (Même sans méthodes juste un item normal) il envois l’entitée de la lance et se charge O_o
-
Envoies nous ton code. Et pour le décalage il suffit de faire un petit GL11.glTranslate dans le code du rendu.
-
Voilà le github avec les derniers codes : https://github.com/ArkCraft/ArkCraft/tree/master/src/main
ça sera surement plus pratique -
Il n’y a qu’un item sur le github.
-
Oui, je viens de changer : https://github.com/ArkCraft/ArkCraftMod/
-
Fais un peu d’ordre dans ton code, y’a pas besoin de 40 glScale à la suite.
Dans ton glTranslate, rajoute un -1 sur l’axe y, il faut changer ces valeurs pour avoir la bonne.
-
C’est le render originel de la flèche
Comment je change pour -1, je n’ai aucunes connaissances en GL -
weaponSpear = new WeaponSpear().setUnlocalizedName(“weaponSpear”).setTextureName(References.MODID + “:weaponSpear”).setCreativeTab(CreativeTabs.tabMaterials);
itemLongneckRifle = new WeaponSpear().setUnlocalizedName(“itemLongneckRifle”).setTextureName(References.MODID + “:itemLongneckRifle”).setCreativeTab(CreativeTabs.tabMaterials);Si tu utilises la même classe pour les deux c’est normal que les deux items ont le même comportement …
Et pour le -1, c’est juste changer un nombre dans le code … ça ne nécessite aucune compétence spécial.
-
Okkkk je suis donc un con pour ne pas avoir vu ça….
Le -1 je ne sait juste pas où le placer
-
Voilà