Jump to content

HappyHippo77

Members
  • Posts

    23
  • Joined

  • Last visited

Posts posted by HappyHippo77

  1. 3 hours ago, Draco18s said:

    This is a very complicated thing and almost no one does it because its complicated and a pain in the ass because vanilla doesn't support it directly.

    This is the best example I have, but doesn't store data at the block level, but rather in 16x16x8 block-groups. Mind, its old code.

    Thanks for the help, sorry I keep asking so many questions. Where would I use this hashmap? In a class which extends WorldSavedData?

  2. 15 hours ago, TheGreyGhost said:

    Yeah, pretty much.

     

    You might use (say) a HashMap of BlockPos vs energy value for all blocks which are are partially depleted.  The block type is stored already (in the World) so you don't need to store that.

    You might also need some sort of second datastructure (eg HashSet) for blocks which are permanently depleted.

    I'm relatively new to Forge, so all of this is very complicated and out of my league, but I'm good at learning, so I'll try. Do you know of any resources for this kind of thing?

     

    15 hours ago, TheGreyGhost said:

    I think you also need to decide how the game should react if the data structures get too big and you need to cull them from memory.  What's your game mechanic for that?  eg

    Do you strip out the depleted blocks which are a long way away? ("Natural energy regenerates instantly when there are no spellcasters within X radius")

    If too many blocks get fully depleted in an area, does it destroy the entire chunk? ("If the flow of natural energy is sufficiently disturbed, then all natural energy in the area sickens and dies")

    Well, once the blocks "die", they'd probably be replaced with separate blocks from the mod which would have a more "dead" appearance, and no ability to receive energy (and may have lesser value drops), so I don't think I'd need that kind of thing too much (the energy will restore naturally over time, and not an overly long time, so it shouldn't ever get too full of data).

  3. 41 minutes ago, TheGreyGhost said:

    Hi

    I don't think it's possible to directly add this information to vanilla blocks.  If it were your own blocks, you could have blockstates for each one (say 16 levels) or a tileentity.

    However it's certainly possible to maintain a parallel data structure of your own which stores the energy level for every block (or perhaps more efficiently - every partially depleted block) - you can store it in WorldSavedData, and can update it regularly using server world tick.  You may need to be careful about chunks loading in or out (not trying to update information for chunks which have been unloaded because the player is a long way away, for example) but it wouldn't be particularly difficult.

     

    If there are other mods which seem to do something similar, you could look at their source code too.

    -TGG

     

     

    Thanks for the response! So to do this, would I basically need to add a value for every modified block containing the location and energy values (and potentially the block type as well) of each block?

  4. So I've got a really cool idea for a system for a mod of mine. Basically, it's a magic mod, and there will be two kinda of energy (mana), natural and personal. Natural energy exists in every natural block in the game, to different extents depending on the block itself. Personal energy is from the player themselves. By depleting personal energy too far you'll begin to experience negative effects, but if you don't give an area enough time to "recharge" after performing more magic there and trying again, the energy might be completely depleted from the blocks and they might die, rendering the area useless. Thus, you'd have to balance between using personal and natural energy in order to keep your casting areas alive.

     

    I really want to implement this system, but I've run into a massive barrier. I don't know how I would be able to store information, not only in normal vanilla blocks, but in EVERY natural block which has been depleted from its default energy in some way.. I've seen other mods do things somewhat similar to this, so I get the feeling it's possible, I just have no idea how to do it myself. Would I use Capabilities? Or is there a better system?

  5. 15 hours ago, TheGreyGhost said:

    Ah.  You're using 1.14.  Any reason you're not using 1.15?

     

    I wrestled with it for a while but I couldn't get it to load properly.  It either sticks .json on the end of the .obj filename or it doesn't load at all.  I can't figure out how the object loader is supposed to be invoked.

     

    Sorry dude, unless you update to 1.15 I'm out of ideas.

     

    -TGG

     

    I might be able to figure it out in 1.15. I used 1.14 because the documentation sucks for 1.15, and there's no tutorials for it either. I'll see if I can update.

  6. 1 hour ago, TheGreyGhost said:

    Hi

     

    Short answer is: lots of things can cause this

     

    If you post a link to a github I'll fork it and see if I can find any more clues.

     

    -TGG

    Hey! Thanks for the reply. Took me a while to figure out, and I'm not sure I did it right, but I think I finally managed to make a repository for it:
    https://github.com/HappyHippo77/Witchery2

     

    Please tell me if I did something wrong! I'm pretty new to github. I also may have changed some stuff in the files since I last replied.

     

    (Also: I am recreating the Witchery mod, yes. Mostly for practice and personal use, though I may publicize it if it ever gets accurate enough to the original. The idea is not to claim the work as my own, but to bring back the work of another person.)

  7. On 3/15/2020 at 7:25 PM, TheGreyGhost said:

    Hi

     

    I just finished figuring this out myself; I loaded obj files as a block, for use by a TileEntityRenderer

    Try this github branch

    https://github.com/TheGreyGhost/MinecraftByExample/tree/1-15-2-working-latestMCP

     

    The key files:

    blockstates json:

    
    {
      "forge_marker": 1,
      "variants": {
        "use_wavefront_obj_model=false": { "model": "block/hopper" },
        "use_wavefront_obj_model=true": { "model": "minecraftbyexample:block/mbe21_ter_wavefront_model" }
      }
    }

    in models/block:

    
    {
      "loader": "forge:obj",
      "flip-v": true,
      "ambientToFullbright": false,
      "__comment": "flip-v may be required if your texture appears mirrored.  See OBJloader::read() for other flags.  currently the available options are",
      "__comment1": "detectCullableFaces (default true) = try to convert faces to Directional Quads (EAST, WEST, etc) instead of just general quads",
      "__comment2": "diffuseLighting (default false) = attempt to apply the direction-dependent lighting as per vanilla blocks.  Currently does nothing.",
      "__comment3": "flipV (default false) = mirror the texture sheet top-->bottom (if your textures appear upside-down)",
      "__comment4": "ambientToFullbright (default true) = always render at maximum world illumination (combinedLight) regardless of the actual skylight or blocklight present",
      "__comment5": "materialLibraryOverrideLocation (default null) = use this path/filename for the material library file .mtl",
      "model" : "minecraftbyexample:models/block/mbe21_ter_gem.obj"
    }

    obj file in same directory:

    
    # Blender v2.80 (sub 75) OBJ File: 'mbe21_ter_gem.blend'
    # www.blender.org
    mtllib mbe21_ter_gem.mtl
    o Gem
    v 0.000000 1.000000 0.000000
    v -0.500000 0.000000 -0.500000
    v 0.500000 0.000000 -0.500000
    v 0.500000 -0.000000 0.500000
    v -0.500000 -0.000000 0.500000
    v 0.000000 -1.000000 -0.000000
    vt 0.125000 0.000000
    vt 0.000000 0.500000
    vt 0.250000 0.500000
    
    vt 0.375000 0.000000
    vt 0.250000 0.500000
    vt 0.500000 0.500000
    
    vt 0.625000 0.000000
    vt 0.500000 0.500000
    vt 0.750000 0.500000
    
    vt 0.875000 0.000000
    vt 0.750000 0.500000
    vt 1.000000 0.500000
    
    vt 0.125000 1.000000
    vt 0.000000 0.500000
    vt 0.250000 0.500000
    
    vt 0.375000 1.000000
    vt 0.250000 0.500000
    vt 0.500000 0.500000
    
    vt 0.625000 1.000000
    vt 0.500000 0.500000
    vt 0.750000 0.500000
    
    vt 0.875000 1.000000
    vt 0.750000 0.500000
    vt 1.000000 0.500000
    vn 0.0000 0.4472 -0.8944
    vn 0.8944 0.4472 0.0000
    vn 0.0000 0.4472 0.8944
    vn -0.8944 0.4472 0.0000
    vn 0.0000 -0.4472 -0.8944
    vn 0.8944 -0.4472 -0.0000
    vn 0.0000 -0.4472 0.8944
    vn -0.8944 -0.4472 -0.0000
    usemtl Material
    s 1
    f 1/1/1 3/2/1 2/3/1
    f 1/4/2 4/5/2 3/6/2
    f 1/7/3 5/8/3 4/9/3
    f 1/10/4 2/11/4 5/12/4
    f 6/13/5 2/14/5 3/15/5
    f 6/16/6 3/17/6 4/18/6
    f 6/19/7 4/20/7 5/21/7
    f 6/22/8 5/23/8 2/24/8

    mtl file in same directory:

    
    # Blender MTL File: 'mbe21_ter_gem.blend'
    # Material Count: 1
    
    newmtl Material
    Ns 323.999994
    Ka 1.000000 1.000000 1.000000
    Kd 0.800000 0.800000 0.800000
    Ks 0.500000 0.500000 0.500000
    Ke 0.0 0.0 0.0
    Ni 1.450000
    d 1.000000
    illum 2
    map_Kd minecraftbyexample:model/mbe21_ter_gem

    texture file is in

    textures/model

     

    Cheers

      TGG

     

    So I feel bad asking here, but I can't find anything anywhere else so I'll just ask... So I've pretty much done what's in here. The game loads with no related errors or warnings. But when I place the block down, it's completely invisible. It has a hitbox, but there's nothing there. I saw one other person with this problem but they were using 1.9 and never got a good answer. Any idea what causes this?

  8. 9 hours ago, desht said:

    Maybe your efforts would be better spent contributing to Bewitchment, a spiritual successor which doesn't use any of the original mod's assets?

    I would do this, but IIRC they closed their suggestions and such. I also don't very much like it, because it doesn't have the same feel as the original Witchery mod.

  9. 10 hours ago, desht said:

    Regarding the legality of recreating Witchery: there's nothing to stop you using the code or assets privately, for just "practice".  But you cannot publish anything containing any code or assets from that project, since it's not open-source.  And you can't call anything you release "Witchery" either.

    Thanks for the help! Also, regarding this ^, I figured that would be it, but I do wonder how that ties in to the fact that that mod is dead (and seemingly, so too is the creator). Who would be the one to call me out if I did reproduce it? I am copying the textures from the mod to use in the recreation, but I'm actively acknowledging that they are Emoniph's creation, not mine.

     

    Is there somewhere where I can look at the specifics behind the license and everything for Witchery?

  10. 21 hours ago, DavidM said:

    You should do this in the Item which you right click with instead.

    If it is a custom item, override Item#onItemUse.

    If it is a vanilla item, subscribe to PlayerInteractEvent.RightClickBlock and do your block changing there.

    Thanks! This is pretty helpful! One thing though, how would one find which block is being clicked with the onItemUse?

  11. Hey again! I'm gonna be around here a lot for a while...

    So this time I'm trying to make it so when I right click a cauldron with an item, it changes to a different block. Relatively simple concept, with one small problem. I want this to happen to a VANILLA cauldron. Now I've tried to do this by extending CauldronBlock in a class and overriding the onBlockActivated event, but this doesn't seem to be working. I'm assuming there's a problem with the way I'm overriding the thing, but I'm not sure what the issue is. So... how do I do this??

    Here's the code:
     

    package com.happyhippo77.witchery2.block.blocks;
    
    import com.happyhippo77.witchery2.item.ModItems;
    import net.minecraft.block.*;
    import net.minecraft.entity.player.PlayerEntity;
    import net.minecraft.entity.player.ServerPlayerEntity;
    import net.minecraft.item.*;
    import net.minecraft.potion.PotionUtils;
    import net.minecraft.potion.Potions;
    import net.minecraft.stats.Stats;
    import net.minecraft.tileentity.BannerTileEntity;
    import net.minecraft.util.Hand;
    import net.minecraft.util.SoundCategory;
    import net.minecraft.util.SoundEvents;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.util.math.BlockRayTraceResult;
    import net.minecraft.world.World;
    
    public class MinecraftCauldron extends CauldronBlock {
    
        public MinecraftCauldron(Block.Properties properties) {
            super(properties);
            this.setDefaultState(this.stateContainer.getBaseState().with(LEVEL, Integer.valueOf(0)));
        }
    
    
        @Override
        public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
            ItemStack itemstack = player.getHeldItem(handIn);
            if (itemstack.getItem() == ModItems.ANOINTING_PASTE) {
                // DO STUFF HERE
            } else {
                return true;
            }
            if (itemstack.isEmpty()) {
                return true;
            } else {
                int i = state.get(LEVEL);
                Item item = itemstack.getItem();
                if (item == Items.WATER_BUCKET) {
                    if (i < 3 && !worldIn.isRemote) {
                        if (!player.abilities.isCreativeMode) {
                            player.setHeldItem(handIn, new ItemStack(Items.BUCKET));
                        }
    
                        player.addStat(Stats.FILL_CAULDRON);
                        this.setWaterLevel(worldIn, pos, state, 3);
                        worldIn.playSound((PlayerEntity)null, pos, SoundEvents.ITEM_BUCKET_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F);
                    }
    
                    return true;
                } else if (item == Items.BUCKET) {
                    if (i == 3 && !worldIn.isRemote) {
                        if (!player.abilities.isCreativeMode) {
                            itemstack.shrink(1);
                            if (itemstack.isEmpty()) {
                                player.setHeldItem(handIn, new ItemStack(Items.WATER_BUCKET));
                            } else if (!player.inventory.addItemStackToInventory(new ItemStack(Items.WATER_BUCKET))) {
                                player.dropItem(new ItemStack(Items.WATER_BUCKET), false);
                            }
                        }
    
                        player.addStat(Stats.USE_CAULDRON);
                        this.setWaterLevel(worldIn, pos, state, 0);
                        worldIn.playSound((PlayerEntity)null, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
                    }
    
                    return true;
                } else if (item == Items.GLASS_BOTTLE) {
                    if (i > 0 && !worldIn.isRemote) {
                        if (!player.abilities.isCreativeMode) {
                            ItemStack itemstack4 = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER);
                            player.addStat(Stats.USE_CAULDRON);
                            itemstack.shrink(1);
                            if (itemstack.isEmpty()) {
                                player.setHeldItem(handIn, itemstack4);
                            } else if (!player.inventory.addItemStackToInventory(itemstack4)) {
                                player.dropItem(itemstack4, false);
                            } else if (player instanceof ServerPlayerEntity) {
                                ((ServerPlayerEntity)player).sendContainerToPlayer(player.container);
                            }
                        }
    
                        worldIn.playSound((PlayerEntity)null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
                        this.setWaterLevel(worldIn, pos, state, i - 1);
                    }
    
                    return true;
                } else if (item == Items.POTION && PotionUtils.getPotionFromItem(itemstack) == Potions.WATER) {
                    if (i < 3 && !worldIn.isRemote) {
                        if (!player.abilities.isCreativeMode) {
                            ItemStack itemstack3 = new ItemStack(Items.GLASS_BOTTLE);
                            player.addStat(Stats.USE_CAULDRON);
                            player.setHeldItem(handIn, itemstack3);
                            if (player instanceof ServerPlayerEntity) {
                                ((ServerPlayerEntity)player).sendContainerToPlayer(player.container);
                            }
                        }
    
                        worldIn.playSound((PlayerEntity)null, pos, SoundEvents.ITEM_BOTTLE_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F);
                        this.setWaterLevel(worldIn, pos, state, i + 1);
                    }
    
                    return true;
                } else {
                    if (i > 0 && item instanceof IDyeableArmorItem) {
                        IDyeableArmorItem idyeablearmoritem = (IDyeableArmorItem)item;
                        if (idyeablearmoritem.hasColor(itemstack) && !worldIn.isRemote) {
                            idyeablearmoritem.removeColor(itemstack);
                            this.setWaterLevel(worldIn, pos, state, i - 1);
                            player.addStat(Stats.CLEAN_ARMOR);
                            return true;
                        }
                    }
    
                    if (i > 0 && item instanceof BannerItem) {
                        if (BannerTileEntity.getPatterns(itemstack) > 0 && !worldIn.isRemote) {
                            ItemStack itemstack2 = itemstack.copy();
                            itemstack2.setCount(1);
                            BannerTileEntity.removeBannerData(itemstack2);
                            player.addStat(Stats.CLEAN_BANNER);
                            if (!player.abilities.isCreativeMode) {
                                itemstack.shrink(1);
                                this.setWaterLevel(worldIn, pos, state, i - 1);
                            }
    
                            if (itemstack.isEmpty()) {
                                player.setHeldItem(handIn, itemstack2);
                            } else if (!player.inventory.addItemStackToInventory(itemstack2)) {
                                player.dropItem(itemstack2, false);
                            } else if (player instanceof ServerPlayerEntity) {
                                ((ServerPlayerEntity)player).sendContainerToPlayer(player.container);
                            }
                        }
    
                        return true;
                    } else if (i > 0 && item instanceof BlockItem) {
                        Block block = ((BlockItem)item).getBlock();
                        if (block instanceof ShulkerBoxBlock && !worldIn.isRemote()) {
                            ItemStack itemstack1 = new ItemStack(Blocks.SHULKER_BOX, 1);
                            if (itemstack.hasTag()) {
                                itemstack1.setTag(itemstack.getTag().copy());
                            }
    
                            player.setHeldItem(handIn, itemstack1);
                            this.setWaterLevel(worldIn, pos, state, i - 1);
                            player.addStat(Stats.CLEAN_SHULKER_BOX);
                        }
    
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        }
    
    }

     

  12. 1 hour ago, HenryRichard said:

    It is under External Libraries - it'll look something like "Gradle: net.minecraftforge:forge:1.14.4". The assets will be in net.minecraft:client:extra.

    Thanks! One problem though, I can get it down to "client" but there's no "extra".

     

    EDIT: well I didn't find "extra", but I did find "block" above "client" and I think it was in there.

  13. So I'm not really sure if this is legal or not, but I'm trying to recreate the Witchery mod for practice. I'm not modifying or using the source code, and I'm not claiming it as original work, plus it's been dead for years (and so has the creator apparently), so I don't think it will be a problem. Now, I've run into a massive difficulty. I'm trying to recreate the Witch's Cauldron, and I've noticed something about the model. The little feet have are rotated on multiple axis. I'm using BlockBench for the models, and in normal Java Minecraft, you can only rotate parts on one axis. Now, I figured I might open the Witchery Jar and just check how they do it in that. They don't. There's no models at all.

    So yeah, how do you make a model with parts with multiple rotations?

  14. 18 hours ago, Ugdhar said:

    in your IDE under referenced libraries, you should be able to view the forge/minecraft sources, and other assets in the client-extra.jar

    I'm using IntelliJ, and I can't seem to find anything like this. Would it be in "External Libraries"? And if so what would the name in there be? I see nothing similar to "client-extra"...

  15. I've been doing some searching for help with this but can't seem to find anything. I don't want to add new particles into the game, I want to use the vanilla particles. Basically I'm trying to get flame particles to appear over specific parts of a block in my mod (where there are candles) and cannot find anything telling me how to even begin to use particles. So yeah, just some information on how to do that (or pointing to a good tutorial for it) would be nice. I'm using 1.14.4.

  16. 50 minutes ago, Ugdhar said:

    Not what you want to hear, but you honestly should probably be learning basic Java/OOP. Not knowing what a constructor is is a bad thing.

    I already have a basic understanding of how Java functions. I can get around alright in a Java environment. I guess I just never heard "constructor" before.

    One problem that I may have is that I can't learn Java well with anything except Forge. I only learn well when I'm doing something I find interesting, and the boring, drawling, here's-this-now-go-use-it tutorials you usually find never teach me anything I'll remember. I'll end up learning Forge faster if I just learn to use Forge than if I spend forever scurrying around trying to find the smallest shred of a good resource for Java.

    • Like 1
  17. So I'm following some tutorials, and I'm trying to use them is ways other than exactly what they're doing (which helps me learn faster), but I may have caused problems by doing that... So the first problem started when I had a block and an item for that block. I could /setblock the block just fine, no errors. But when I /give-d myself the item, it says "an internal error occurred when running this command" and immediately crashed. I didn't understand what was wrong, but after some messing around I managed to make it stop doing that... With the slight side effect that the game wont even load. It just throws a bunch of errors, and comes up with a screen saying "1 error occurred". I have no clue how to fix this (the error seems blatantly unconnected), so I decided to ask about it here. I am using 1.14.4.

    This is my main file (Noodles)

    package com.happyhippo77.noodles;
    
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
    import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    // The value here should match an entry in the META-INF/mods.toml file
    @Mod("noodles")
    public class Noodles {
        public static final String MODID = "noodles";
    
        // Directly reference a log4j logger.
        public static final Logger LOGGER = LogManager.getLogger();
    
        public Noodles() {
            // Register the setup method for modloading
            FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
    
        }
    
        private void setup(final FMLCommonSetupEvent event) {
    
        }
    }

     

    This is the file for the block (NoodleOre) don't ask why the obsession with noodles, I don't know
     

    package com.happyhippo77.noodles.blocks.properties;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.SoundType;
    import net.minecraft.block.material.Material;
    
    public class NoodleOre extends Block {
        public NoodleOre() {
            super(Properties.create(Material.ROCK)
                    .sound(SoundType.STONE)
                    .hardnessAndResistance(2.0f)
            );
            setRegistryName("noodle_ore");
        }
    }


    Here's the file for the blocks (ModBlocks)
     

    package com.happyhippo77.noodles.blocks;
    
    import com.happyhippo77.noodles.Noodles;
    import com.happyhippo77.noodles.blocks.properties.NoodleOre;
    import net.minecraft.block.Block;
    import net.minecraftforge.event.RegistryEvent;
    import net.minecraftforge.eventbus.api.SubscribeEvent;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.registries.ObjectHolder;
    
    @Mod.EventBusSubscriber(modid = Noodles.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
    @ObjectHolder(Noodles.MODID)
    public class ModBlocks {
            @SubscribeEvent
            public static void onBlocksRegistry(final RegistryEvent.Register<Block> event) {
                // register a new block here
                event.getRegistry().register(new NoodleOre());
                Noodles.LOGGER.info("Registered Blocks");
            }
    
        public static NoodleOre NOODLE_ORE = null;
    }

     

    And here's the file for the items (ModItems)
     

    package com.happyhippo77.noodles.items;
    
    import com.happyhippo77.noodles.Noodles;
    import com.happyhippo77.noodles.blocks.ModBlocks;
    import net.minecraft.item.BlockItem;
    import net.minecraft.item.Item;
    import net.minecraftforge.event.RegistryEvent;
    import net.minecraftforge.eventbus.api.SubscribeEvent;
    import net.minecraftforge.fml.common.Mod;
    
    @Mod.EventBusSubscriber(modid = Noodles.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
    public class ModItems {
    
        @SubscribeEvent
        public static void onItemsRegistry(final RegistryEvent.Register<Item> event) {
            // register a new block here
            event.getRegistry().register(new BlockItem(ModBlocks.NOODLE_ORE, new Item.Properties()).setRegistryName(ModBlocks.NOODLE_ORE.getRegistryName()));
            Noodles.LOGGER.info("Registered Items");
        }
    }


     

    Overall the code is just kind of erratic, so there's probably some really idiotic mistake in there that I can't see. Nonetheless, I really can't figure it out, so any help is appreciated!

    Oh yeah, and here's the console from around the time the errors start to where they end.
     

    Spoiler

    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ModList/LOADING]: Dispatching synchronous event LifecycleEvent:LOAD_REGISTRIES
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Firing event for modid noodles : RegistryEvent.Register<minecraft:block>
    [14:56:57] [Client thread/INFO] [co.ha.no.Noodles/]: Registered Blocks
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Fired event for modid noodles : RegistryEvent.Register<minecraft:block>
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Firing event for modid forge : RegistryEvent.Register<minecraft:block>
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Fired event for modid forge : RegistryEvent.Register<minecraft:block>
    [14:56:57] [Client thread/DEBUG] [ne.mi.re.GameData/REGISTRIES]: Applying holder lookups: minecraft:block
    [14:56:57] [Client thread/DEBUG] [ne.mi.re.GameData/REGISTRIES]: Holder lookups applied: minecraft:block
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ModList/LOADING]: Dispatching synchronous event LifecycleEvent:LOAD_REGISTRIES
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Firing event for modid noodles : RegistryEvent.Register<minecraft:item>
    [14:56:57] [Client thread/ERROR] [ne.mi.fm.ja.FMLModContainer/]: Exception caught during firing event: null
        Index: 2
        Listeners:
            0: NORMAL
            1: ASM: class com.happyhippo77.noodles.blocks.ModBlocks onBlocksRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
            2: ASM: class com.happyhippo77.noodles.items.ModItems onItemsRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
    java.lang.NullPointerException
        at com.happyhippo77.noodles.items.ModItems.onItemsRegistry(ModItems.java:17)
        at net.minecraftforge.eventbus.ASMEventHandler_1_ModItems_onItemsRegistry_Register.invoke(.dynamic)
        at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:80)
        at net.minecraftforge.eventbus.EventBus.post(EventBus.java:258)
        at net.minecraftforge.fml.javafmlmod.FMLModContainer.fireEvent(FMLModContainer.java:106)
        at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
        at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
        at net.minecraftforge.fml.ModContainer.transitionState(ModContainer.java:112)
        at net.minecraftforge.fml.ModList.lambda$dispatchSynchronousEvent$5(ModList.java:125)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at net.minecraftforge.fml.ModList.dispatchSynchronousEvent(ModList.java:125)
        at net.minecraftforge.fml.ModList.lambda$static$1(ModList.java:96)
        at net.minecraftforge.fml.LifecycleEventProvider.dispatch(LifecycleEventProvider.java:71)
        at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:197)
        at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$24(ModLoader.java:189)
        at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:969)
        at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:189)
        at net.minecraftforge.fml.client.ClientModLoader.lambda$begin$2(ClientModLoader.java:97)
        at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:113)
        at net.minecraftforge.fml.client.ClientModLoader.begin(ClientModLoader.java:97)
        at net.minecraft.client.Minecraft.init(Minecraft.java:457)
        at net.minecraft.client.Minecraft.run(Minecraft.java:365)
        at net.minecraft.client.main.Main.main(Main.java:128)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55)
        at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37)
        at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54)
        at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72)
        at cpw.mods.modlauncher.Launcher.run(Launcher.java:81)
        at cpw.mods.modlauncher.Launcher.main(Launcher.java:65)
        at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102)

    [14:56:57] [Client thread/ERROR] [ne.mi.fm.ja.FMLModContainer/LOADING]: Caught exception during event RegistryEvent.Register<minecraft:item> dispatch for modid noodles
    java.lang.NullPointerException: null
        at com.happyhippo77.noodles.items.ModItems.onItemsRegistry(ModItems.java:17) ~[classes/:?] {re:classloading}
        at net.minecraftforge.eventbus.ASMEventHandler_1_ModItems_onItemsRegistry_Register.invoke(.dynamic) ~[?:?] {}
        at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:80) ~[eventbus-1.0.0-service.jar:?] {}
        at net.minecraftforge.eventbus.EventBus.post(EventBus.java:258) ~[eventbus-1.0.0-service.jar:?] {}
        at net.minecraftforge.fml.javafmlmod.FMLModContainer.fireEvent(FMLModContainer.java:106) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:28.2] {re:classloading}
        at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65) ~[?:1.8.0_241] {}
        at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65) ~[?:1.8.0_241] {}
        at net.minecraftforge.fml.ModContainer.transitionState(ModContainer.java:112) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.ModList.lambda$dispatchSynchronousEvent$5(ModList.java:125) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at java.util.ArrayList.forEach(ArrayList.java:1257) ~[?:1.8.0_241] {}
        at net.minecraftforge.fml.ModList.dispatchSynchronousEvent(ModList.java:125) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.ModList.lambda$static$1(ModList.java:96) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.LifecycleEventProvider.dispatch(LifecycleEventProvider.java:71) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:197) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$24(ModLoader.java:189) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:969) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:189) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$begin$2(ClientModLoader.java:97) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:113) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.begin(ClientModLoader.java:97) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraft.client.Minecraft.init(Minecraft.java:457) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
        at net.minecraft.client.Minecraft.run(Minecraft.java:365) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
        at net.minecraft.client.main.Main.main(Main.java:128) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_241] {}
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_241] {}
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_241] {}
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_241] {}
        at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {}
        at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-4.1.0.jar:?] {}
        at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {}
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Firing event for modid forge : RegistryEvent.Register<minecraft:item>
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ja.FMLModContainer/LOADING]: Fired event for modid forge : RegistryEvent.Register<minecraft:item>
    [14:56:57] [Client thread/FATAL] [ne.mi.fm.ModLoader/LOADING]: Failed to complete lifecycle event LOAD_REGISTRIES, 1 errors found
    [14:56:57] [Client thread/FATAL] [ne.mi.ev.EventBus/EVENTBUS]: EventBus 0 shutting down - future events will not be posted.
    java.lang.Exception: stacktrace
        at net.minecraftforge.eventbus.EventBus.shutdown(EventBus.java:278) ~[eventbus-1.0.0-service.jar:?] {}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:115) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.begin(ClientModLoader.java:97) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraft.client.Minecraft.init(Minecraft.java:457) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
        at net.minecraft.client.Minecraft.run(Minecraft.java:365) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
        at net.minecraft.client.main.Main.main(Main.java:128) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_241] {}
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_241] {}
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_241] {}
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_241] {}
        at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {}
        at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-4.1.0.jar:?] {}
        at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-4.1.0.jar:?] {}
        at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar:?] {}
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.cl.ClientModLoader/CORE]: Generating PackInfo named mod:forge for mod file C:\Users\Conner\.gradle\caches\forge_gradle\minecraft_user_repo\net\minecraftforge\forge\1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3\forge-1.14.4-28.2.0_mapped_snapshot_20190719-1.14.3-recomp.jar
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.cl.ClientModLoader/CORE]: Generating PackInfo named mod:noodles for mod file C:\Users\Conner\Desktop\Minecraft\Modding\Noodles\build\resources\main
    [14:56:57] [Client thread/DEBUG] [ne.mi.fm.ForgeI18n/CORE]: Loading I18N data entries: 0
    [14:57:00] [Client thread/INFO] [mojang/NarratorWindows]: Narrator library for x64 successfully loaded
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.fm.co.ConfigTracker/CONFIG]: Loading configs type CLIENT
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.fm.co.ConfigTracker/CONFIG]: Loading config file type CLIENT at forge-client.toml for forge
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.fm.co.ConfigFileTypeHandler/CONFIG]: Built TOML config for C:\Users\Conner\Desktop\Minecraft\Modding\Noodles\run\config\forge-client.toml
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.fm.co.ConfigFileTypeHandler/CONFIG]: Loaded TOML config file C:\Users\Conner\Desktop\Minecraft\Modding\Noodles\run\config\forge-client.toml
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.fm.co.ConfigFileTypeHandler/CONFIG]: Watching TOML config file C:\Users\Conner\Desktop\Minecraft\Modding\Noodles\run\config\forge-client.toml for changes
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.co.ForgeConfig/FORGEMOD]: Loaded forge config file forge-client.toml
    [14:57:00] [Server-Worker-6/DEBUG] [ne.mi.fm.co.ConfigTracker/CONFIG]: Loading configs type COMMON
    [14:57:00] [Server-Worker-6/ERROR] [ne.mi.fm.ModLoader/LOADING]: Skipping lifecycle event SETUP, 1 errors found.
    [14:57:00] [Server-Worker-6/FATAL] [ne.mi.fm.ModLoader/LOADING]: Failed to complete lifecycle event SETUP, 1 errors found
    [14:57:00] [Server-Worker-6/FATAL] [ne.mi.ev.EventBus/EVENTBUS]: EventBus 0 shutting down - future events will not be posted.
    java.lang.Exception: stacktrace
        at net.minecraftforge.eventbus.EventBus.shutdown(EventBus.java:278) ~[eventbus-1.0.0-service.jar:?] {}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:115) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.startModLoading(ClientModLoader.java:123) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$onreload$3(ClientModLoader.java:105) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:113) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1640) [?:1.8.0_241] {}
        at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1632) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) [?:1.8.0_241] {}
    [14:57:02] [Server-Worker-2/WARN] [minecraft/ModelBakery]: Exception loading blockstate definition: noodles:blockstates/noodle_ore.json: java.io.FileNotFoundException: noodles:blockstates/noodle_ore.json
    [14:57:02] [Server-Worker-2/WARN] [minecraft/ModelBakery]: Exception loading blockstate definition: 'noodles:blockstates/noodle_ore.json' missing model for variant: 'noodles:noodle_ore#'
    [14:57:03] [Server-Worker-2/ERROR] [ne.mi.fm.ModLoader/LOADING]: Skipping lifecycle event ENQUEUE_IMC, 1 errors found.
    [14:57:03] [Server-Worker-2/FATAL] [ne.mi.fm.ModLoader/LOADING]: Failed to complete lifecycle event ENQUEUE_IMC, 1 errors found
    [14:57:03] [Server-Worker-2/FATAL] [ne.mi.ev.EventBus/EVENTBUS]: EventBus 0 shutting down - future events will not be posted.
    java.lang.Exception: stacktrace
        at net.minecraftforge.eventbus.EventBus.shutdown(EventBus.java:278) ~[eventbus-1.0.0-service.jar:?] {}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:115) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.finishModLoading(ClientModLoader.java:136) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at net.minecraftforge.fml.client.ClientModLoader.lambda$onreload$4(ClientModLoader.java:107) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
        at java.util.concurrent.CompletableFuture.uniRun(CompletableFuture.java:719) [?:1.8.0_241] {}
        at java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:701) [?:1.8.0_241] {}
        at java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:457) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) [?:1.8.0_241] {}
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) [?:1.8.0_241] {}

     

  18. So I've been learning Forge for a little bit, but I can't find any good resources. So far I've been using Cadiboo's tutorials (1.15.1) at https://cadiboo.github.io/tutorials/1.15.1/forge/, but those are still very early in creation and after looking through the source code of other mods around this version it appears that it is not teaching typical organization methods.

    I'm intending to learn Forge 1.15.2, but if there's an easier/more accessible version that's still relatively recent then I'll take that instead, and move into 1.15.2 as I improve.

    So yeah, what are some good resources, and what version should I learn first?

×
×
  • Create New...

Important Information

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