[1.7.x]Extended Entity Properties/Dimension/Particules/Rotation d'un Item



  • Bonjour,
    J'ai quelques "petits" problèmes que j'ai pensé bon de regroupé dans un seul post :

    Dimension

    Connaîtriez-vous une possibilité de pouvoir généré une seul structure au  coordonnées du spawn du joueur dans une dimension ?
    Je ne sais pas où chercher donc je n'ai aucun code de "départ" :s , j'ai juste les codes de base pour la génération d'une dimension vide

    Particules

    J'ai voulu faire spawn des particules et j'aimerais que les particules soit "stable" comme le bloc barrier en snapshot

    @SideOnly(Side.CLIENT)
    public class EntityParticulesFX  extends EntityFX {
    
    protected EntityParticulesFX (World par1World, double par2, double par4,double par6) {
    super(par1World, par2, par4, par6);
    
    }
    
    public EntityParticulesFX (World par1World, double par2, double par4,double par6, double par8, double par10, double par12) {
    super(par1World, par2, par4, par6, par8, par10, par12);
    this.setVelocity(0.0d, 0.0d, 0.0d);
    this.particleAge = 0;
    this.particleMaxAge = 2;
    }
    
    @Override
    public void renderParticle(Tessellator par1Tessellator, float par2,float par3, float par4, float par5, float par6, float par7) {
    // func_98187_b() = bindTexture();
    FMLClientHandler.instance().getClient().renderEngine.bindTexture(new ResourceLocation("dossier:textures/particles/Particules.png"));;
    float scale = 0.5F * this.particleScale;
    float xPos = (float) (this.prevPosX + (this.posX - this.prevPosX)
    * (double) par2 - interpPosX);
    float yPos = (float) (this.prevPosY + (this.posY - this.prevPosY)
    * (double) par2 - interpPosY);
    float zPos = (float) (this.prevPosZ + (this.posZ - this.prevPosZ)
    * (double) par2 - interpPosZ);
    float colorIntensity = 1.0F;
    par1Tessellator.setColorOpaque_F(this.particleRed * colorIntensity,
    this.particleGreen * colorIntensity, this.particleBlue
    * colorIntensity);// , 1.0F);
    par1Tessellator.addVertexWithUV((double) (xPos - par3 * scale - par6
    * scale), (double) (yPos - par4 * scale), (double) (zPos - par5
    * scale - par7 * scale), 0D, 1D);
    par1Tessellator.addVertexWithUV((double) (xPos - par3 * scale + par6
    * scale), (double) (yPos + par4 * scale), (double) (zPos - par5
    * scale + par7 * scale), 1D, 1D);
    par1Tessellator.addVertexWithUV((double) (xPos + par3 * scale + par6
    * scale), (double) (yPos + par4 * scale), (double) (zPos + par5
    * scale + par7 * scale), 1D, 0D);
    par1Tessellator.addVertexWithUV((double) (xPos + par3 * scale - par6
    * scale), (double) (yPos - par4 * scale), (double) (zPos + par5
    * scale - par7 * scale), 0D, 0D);
    }
    
    }
    

    #Rotation d'item(Rotation d'item)

    Voici la classe de mon render, le problème est que l'item n'a pas de rotation sur lui même, il n'est pas centré

    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
    switch(type)
    {
    case ENTITY:
    return true;
    default:
    return false;
    }
    }
    
    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item,
    ItemRendererHelper helper) {
    if(helper == ItemRendererHelper.ENTITY_ROTATION)
    {
    return true;
    }
    return false;
    }
    
    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object… data)
    {
    switch(type)
    {
    case ENTITY:
    {
    EntityItem living = (EntityItem)data[1];
    int renderPass = item.getItem().requiresMultipleRenderPasses() ? 1 : 0;
    
    GL11.glPushMatrix();
               GL11.glScalef(2F, 2F, 2F);
               GL11.glTranslatef(0.3F, 0.25F, 0F);
    
               GL11.glRotatef(0F, 1.0F, 0.0F, 0.0F);
               GL11.glRotatef(0F, 0.0F, 0.0F, 1.0F);
               GL11.glRotatef(0F, 0.0F, 1.0F, 0.0F);
               this.renderItem(living, item, renderPass);
        GL11.glPopMatrix();
    break;
    }
    default:
    break;
    }
    
    }
    
    public void renderItem(EntityItem living, ItemStack stack, int pass)
    {
    TextureManager texturemanager = FMLClientHandler.instance().getClient().getTextureManager();
    GL11.glPushMatrix();
    IIcon icon = living.getEntityItem().getItem().getIcon(stack, pass);
    if(icon == null)
    {
    GL11.glPopMatrix();
    return;
    }
    texturemanager.bindTexture(texturemanager.getResourceLocation(stack.getItemSpriteNumber()));
    Tessellator tessellator = Tessellator.instance;
    float f = icon.getMinU();
    float f1 = icon.getMaxU();
    float f2 = icon.getMinV();
    float f3 = icon.getMaxV();
    float f4 = 0.0F;
    float f5 = 0.3F;
    GL11.glEnable(GL12.GL_RESCALE_NORMAL);
    GL11.glTranslatef(-f4, -f5, 0.0F);
    float f6 = 1.0F;
    GL11.glScalef(f6, f6, f6);
    GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
    GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
    GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F);
    ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), -0.0625F);
    

    #Extended Entity Properties(Extended Entity Properties)

    Le code pour le double saut étant fait en client, j'ai voulu envoyé utiliser un packet pour envoyé cette donnée au serveur mais cela ne ce fait pas
    PacketSonic :

    ​public class PacketSonic
    extends FFMTPacket
    {
    
    public int Descendre;
    public boolean DoubleJump;
    public long Ring;
    
    public PacketSonic(){
    
    }
    
    public PacketSonic(int Descendre, boolean DoubleJump, long Ring){
    this.Descendre = Descendre;
    this.DoubleJump = DoubleJump;
    this.Ring = Ring;
    }
    
    @Override
    public void writeData(ByteBuf buffer) throws IOException {
    buffer.writeInt(Descendre);
    buffer.writeBoolean(DoubleJump);
    buffer.writeLong(Ring);
    
    }
    
    @Override
    public void readData(ByteBuf buffer) {
    this.Descendre = buffer.readInt();
    this.DoubleJump = buffer.readBoolean();
    this.Ring = buffer.readLong();
    
    }
    
    @Override
    public void handleClientSide(EntityPlayer player) {
    ExtendedEntityPropSonic props = ExtendedEntityPropSonic
    .get(player);
    props.Descendre = this.Descendre;
    props.DoubleJump = this.DoubleJump;
    props.Ring = this.Ring;
    }
    
    @Override
    public void handleServerSide(EntityPlayer player) {
    ExtendedEntityPropSonic props = ExtendedEntityPropSonic
    .get(player);
    props.Descendre = this.Descendre;
    props.DoubleJump = this.DoubleJump;
    props.Ring = this.Ring;
    }
    
    }
    

    ExtendedEntityPropSonic :

    ​ public final static String EXT_PROP_NAME = "ExtPropSonic";
    
    private final EntityPlayer player;
    
    public int Descendre;
    public boolean DoubleJump;
    public long Ring;
    
    public ExtendedEntityPropSonic(EntityPlayer player) {
    this.player = player;
    this.Descendre = 0;
    this.DoubleJump = false;
    this.Ring = 0;
    
    }
    
    @Override
    public void saveNBTData(NBTTagCompound compound) {
    
    NBTTagCompound properties = new NBTTagCompound();
    
    properties.setInteger("Descendre", this.Descendre);
    properties.setBoolean("DoubleJump", this.DoubleJump);
    properties.setLong("Ring", this.Ring);
    
    compound.setTag(EXT_PROP_NAME, properties);
    
    }
    
    @Override
    public void loadNBTData(NBTTagCompound compound) {
    NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME);
    this.Descendre = properties.getInteger("Descendre");
    this.DoubleJump = properties.getBoolean("DoubleJump");
    this.Ring = properties.getLong("Ring");
    
    }
    
    @Override
    public void init(Entity entity, World world) {
    // TODO Auto-generated method stub
    
    }
    
    public static final void register(EntityPlayer player) {
    player.registerExtendedProperties(ExtendedEntityPropSonic.EXT_PROP_NAME,
    new ExtendedEntityPropSonic(player));
    }
    
    public static final ExtendedEntityPropSonic get(EntityPlayer player) {
    return (ExtendedEntityPropSonic) player.getExtendedProperties(EXT_PROP_NAME);
    }
    
    public final void sync() {
    PacketSonic packetSonic = new PacketSonic(this.Descendre, this.DoubleJump, this.Ring);
    Sonic_mod.rcModPacketHandler.sendToServer(packetSonic);
    
    if (!player.worldObj.isRemote) {
    EntityPlayerMP player1 = (EntityPlayerMP) player;
    Sonic_mod.rcModPacketHandler.sendTo(packetSonic, player1);
    }
    }
    private static String getSaveKey(EntityPlayer player) {
    return player.getDisplayName() + ":" + EXT_PROP_NAME;
    }
    
    public static void saveProxyData(EntityPlayer player) {
    ExtendedEntityPropSonic playerData = ExtendedEntityPropSonic.get(player);
    NBTTagCompound savedData = new NBTTagCompound();
    
    playerData.saveNBTData(savedData);
    CommonProxy.storeEntityData(getSaveKey(player), savedData);
    }
    
    public static void loadProxyData(EntityPlayer player) {
    ExtendedEntityPropSonic playerData = ExtendedEntityPropSonic.get(player);
    NBTTagCompound savedData = CommonProxy.getEntityData(getSaveKey(player));
    
    if (savedData != null) {
    playerData.loadNBTData(savedData);
    }
    playerData.sync();
    }
    
    public long getRing() {
    return this.Ring;
    }
    
    public void setRing(long newRing) {
    this.Ring = newRing;
    this.sync();
    
    }
    
    public int getDescendre() {
    return this.Descendre;
    }
    
    public void setDescendre(int newDescendre) {
    this.Descendre = newDescendre;
    this.sync();
    }
    
    public boolean getDoubleJump() {
    return this.DoubleJump;
    }
    
    public void setDoubleJump(boolean newDoubleJump) {
    this.DoubleJump = newDoubleJump;
    this.sync();
    }
    

    Une partie de ma classe event :

    ​ /** Register data*/
    @SubscribeEvent
    public void onEntityConstructing(EntityConstructing event) {
    
    if (event.entity instanceof EntityPlayer
    && ExtendedEntityPropSonic.get((EntityPlayer) event.entity) == null)
    {
    ExtendedEntityPropSonic.register((EntityPlayer) event.entity);
    System.out.println("une entité a rejoint le monde");
    }
    }
    @SubscribeEvent
    public void onEntityJoinWorld(EntityJoinWorldEvent event) {
    if (!event.entity.worldObj.isRemote
    && event.entity instanceof EntityPlayer) {
    NBTTagCompound playerData = CommonProxy
    .getEntityData(((EntityPlayer) event.entity)
    .getDisplayName());
    if (playerData != null) {
    ((ExtendedEntityPropSonic) (event.entity
    .getExtendedProperties(ExtendedEntityPropSonic.EXT_PROP_NAME)))
    .loadNBTData(playerData);
    }
    
    ((ExtendedEntityPropSonic) (event.entity
    .getExtendedProperties(ExtendedEntityPropSonic.EXT_PROP_NAME)))
    .sync();
    }
    }
    }
    

    Savez vous où cela cloche ?

    Remerciements

    Overlay : Merci à Robin pour son aide ^^
    Double saut : Merci à Robin pour m'avoir donné le code 😄

    Merci beaucoup pour votre aide ^^


  • Moddeurs confirmés Modérateurs

    bha en fait le tuto de gugu permet de sauvegarder le tag NBT car quand tu meurt les tag NBT sont reset


  • Moddeurs confirmés Rédacteurs Administrateurs

    Heu comment ça ? Tu veux générer une structure dans le monde, c'est juste ça ?



  • Non, j'aimerais créer une dimension où il y a que la structure (pour prendre un exemple plus concret tu as l'idée de la dimension que propose sevenno07 dans son projet :

    créer une PERD "Personal Empty Room Dimension".
    Donc via une autre "table de craft", vous pourrez créer une gemme qui vous permettra d'aller dans votre dimension personnelle Explication :
    Cette salle sera fabriquée à partir de blocs incassables qui ont une valeur de 50 EPC, les blocs de vide aussi on une valeur, 2 EPC

    )

    Edit : merci isador34 ^^


  • Moddeurs confirmés Rédacteurs Administrateurs

    Heu alors là, je ne sais pas trop, il faudrait virer tout le code de génération classique mais je ne sais pas comment faire.

    Pour ce que t'as dit isador c'est faux, les tags nbt ne sont pas effacés dans les deux cas. Les propriétés customs d'entity sont plus complexe à être mit en place mais sont plus pratique pour get / set les valeurs et ajouter ses propres méthodes dedans.



  • pour les structures je vais bientôt faire un tuto dessus, et si aucun d'autre membre le fond un autre sur les dimensions.



  • Le plus dûr n'est pas de généré une structure, ni de faire une dimension je pense
    C'est de faire en sorte que la dimension est vide avec une structure qui apparaît à ton spawn 😛


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    C'est même relativement facile à faire.
    Prenons une structure de 5^3.
    La bordure de la structure étant le 5ème bloc en x, y et z.
    Il suffit de dire que tous les blocs en dehors de cette zone sont des blocs d'air, et de dire, que le bas de la structure spawn en dessous du joueur.

    C'est moi, qui vais m'occuper de cette dimension-structure dans Energy Transformer (J'aime le challenge).



  • "C'est moi, qui va s'occuper de cette dimension-structure dans Energy Transformer (J'aime le challenge)."
    Ok ^^ j'ai un projet personnel qui va utilisé le même principe (structure dans le vide), je vais essayé d'utiliser ça

    Ah au faite je vais pouvoir vous aidez vers juillet pour Energy Transformer ^^ (enfin si j'arrive à vous aidez)



  • Après avoir vérifié le temps entre chaque post (doute entre 24 et 48h :P) :
    J'ai réussi à créer ma dimension vide en revanche mon problème est de faire spawn la structure en dessous du spawn du joueur qui doit être identique à chaque endroit de l'overworld (en gros que le portail soit fait en 1900 1000 ou en 0 0 revient au même)

    J'ai fait quelque recherche dans les codes mais je n'ai rien trouvé de spécial mise à part peut-être :

    public ChunkCoordinates getEntrancePortalLocation()
    {
    return new ChunkCoordinates(100, 50, 0);
    }
    
    

    mais il n'est d'aucune aide pour ce problème il me semble
    Auriez vous une idée :huh:

    Merci d'avance 😄


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    C'est le joueur qui spawn en (100, 50, 0) ou la structure? Pour la structure, j'ai réussi à la faire spawné constamment en (0, 4, 0).



  • Bah les deux en faite 😛
    Enfin après les coordonnés peut importe le temps que le joueur spawn bien au dessus de la structure ^^___Salut,
    J'ai un autre problème qui concerne la façon dont on active le fly j'aimerais faire un système de la même façon (donc en faisant un "double saut" mais j'ai du mal à comprendre le système qui active le fly dans la class EntityPlayerSP on voit

    boolean flag = this.movementInput.jump;
    if (this.capabilities.allowFlying && !flag && this.movementInput.jump)
    {
    if (this.flyToggleTimer == 0)
    {
    this.flyToggleTimer = 7;
    }
    else
    {
    this.capabilities.isFlying = !this.capabilities.isFlying;
    this.sendPlayerAbilities();
    this.flyToggleTimer = 0;
    }
    }
    

    flag est normalement contraire de "this.movementInput.jump" et pourtant c'est une condition "et" (si on peut dire ça comme ça)
    De plus j'ai utilisé ce code mais ça n'a pas marché un simple saut l'active
    Merci d'avance

    Edit : Oups >.<' j'ai mal configurer mon profil… Le forum m'affichait l'heure en GTM +0 donc je pensais que ça faisait les 24 heures .... Désolé 😞


  • Moddeurs confirmés Rédacteurs Administrateurs

    J'ai fusionné les deux messages.

    Tu l'as mit ou ton code ?
    Car celui de mojang se trouve dans la fonction onUpdate du joueur, donc une fonction déclenché à chaque tick. Entre les deux morceaux de code que tu as donnés, il y a d'autres codes qui joue sur le timer, ça doit être ça.
    La condition flag est obtenu plus tôt dans le temps, en fait elle sert à éviter que mettre le fly si le joueur reste appuyer sur la touche.



  • Merci d'avoir fusionné mes messages et encore désolé ^^'
    J'ai mis le bout de code dans un LivingUpdateEvent
    Ok, en revanche comment puis-je garder le même principe en ne pouvant pas vraiment "éloigner" le flag :s ?
    Les codes entre les deux morceaux que j'ai envoyé concernent le sprint donc je ne pense pas que l'info est dedans


  • Moddeurs confirmés Rédacteurs Administrateurs

    Envoie tout ton code actuel. Tu cherche à faire quoi exactement ?



  • Ok

    @SubscribeEvent
    public void onLivingUpdate(LivingUpdateEvent event)
    {
    Minecraft mc = Minecraft.getMinecraft();
    if(event.entity instanceof EntityPlayer){
    EntityPlayer player = (EntityPlayer) event.entityLiving;
    
    boolean flag = mc.thePlayer.movementInput.jump;
    if(!flag&&mc.thePlayer.movementInput.jump){
    final IEntitySelector livingFilter = new SonicEntityFilter();
    List entityTagetList = player.worldObj.selectEntitiesWithinAABB(Entity.class, player.boundingBox.expand(64.0D, 64.0D, 64.0D), livingFilter);
    for(int i = 0; i < entityTagetList.size(); i++)
    {
    Entity entityTarget = (Entity)entityTagetList.get(i);
    if(entityTarget != player && entityTarget instanceof EntityLivingBase)
    {
    EntityLivingBase entityLivingTarget = (EntityLivingBase)entityTarget;
    Vec3 vec3 = player.getLook(1.0F).normalize();
    Vec3 vec31 = entityLivingTarget.worldObj.getWorldVec3Pool().getVecFromPool(entityLivingTarget.posX - player.posX, entityLivingTarget.boundingBox.minY + (double)(entityLivingTarget.height / 2.0F) - (player.posY + (double)player.getEyeHeight()), entityLivingTarget.posZ - player.posZ);
    double d0 = vec31.lengthVector();
    vec31 = vec31.normalize();
    double d1 = vec3.dotProduct(vec31);
    if(d1 > 1.0D - 0.025D / d0 && player.canEntityBeSeen(entityLivingTarget))
    {
    player.setPositionAndUpdate(entityLivingTarget.posX, entityLivingTarget.posY, entityLivingTarget.posZ);
    player.attackTargetEntityWithCurrentItem(entityLivingTarget);
    }
    }
    }
    }
    }
    }
    

    Bon ben là les codes "parlent" d'eux même je cherche à faire en sorte que lorsqu'on appuie deux fois sur espace cela tp le joueur à l'entité et l'attaque ^^


  • Moddeurs confirmés Rédacteurs Administrateurs

    private final Map <entityplayer, integer="">timeSinceLastJump = new HashMap();
    @SubscribeEvent
    public void onJump(LivingJumpEvent event)
    {
    if(event.entityLiving instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    if(timeSinceLastJump.containsKey(player))
    {
    if(timeSinceLastJump.get(player) < 30)
    {
    System.out.println("deux jump à la suite");
    }
    }
    timeSinceLastJump.put(player, 0);
    }
    }
    
    @SubscribeEvent
    public void onLivingUpdate(LivingUpdateEvent event)
    {
    if(event.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    if(timeSinceLastJump.containsKey(player))
    {
    timeSinceLastJump.put(player, timeSinceLastJump.get(player) + 1);
    System.out.println(timeSinceLastJump.get(player));
    }
    }
    }
    

    J'ai testé, c'est fonctionnel.</entityplayer,>



  • Pour ma part le message à parait à un simple saut pourtant 😮 , d'après ce que j'ai compris du code si la touche est maintenu cela marche quand même non ?

    Edit : Mise à jour du post afin de ne pas avoir à lire tout les messages


  • Moddeurs confirmés Rédacteurs Administrateurs

    En effet, je viens de retesté, je devais être fatigué quand j'ai dis que ça fonctionnait x)

    Du-coup j'ai tout refait, ça m'a l'air bon parcontre c'est que en client :

    @SideOnly(Side.CLIENT)
    boolean jumpLast = false;
    @SideOnly(Side.CLIENT)
    int timer;
    
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void onTickPlayer(TickEvent.PlayerTickEvent event)
    {
    if(event.player.getCommandSenderName() == Minecraft.getMinecraft().thePlayer.getCommandSenderName())
    {
    EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;
    if(player.movementInput.jump)
    {
    if(!jumpLast)
    {
    jumpLast = true;
    }
    else if(timer > 2)
    {
    jumpLast = false;
    System.out.println("second jump");
    }
    timer = 0;
    }
    if(jumpLast)
    {
    timer ++;
    if(timer > 20)
    {
    jumpLast = false;
    timer = 0;
    }
    }
    }
    }
    

    Ah, aussi, j'utilise un event de fml, donc il faut enregistrer la classe avec FMLCommonHandler.instance().bus().register(new TaClasse());



  • C'est pas grave 😛 vu tout ce que tu fais sur ce site ._.
    Merci beaucoup ça marche parfaitement bien ^^

    Edit : Encore un "petit" problème >.<' (je suis actuellement en train de chercher comment l'arranger)
    J'ai voulu faire spawn des particules et j'aimerais que les particules soit "stable" comme le bloc barrier en snapshot


Log in to reply