Jump to content

How do I create a custom cactus, that can only spawn on a specific block?


Recommended Posts

Posted

Hey all!

 

I have no idea how to create a custom cactus, but I to create a custom cactus that damages you like a normal cactus, but only spawns on a block from my mod.

 

This is the code for my cactus class:

 

 

package com.leonardude.zether.blocks;

 

import net.minecraft.block.Block;

import net.minecraft.block.material.Material;

 

import com.leonardude.zether.main.Zether;

 

public class BlockRedCactus extends Block {

 

public BlockRedCactus(int id, Material material) {

super(id, material);

this.setCreativeTab(Zether.zetherTab);

this.setHardness(12.0F);

this.setResistance(2000.0F);

this.setLightOpacity(255);

}

 

}

 

Thanks in advance!

Leonardude

Posted

Um... (*cough, cough*) Look at the BlockCactus class (*cough, cough*), reference it (*cough, cough*), and use methods from it (*cough, cough*).

 

At least, that's how I made my cactus mod that made 15 new cacti... (that got deleted on PMC by a moderator with no modding experience who thought it "was too simple").

-Mitchellbrine

 

  Quote

Minecraft can do ANYTHING, it's coded in Java and you got the full power of Java behind you when you code. So nothing is impossible.

It may be freaking fucking hard though, but still possible ;)

 

If you create a topic on Modder Support, live by this motto:

  Quote
I don't want your charity, I want your information
Posted

Here's my NON-CODED (;)) answer:

 

1) Extend BlockCactus

2) Take a look at BlockCactus

3) Find the right fields

4) Customize them to your own needs

-Mitchellbrine

 

  Quote

Minecraft can do ANYTHING, it's coded in Java and you got the full power of Java behind you when you code. So nothing is impossible.

It may be freaking fucking hard though, but still possible ;)

 

If you create a topic on Modder Support, live by this motto:

  Quote
I don't want your charity, I want your information
Posted

There is nothing in the BlockCactus class that lets me stack my cactus on top of others of my cacti, and there is nothing letting me make my cactus only be able to be put down on my custom block, so if you could help me with that, then that would be great!

Posted

Hi

 

Some hints :-)

BlockCactus.canPlaceBlockAt

-->

BlockCactus.canBlockStay

-->

Block.canSustainPlant

 

If you look at these methods and understand how they work then you should be able to adapt them (override them) to do what you want.

 

-TGG

Posted

I'm pretty sure the only method that I have to override is Block.canSustainPlant but that uses Enum Plant Types, and that only works for growing plants on vanilla blocks. I want my cactus to grow on my own version of sand, so I need to do other stuff with it than just override a method.

Posted

I was about to reply but I see TGG said all I was about to say.

He mentions the other relevant methods to look at.

Understand how the three works internally and you should be good ;)

  Quote

If you guys dont get it.. then well ya.. try harder...

Posted

I don't think that you guys know what I'm asking right now.

The current cactus spawning code uses the Enumeration DESERT, which means that it can only spawn or be place on sand, based on the if statements in the given methods. What I need to do is have my own cactus spawn on my own block, USING MY OWN ENUMERATION! (Bold wasn't working so I had to capitalize it) I don't know how to create my own enumeration that acts like the DESERT enumeration, but uses a custom block instead of sand.

Posted

Hi

 

You're right that adding your own enum would be difficult.  Luckily you don't need to.

 

In canBlockStay:

 

The first four if statements check whether the cactus is next to another one.

The last one checks whether the block beneath the cactus will support its growth.

So why not change the call to canSustainPlant to your own checking code?

 

@Override canBlockStay in MyCustomCactus.canBlockStay and you're laughing.

 

-TGG

 

    /**
     * Can this block stay at this position.  Similar to canPlaceBlockAt except gets checked often with plants.
     */
    public boolean canBlockStay(World par1World, int x, int y, int z)
    {
        if (par1World.getBlockMaterial(x - 1, y, z).isSolid())
        {
            return false;
        }
        else if (par1World.getBlockMaterial(x + 1, y, z).isSolid())
        {
            return false;
        }
        else if (par1World.getBlockMaterial(x, y, z - 1).isSolid())
        {
            return false;
        }
        else if (par1World.getBlockMaterial(x, y, z + 1).isSolid())
        {
            return false;
        }
        else
        {
            int blockBeneathMe = par1World.getBlockId(x, y - 1, z);
            return blocksList[blockBeneathMe] != null && blocksList[blockBeneathMe].canSustainPlant(par1World, x, y - 1, z, ForgeDirection.UP, this);
        }
    }

 

Posted

Hi

 

OK, I understand your confusion now.  I'd recommend you spend a bit of time doing some practice tutorials about inheritance in Java and especially how to override methods when you extend base classes.  Otherwise you'll struggle for days and get really frustrated because Minecraft uses that all the time.

 

http://docs.oracle.com/javase/tutorial/java/concepts/inheritance.html

http://docs.oracle.com/javase/tutorial/java/IandI/index.html

http://www.tutorialspoint.com/java/java_inheritance.htm

 

Unfortunately I can't really recommend any good tutorials for learning Java because I have come from C++, but perhaps some of the other folks on this forum could help.

 

-TGG

 

Posted

I know about inheritance and all of that. I've known Java for around two years. I just don't understand what to do relating to the cactus and what inheritance has to do with getting my cactus to only be able to be placed on my custom block.

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

    • Betafort Recovery has emerged as a prominent figure in the realm of cryptocurrency recovery, gaining a reputation for their exceptional ability to retrieve lost Bitcoin (BTC) and other cryptocurrencies. Their expertise and track record have made them a beacon of hope for individuals facing the distressing situation of lost or inaccessible crypto assets.  
    • When you name a method like that, with no return value, it is a constructor. The constructor must have the same name as the class it constructs, in this case, ModItems. I would strongly advise reading up on some basic Java tutorials, because you will definitely be running into a lot more issues as you go along without the basics. *I should also add that the Forge documentation is a reference, not a tutorial. Even following tutorials, you should know Java basics, otherwise the smallest of mistakes will trip you up as you copy someone elses code.
    • so, I'm starting modding and I'm following the official documantation for forge: https://docs.minecraftforge.net, but in the registries part it is not working as it is in the docs:   public class ModItems { private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, DarkStarvation.MOD_ID); public static final RegistryObject<Item> TEST_ITEM = ITEMS.register("test_item", () -> new Item(new Item.Properties())); public DarkStarvation(FMLJavaModLoadingContext context) { ITEMS.register(context.getModEventBus()); } } in 'public DarkStarvation(...' the DarkStarvation has this error: Invalid method declaration; return type required and the getModEventBus(): Cannot resolve method 'getModEventBus' in 'FMLJavaModLoadingContext' please help, I asked gpt but it is saying that I'm using an old method, but I'm following the latest version of Forge Docs???
    • I merged your second post with the original , there is no need to post a new thread asking for an answer. If someone sees your post and can help, they will reply. If you are seeking a quicker response, you could try asking in the Minecraft Forge diacord.
    • Create a new instance and start with cobblemon - if this works, add the rest of your mods in groups   Maybe another mod is conflicting - like Sodium/Iris or Radical Cobblemon Trainers
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

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