Jump to content

[1.14.4] Any way to hook into Elytras code?


SkylorBeck

Recommended Posts

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.

Link to comment
Share on other sites

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

        }

    }
}
Link to comment
Share on other sites

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);
}
Link to comment
Share on other sites

See this bit?

13 hours ago, SkylorBeck said:

itemstack.getItem() == Items.ELYTRA

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.

Link to comment
Share on other sites

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.

Edited by SkylorBeck
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

13 minutes ago, 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.

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

12 minutes ago, SkylorBeck said:

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

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
Link to comment
Share on other sites

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. 

Link to comment
Share on other sites

Check if the player is an instanceof ServerPlayerEntity, then cast.

  • Thanks 1

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

    • Slot Bonus New Member 100 Di Awal To Rendah   ⚡️ KLIK DAFTAR BONUS NEW MEMBER 100 DI AWAL ⚡️ ⚡️ LINK SLOT GACOR BONUS NEW MEMBER 100 DI DEPAN ⚡️     Slot Bonus 100 Situs Slot Online Gacor Bonus New Member 100 Di Awal Slot Bonus 100 adalah permainan di slot online gacor dengan winrate tembus 99% menggunakan akun pro. Kami adalah situs Slot Bonus 100 yang menghadirkan semua permainan slot terbaik di Asia. Semua member diberikan pelayanan maximal serta CS yang selalu siap 24 jam. Itulah mengapa, banyak member lama yang masih bermain di situs kami. Bagi yang mencari Slot Bonus 100 super gacor, Situs kami adalah tempatnya. Jangan bingung karena kami selalu memberikan RTP terbaru agar tahu kapan waktu yang tepat untuk main dan bisa WD sampai puluhan juta rupiah. Ratusan pemain mengenal kami sebagai situs Slot Bonus 100 No 1 karena kami mempermudah pemain untuk mendapatkan maxwin. Winrate ditingkatkan sampai di atas rata-rata. Bagi yang ingin mendapatkan pola, bisa mencoba dulu bermain demo slot gacor di situs Slot Bonus 100 terbaik 2024 ini. Pemain yang daftar dan main hari ini lewat link Slot Bonus 100, dikasih jaminan 100% menang.
    • Hello, for educational purpose I am trying to port a mod from 1.20.1 to 1.20.2+ but I can't understand how the new networking system works. I manage to get through it for the most part, but I'm stuck on how to register packets. The previous method was: INSTANCE.registerMessage(id++, CPExecuteSkill.class, CPExecuteSkill::toBytes, CPExecuteSkill::fromBytes, CPExecuteSkill::handle); with instance being of type SimpleChannel.  (The forge document is not up to date for this part unfortunatly) Any help or clear documentation would be welcome.
    • ☾☾ KLIK DAFTAR DI SINI ☽☽ ☾☾ KLIK DAFTAR DI SINI ☽☽ ☾☾ KLIK DAFTAR DI SINI ☽☽   SLOT BANK MANDIRI merupakan situs daftar bandar judol yang deposit menggunakan bank mandiri hanya 1menit Langsung masuk di dalam akun anda. SLOT BANK MANDIRI menyediakan berbagai macam game slot online terlengkap provider termasuk daftar deposit via bank mandiri dan semua game slot gacor maxwin terbaru 2024.    
    • Selamat datang di TOTO88 salah satu situs slot gacor gampang menang hari ini di Indonesia yang sangat menjajikan. Slot gacor adalah adalah suatu istilah yang digunakan untuk menjelaskan sebuah permainan slot gampang menang di situs slot online. Situs slot gacor TOTO88 ini bisa menjadi populer walaupun terbilang baru karena RTP slot online yang disajikan begitu tinggi. Seiring dengan perkembangan zaman situs slot gacor terbaru ini juga sudah update dari segi teknologi yang menggunakan HTML5, inilah yang membuat grafis permainan terlihat begitu modern, audio lebih jernih, dan user interface yang smooth. Tidak dipungkiri grafis yang kami memiliki sudah menarik banyak sekali pendatang baru yang ingin merasakan terbawa dalam suasana tema permainan mesin slot. Kehadiran slot gacor menjadi angin segar bagi para pecinta judi online, memberikan alternatif permainan yang seru dan menguntungkan. Tak heran jika popularitas slot gacor terus meningkat, menarik minat para pemain baru untuk mencoba peruntungan mereka di situs slot gacor hari ini TOTO88.
    • Slot88 Viral = Situs Slot88 Gacor Modal Receh Gampang Menang Viral Slot88 Online Min Depo 1000 1RB 1K 1ribu Tanpa Potongan ▶️▶️DAFTAR◀️◀️ ▶️▶️DAFTAR◀️◀️ ▶️▶️DAFTAR◀️◀️ Slot88 Viral menjadi sorotan para pecinta slot online dengan berbagai fitur menarik yang ditawarkan. Berikut adalah ulasan singkat tentang situs ini: Slot88 Gacor Modal Receh Slot88 Viral menawarkan pengalaman bermain slot online yang menarik dengan modal yang sangat terjangkau. Dengan deposit mulai dari 1000, 1RB, 1K, hingga 1ribu tanpa potongan, Anda dapat langsung memulai petualangan Anda untuk mencari kemenangan besar. Gampang Menang di Slot88 Online Salah satu daya tarik utama dari Slot88 Viral adalah peluang besar untuk meraih kemenangan. Dengan berbagai pilihan permainan slot gacor yang disediakan, para pemain memiliki kesempatan yang lebih besar untuk mendapatkan jackpot dan hadiah besar lainnya. Min Depo Tanpa Potongan Slot88 Viral memastikan bahwa setiap transaksi deposit dilakukan tanpa potongan, sehingga Anda dapat menggunakan seluruh saldo deposit Anda untuk bermain tanpa kehilangan sebagian karena biaya transaksi. Ini memberi Anda nilai yang lebih besar untuk setiap deposit yang Anda lakukan. Viral di Kalangan Pecinta Slot Online Slot88 Viral telah menjadi viral di kalangan pecinta slot online karena reputasinya yang baik dalam menyediakan pengalaman bermain yang adil, transparan, dan menguntungkan bagi para pemainnya. Dengan jumlah pemain yang terus bertambah, situs ini terus memperkuat posisinya sebagai salah satu destinasi utama untuk bermain slot online. Jadi, jika Anda mencari situs slot online yang menarik, menghibur, dan memberikan peluang besar untuk menang, Slot88 Viral adalah pilihan yang tepat. Bergabunglah sekarang dan rasakan sensasi bermain di salah satu situs slot paling populer di dunia daring!  
  • Topics

×
×
  • Create New...

Important Information

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