Jump to content

[1.13.2] Rotation code in classes?


Billy Playz

Recommended Posts

Do you mean setting the block to face the player when placed down?

Override Block#getStateForPlacement and return the blockstate of facing in the player's direction.

Also change the variants in the blockstates json to match your rotation.

 

For reference, look at how the vanilla furnace handles it.

Edited by DavidM

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Link to comment
Share on other sites

  • 3 weeks later...
On 3/20/2019 at 11:14 PM, DavidM said:

Do you mean setting the block to face the player when placed down?

Override Block#getStateForPlacement and return the blockstate of facing in the player's direction.

Also change the variants in the blockstates json to match your rotation.

 

For reference, look at how the vanilla furnace handles it.

Hi! Sorry that it has been a while but do you mind if you could give me an example of 1.13 rotation on placement feature? I have tried messing with my code but I cannot get rotation to work in my block.

I checked the furnace code and got the rotation code from it but it does not work as some things come out as deprecated or just not working. Sorry to be annoying if I am, but thanks if I get any replies again.

Link to comment
Share on other sites

How to do rotation:

 

1. Store the direction

Add this to your block class:
 

public static final PropertyDirection FACING = BlockHorizontal.FACING;

This just stores the direction.

 

2. Tell forge that direction is part of the state

You need to tell forge direction is part of the state, so it can load it from the blockstate.

Add this to your block's code:

