-
Posts
129 -
Joined
-
Last visited
-
Days Won
1
Everything posted by JaredBGreat
-
[1.12.2] Models / Texture on wrong block [SOLVED]
JaredBGreat replied to JaredBGreat's topic in Modder Support
What isn't for me is spending excessive amounts of time on something I don't profit / materially benefit from when there are other things I could be doing that are more useful. I do quite well with the logic -- I'm pretty good at algorithm design and problem solving in general. I suppose feeling good when I working it as addictive, but I have to question if this is sometimes an unhealthy addiction -- particularly when it comes to work on someone else's game from free. Also, most programming now isn't anything like that description -- at one point it did involve a lot of logic, math, and technical knowledge. Some of it still does, but a lot of it now is more like just speaking foreign language than doing higher math; mostly about memorizing libraries and APIs, more vocabulary than problem solving. I suppose game programming is an area that remains a bit more technical and reasoning intensive, but its no longer a good description of programming in general. For most of it the biggest hurdle is akin to studying German (or C++) and then finding you're actually going to France (or Python), or finding the local English is full of slangs you don't know. -
[1.12.2] Models / Texture on wrong block [SOLVED]
JaredBGreat replied to JaredBGreat's topic in Modder Support
I'm sorry I got stressed. Its just after spending several years ignoring everything but world-gen I finally started experimenting with other things, and they worked great when using older version making extensions for older mods. Then I started working on them for newer things. I get frustrated, then I think I've figured something out and get my hopes up, only for that to not work or run into another problem, often from something not at all obvious (e.g., the recipe json needing "minecraft:crafting_shaped" rather than just "crafting_shaped" as in vanilla recipes). Then its like, "Why do I bother, I'm getting no where, just wasting my time and stressing myself." I'll look into getting it to work with the model loader, when I have time. It not about like one thing or another -- its just that at this point using the model mesher worked right away without a hitch, and trying to use the model loader simply didn't work when I tried it. Anyway, things are working for now -- next there is the matter of making slabs and all those wooden things using block states (while trying to inherit behavior to avoid copying vanilla code), all in a mod that is mostly a replacement biome provider. I've had far more headaches from making one tree than making several mini-bosses (in another WIP mod) and reworking the world-gen together -- something I'd have never expected. -
[1.12.2] Models / Texture on wrong block [SOLVED]
JaredBGreat replied to JaredBGreat's topic in Modder Support
Well, it works, and nothing else does. Not that it matters, this is the alpha 1, the final version. Recipes don't work either, and I don't want to fool with them. I really am getting to really dislike modding. It was fun back in the 1.6 and 1.7 days. Then came json (gag), a growing collection of registries with constantly changing usage, more and more finicky APIs, and more and more over complication. I suppose I just wanted to leave this in a working state, done or not, though I don't think I will be. But at this point I think I really am leaving modding this game behind. So, its working with the mesher, and I don't really plan to work on it further, so I'm just leaving it. Sorry, for the trouble. -
[1.12.2] Models / Texture on wrong block [SOLVED]
JaredBGreat replied to JaredBGreat's topic in Modder Support
Thanks. I managed to get it working like this: @Mod.EventBusSubscriber public class ClientProxy implements IProxy { @Override @SideOnly(Side.CLIENT) public void registerItemRenders() { ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); initClient(mesher, ModBlocks.pineLog, ModBlocks.pineLog.getBasicState()); initClient(mesher, ModBlocks.pinePlanks); initClient(mesher, ModBlocks.pineNeedle, ModBlocks.pineNeedle.getDefaultState()); initClient(mesher, ModBlocks.pineSapling); } @SideOnly(Side.CLIENT) public static void initClient(ItemModelMesher mesher, Block block) { Item item = Item.getItemFromBlock(block); ModelResourceLocation model = new ModelResourceLocation(block.getRegistryName(),"normal"); ModelLoader.setCustomModelResourceLocation(item, 0, model); mesher.register(item, 0, model); } @SideOnly(Side.CLIENT) public static void initClient(ItemModelMesher mesher, Block block, IBlockState type) { Item item = Item.getItemFromBlock(block); String s = new DefaultStateMapper().getPropertyString(type.getProperties()); ModelResourceLocation model = new ModelResourceLocation(block.getRegistryName(), s); ModelLoader.setCustomModelResourceLocation(item, block.getMetaFromState(type), model); mesher.register(item, 0, model); } } Now I'm getting it to github and taking a nap -- too little sleep lately. I also was running the code too soon -- in preinit when it seems needed to be in init. -
[1.12.2] Models / Texture on wrong block [SOLVED]
JaredBGreat replied to JaredBGreat's topic in Modder Support
Sorry to be such a downer -- I am getting burned out, it happens more and more. It was fun once -- making my "doomlike" dungeons, seeing them appear in the world, then starting up the game in survival and fighting through them. And this, I suppose I could make my life a lot simpler by just sticking to the world gen in the new mod and not adding a special tree for hot climates. But that is what I'm thinking -- its time to move one. Perhaps maintain my one popular mod for new version. But yeah, I need to stop being temped to come back and finish that one last cool seeming idea. I do need to focus on what's good for me, and this may not be any more. Better to do something I enjoy and is good for me than to stress myself out and whine. Again, sorry for being such a downer. -
[1.12.2] Models / Texture on wrong block [SOLVED]
JaredBGreat replied to JaredBGreat's topic in Modder Support
It wanted a unique String, so I gave it one. Changing it to null (what I supposed it should have been), neither does using another string. The item block for a log still looks like a sapling, and all the others still look like black-and-purple cubes. Neither does using a newer Forge version. Frankly, I tire of the endlessly the increasing over-complication and constant re-learning what I just learned, the repeated breaking of everything. More and more this is not a fun hobby -- and what good is hobby that isn't fun, that just causes stress? More and more I think my time with this game is coming to a final close. -
OK, I was updating an old experiment to Minecraft 1.12.2. However, I ran into a really strand problem. While some errors were easy to fix, and other I managed to work out with a bit of debugging code, I can't figure out what's going on with the models. I use this code to apply model to the handful of blocks I've added (https://github.com/BlackJar72/ClimaticBiomePlacement/blob/Classic1.10.2/main/java/jaredbgreat/climaticbiome/proxy/ClientProxy.java): @Override public void registerItemRenders() { ModBlocks.pineLogItem.registerModels(); ModBlocks.pinePlanksItem.registerModels(); ModBlocks.pineNeedleItem.registerModels(); ModBlocks.pineSaplingItem.registerModels(); } (https://github.com/BlackJar72/ClimaticBiomePlacement/blob/Classic1.10.2/main/java/jaredbgreat/climaticbiome/blocks/items/RegisteringItemBlock.java) public RegisteringItemBlock registerModels() { ModelResourceLocation recloc = new ModelResourceLocation(block.getRegistryName(), block.getUnlocalizedName()); ModelLoader.setCustomModelResourceLocation(this, 0, recloc); return this; } This works perfectly in 1.10.2. But, in 1.12.2 only one item gets a model / texture, and its not usually the right one. Worse, which one gets it seems randomized: with the above code only the sapling shows up (and represents a log), however, if I move the last line to the first log (now second) actually get a texture, but nothing else does!?! What am I doing wrong? What have I missed? Is there something else I should be doing? (And yes, I know there are something that aren't technically idea, like "common" proxies, but getting things basically working is a high priority to me than refactoring out thing like bad naming conventions.)
-
Well, no, they've never been officially supported, just condoned by the EULAs. Just if you've wondered, a brief history of modding (possibly oversimplified with errors): In the beginning there was MCP (Minecraft Coder Project), which, like Forge, was third-party. It provided utilities that decompiled and deobfuscated Minecraft for modding. It was all about "install mods" (aka, "jar mods") -- to install a mod you actually had to open minecraft.jar with a tool for zip files (jar's really are speciallized zip files). If something went wrong the game could break (so you backed up the jar) and if two mods changed the same class they could not be used together -- the second one you installed would break the first by overwriting its changes. Then came two innovations. One was the mod loader, of which there were several (Rasgumi's, LiteLoader, etc.) -- you could install those mods and then they could load other mods. Second there was Forge, which included APIs and ways to avoid modding base classes directly. Then, Forge added its own built-in Forge Mod Loader (FML). Installing mods in the jar was then obsolete, modding was much safer, and huge modpacks became possible and eventually common. However, modding Minecraft has never been like modding most games -- you really are hacking the games binary either directly or indirectly. With Forge, you can avoid hacking the core game. Still, new release break everything, and force MCP and Forge to fix everything for the new versions; I'm sure all the work is why the Forge team doesn't want to support really old game versions. I might want to look at the link given above for the details, as I never worried about it too much. But I do know this -- the ability to load new code at run time is part of the Java language, supported through what are called classloaders. Modding if possible because of the nature of the Java language rather than the intentional design or Notch or Mojang. Thus, Forge only works for the "Java edition."
-
Looking through the libraries from within Eclipse show the gson, but another post here mentioned org.json.simple.parser.JSONParser; I'm looking into using json files for extra configurations, but I don't want to write my own parser (defeats the point) and want to be sure whatever library I use will be one that is available with the game. (I do not want to push them into a fat jar, which could have legal implications as well as file bloat and extra work for me, or worse, try to have them downloaded). I've started with gson, and hope that's not a mistake. So which does the game use and have conveniently available, Google gson? or json.org?
-
Coding done, was working in mcp, when i export and run it breaks
JaredBGreat replied to thenyanman's topic in Modder Support
If you must make install mods (aka, jar mods) like it was 2012 I'm not sure its relevant to Forge. I mean, its not based on Forge so why would it be? Its you're life, but in 2018 modding is that way is probably not worth your time. Have you tried the Forge MDK? -
[1.12.2] World generation with TileEntities
JaredBGreat replied to deerangle's topic in Modder Support
Just let me know when your mods ready -- I'm always up for new dungeons to explore / fight through. -
[1.12.2] World generation with TileEntities
JaredBGreat replied to deerangle's topic in Modder Support
Making a dungeon mod -- someone after my own heart. Well, for spawners I used this code: public static void placeSpawner(World world, int x, int y, int z, String mob) { // Place spawner block BlockPos pos = new BlockPos(x, y, z); if (MinecraftForge.TERRAIN_GEN_BUS.post(new DLDEvent.BeforePlaceSpawner(world, pos, mob))) return; if(isProtectedBlock(world, x, y, z)) return; if(!placeBlock(world, x, y, z, spawner)) return; TileEntityMobSpawner theSpawner = (TileEntityMobSpawner)world.getTileEntity(pos); // Set up spawner logic MobSpawnerBaseLogic logic = theSpawner.getSpawnerBaseLogic(); NBTTagCompound spawnData = new NBTTagCompound(); spawnData.setString("id", mob); logic.setNextSpawnData(new WeightedSpawnerEntity(1, spawnData)); } Note that I never did manage to add custom attributes to the spawner / mob (I tried once, when I added them to items). But for adding a mob, this works. I have code for chests too, though it refers through several classes and methods to pick items. The basic adding of items isn't hard though, if you want to see it. For custom, you just have to add whatever attributes you have created. -
Ah, I'm use to building huge things, but always underground. For things on the surface I have only vague ideas -- I've toyed with the idea of building biome-sized cities and roads that stretch 1000 blocks for one mod idea, but never actually tried it or worked a precise system for doing that, or any really good ideas, really. Oh well, I tried to help. But for many structures I'm quite happy to have them half-burried, etc. -- though for a ravine I might just put a foundation under the castle, or similar, so it will either reach the bottom of believable bridge it. For the technical issue of just avoiding generating chuck it simple, but yeah, if you really want to check the terrain it would get harder.
-
Well, I've been working on the same program. My main mod (Doomlike Dungeons) does this all wrong, intentionally generating the whole thing across a huge area -- mostly because that's what I could figure out easily as a new modder back in 2014 and didn't think about the consequences. I've been working out a new system for a sequel (since core parts like this are too broken so start over would be easier). My plan, if it works, is very simple, though it requires slightly more complex data structures to store the structure. Split the structure up into many structures along chunk boundaries and build only the part that is in the chunk being generated. I don't know how well this will work with what you are trying to do, but that is how I would (hopefully) will do it.
-
Didn't make a difference. That much isn't surprising, as the package-protected constructor was being called from inside the same package. But worth a try, I guess. EDIT: I've done some more research (thanks Google), and have uncovered evidence, such as this bug report that this is an actual bug in Java itself (apparently in both Java 7 and Java 8), and that it has something to do with the byte code format. There are reports of this kind of thing in code written a various other context, such as LibGDX and in Kotlin. I suppose I could completely re-write and see if I get luck -- it may very well be beyond this forums ability to help, unless someone just happens to know a trick to get around the bug or avoid triggering it. EDIT2: I've researched this all day. I've also tried refactoring and re-writing the code in various ways. Nothing seems to help. Java just doesn't like that class and that method. I give up, I have other things to do and don't have time for this. Thanks to everyone who has tried to help, but this will just be a small / minor mod with hard coded world-gen.
-
The full code is here: https://github.com/BlackJar72/ClimaticBiomePlacement What I'd think would be the most relevant parts are in these: In ClimaticBiomePlacement (main mod class); comment this out and everything works: @EventHandler public void postInit(FMLPostInitializationEvent event) { configHandler.findCustomBiomes(); } In jaredbgreat.climaticbiome.config.ConfigHander: public void findCustomBiomes() { File biomesFile = new File(dir.getPath() + File.separatorChar + Info.DIR + ".cfg"); customBiomes = new BiomeConfigurator(biomesFile); customBiomes.process(); } I hate to always be asking for help, but I have no idea how to even begin debugging this. I do know that Java often doesn't load classes until it needs them, and if I don't call the constructor for that class its fine (and the mod works on a hardcoded system). I've never seen anything like this though, and have no idea what would cause that or where to begin fixing it. As is I could release this as a small mod -- but I really was hoping I could make the who biome system configurable with biomes from other mods. Anyway, thanks.
-
OK, I'm not sure what I could have possibly done, or if its an FML bug or even a Java bug, or if this would happen once I update, but I've never seen this before, and don't even really know what it means. This time my code is not preducing unexpected behavior, the part it doesn't like isn't even running as far as I can tell. Instead the game crashes on trying to load one of my classes. This class isn't even directly modding the game, its for reading advanced configurations, and as far as I can tell the Java code is fine. Does anyone know what is going on or what this error even means? The class its trying to load is this: package jaredbgreat.climaticbiome.config; import jaredbgreat.climaticbiome.generation.chunk.biomes.IBiomeSpecifier; import jaredbgreat.climaticbiome.generation.chunk.biomes.generic.BiomeTable; import jaredbgreat.climaticbiome.generation.chunk.biomes.generic.GetIslandBiome; import jaredbgreat.climaticbiome.generation.chunk.biomes.generic.GetLeafBiome; import jaredbgreat.climaticbiome.generation.chunk.biomes.generic.GetListedBiome; import jaredbgreat.climaticbiome.generation.chunk.biomes.generic.GetNoiseBiome; import jaredbgreat.climaticbiome.generation.chunk.biomes.generic.GetSingleBiome; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.StringTokenizer; public class BiomeConfigurator { File file; private static final String delim = " ,\t"; private boolean inBlock; HashMap<String, IBiomeSpecifier> specifiers; HashMap<String, AbstractTempBiome> temps; ArrayList<String> identifiers; BiomeConfigurator(File file) { if(!file.exists() || !file.canRead() || !file.isFile()) { System.err.println("ERROR: The file " + file + " could not be read!"); return; } this.file = file; specifiers = new HashMap<>(); temps = new HashMap<>(); identifiers = new ArrayList(); } public void process() { try { readFile(file); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } for(String name : identifiers) { temps.get(name).setupSpecifier(name); } } /** * This will read and parse a file into IBiomeSpecifiers. * * This includes recognition of comments, blocks, and the * ability to import additional files. * * @param file * @throws FileNotFoundException * @throws IOException */ private void readFile(File file) throws FileNotFoundException, IOException { BufferedReader reader = new BufferedReader(new FileReader(file)); StringTokenizer tokens = null; AbstractTempBiome specifier; inBlock = false; String line, token1, token3; while((line = reader.readLine()) != null) { if(line.startsWith("#")) { continue; } tokens = new StringTokenizer(line, delim); token1 = tokens.nextToken(); if(token1.toLowerCase().equals("import")) { readFile(new File(tokens.nextToken())); } else { specifier = addSpecifier(token1, tokens.nextToken()); if((token3 = tokens.nextToken()).equals("{")) { readData(reader, tokens, specifier); } else { specifier.addString(token3); } } } } /** * Read data for a a specific IBiomeSpecifier (or more accurately, * for its temporary stand-in, an AbstractTempBiome) from a block * of data. Such blocks are delimited with curly braces. * * @param reader * @param tokens * @param specifier * @throws IOException */ private void readData(BufferedReader reader, StringTokenizer tokens, AbstractTempBiome specifier) throws IOException { if(readDataLine(tokens, specifier)) { return; } String line; while((line = reader.readLine()) != null) { if(line.startsWith("#")) { continue; } tokens = new StringTokenizer(line, delim); if(readDataLine(tokens, specifier)) { return; } } } /** * Reads one line of data for a specific IBiomeSpecifier (or more * accurately, for its temporary stand-in, an AbstractTempBiome). * * Returns true if the end of the block was reached, otherwise * returns false. * * @param tokens * @param specifier * @return */ private boolean readDataLine(StringTokenizer tokens, AbstractTempBiome specifier) { String token; while(tokens.hasMoreTokens()) { token = tokens.nextToken(); if(token.equals("}")) { return true; } else if(token.endsWith("}")) { // This should not be done, but someone is bound to do it token = token.substring(0, token.length() - 1); if(token.toLowerCase().equals("null")) { specifier.addString(null); } else { specifier.addString(token); } specifier.addString(token); return true; } else { if(token.toLowerCase().equals("null")) { specifier.addString(null); } else { specifier.addString(token); } } } return false; } /** * This will take a name and type and create an empty IBiomeSpecifier * and matching AbstractTempBiome to hold its initialization data * unitl all data is read. It will also add the name of the new * biome specifier to the list of identifiers which are iterated * during the follow data setup phase. * * * @param type * @param name * @return */ private AbstractTempBiome addSpecifier(String type, String name) { AbstractTempBiome out = null; identifiers.add(name); if(type.toLowerCase().equals("island")) { specifiers.put(name, new GetIslandBiome()); temps.put(name, out = new TempIslandBiome(this)); } else if(type.toLowerCase().equals("leaf")) { specifiers.put(name, new GetLeafBiome()); temps.put(name, out = new TempLeafBiome(this)); } else if(type.toLowerCase().equals("list")) { specifiers.put(name, new GetListedBiome()); temps.put(name, out = new TempListedBiome(this)); } else if(type.toLowerCase().equals("noise")) { specifiers.put(name, new GetNoiseBiome()); temps.put(name, out = new TempNoiseBiome(this)); } else if(type.toLowerCase().equals("single")) { specifiers.put(name, new GetSingleBiome()); temps.put(name, out = new TempSingleBiome(this)); } else if(type.toLowerCase().equals("table")) { specifiers.put(name, new BiomeTable()); temps.put(name, out = new TempBiomeTable(this)); } return out; } } And when I start the game I get this crash report: Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release [05:59:52] [main/INFO] [GradleStart]: Extra: [] [05:59:52] [main/INFO] [GradleStart]: Running with arguments: [--userProperties, {}, --assetsDir, /home/jared/.gradle/caches/minecraft/assets, --assetIndex, 1.10, --accessToken{REDACTED}, --version, 1.10.2, --tweakClass, net.minecraftforge.fml.common.launcher.FMLTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker] [05:59:52] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker [05:59:52] [main/INFO] [FML]: Forge Mod Loader version 12.18.3.2185 for Minecraft 1.10.2 loading [05:59:52] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_161, running on Linux:amd64:3.13.0-139-generic, installed at /usr/lib/jvm/java-8-oracle/jre [05:59:52] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker [05:59:52] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin [05:59:52] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin [05:59:52] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper [05:59:52] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work! [05:59:52] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper [05:59:52] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker [05:59:53] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker [05:59:53] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker [05:59:53] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker [05:59:53] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main} [05:59:53] [Client thread/INFO]: Setting user: Player608 [05:59:56] [Client thread/WARN]: Skipping bad option: lastServer: [05:59:56] [Client thread/INFO]: LWJGL Version: 2.9.4 [05:59:56] [Client thread/INFO] [STDOUT]: [net.minecraftforge.fml.client.SplashProgress:start:221]: ---- Minecraft Crash Report ---- // This doesn't make any sense! Time: 06/02/18 5:59 AM Description: Loading screen debug info This is just a prompt for computer specs to be printed. THIS IS NOT A ERROR A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details: Minecraft Version: 1.10.2 Operating System: Linux (amd64) version 3.13.0-139-generic Java Version: 1.8.0_161, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 770290416 bytes (734 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: Loaded coremods (and transformers): GL info: ' Vendor: 'Intel Open Source Technology Center' Version: '3.0 Mesa 10.1.3' Renderer: 'Mesa DRI Intel(R) Ivybridge Desktop ' [05:59:56] [Client thread/INFO] [FML]: MinecraftForge v12.18.3.2185 Initialized [05:59:56] [Client thread/INFO] [FML]: Replaced 231 ore recipes [05:59:56] [Client thread/INFO] [FML]: Found 0 mods from the command line. Injecting into mod discoverer [05:59:56] [Client thread/INFO] [FML]: Searching /home/jared/Documents/src/eclipse/Forge-1.10/ClimaticBiomes/run/mods for mods [05:59:58] [Client thread/INFO] [FML]: Forge Mod Loader has identified 4 mods to load [05:59:58] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, climaticbiomesjbg] at CLIENT [05:59:58] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, climaticbiomesjbg] at SERVER [05:59:58] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Climatic Biome Placement [05:59:58] [Client thread/INFO] [FML]: Processing ObjectHolder annotations [05:59:58] [Client thread/INFO] [FML]: Found 423 ObjectHolder annotations [05:59:58] [Client thread/INFO] [FML]: Identifying ItemStackHolder annotations [05:59:58] [Client thread/INFO] [FML]: Found 0 ItemStackHolder annotations [05:59:58] [Client thread/INFO] [STDOUT]: [jaredbgreat.climaticbiome.blocks.ModBlocks:registerBlock:36]: Registered block : tile.pine_log [05:59:58] [Client thread/INFO] [STDOUT]: [jaredbgreat.climaticbiome.blocks.ModBlocks:registerBlock:36]: Registered block : tile.pine_planks [05:59:58] [Client thread/INFO] [STDOUT]: [jaredbgreat.climaticbiome.blocks.ModBlocks:registerBlock:36]: Registered block : tile.pine_leaves [05:59:58] [Client thread/INFO] [STDOUT]: [jaredbgreat.climaticbiome.blocks.ModBlocks:registerBlock:36]: Registered block : tile.pine_sapling [05:59:58] [Client thread/INFO] [FML]: Applying holder lookups [05:59:58] [Client thread/INFO] [FML]: Holder lookups applied [05:59:58] [Client thread/INFO] [FML]: Applying holder lookups [05:59:58] [Client thread/INFO] [FML]: Holder lookups applied [05:59:58] [Client thread/INFO] [FML]: Applying holder lookups [05:59:58] [Client thread/INFO] [FML]: Holder lookups applied [05:59:58] [Client thread/INFO] [FML]: Configured a dormant chunk cache size of 0 [05:59:58] [Forge Version Check/INFO] [ForgeVersionCheck]: [Forge] Starting version check at http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json [05:59:58] [Client thread/INFO] [FML]: Applying holder lookups [05:59:58] [Client thread/INFO] [FML]: Holder lookups applied [05:59:58] [Client thread/INFO] [FML]: Injecting itemstacks [05:59:58] [Client thread/INFO] [FML]: Itemstack injection complete [05:59:59] [Forge Version Check/INFO] [ForgeVersionCheck]: [Forge] Found status: UP_TO_DATE Target: null [05:59:59] [Sound Library Loader/INFO]: Starting up SoundSystem... [05:59:59] [Thread-7/INFO]: Initializing LWJGL OpenAL [05:59:59] [Thread-7/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org) [05:59:59] [Thread-7/INFO]: OpenAL initialized. [06:00:00] [Sound Library Loader/INFO]: Sound engine started [06:00:01] [Client thread/INFO] [FML]: Max texture size: 8192 [06:00:01] [Client thread/INFO]: Created: 16x16 textures-atlas [06:00:02] [Client thread/INFO] [FML]: Injecting itemstacks [06:00:02] [Client thread/INFO] [FML]: Itemstack injection complete [06:00:02] [Client thread/ERROR] [FML]: Fatal errors were detected during the transition from POSTINITIALIZATION to AVAILABLE. Loading cannot continue [06:00:02] [Client thread/ERROR] [FML]: States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJ mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJ FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.10.2-12.18.3.2185.jar) UCHIJ Forge{12.18.3.2185} [Minecraft Forge] (forgeSrc-1.10.2-12.18.3.2185.jar) UCHIE climaticbiomesjbg{0.9.0} [Climatic Biome Placement] (bin) [06:00:02] [Client thread/ERROR] [FML]: The following problems were captured during this phase [06:00:02] [Client thread/ERROR] [FML]: Caught exception from Climatic Biome Placement (climaticbiomesjbg) java.lang.VerifyError: Bad local variable type Exception Details: Location: jaredbgreat/climaticbiome/config/BiomeConfigurator.readFile(Ljava/io/File;)V @26: aload Reason: Type top (current frame, locals[4]) is not assignable to reference type Current Frame: bci: @26 flags: { } locals: { 'jaredbgreat/climaticbiome/config/BiomeConfigurator', 'java/io/File', 'java/io/BufferedReader', 'java/util/StringTokenizer', top, 'java/lang/String' } stack: { } Bytecode: 0x0000000: bb00 8059 bb00 8259 2bb7 0084 b700 874d 0x0000010: 014e 2a03 b500 89a7 006e 1904 128d b600 0x0000020: 9199 0006 a700 61bb 008b 5919 0412 0bb7 0x0000030: 0094 4e2d b600 973a 0519 05b6 009a 129c 0x0000040: b600 a099 0015 2abb 001c 592d b600 97b7 0x0000050: 00a1 b700 5da7 0030 2a19 052d b600 97b7 0x0000060: 00a5 3a06 2db6 0097 593a 0712 a7b6 00a0 0x0000070: 9900 0e2a 2c2d 1906 b700 aba7 000a 1906 0x0000080: 1907 b600 ae2c b600 b159 3a04 c7ff 8eb1 0x0000090: Stackmap Table: full_frame(@26,{Object[#2],Object[#28],Object[#128],Object[#139],Top,Object[#109]},{}) full_frame(@39,{Object[#2],Object[#28],Object[#128],Object[#139],Object[#109]},{}) append_frame(@88,Object[#109]) append_frame(@126,Object[#115],Object[#109]) full_frame(@133,{Object[#2],Object[#28],Object[#128],Object[#139]},{}) at jaredbgreat.climaticbiome.config.ConfigHandler.findCustomBiomes(ConfigHandler.java:104) ~[bin/:?] at jaredbgreat.climaticbiome.ClimaticBiomePlacement.postInit(ClimaticBiomePlacement.java:63) ~[bin/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_161] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_161] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_161] at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:602) ~[forgeSrc-1.10.2-12.18.3.2185.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_161] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_161] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_161] at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?] at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?] at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?] at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?] at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?] at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:243) ~[forgeSrc-1.10.2-12.18.3.2185.jar:?] at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:221) ~[forgeSrc-1.10.2-12.18.3.2185.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_161] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_161] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_161] at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?] at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?] at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?] at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?] at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?] at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:145) [LoadController.class:?] at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:800) [Loader.class:?] at net.minecraftforge.fml.client.FMLClientHandler.finishMinecraftLoading(FMLClientHandler.java:324) [FMLClientHandler.class:?] at net.minecraft.client.Minecraft.startGame(Minecraft.java:561) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:386) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_161] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_161] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_161] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_161] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_161] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_161] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:26) [start/:?] [06:00:02] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:649]: ---- Minecraft Crash Report ---- // There are four lights! Time: 06/02/18 6:00 AM Description: There was a severe problem during mod loading that has caused the game to fail net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from Climatic Biome Placement (climaticbiomesjbg) Caused by: java.lang.VerifyError: Bad local variable type Exception Details: Location: jaredbgreat/climaticbiome/config/BiomeConfigurator.readFile(Ljava/io/File;)V @26: aload Reason: Type top (current frame, locals[4]) is not assignable to reference type Current Frame: bci: @26 flags: { } locals: { 'jaredbgreat/climaticbiome/config/BiomeConfigurator', 'java/io/File', 'java/io/BufferedReader', 'java/util/StringTokenizer', top, 'java/lang/String' } stack: { } Bytecode: 0x0000000: bb00 8059 bb00 8259 2bb7 0084 b700 874d 0x0000010: 014e 2a03 b500 89a7 006e 1904 128d b600 0x0000020: 9199 0006 a700 61bb 008b 5919 0412 0bb7 0x0000030: 0094 4e2d b600 973a 0519 05b6 009a 129c 0x0000040: b600 a099 0015 2abb 001c 592d b600 97b7 0x0000050: 00a1 b700 5da7 0030 2a19 052d b600 97b7 0x0000060: 00a5 3a06 2db6 0097 593a 0712 a7b6 00a0 0x0000070: 9900 0e2a 2c2d 1906 b700 aba7 000a 1906 0x0000080: 1907 b600 ae2c b600 b159 3a04 c7ff 8eb1 0x0000090: Stackmap Table: full_frame(@26,{Object[#2],Object[#28],Object[#128],Object[#139],Top,Object[#109]},{}) full_frame(@39,{Object[#2],Object[#28],Object[#128],Object[#139],Object[#109]},{}) append_frame(@88,Object[#109]) append_frame(@126,Object[#115],Object[#109]) full_frame(@133,{Object[#2],Object[#28],Object[#128],Object[#139]},{}) at jaredbgreat.climaticbiome.config.ConfigHandler.findCustomBiomes(ConfigHandler.java:104) at jaredbgreat.climaticbiome.ClimaticBiomePlacement.postInit(ClimaticBiomePlacement.java:63) 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.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:602) 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 com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) at com.google.common.eventbus.EventBus.post(EventBus.java:275) at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:243) at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:221) 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 com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) at com.google.common.eventbus.EventBus.post(EventBus.java:275) at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:145) at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:800) at net.minecraftforge.fml.client.FMLClientHandler.finishMinecraftLoading(FMLClientHandler.java:324) at net.minecraft.client.Minecraft.startGame(Minecraft.java:561) at net.minecraft.client.Minecraft.run(Minecraft.java:386) at net.minecraft.client.main.Main.main(Main.java:118) 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.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) 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.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:26) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details: Minecraft Version: 1.10.2 Operating System: Linux (amd64) version 3.13.0-139-generic Java Version: 1.8.0_161, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 562020024 bytes (535 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP 9.32 Powered by Forge 12.18.3.2185 4 mods loaded, 4 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJ mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJ FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.10.2-12.18.3.2185.jar) UCHIJ Forge{12.18.3.2185} [Minecraft Forge] (forgeSrc-1.10.2-12.18.3.2185.jar) UCHIE climaticbiomesjbg{0.9.0} [Climatic Biome Placement] (bin) Loaded coremods (and transformers): GL info: ' Vendor: 'Intel Open Source Technology Center' Version: '3.0 Mesa 10.1.3' Renderer: 'Mesa DRI Intel(R) Ivybridge Desktop ' [06:00:02] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:649]: #@!@# Game crashed! Crash report saved to: #@!@# /home/jared/Documents/src/eclipse/Forge-1.10/ClimaticBiomes/run/./crash-reports/crash-2018-02-06_06.00.02-client.txt AL lib: (EE) alc_cleanup: 1 device not closed Does anyone at least know what is happening -- it looks like the classloader doesn't like my class and or fml is not handling it right -- I'm pretty sure of that. But I have no idea why or how that would happen.
-
How do I make 32 X 32 texture like faithful
JaredBGreat replied to TheRPGAdventurer's topic in Modder Support
It funny, everyone here upscales. I often start with a large, photo-realistic image (sometimes and actual photo) and downscale it before tweaking and editing. With the right color tweaking this can make things seem higher resolution than they actually are because of the subtle and realistic color gradients. I do sometimes posterize them down to 256 colors, and the effect isn't usually noticeable, either, so its not just a mater of lots of colors but rather the combination of color. -
How to modify a vanilla biome characteristics?
JaredBGreat replied to gabrieldi's topic in Modder Support
OK, there is more than one way to do most of these things. To add structure you could: You could create a generation handler that implements IWorldGenerator and is registered with forge. This is most often used to place things like ores or flowers, but can be used to place anything (I use it for Doomlike Dungeons). You would just have to have your code test for the desert biome when deciding to place the structure. You don't need to change the biome at all to do this. You could create it as a biome feature, which the biome decorator can sometimes add (this if often used for trees, cacti, pools, etc.). Here is an example: https://github.com/BlackJar72/ClimaticBiomePlacement/blob/master/main/java/jaredbgreat/climaticbiome/generation/feature/GenPine.java -- vanilla example can be found in the world generation packages (under world). I'm pretty sure you would need to create a modded biome (even if just extending a vanilla one) to do it that way. The feature could be created in many ways -- procedurally, from an array, or from the files now stored as structure under assets (I don't know how to use those, since I mostly interested in procedural generation). To add mobs just use EntityRegistry.addSpawn() like diesieben07 said. Again, you don't need a new or modded biome to do this. So up to this point, you don't really need to mod the biome itself. To change things like size you'd have to get deep into the biome provider and/or gen layers -- I've created a biome provider, but it bypasses the noise layers / gen layers, so I don't know much about those. This is some of the most technical code in the game, and a lot of it is very mathy, so not to be done lightly, and might not be worth it just to make some changes to one biome. You could probably change where they're found be registering them in other biome groups, though, and it is possible to extend a biome to make a new one with new features and register it. I have no idea if you can remove biomes from the biome groups to keep the vanilla from appearing. You'd have to figure that out yourself. -
To code, to program, or to mod. Yes, I make a distinction between simply coding (writing technically valid code in some language) and programming (developing software to solve an actual problem). I learned the basics of Java from a teach yourself in 21 days book, about 15 years ago. Then, after being poor and without a computer for many years I re-learned Java from the official tutorials that Oracle has (https://docs.oracle.com/javase/tutorial/), though those might go a bit fast for someone who has never written code before. Before that I'd learned Atari Basic, Pascal, and beginning C++ (in that order). I was self-taught in all but Pascal (which I had a class on in high school), starting with Basic when I was in elementary school. Really learning to program was then a mater of practice -- the more you do it that better you get. Once you know the basics of a language, the thing to do is just start trying to do things with it. No matter what books you read or videos you watch you will never really know how to program unless you put time into programming -- like any skill it requires practice. As for modding, I watched some old videos by SweGoesMincraft (or something like that) which were for 1.6.4, to get the basics -- how to get Forge to recognize it as a mod, how to have Forge initialize it, etc. For there it was a mater looking through the code and figuring things out. This is also a skill; at first it can be hard -- Minecraft is most often not organized in the way I'd find most obvious. But a lot of it was trying things and see if they worked, looking at error reports to track down anything that actually crashed, struggling to figure what was going wrong if I didn't get the results I wanted. I remember the first time I got something to generate in game -- a quartz pillar though the middle of each chunk -- it seemed so cool that I'd made the game do *something*. I then went on to have it build scattered empty rooms, then rooms with content, then whole procedural dungeons (my real goal), and at each step I felt good that I'd made it work. That is how you learn to mod.
-
One last update and then I'll let this die, since people were wondering what I'd figure out: First, vanilla terrain gen in 1.10.x is more memory intensive than I realized at first. The last time I looked at that it was for an older version (probably 1.6). It seems my system may not actually use much if any more memory, and if a lot of terrain is generated quickly (e.g., flying around at high speed in spectator mode) with no modded world shows that vanilla will run out of memory and start to choke at least as fast (maybe faster, it seemed that way but I didn't time it). My system also seems to generate terrain a bit faster than vanilla (though it has no rivers or beaches). So maybe that isn't a problem. Second, I think I've isolated the source of the extra save files, and know why they're so small. It seems that the method areBiomesViable() in BiomeProvider is frequently run on random seeming, distant chunks. The extra files also will appear without any modded world gen in 1.10, but do not appear in 1.12. So I suspect these are being generated by an attempt to find a locations for large structures (woodland mansions?), and the generated region files is a side effect of generating these chunks which then get saved, a minor problem that was fixed in newer game versions -- and that it has nothing to do with the mod, and was never really an issue. So that's it basically -- I was overly concerned about nothing, mistaking normal game behavior for a problem I'd caused; looking for solutions for problems that weren't really there because I didn't have a good understanding of how it was supposed to work. If I get more done on this, the next post will probably be in a new thread in the mods section, and not too soon (I'm very busy again now). Thanks everyone for all the help and advice.
-
I've been away a few days, and haven't really looked at the event yet. I often don't think of events for things like this. I do know that getBiomesForGeneration() returns an array representing a 10x10 of locations at every four blocks which is used by the chunk provider to generate height maps that average across biome boundaries, and that getBiomes() returns and array of biomes within a chunk on a one block resolution and is used by the biome decorator to place things like trees and dirt. I also have found there is something else (maybe several location) in accessing the biome cache directly without going through the biome provider, and that this is used for placing structures (writing to the biome array everything is treated as plains, so no temples, plains village in the deserts, etc.) -- I have no idea where that is so far. I don't know if using the event would prevent the extra save files. I do suspect that the memory usage will be high no mater what I do -- at least as long as I use this kind of large-scale land and climate model. In the mean time I have been thinking of making a better caching system for my data -- well, that and having my mind wander back to my other project (possibly Doomlike Dungeons II or something along those lines).
-
I've done more tests. Applying some of the profiling out put in my original experimenting tool gives results like this when my biome system is run outside Minecraft: Total memory usage: USED MEMORY: 115 MB 486 Basin nodes 19449 BiomeBasins 102781 ChunkTiles 9 Regions 4 Spatial noise generators Where memory can spike to over 500 MB. This has me confused as doing a few calculation on the objects it reports existing (based on the fields they contain and the size of the primitive types) only accounts for about 8 MB. But it does appear my generation system may simply use far more memory than I realized. Perhaps its too greedy for what it does, at least in the context of what most people would want and expect. The I suspect the extra save files are from somewhere else. I'm using a round-about way of getting data into the biomeCache, since its private in BiomeFinder; specifically ignoring the cache flag and always writing into the cache when it calls getBiomes(), since that is the only access I have (the way I wrote getBiomesForGeneration() requires this to work since it gets its data from the biomeCache instead of a genlayer like in vanilla). What I suspect is happening is that something is calling this for distant locations (perhaps to check for possible structure locations of similar), and its not supposed to be cached when this happens. Put differently, the problem comes from completely skipping the genlayers -- to fix this I'd need have my biome data written into a genlayer and accessed from there, so that I can leave the biomeCache to function as it was intended. (Extra continental regions would also be a bi-product, as it would need the correct climate data for that location.) I'm not sure I can get the memory usage down to an acceptable level -- not with this way of doing thing. A system that was more memory efficient would simply not be at all the same system, and this system will never really be memory efficient; it just requires too much data (every chunk requires calculation on 48 fake chunks for one thing -- the calculation is fast but its a lot of extra proto-chunks being stored).
-
Well, I'm done with this for a couple days (I plan to visit my sister for Christmas tomorrow). For now, I've added some memory management (caches with object pools for frequently used classes). Most of my object are far less common than they were. However, overall memory is still awfully high (not a big change), and I have found that some classes acquire new instances way too fast and don't let go of them -- notable the "Regions" (4096x4096 areas which each get landmass and climate nodes / attractors). This leads me to think that my hunch that something is activating world gen way too far out or simply at incorrect coordinates. I don't think my world gen is "rolling" and causing more on its own -- it only spreads while travelling and cause no lag (unless memory is depleted). I'm not so much suspecting a bug in the vanilla code per se, as that I'm not interfacing with it correctly somewhere -- a case of playing with forces I don't understand. Anyway, thanks for now. EDIT: One of my experiments crashed with a null pointer in ChunkProviderServer, so maybe that's a good place to start looking for something that is asking my biome provider I wasn't expecting.