Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

TheThorneCorporation

Members
  • Posts

    65
  • Joined

  • Last visited

Posts posted by TheThorneCorporation

  1. RESOLVED by importing using the Gradle wizard. Maybe that should be mentioned in the docs...

    Hello,

    After opening a fresh MDK and running genEclipseRuns, I open the project in Eclipse only to find that the decompiled Minecraft code is missing. Is there something I have to do?

    Screen Shot 2020-11-19 at 6.01.44 PM.png

  2. 36 minutes ago, DaemonUmbra said:

    No, don't leave dependencies.examplemod, that declares dependencies for a mod that doesn't exist

    The logo does matter if you plan to open the mod list

    All values in mods.toml marked #Optional should be set or removed entirely, do not leave them blank

    I did that, but it still doesn't work, giving the same error.

  3. 2 hours ago, Draco18s said:

    Show your main mod class and your mods.toml file.

    Here you go. (I should probably get to cleaning up the files – I changed the minimum amount required from the defaults to make the mod work.)

    The mod class:

    package com.thornecorporation.elementalmagic;
    
    import net.minecraft.item.ItemGroup;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.Items;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.event.RegistryEvent;
    import net.minecraftforge.eventbus.api.SubscribeEvent;
    import net.minecraftforge.fml.InterModComms;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
    import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
    import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
    import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
    import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
    import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import java.util.stream.Collectors;
    
    // The value here should match an entry in the META-INF/mods.toml file
    @Mod(ElementalMagic.MOD_ID)
    public class ElementalMagic
    {
        // Directly reference a log4j logger.
    	public static final String MOD_ID = "elementalmagic";
        private static final Logger LOGGER = LogManager.getLogger();
        public static final ItemGroup ITEM_GROUP = new ElementalMagicItemGroup("elemental_magic_group");
    
        public ElementalMagic() {
            // Register the setup method for modloading
            FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
            // Register the enqueueIMC method for modloading
            FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC);
            // Register the processIMC method for modloading
            FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC);
            // Register the doClientStuff method for modloading
            FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
    
            // Register ourselves for server and other game events we are interested in
            MinecraftForge.EVENT_BUS.register(this);
        }
    
        private void setup(final FMLCommonSetupEvent event)
        {
            
        }
    
        private void doClientStuff(final FMLClientSetupEvent event) {
            // do something that can only be done on the client
            LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings);
        }
    
        private void enqueueIMC(final InterModEnqueueEvent event)
        {
            // some example code to dispatch IMC to another mod
            InterModComms.sendTo("elementalmagic", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world";});
        }
    
        private void processIMC(final InterModProcessEvent event)
        {
            // some example code to receive and process InterModComms from other mods
            LOGGER.info("Got IMC {}", event.getIMCStream().
                    map(m->m.getMessageSupplier().get()).
                    collect(Collectors.toList()));
        }
        // You can use SubscribeEvent and let the Event Bus discover methods to call
        @SubscribeEvent
        public void onServerStarting(FMLServerStartingEvent event) {
            
        }
    
        // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD
        // Event bus for receiving Registry Events)
        @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
        public static class RegistryEvents {
            @SubscribeEvent
            public static void onNewRegistry(final RegistryEvent.NewRegistry event) {
                
            }
        }
        
        public static class ElementalMagicItemGroup extends ItemGroup {
    
    		public ElementalMagicItemGroup(String name) {
    			super(name);
    		}
    
    		@Override
    		public ItemStack createIcon() {
    			return new ItemStack(Items.COOKED_COD);
    		}
            
        }
    }

     

    The mods.toml file at src/main/resources:

    # This is an example mods.toml file. It contains the data relating to the loading mods.
    # There are several mandatory fields (#mandatory), and many more that are optional (#optional).
    # The overall format is standard TOML format, v0.5.0.
    # Note that there are a couple of TOML lists in this file.
    # Find more information on toml format here:  https://github.com/toml-lang/toml
    # The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
    modLoader="javafml" #mandatory
    # A version range to match for said mod loader - for regular FML @Mod it will be the forge version
    loaderVersion="[31,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
    # A URL to refer people to when problems occur with this mod
    issueTrackerURL="http://my.issue.tracker/" #optional
    # A list of mods - how many allowed here is determined by the individual mod loader
    [[mods]] #mandatory
    # The modid of the mod
    modId="elementalmagic" #mandatory
    # The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
    version="${file.jarVersion}" #mandatory
     # A display name for the mod
    displayName="Example Mod" #mandatory
    # A URL to query for updates for this mod. See the JSON update specification <here>
    updateJSONURL="http://myurl.me/" #optional
    # A URL for the "homepage" for this mod, displayed in the mod UI
    displayURL="http://example.com/" #optional
    # A file name (in the root of the mod JAR) containing a logo for display
    logoFile="examplemod.png" #optional
    # A text field displayed in the mod UI
    credits="Thanks for this example mod goes to Java" #optional
    # A text field displayed in the mod UI
    authors="Love, Cheese and small house plants" #optional
    # The description text for the mod (multi line!) (#mandatory)
    description='''
    This is a long form description of the mod. You can write whatever you want here
    
    Have some lorem ipsum.
    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    '''
    # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
    [[dependencies.examplemod]] #optional
        # the modid of the dependency
        modId="forge" #mandatory
        # Does this dependency have to exist - if not, ordering below must be specified
        mandatory=true #mandatory
        # The version range of the dependency
        versionRange="[31,)" #mandatory
        # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
        ordering="NONE"
        # Side this dependency is applied on - BOTH, CLIENT or SERVER
        side="BOTH"
    # Here's another dependency
    [[dependencies.examplemod]]
        modId="minecraft"
        mandatory=true
        versionRange="[1.15.2]"
        ordering="NONE"
        side="BOTH"
    

    Hey, wait a minute. I forgot to change an appearance of "examplemod" in the toml files! Maybe that's it?

     

    EDIT: Nope, that's not it. I fixed the mistake and it still gives me the same problem. I attached the latest.log for the mod, but here's the most relevant section (the first FATAL thing logged):

    [28Jul2020 20:40:10.728] [Render thread/INFO] [net.minecraft.client.Minecraft/]: Setting user: Dev
    [28Jul2020 20:40:26.227] [Render thread/INFO] [net.minecraft.client.Minecraft/]: Backend library: LWJGL version 3.2.1 build 12
    [28Jul2020 20:40:29.655] [Render thread/FATAL] [net.minecraftforge.fml.ModLoader/LOADING]: File /Users/neoskater/Desktop/ComputerScience/Java/MinecraftModding/1.15.2/ElementalMagic/bin/main constructed 0 mods: [], but had 1 mods specified: [elementalmagic]
    [28Jul2020 20:40:29.655] [Render thread/FATAL] [net.minecraftforge.fml.ModLoader/CORE]: Failed to initialize mod containers
    net.minecraftforge.fml.ModLoadingException: The Mod File /Users/neoskater/Desktop/ComputerScience/Java/MinecraftModding/1.15.2/ElementalMagic/bin/main has mods that were not found

     

    and the new and improved mods.toml:

    modLoader="javafml" #mandatory
    loaderVersion="[31,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
    issueTrackerURL="http://my.issue.tracker/" #optional
    [[mods]] #mandatory
    modId="elementalmagic" #mandatory
    version="${file.jarVersion}" #mandatory
    displayName="Elemental Magic" #mandatory
    updateJSONURL="http://myurl.me/" #optional
    displayURL="http://example.com/" #optional
    logoFile="examplemod.png" #optional
    credits="Damian Thorne - the mod maker" #optional
    authors="Damian Thorne, CEO of the Thorne Corporation" #optional
    description='''A way to utilize the power of fire, water, air, earth, and ether in Minecraft.'''
    [[dependencies.elementalmagic]] #optional
        modId="forge" #mandatory
        mandatory=true #mandatory
        versionRange="[31,)" #mandatory
        ordering="NONE"
        side="BOTH"
    [[dependencies.elementalmagic]]
        modId="minecraft"
        mandatory=true
        versionRange="[1.15.2]"
        ordering="NONE"
        side="BOTH"
    

     

    latest.log

  4. Whenever I try to run runClient, I get past the Minecraft loading screen, only to be met by this error message:

     

    "Users/neoskater/Desktop/ComputerScience/Java/MinecraftModding/1.15.2/ElementalMagic/bin/main has mods that were not found."

     

    I went into the mods.toml file in main and it does appear to be set up correctly with the correct modid, but nothing is loading. Any idea what's going on?

     

    (Note: For some reason the bin/main in this mod only contains a pack.mcmeta and a META-INF folder containing only mods.toml, while the one for the only mod I have successfully tested contains a full copy of the code. Maybe that has something to do with it?)

    Screen Shot 2020-07-28 at 4.06.20 PM.png

  5. Hello,

    I'm creating an elemental magic mod, and am creating a class Element to represent the elements. I want each instance of Element to be associated with a color. Text relating to this element will show up in this color. However, I don't know what class I should use to represent this color. Does anyone have any suggestions on this matter?

    Also, I'm creating a registry for Elements using RegistryBuilder. What methods should I call on it, in what order, and with what parameters?

  6. On 6/24/2020 at 5:10 PM, GnRSlashSP said:

    I don't know what you are saying with "Spawn ItemStack", because ItemStacks can't "Spawn".

     

    If you have a ItemStack and want this item to Spawn in world right above players head, use ItemEntity (search how mobs drops its inventory and copy the code there).

     

    But if you want to put a specific ItemStack in player armor head position inventory, its simple:  playerEntity.armorinventory.set(slot, itemstack)  //  don't remember if player head slot is 0 or 3, try it

     

    Always do these things SERVER side.

    Thanks!

  7. Hey guys,

     

    So I have a biome, and I want it to be of type forest. However, I also want the grass and leaves in the biome to be orange, which is not the default for forest biomes. is there any way I can override the natural grass color of a biome type?

     

    In addition, I have written this method for class DrillItem that will allow it to perform a function similar to stripping wood for ores, that also spawns an item at the player using the block:

    	protected static final Map<Block, Block> ORE_DEPLETION_MAP = (new Builder<Block, Block>())
    			.put(Blocks.COAL_ORE, BlockList.DEPLETED_COAL_ORE.get())
    			.put(BlockList.DEPLETED_COAL_ORE.get(), BlockList.TWICE_DEPLETED_COAL_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_COAL_ORE.get(), BlockList.THRICE_DEPLETED_COAL_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_COAL_ORE.get(), Blocks.STONE)
    			.put(Blocks.IRON_ORE, BlockList.DEPLETED_IRON_ORE.get())
    			.put(BlockList.DEPLETED_IRON_ORE.get(), BlockList.TWICE_DEPLETED_IRON_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_IRON_ORE.get(), BlockList.THRICE_DEPLETED_IRON_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_IRON_ORE.get(), Blocks.STONE)
    			.put(Blocks.GOLD_ORE, BlockList.DEPLETED_GOLD_ORE.get())
    			.put(BlockList.DEPLETED_GOLD_ORE.get(), BlockList.TWICE_DEPLETED_GOLD_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_GOLD_ORE.get(), BlockList.THRICE_DEPLETED_GOLD_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_GOLD_ORE.get(), Blocks.STONE)
    			.put(Blocks.LAPIS_ORE, BlockList.DEPLETED_LAPIS_ORE.get())
    			.put(BlockList.DEPLETED_LAPIS_ORE.get(), BlockList.TWICE_DEPLETED_LAPIS_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_LAPIS_ORE.get(), BlockList.THRICE_DEPLETED_LAPIS_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_LAPIS_ORE.get(), Blocks.STONE)
    			.put(Blocks.REDSTONE_ORE, BlockList.DEPLETED_REDSTONE_ORE.get())
    			.put(BlockList.DEPLETED_REDSTONE_ORE.get(), BlockList.TWICE_DEPLETED_REDSTONE_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_REDSTONE_ORE.get(), BlockList.THRICE_DEPLETED_REDSTONE_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_REDSTONE_ORE.get(), Blocks.STONE)
    			.put(Blocks.EMERALD_ORE, BlockList.DEPLETED_EMERALD_ORE.get())
    			.put(BlockList.DEPLETED_EMERALD_ORE.get(), BlockList.TWICE_DEPLETED_EMERALD_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_EMERALD_ORE.get(), BlockList.THRICE_DEPLETED_EMERALD_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_EMERALD_ORE.get(), Blocks.STONE)
    			.put(Blocks.DIAMOND_ORE, BlockList.DEPLETED_DIAMOND_ORE.get())
    			.put(BlockList.DEPLETED_DIAMOND_ORE.get(), BlockList.TWICE_DEPLETED_DIAMOND_ORE.get())
    			.put(BlockList.TWICE_DEPLETED_DIAMOND_ORE.get(), BlockList.THRICE_DEPLETED_DIAMOND_ORE.get())
    			.put(BlockList.THRICE_DEPLETED_DIAMOND_ORE.get(), Blocks.STONE)
    			.put(BlockList.MOD_GEM_ORE.get(), BlockList.DEPLETED_MOD_GEM_ORE.get())
    			.put(BlockList.DEPLETED_MOD_GEM_ORE.get(), Blocks.STONE)
    			.build();
    	
    	protected static final Random rng = new Random();
    	
    	protected static final Map<Block, Supplier<ItemStack>> DEPLETION_DROPS_MAP = (new Builder<Block, Supplier<ItemStack>>())
    			.put(Blocks.COAL_ORE, () -> new ItemStack(Items.COAL, 1))
    			.put(BlockList.DEPLETED_COAL_ORE.get(), () -> new ItemStack(Items.COAL, 1))
    			.put(BlockList.TWICE_DEPLETED_COAL_ORE.get(), () -> new ItemStack(Items.COAL, 1))
    			.put(BlockList.THRICE_DEPLETED_COAL_ORE.get(), () -> new ItemStack(Items.COAL, 1))
    			.put(Blocks.IRON_ORE, () -> new ItemStack(ItemList.IRON_SLAG.get(), 1))
    			.put(BlockList.DEPLETED_IRON_ORE.get(), () -> new ItemStack(ItemList.IRON_SLAG.get(), 1))
    			.put(BlockList.TWICE_DEPLETED_IRON_ORE.get(), () -> new ItemStack(ItemList.IRON_SLAG.get(), 1))
    			.put(BlockList.THRICE_DEPLETED_IRON_ORE.get(), () -> new ItemStack(ItemList.IRON_SLAG.get(), 1))
    			.put(Blocks.GOLD_ORE, () -> new ItemStack(ItemList.GOLD_SLAG.get(), 1))
    			.put(BlockList.DEPLETED_GOLD_ORE.get(), () -> new ItemStack(ItemList.GOLD_SLAG.get(), 1))
    			.put(BlockList.TWICE_DEPLETED_GOLD_ORE.get(), () -> new ItemStack(ItemList.GOLD_SLAG.get(), 1))
    			.put(BlockList.THRICE_DEPLETED_GOLD_ORE.get(), () -> new ItemStack(ItemList.GOLD_SLAG.get(), 1))
    			.put(Blocks.LAPIS_ORE, () -> new ItemStack(Items.LAPIS_LAZULI, MathHelper.nextInt(rng, 4, 9)))
    			.put(BlockList.DEPLETED_LAPIS_ORE.get(), () -> new ItemStack(Items.LAPIS_LAZULI, MathHelper.nextInt(rng, 4, 9)))
    			.put(BlockList.TWICE_DEPLETED_LAPIS_ORE.get(), () -> new ItemStack(Items.LAPIS_LAZULI, MathHelper.nextInt(rng, 4, 9)))
    			.put(BlockList.THRICE_DEPLETED_LAPIS_ORE.get(), () -> new ItemStack(Items.LAPIS_LAZULI, MathHelper.nextInt(rng, 4, 9)))
    			.put(Blocks.EMERALD_ORE, () -> new ItemStack(Items.EMERALD, 1))
    			.put(BlockList.DEPLETED_EMERALD_ORE.get(), () -> new ItemStack(Items.EMERALD, 1))
    			.put(BlockList.TWICE_DEPLETED_EMERALD_ORE.get(), () -> new ItemStack(Items.EMERALD, 1))
    			.put(BlockList.THRICE_DEPLETED_EMERALD_ORE.get(), () -> new ItemStack(Items.EMERALD, 1))
    			.put(Blocks.DIAMOND_ORE, () -> new ItemStack(Items.DIAMOND, 1))
    			.put(BlockList.DEPLETED_DIAMOND_ORE.get(), () -> new ItemStack(Items.DIAMOND, 1))
    			.put(BlockList.TWICE_DEPLETED_DIAMOND_ORE.get(), () -> new ItemStack(Items.DIAMOND, 1))
    			.put(BlockList.THRICE_DEPLETED_DIAMOND_ORE.get(), () -> new ItemStack(Items.DIAMOND, 1))
    			.put(Blocks.REDSTONE_ORE, () -> new ItemStack(Items.REDSTONE, MathHelper.nextInt(rng, 4, 5)))
    			.put(BlockList.DEPLETED_REDSTONE_ORE.get(), () -> new ItemStack(Items.REDSTONE, MathHelper.nextInt(rng, 4, 5)))
    			.put(BlockList.TWICE_DEPLETED_REDSTONE_ORE.get(), () -> new ItemStack(Items.REDSTONE, MathHelper.nextInt(rng, 4, 5)))
    			.put(BlockList.THRICE_DEPLETED_REDSTONE_ORE.get(), () -> new ItemStack(Items.REDSTONE, MathHelper.nextInt(rng, 4, 5)))
    			.put(BlockList.MOD_GEM_ORE.get(), () -> new ItemStack(ItemList.MOD_GEM.get(), 1))
    			.put(BlockList.DEPLETED_MOD_GEM_ORE.get(), () -> new ItemStack(ItemList.MOD_GEM.get(), 1))
    			.build();
       .
       .
       .
         public ActionResultType onItemUse(ItemUseContext context) {
    		World world = context.getWorld();
    		BlockPos blockpos = context.getPos();
    		BlockState blockstate = world.getBlockState(blockpos);
    		Block block = ORE_DEPLETION_MAP.get(blockstate.getBlock());
    		if (block != null && this.canHarvestBlock(blockstate)) {
    			PlayerEntity playerentity = context.getPlayer();
    			world.playSound(playerentity, blockpos, SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS, 1.0F, 1.0F);
    			if (!world.isRemote) {
    					world.setBlockState(blockpos, block.getDefaultState().with(RotatedPillarBlock.AXIS, blockstate.get(RotatedPillarBlock.AXIS)), 11);
    				if (playerentity != null) {
    					if(DEPLETION_DROPS_MAP.get(blockstate.getBlock()) != null) {
    						Supplier<ItemStack> sup = DEPLETION_DROPS_MAP.get(blockstate.getBlock());
    						world.addEntity(new ItemEntity(world, playerentity.getPosition().getX(), playerentity.getPosition().getY(), playerentity.getPosition().getZ(), sup.get()));
    					}
    					context.getItem().damageItem(1, playerentity, (player) -> {
    						player.sendBreakAnimation(context.getHand());
    					});
    				}
    			}
    			return ActionResultType.SUCCESS;
    		} else {
    			return ActionResultType.PASS;
    		}
    	}

    Unfortunately, when I tested the method in the world it did not work, The block was not changed to the value it is mapped to in ORE_DEPLETION_MAP, nor did an ItemStack spawn.

    What am I doing wrong?

  8. Hey,

     

    So I'm overriding onRightClick in a custom item class called DrillItem to spawn a certain ItemStack at the using player's head whenever certain particular blocks are right-clicked. However, I don't know how to spawn an ItemStack entity in the world, much less at the player's head. Could someone please give me some pointers?

  9. Heya,

     

    So, I have a class of tool called DrillItem, and I want to add a feature called "ore depletion." It's like stripping wood, except it's for ores. Depleting an ore spawns that ore's specific ItemStack at the player and replaces the ore with the next less depleted form. For example, if I right-clicked with a Diamond Drill on Coal Ore, it would turn into Depleted Coal Ore and give me 1 coal. If I right-clicked on the Depleted Coal Ore, it would turn to Twice Depleted Coal Ore and give me 1 more coal. If I right-clicked on the Twice Depleted Coal Ore, it would turn to Thrice Depleted Coal Ore and give me 1 more coal. If I right-clicked on the Thrice Depleted Coal Ore one final time, it would turn to stone and give me 1 more coal.

     

    I want to use an implementation of Map<Block, Block> to control what each ore turns into when depleted, and a Map<Block, Supplier<ItemStack>> to determine what ItemStack comes out. I copied code from the AxeItem class's stripping map to create these maps. However, I am adding a static method registerDepletableOre that would allow other modders to add their ores to the system, and I want the maps to be mutable to that end. The Builder method of creating the map, which I am using now, doesn't do the trick for me. What other mutable implementations of Map should I use to make my map mutable?

  10. 1 hour ago, CaptainDoge said:

    What is the best method for overriding a vanilla blocks class? Is there a way to modify a vanilla class to add or change functionality?

    Overriding a vanilla block class...? Most vanilla blocks are instances of Block, and those with special functionality use a subclass of Block with the required methods.

    Do you mean changing the functionality of a vanilla block? I know nothing about this. Maybe the "reflection" I've been hearing so much about may be useful to you.

  11. Heya,

    So, I'm adding "depleted," "twice depleted," and "thrice depleted" counterparts to all the vanilla ores, for my own reasons. I want to decrease the amount each ore is affected by increasing levels of Fortune. For example, for depleted lapis ore mining it with a Fortune III pickaxe is the same as mining it with a Fortune II pickaxe, and Fortune II is equivalent to Fortune I, and you might as well not waste your Fortune I pickaxe. For twice depleted lapis ore, mining it with a Fortune II pickaxe gets the same results as a Fortune I pickaxe, and thrice depleted lapis just isn't affected by Fortune at all. Problem is, I'm not sure how to go about this in the json files. I'm thinking of creating a new formula for applying Fortune bonuses and using that, but I'm not sure how to start. Could someone please give me pointers?

  12. 1 hour ago, Draco18s said:

    I wonder if there is some kind of ... Block....Position varaible passed to your item through one of the various methods related to breaking blocks...

    I do have access to a BlockPos variable, I'm just not sure what to do with it. Should I pass it to the World in some sort of method? Should I operate on it directly? Is the method I'm looking for one of those methods that doesn't have an MCP name yet? And once I've checked the block, how do I break it? I don't want to just replace it with air, and I'm sure there's a method that allows me to spawn in the drops.

    Here's what I have so far.

    	public boolean onBlockDestroyed(ItemStack stack, World worldIn, BlockState state, BlockPos pos, LivingEntity entityLiving) {
    		if (!worldIn.isRemote && state.getBlockHardness(worldIn, pos) != 0.0F) {
    			stack.damageItem(1, entityLiving, (p_220038_0_) -> {
    				p_220038_0_.sendBreakAnimation(EquipmentSlotType.MAINHAND);
    				});
    			}
    		if(!worldIn.isRemote) {
    			BlockPos otherPos = pos.up();
    			boolean notEncounteredNonLog = true;
    			do {
    				Block block = /*can't find a suitable expression to check the block at otherPos*/;
    				if(block.isIn(BlockTags.LOGS)) {
    					//destroy the block found
    					otherPos = otherPos.up();
    				}
    				else {
    					notEncounteredNonLog = false;
    				}
    			} while(notEncounteredNonLog);
    		}
    		return true;
    	}

     

  13. Hi,

    I've created a chainsaw item. Its salient feature is that if the block it just destroyed is a log, it iterates through every block above the block destroyed and destroys it, until it encounters a block besides a log. (I'm overriding onBlockDestroyed to do this.) What I need to know is, how do I check the block at a specific position, and how do I break it as if the player had just broken it (making it drop things, etc.)?

    Edit: SOLVED by looking at vanilla code.

  14. ...declare which versions of the dependent mod require which versions of the dependency and assume my users will download a compatible version of the dependency, or include the dependency with the correct version in my library? And if so, how?

     

    Both mods do stuff on the client and server, so if including dependency libraries hides them from the client I may have to rely on my users being responsible.

  15. I'm making a mod that adds in controls for abilities that can be activated when you're wearing a certain piece of armor (e.g. pressing the chestplate_ability key while wearing the Muteki Chestplate will give you Strength V for 30 seconds). I want 5 controls: One for each piece of armor individually and one for every applicable piece at once. For this reason, I'm trying to instantiate instances of KeyBinding. However, I have no idea what I'm doing and cannot find a tutorial for 1.15.2. Could someone explain to me what I'm supposed to do or link me to a tutorial?

  16. Okay, I rewrote IThorneRecipeSerializer like this:

    public interface IThorneRecipeSerializer<T extends IRecipe<?>> extends IRecipeSerializer<T> {
    
    	public static IRecipeSerializer<ShapelessAdvancedRecipe> ADVANCED_CRAFTING_SHAPELESS = register("advanced_crafting_shapeless", new ShapelessAdvancedRecipe.Serializer());
    	public static IRecipeSerializer<ShapedAdvancedRecipe> ADVANCED_CRAFTING_SHAPED = register("advanced_crafting_shaped", new ShapedAdvancedRecipe.Serializer());
    
    	static <S extends IRecipeSerializer<T>, T extends IRecipe<?>> S register(String key, S recipeSerializer) {
    		return IRecipeSerializer.register(key, recipeSerializer);
    	}
    }

     

    and added this to my RegistryEvents:

    @SubscribeEvent
    public static void registerRecipeSerializers(final RegistryEvent.Register<IRecipeSerializer<?>> event) {
    	event.getRegistry().registerAll
    	(
    		IThorneRecipeSerializer.ADVANCED_CRAFTING_SHAPED,
    		IThorneRecipeSerializer.ADVANCED_CRAFTING_SHAPELESS
    	);
    }

     

    but it's still not working.

    I'll work on getting a GitHub repo up.

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.