setDefaultState(getDefaultState().withProperty(FACING, EnumFacing.NORTH)

(Add it to the constructor)

 

3. Set the state when the block is placed.

You have to set the state when the block is placed. Add this to your block class:

@Override
    @Nonnull
    public IBlockState getStateForPlacement(@Nullable World world, @Nullable BlockPos pos, @Nullable EnumFacing facing, float hitX, float hitY, float hitZ, int meta, @Nullable EntityLivingBase placer, EnumHand hand) {
        assert placer != null;
        return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
    }

The code

placer.getHorizontalFacing().getOpposite()

Just gets the horizontal facing direction (where you are looking along the x and z axis) then gets the opposite so the block faces you.

 

4. Add it to your blockstate

This is an example of a blockstate with facing (works in 1.12.2):

{
  "variants": {
    "facing=north": { "model": "modid:model" },
    "facing=west": { "model": "modid:model", "y": 90 },
    "facing=south": { "model": "modid:model", "y": 180 },
    "facing=east": { "model": "modid:model", "y": 270 }
  }
}

(replace modid with your modid, model with the model resource location)

Link to comment
Share on other sites

17 hours ago, Big_Bad_E said:

How to do rotation:

 

1. Store the direction

Add this to your block class:
 


public static final PropertyDirection FACING = BlockHorizontal.FACING;

This just stores the direction.

 

2. Tell forge that direction is part of the state

You need to tell forge direction is part of the state, so it can load it from the blockstate.

Add this to your block's code:


setDefaultState(getDefaultState().withProperty(FACING, EnumFacing.NORTH)

(Add it to the constructor)

 

3. Set the state when the block is placed.

You have to set the state when the block is placed. Add this to your block class:


@Override
    @Nonnull
    public IBlockState getStateForPlacement(@Nullable World world, @Nullable BlockPos pos, @Nullable EnumFacing facing, float hitX, float hitY, float hitZ, int meta, @Nullable EntityLivingBase placer, EnumHand hand) {
        assert placer != null;
        return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
    }

The code


placer.getHorizontalFacing().getOpposite()

Just gets the horizontal facing direction (where you are looking along the x and z axis) then gets the opposite so the block faces you.

 

4. Add it to your blockstate

This is an example of a blockstate with facing (works in 1.12.2):


{
  "variants": {
    "facing=north": { "model": "modid:model" },
    "facing=west": { "model": "modid:model", "y": 90 },
    "facing=south": { "model": "modid:model", "y": 180 },
    "facing=east": { "model": "modid:model", "y": 270 }
  }
}

(replace modid with your modid, model with the model resource location)

6

Hi, sorry but I am looking for 1.13.2 as it says in the title as I am trying to update my mod from 1.12.2 to 1.13.2. I know from 1.12.2, but 1.13.2 I still need to figure out. Thanks for replying anyway.

Though if this is for 1.13.2 (though you do say 1.12.2 in the blockstate) please can you tell me how my workspace should look?

Edited by Billy Playz
Link to comment
Share on other sites

6 hours ago, Billy Playz said:

Hi, sorry but I am looking for 1.13.2 as it says in the title as I am trying to update my mod from 1.12.2 to 1.13.2. I know from 1.12.2, but 1.13.2 I still need to figure out. Thanks for replying anyway.

Though if this is for 1.13.2 (though you do say 1.12.2 in the blockstate) please can you tell me how my workspace should look?

Sorry totally managed to misread that!
I currently cannot test for 1.13.2 (gradle hates me :/), but the code should not change to my knowledge. If it does not work, what methods are missing/what is the error?

I have read through the notes and have not seen any changes to IProperty or any non-deprecated methods.

Edited by Big_Bad_E
  • Like 1
Link to comment
Share on other sites

Everything is the same except #2 which has been moved to its own method (fillStateContainer)

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

13 hours ago, Big_Bad_E said:

Sorry totally managed to misread that!
I currently cannot test for 1.13.2 (gradle hates me :/), but the code should not change to my knowledge. If it does not work, what methods are missing/what is the error? 

I have read through the notes and have not seen any changes to IProperty or any non-deprecated methods.

Hi! This is what my Eclipse workspace area looks like when I tried your code. TY.

Xh2Vo7o.png

Link to comment
Share on other sites

Don't just blindly copy the code others provide. For that matter never blindly copy other's code. In this case you are trying to use 1.12 code in a 1.13 environment.

You can always see how this is done in vanilla, something like BlockDispenser for example should be exactly what you need.

 

On 4/10/2019 at 12:22 AM, Big_Bad_E said:

assert placer != null;

I don't really see the point of this assertion. If the placer is null you will crash anyway one line later with a NPE. 

Link to comment
Share on other sites

37 minutes ago, V0idWa1k3r said:

Don't just blindly copy the code others provide. For that matter never blindly copy other's code. In this case you are trying to use 1.12 code in a 1.13 environment. 

You can always see how this is done in vanilla, something like BlockDispenser for example should be exactly what you need.

 

I don't really see the point of this assertion. If the placer is null you will crash anyway one line later with a NPE. 

3

I do understand, it is just he asked what errors showed up as he could not figure out why it does not work as he could not see any notes saying it has been changed (and I know it has changed, hence why I am wanting to have some help on how to do it). I am aware that copying code blindly is bad, I have learnt. I am asking for rotating code in a java class as the vanilla code does not work and I have no idea what I am doing with it in 1.13.2 as the code has changed. What do I extend if I need to? What do I implement if I need to? What is the code for the placement? What is the code for checking the player? Where do I put the code? Can the code be in a class file, or does it have to be where I have set the properties? Is my code correct? The only answer I know is that I have no idea how to do it, and I cannot find any help on this. This is why I have turned to the forums - for answers.

Link to comment
Share on other sites

4 hours ago, Billy Playz said:

I am asking for rotating code in a java class as the vanilla code does not work

Why? Vanilla code works perfectly fine for vanilla. In this case it should work perfectly for your use-case aswell as long as you implement it correctly.

 

4 hours ago, Billy Playz said:

I have no idea what I am doing with it in 1.13.2 as the code has changed.

If you have no idea what the code does you can look at vanilla's class and figure it out. Sure it changed but that doesn't stop you from figuring out how it works. You are not looking at magical spaghetti code of 10000+ lines after all.

 

4 hours ago, Billy Playz said:

What do I extend if I need to?

Since you are making a block you need to extend Block.

 

4 hours ago, Billy Playz said:

What do I implement if I need to?

Depends on what you want your block to do. Again, see vanilla for examples.

 

4 hours ago, Billy Playz said:

What is the code for the placement?

Again, you can see it for yourself in vanilla classes like BlockFurnace, BlockDispenser, BlockPiston, etc.

 

4 hours ago, Billy Playz said:

What is the code for checking the player?

What does this question even mean? Why do you need to be "checking" the player?

 

4 hours ago, Billy Playz said:

Where do I put the code?

...in your block class.

 

4 hours ago, Billy Playz said:

Can the code be in a class file, or does it have to be where I have set the properties?

I am sorry but if you are asking questons like these you need to learn basic java. You can't make a minecraft mod without understanding the fundamentals of the programming language you are using.

 

4 hours ago, Billy Playz said:

Is my code correct?

Your IDE tells you that.

 

4 hours ago, Billy Playz said:

This is why I have turned to the forums - for answers.

Well, here are your answers - learn java(at least the basics of it) and look at how vanilla does things. Then you can come back with more specific questions we would be able to answer without telling you to look at vanilla's code.

Link to comment
Share on other sites

placer.getHorizontalFacing().getOpposite()

That line is what "checks the player" (checks where they are facing).

It seems a remap might of changed it, try using:

PropertyEnum<EnumFacing>

instead of

PropertyDirection

and set it to be:

new PropertyEnum<EnumFacing>("facing", EnumFacing.class, Collections2.filter(Lists.newArrayList(EnumFacing.values()), EnumFacing.Plane.HORIZONTAL);

 

 

Edited by Big_Bad_E
Link to comment
Share on other sites

6 hours ago, V0idWa1k3r said:

Don't just blindly copy the code others provide. For that matter never blindly copy other's code. In this case you are trying to use 1.12 code in a 1.13 environment.

You can always see how this is done in vanilla, something like BlockDispenser for example should be exactly what you need.

 

I don't really see the point of this assertion. If the placer is null you will crash anyway one line later with a NPE. 

Because Intellij is annoying, and you never know. Makes it easier to debug I guess, also personal preference.

 

Also, yes, never blindly copy paste code, and if you are stuck you can always get code from vanilla blocks (that is where that code is from anyways)

 

I would suggest playing around in Java with other things, Forge is one of the hardest libraries out there. If you want to stick with Minecraft, Spigot is a lot easier. You could also mess around with Discord bots (https://github.com/DV8FromTheWorld/JDA/releases) or make games/software.

Edited by Big_Bad_E
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 PULSA TANPA POTONGAN : SLOT PULSA 5000 VIA INDOSAT IM3 TANPA POTONGAN - SLOT PULSA XL TELKOMSEL TANPA POTONGAN  KLIK DISINI DAFTAR DISINI SLOT VVIP << KLIK DISINI DAFTAR DISINI SLOT VVIP << KLIK DISINI DAFTAR DISINI SLOT VVIP << KLIK DISINI DAFTAR DISINI SLOT VVIP << SITUS SLOT GACOR 88 MAXWIN X500 HARI INI TERBAIK DAN TERPERCAYA GAMPANG MENANG Dunia Game gacor terus bertambah besar seiring berjalannya waktu, dan sudah tentu dunia itu terus berkembang serta merta bersamaan dengan berkembangnya SLOT GACOR sebagai website number #1 yang pernah ada dan tidak pernah mengecewakan sekalipun. Dengan banyaknya member yang sudah mempercayakan untuk terus menghasilkan uang bersama dengan SLOT GACOR pastinya mereka sudah percaya untuk bermain Game online bersama dengan kami dengan banyaknya testimoni yang sudah membuktikan betapa seringnya member mendapatkan jackpot besar yang bisa mencapai ratusan juta rupiah. Best online Game website that give you more money everyday, itu lah slogan yang tepat untuk bermain bersama SLOT GACOR yang sudah pasti menang setiap harinya dan bisa menjadikan bandar ini sebagai patokan untuk mendapatkan penghasilan tambahan yang efisien dan juga sesuatu hal yang fix setiap hari nya. Kami juga mendapatkan julukan sebagai Number #1 website bocor yang berarti terus memberikan member uang asli dan jackpot setiap hari nya, tidak lupa bocor itu juga bisa diartikan dalam bentuk berbagi promosi untuk para official member yang terus setia bermain bersama dengan kami. Berbagai provider Game terus bertambah banyak setiap harinya dan terus melakukan support untuk membuat para official member terus bisa menang dan terus maxwin dalam bentuk apapun maka itu langsung untuk feel free to try yourself, play with SLOT GACOR now or never !
    • BRI4D adalah pilihan tepat bagi Anda yang menginginkan pengalaman bermain slot dengan RTP tinggi dan transaksi yang akurat melalui Bank BRI. Berikut adalah beberapa alasan mengapa Anda harus memilih BRI4D: Tingkat Pengembalian (RTP) Tertinggi Kami bangga menjadi salah satu agen situs slot dengan RTP tertinggi, mencapai 99%! Ini berarti Anda memiliki peluang lebih besar untuk meraih kemenangan dalam setiap putaran permainan. Transaksi Melalui Bank BRI yang Akurat Proses deposit dan penarikan dana di BRI4D cepat, mudah, dan akurat. Kami menyediakan layanan transaksi melalui Bank BRI untuk kenyamanan Anda. Dengan begitu, Anda dapat melakukan transaksi dengan lancar dan tanpa khawatir. Beragam Pilihan Permainan BRI4D menyajikan koleksi permainan slot yang beragam dan menarik dari berbagai provider terkemuka. Mulai dari tema klasik hingga yang paling modern, Anda akan menemukan banyak pilihan permainan yang sesuai dengan selera dan preferensi Anda.  
    • SPARTA88 adalah pilihan tepat bagi Anda yang menginginkan agen situs slot terbaik dengan RTP tinggi dan transaksi yang mudah melalui Bank BNI. Berikut adalah beberapa alasan mengapa Anda harus memilih SPARTA88: Tingkat Pengembalian (RTP) Tinggi Kami bangga menjadi salah satu agen situs slot dengan RTP tertinggi, mencapai 98%! Ini berarti Anda memiliki peluang lebih besar untuk meraih kemenangan dalam setiap putaran permainan. Beragam Pilihan Permainan SPARTA88 menyajikan koleksi permainan slot yang beragam dan menarik dari berbagai provider terkemuka. Mulai dari tema klasik hingga yang paling modern, Anda akan menemukan banyak pilihan permainan yang sesuai dengan selera dan preferensi Anda. Kemudahan Bertransaksi Melalui Bank BNI Proses deposit dan penarikan dana di SPARTA88 cepat, mudah, dan aman. Kami menyediakan layanan transaksi melalui Bank BNI untuk kenyamanan Anda. Dengan begitu, Anda dapat melakukan transaksi dengan lancar tanpa perlu khawatir.
    • Slot Bank ALADIN atau Daftar slot Bank ALADIN bisa anda lakukan pada situs WINNING303 kapanpun dan dimanapun, Bermodalkan Hp saja anda bisa mengakses chat ke agen kami selama 24 jam full. keuntungan bergabung bersama kami di WINNING303 adalah anda akan mendapatkan bonus 100% khusus member baru yang bergabung dan deposit. Tidak perlu banyak, 5 ribu rupiah saja anda sudah bisa bermain bersama kami di WINNING303 . Tunggu apa lagi ? Segera Klik DAFTAR dan anda akan jadi Jutawan dalam semalam.
    • Slot Bank PAPUA atau Daftar slot Bank PAPUA bisa anda lakukan pada situs WINNING303 kapanpun dan dimanapun, Bermodalkan Hp saja anda bisa mengakses chat ke agen kami selama 24 jam full. keuntungan bergabung bersama kami di WINNING303 adalah anda akan mendapatkan bonus 100% khusus member baru yang bergabung dan deposit. Tidak perlu banyak, 5 ribu rupiah saja anda sudah bisa bermain bersama kami di WINNING303 . Tunggu apa lagi ? Segera Klik DAFTAR dan anda akan jadi Jutawan dalam semalam.  
  • Topics

×
×
  • Create New...

Important Information

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