Jump to content

SkylorBeck

Members
  • Posts

    7
  • Joined

  • Last visited

Posts posted by SkylorBeck

  1. 18 minutes ago, MoxLotus said:

    In ServerPlayNetHandler::processEntityAction

     

    But if you call that setElytraFlying method from PlayerEntity does that have the desired effect? The setFlag method is protected, but all setElytraFlying appears to do is set it. I don't see any additional checks after it is called. It won't fully replicate the behavior of Elytra, but my guess is that it is in charge of the flying part.

    Thanks for the info/idea.

     

    If I try to call setElytraFlying like so,

    public void glide(PlayerEntity player) {
        if (!player.onGround && !player.isElytraFlying() && !player.isInWater()) {
            ItemStack itemstack = player.getItemStackFromSlot(EquipmentSlotType.CHEST);
            if (itemstack.getItem() == elytronitem.elytronitem) {
                player.setElytraFlying();
            }
        }
    }

    I cannot resolve setElytraFlying in PlayerEntity. If I change it to 

    public void glide(ServerPlayerEntity player) {

    then it calls but then the onArmorTick doesn't function anymore as 

    @Override
            public void onArmorTick (ItemStack stack, World world, PlayerEntity player){
                if (!player.onGround) {
                    glide(player); }
    
    }

    is calling for a PlayerEntity. If I changed that to ServerPlayerEntity then the @Override stops working because Method does not override Method from Super.

     

    I really feel like I'm missing something here. 

  2. 1 minute ago, Draco18s said:

    I have never said it's not possible, I've said that you have to replicate the behavior yourself in an event handler because the vanilla code cannot be used.

    and as you can see, I have already done that. 

    14 hours ago, SkylorBeck said:

     

    
        private void glide(PlayerEntity entity) {
            if (!entity.onGround && !entity.isElytraFlying() && !entity.isInWater()) {
                ItemStack itemstack = entity.getItemStackFromSlot(EquipmentSlotType.CHEST);
                if (itemstack.getItem() == elytronitem.elytronitem){
    //MYSTERY ELYTRA CODE GOES HERE
                }
            }
        }
    
    
        @Override
        public void onArmorTick(ItemStack stack, World world, PlayerEntity player) {
    
    
            if (!player.onGround) {
                glide(player);
    
            }
    
        }
    }

    Please stop derailing the thread by being a jerk for no reason.

  3. 30 minutes ago, MoxLotus said:

    I'm looking at the 1.15 code, but it's substantially similar. My understanding is that when a player jumps in midair while Elytra are equipped, the client sends that packet to the server. The server receives the packet and double checks the criteria for flying.

    
    public void processEntityAction(CEntityActionPacket packetIn) {

    ...

    
    case START_FALL_FLYING:
       if (!this.player.func_226566_ei_()) {
          this.player.func_226568_ek_();
       }
       break;

    The server calls another function which sets flag 7.

    
    public void func_226568_ek_() {
       this.setFlag(7, true);
       this.setFlag(7, false);
    }
    

    Can you tell me where you found that Fall_Flying case? That seems like a good missing piece of my puzzle.

  4. 23 minutes ago, MoxLotus said:

    I'm looking at the 1.15 code, but it's substantially similar. My understanding is that when a player jumps in midair while Elytra are equipped, the client sends that packet to the server. The server receives the packet and double checks the criteria for flying.

    
    public void processEntityAction(CEntityActionPacket packetIn) {

    ...

    
    case START_FALL_FLYING:
       if (!this.player.func_226566_ei_()) {
          this.player.func_226568_ek_();
       }
       break;

    The server calls another function which sets flag 7.

    
    public void func_226568_ek_() {
       this.setFlag(7, true);
       this.setFlag(7, false);
    }
    

    Yes exactly. In my mappings 

    public void setElytraFlying() {
       this.setFlag(7, true);
    }
    
    public void clearElytraFlying() {
       this.setFlag(7, true);
       this.setFlag(7, false);
    }

    is what I need to trigger. I cannot find Fall_Flying in anything but 

     public static enum Action {
          START_SNEAKING,
          STOP_SNEAKING,
          STOP_SLEEPING,
          START_SPRINTING,
          STOP_SPRINTING,
          START_RIDING_JUMP,
          STOP_RIDING_JUMP,
          OPEN_INVENTORY,
          START_FALL_FLYING;
       }
    }

     

    20 minutes ago, Draco18s said:

    See this bit?

    This is the troublesome bit.

    Ah, the guy who always tells everyone it can't be done is here. I am aware. That is why I replicated that code in my code shown above. I know it can be done and I know to use the search function. I know minecraft calls from PlayerEntity and not from Elytra. I've seen every comment you've posted about Elytra and if you're going to tell me that it's not possible like you have everyone else who tried, please leave.

  5. 23 minutes ago, MoxLotus said:

    Have you searched for usages of Items.ELYTRA?

    In PlayerEntity I find a reference to a flag for "elytra flying".

    There is also logic in ClientPlayerEntity that appears to submit a request for that flag to be set when the right conditions are met.

    I did search for Items.Elytra and I also found that flag. I cannot seem to figure out how to trigger it though. 

    Ah I see. 

    if (this.movementInput.jump && !flag && !this.onGround && this.getMotion().y < 0.0D && !this.isElytraFlying() && !this.abilities.isFlying) {
       ItemStack itemstack = this.getItemStackFromSlot(EquipmentSlotType.CHEST);
       if (itemstack.getItem() == Items.ELYTRA && ElytraItem.isUsable(itemstack)) {
          this.connection.sendPacket(new CEntityActionPacket(this, CEntityActionPacket.Action.START_FALL_FLYING));
       }
    }

    FALL_FLYING appears to be a pose as I can only find it referenced here and in a pose list.

    Here is what I have 

     

    public class elytron extends ArmorItem{
        public elytron(IArmorMaterial p_i48534_1_, EquipmentSlotType p_i48534_2_, Properties p_i48534_3_) {
            super(p_i48534_1_, p_i48534_2_, p_i48534_3_);
            setRegistryName("elytron");}
    
    
        private void glide(PlayerEntity entity) {
            if (!entity.onGround && !entity.isElytraFlying() && !entity.isInWater()) {
                ItemStack itemstack = entity.getItemStackFromSlot(EquipmentSlotType.CHEST);
                if (itemstack.getItem() == elytronitem.elytronitem){
    //MYSTERY ELYTRA CODE GOES HERE
                }
            }
        }
    
    
        @Override
        public void onArmorTick(ItemStack stack, World world, PlayerEntity player) {
    
    
            if (!player.onGround) {
                glide(player);
    
            }
    
        }
    }
  6. Sorry if you've seen this many times before. I've been looking for days about how to make an item work like Elytra. I found many posts where people have said it's not possible and many more where people have successfully done it. But not a single person has posted their code or explained how they did it. I've already stared at the ElytraItem.java and scoured through PlayerEntity.java and I just cannot figure it out.

     

    So anyone have any ideas?

     

    Thank you.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.