Jump to content

Recommended Posts

Posted

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.

Posted

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.

Posted
  On 2/6/2020 at 6:30 AM, 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.

Expand  

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);

        }

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

 

Well I found this in ServerPlayerEntity.java. Right below it is 

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

Seems like I need to trigger these.

Posted

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);
}
Posted

See this bit?

  On 2/6/2020 at 6:59 AM, SkylorBeck said:

itemstack.getItem() == Items.ELYTRA

Expand  

This is the troublesome bit.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted (edited)
  On 2/6/2020 at 8:49 PM, 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);
}
Expand  

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;
   }
}

 

  On 2/6/2020 at 8:52 PM, Draco18s said:

See this bit?

This is the troublesome bit.

Expand  

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.

Edited by SkylorBeck
Posted
  On 2/6/2020 at 8:49 PM, 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);
}
Expand  

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

Posted (edited)
  On 2/6/2020 at 9:11 PM, SkylorBeck said:

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.

Expand  

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.

Edited by Draco18s

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
  On 2/6/2020 at 9:25 PM, 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.

Expand  

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

  On 2/6/2020 at 6:59 AM, 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);

        }

    }
}
Expand  

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

Posted
  On 2/6/2020 at 9:19 PM, SkylorBeck said:

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

Expand  

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 1
Posted
  On 2/6/2020 at 9:39 PM, 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.

Expand  

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. 

Posted

ServerPlayerEntity extends PlayerEntity. No idea where which one is used, but you can run an instanceof and try casting. And yes, changing the method signature would invalidate the @Override, but basic Java is normally outside the scope of this forum.

You can try:

if (player instanceof ServerPlayerEntity){
    ServerEntityPlayer serverPlayer = (ServerEntityPlayer)player;
    glide(serverPlayer);
}else {System.out.println("player is not a ServerPlayerEntity :(");}

and feel free to look up appropriate Java tutorials for casting and polymorphism.

 

But like I said, I'm not sure exactly when PlayerEntity is or is not an instance of ServerPlayerEntity.

  • Thanks 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Recovering stolen Bitcoin can feel like an insurmountable challenge, especially after falling victim to scams that promise high returns with little investment. My journey began with excitement when I first learned about Bitcoin mining pools. The idea of earning substantial profits from a modest investment was enticing. I was encouraged to invest $5,200, and soon found myself caught in a web of endless demands for more money to access my funds. As time went on, I paid out hundreds of thousands of dollars, believing that each payment would finally unlock my investments. However, the requests never ceased, and I soon realized I was trapped in a scam. The weight of losing $826,000 worth of Bitcoin was unbearable, and I felt utterly helpless. I reached out to authorities, but their responses were disheartening, leaving me feeling even more isolated in my struggle. In my desperation, I even went to pray, seeking guidance and hope in what felt like a hopeless situation. I poured my heart out, asking for a sign or a way to recover my lost funds. It was during this time of reflection that I began searching for solutions online, hoping to find a way to recover my investments. That’s when I stumbled upon RAPID DIGITAL RECOVERY. At first, I was cynical after all, I had already been deceived so many times. However, I decided to reach out and share my story. The team at RAPID DIGITAL RECOVERY was understanding and compassionate, assuring me they had the expertise to help me recover my stolen Bitcoin. Within hours of providing them with the necessary information, I began to see progress. They guided me through the recovery process, keeping me informed every step of the way. It was surreal to watch as they worked diligently to trace my funds and navigate the complexities of the blockchain. To my astonishment, I received confirmation that my Bitcoin had been successfully recovered. The relief and joy I felt were indescribable. I had almost given up hope, but RAPID DIGITAL RECOVERY proved to be the lifeline I desperately needed. If you find yourself in a similar situation, I urge you to seek help from Reputable team at RAPID DIGITAL RECOVERY.  
    • https://mclo.gs/9Byd16j Hi, I've had my BetterMC world for a couple days now (1.19.2 vers & Fabric loader) but recently whenever I try to open the profile the minecraft launcher crashes and provides this error code. I've checked both this forum and google and haven't found any similar problems or solution to my problem. I'm not the best at reading crash logs but I gathered that there's an issue with fabric possibly, so I re-downloaded the same one on the modpack, then the latest version for 1.19.2 fabric and the issue still occurred. What can I do now?
    • it works now but idk why lmao. i removed terrablender and it didnt work. i then left it for a couple of days and, when i came back, updated the mods that needed updating because "what's the worst that could happen". i then tried launching it and now it works. i genuenly have no clue what i did to make it work, othen than updating the mods. so, thanks for your help
    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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