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

How do I make a base Library for my mods.


needoriginalname
 Share

Recommended Posts

I am currently making a new mod, while at the same time need to maintain another mod. Thing is, the both mods share ALOT of code, rather then maintaining the command code base in two seperate mods, I thought it would be best to put them in a mod library, kinda like what OpenBlocks does with OpenLib, LLibrary, and various core mods. (granted, I am not using ASM at this time)

 

How exactly does someone make one, I am not even sure on the first step to how to do it.

Link to comment
Share on other sites

What I did was just have separate packages in my workspace (mod.draco18s.library, mod.draco18s.mod1, mod.draco18s.mod2...) and use the build.gradle file to set up separate build tasks that would put the compiled code into separate jar files.

 

A few other folks will have other suggestions, but this is the one that worked for me.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

You can build a library, in this case its recommended you shade the library into the final jar to make it easiest on the end user to install it.

Trying to split a project into multiple jars would just be annoying to setup. And annoying for the end user.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Patreon: http://www.patreon.com/lexmanos
Paypal: http://paypal.me/LexManos

BitCoin: 1Q8rWvUNMM2T1ZfDaFeeYQyVXtYoeT6tTn

Link to comment
Share on other sites

What works for me (though there are drawbacks) is creating a separate package for shared code. One drawback is that I must avoid static fields that would work perfectly well to support one mod but fail miserably as soon as two or more mods collide. In other words, when you lift some of your existing code to a higher level of abstraction, you may need to fix some of its single-instance assumptions.

 

Another drawback is that when more than one of my mods is installed, the classes in the shared package will be loaded from only one of them. This creates a synchronization hazard for users who download my mods at different times.

 

If those mods are out of sync (built on different versions of the shared package), then some really weird run-time errors can crop up, so whenever anything changes in the shared package, I must remember to rebuild all of my mods and increment an intermediate version number.

 

I now keep one level of my dot-versioning in sync across all of my mods to denote which version of the shared package is in them (thus I can easily see a mismatch in any crash report with multiple mods loaded). When running my mods, I (and my friends) must make sure that they're all from the same generation.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

I now keep one level of my dot-versioning in sync across all of my mods to denote which version of the shared package is in them (thus I can easily see a mismatch in any crash report with multiple mods loaded). When running my mods, I (and my friends) must make sure that they're all from the same generation.

 

Exactly what I (tried) to do.  Ended up realizing I'd done it in a way that didn't do what I'd been trying to accomplish.  Ended up with a scenario where I had to increment the number that was the "Library" version number despite the library not having actually changed.

 

The 1.10 version numbers will fix that.  The major-est number will be explicit the Library version, rather than just a major revision.

 

Trying to split a project into multiple jars would just be annoying to setup. And annoying for the end user.

 

Except that the reason I'm doing it is because my users explicitly requested it.  They wanted a single feature I had in a mod as its own mod, without all the other things the main mod did.

 

I did split it off as a standalone feature, but the two mods were effective "mutually exclusive" with each other (although checks were made to insure that singleton static references behaved nicely).  So in the 1.10 rebuild, they're properly separate, and the main mod instead depends on the single-feature mod.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Or, you could just add a config option to disable the features they dont wont.

But this isn't what you asked, you asked to make a LIBRARY a library is not end user facing content, that is a mod.

Say you wrote a utility that made interacting with a text file easier for you. That's great, use it in all the mods you want. But to the end user your mod should still just be one file.

Having to download 5 different 'libraries' to install one mod is really annoying.

 

This is where shading/fatjaring comes in. You can build that library internally. You could develop with those 5 libraries and when you build you jar have gradle pack them all together and change their package to 'my.special.mods.libraries.{original package}' and those classes would exist and work and you wouldn't have to worry about two mods having two different versions of the library because each mod would have its own copy and use its own copy.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Patreon: http://www.patreon.com/lexmanos
Paypal: http://paypal.me/LexManos

BitCoin: 1Q8rWvUNMM2T1ZfDaFeeYQyVXtYoeT6tTn

Link to comment
Share on other sites

I've never had anyone complain, but I recognize your point as valid.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Then you haven't been paying attention, 1/2 the tech support issues that aren't mc version mismatches are missing library/dep issues.

Not to mention the cluster that is IRC/Forums.

There is no reason for a modder to make it hard on the end user. It's super simple to do.

https://github.com/johnrengelman/shadow

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Patreon: http://www.patreon.com/lexmanos
Paypal: http://paypal.me/LexManos

BitCoin: 1Q8rWvUNMM2T1ZfDaFeeYQyVXtYoeT6tTn

Link to comment
Share on other sites

but I recognize your point as valid.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Yea, you shouldn't be starting the Minecraft server. That starts a vanilla one. You need to start the forge jar and I think you need to use the bat file that gets generated instead of just opening the jar.
    • 1.12 is no longer supported on this forum. Please update to a modern version of Minecraft to receive support.
    • ---- Minecraft Crash Report ---- WARNING: coremods are present:   TransformLoader (DynamicSurroundings-1.12.2-3.6.1.0.jar)   ForgelinPlugin (Forgelin-1.8.4.jar)   MovingWorldCore (movingworld-1.12-6.353-full.jar)   Quark Plugin (Quark-r1.6-179.jar)   CorePlugin (ForgeEndertech-1.12.2-4.5.5.0-build.0561.jar)   CTMCorePlugin (CTM-MC1.12.2-1.0.2.31.jar)   FarseekCoreMod (Farseek-1.12-2.5.1.jar)   FutureMC (future-mc-1.12.2-0.2.6.1.jar) Contact their authors BEFORE contacting forge // Surprise! Haha. Well, this is awkward. Time: 9/20/21 10:59 AM Description: Ticking block entity java.lang.NullPointerException: Ticking block entity     at net.minecraftforge.fluids.FluidStack.<init>(FluidStack.java:72)     at ic2.core.block.transport.TileEntityFluidPipe$PipeFluidHandler.drain(TileEntityFluidPipe.java:350)     at ic2.core.util.LiquidUtil.drainTile(LiquidUtil.java:332)     at ic2.core.util.LiquidUtil.drainTile(LiquidUtil.java:323)     at ic2.core.block.machine.tileentity.TileEntityPump.pump(TileEntityPump.java:204)     at ic2.core.block.machine.tileentity.TileEntityPump.operate(TileEntityPump.java:177)     at ic2.core.block.machine.tileentity.TileEntityPump.canoperate(TileEntityPump.java:146)     at ic2.core.block.machine.tileentity.TileEntityPump.updateEntityServer(TileEntityPump.java:123)     at ic2.core.block.TileEntityBlock.func_73660_a(TileEntityBlock.java:326)     at net.minecraft.world.World.func_72939_s(World.java:1838)     at net.minecraft.world.WorldServer.func_72939_s(WorldServer.java:613)     at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:767)     at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:397)     at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:668)     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)     at java.lang.Thread.run(Unknown Source) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace:     at net.minecraftforge.fluids.FluidStack.<init>(FluidStack.java:72)     at ic2.core.block.transport.TileEntityFluidPipe$PipeFluidHandler.drain(TileEntityFluidPipe.java:350)     at ic2.core.util.LiquidUtil.drainTile(LiquidUtil.java:332)     at ic2.core.util.LiquidUtil.drainTile(LiquidUtil.java:323)     at ic2.core.block.machine.tileentity.TileEntityPump.pump(TileEntityPump.java:204)     at ic2.core.block.machine.tileentity.TileEntityPump.operate(TileEntityPump.java:177)     at ic2.core.block.machine.tileentity.TileEntityPump.canoperate(TileEntityPump.java:146)     at ic2.core.block.machine.tileentity.TileEntityPump.updateEntityServer(TileEntityPump.java:123)     at ic2.core.block.TileEntityBlock.func_73660_a(TileEntityBlock.java:326) -- Block entity being ticked -- Details:     Name: ic2:pump // ic2.core.block.machine.tileentity.TileEntityPump     Block type: ID #388 (ic2.te // ic2.core.block.BlockTileEntity // ic2:te)     Block data value: 1 / 0x1 / 0b0001     Block location: World: (137,34,-88), Chunk: (at 9,2,8 in 8,-6; contains blocks 128,0,-96 to 143,255,-81), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1)     Actual block type: ID #388 (ic2.te // ic2.core.block.BlockTileEntity // ic2:te)     Actual block data value: 1 / 0x1 / 0b0001 Stacktrace:     at net.minecraft.world.World.func_72939_s(World.java:1838)     at net.minecraft.world.WorldServer.func_72939_s(WorldServer.java:613) -- Affected level -- Details:     Level name: world     All players: 1 total; [EntityPlayerMP['ZtiromDE'/383, l='world', x=136.18, y=35.14, z=-88.54]]     Chunk stats: ServerChunkCache: 137 Drop: 0     Level seed: 6427110845652378783     Level generator: ID 00 - default, ver 1. Features enabled: false     Level generator options:     Level spawn location: World: (0,0,0), Chunk: (at 0,0,0 in 0,0; contains blocks 0,0,0 to 15,255,15), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)     Level time: 0 game time, 0 day time     Level dimension: 0     Level storage version: 0x00000 - Unknown?     Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)     Level game mode: Game mode: survival (ID 0). Hardcore: false. Cheats: false Stacktrace:     at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:767)     at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:397)     at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:668)     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)     at java.lang.Thread.run(Unknown Source) -- System Details -- Details:     Minecraft Version: 1.12.2     Operating System: Windows 10 (amd64) version 10.0     Java Version: 1.8.0_301, Oracle Corporation     Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation     Memory: 2877134552 bytes (2743 MB) / 4130340864 bytes (3939 MB) up to 8388608000 bytes (8000 MB)     JVM Flags: 1 total; -Xmx9000M     IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 7     FML: MCP 9.42 Powered by Forge 14.23.5.2854 58 mods loaded, 58 mods active     States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored     | State  | ID                                           | Version            | Source                                        | Signature                                |     |:------ |:-------------------------------------------- |:------------------ |:--------------------------------------------- |:---------------------------------------- |     | LCHIJA | minecraft                                    | 1.12.2             | minecraft.jar                                 | None                                     |     | LCHIJA | mcp                                          | 9.42               | minecraft.jar                                 | None                                     |     | LCHIJA | FML                                          | 8.0.99.99          | server.jar                                    | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LCHIJA | forge                                        | 14.23.5.2854       | server.jar                                    | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LCHIJA | com.elytradev.movingworld.common.asm.coremod |                    | minecraft.jar                                 | None                                     |     | LCHIJA | forgeendertech                               | 1.12.2-4.5.5.0     | ForgeEndertech-1.12.2-4.5.5.0-build.0561.jar  | None                                     |     | LCHIJA | adpoles                                      | 1.12.2-2.0.3.0     | AdPoles-1.12.2-2.0.3.0-build.0552.jar         | None                                     |     | LCHIJA | crafttweaker                                 | 4.1.20             | CraftTweaker2-1.12-4.1.20.660.jar             | None                                     |     | LCHIJA | jei                                          | 4.16.1.301         | jei_1.12.2-4.16.1.301.jar                     | None                                     |     | LCHIJA | quark                                        | r1.6-179           | Quark-r1.6-179.jar                            | None                                     |     | LCHIJA | autoreglib                                   | 1.3-32             | AutoRegLib-1.3-32.jar                         | None                                     |     | LCHIJA | biomesoplenty                                | 7.0.1.2441         | BiomesOPlenty-1.12.2-7.0.1.2441-universal.jar | None                                     |     | LCHIJA | bookshelf                                    | 2.3.590            | Bookshelf-1.12.2-2.3.590.jar                  | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | chisel                                       | MC1.12.2-1.0.2.45  | Chisel-MC1.12.2-1.0.2.45.jar                  | None                                     |     | LCHIJA | chiselsandbits                               | 14.33              | chiselsandbits-14.33.jar                      | None                                     |     | LCHIJA | clumps                                       | 3.1.2              | Clumps-3.1.2.jar                              | None                                     |     | LCHIJA | collective                                   | 2.64               | collective-1.12.2-2.64.jar                    | None                                     |     | LCHIJA | cosmeticarmorreworked                        | 1.12.2-v5a         | CosmeticArmorReworked-1.12.2-v5a.jar          | aaaf83332a11df02406e9f266b1b65c1306f0f76 |     | LCHIJA | crafttweakerjei                              | 2.0.3              | CraftTweaker2-1.12-4.1.20.660.jar             | None                                     |     | LCHIJA | movingworld                                  | 1.12-6.353         | movingworld-1.12-6.353-full.jar               | None                                     |     | LCHIJA | davincisvessels                              | @DVESSELSVER@      | davincisvessels-1.12-6.340-full.jar           | None                                     |     | LCHIJA | orelib                                       | 3.6.0.1            | OreLib-1.12.2-3.6.0.1.jar                     | 7a2128d395ad96ceb9d9030fbd41d035b435753a |     | LCHIJA | dsurround                                    | 3.6.1.0            | DynamicSurroundings-1.12.2-3.6.1.0.jar        | 7a2128d395ad96ceb9d9030fbd41d035b435753a |     | LCHIJA | farseek                                      | 2.5.1              | Farseek-1.12-2.5.1.jar                        | None                                     |     | LCHIJA | forgelin                                     | 1.8.4              | Forgelin-1.8.4.jar                            | None                                     |     | LCHIJA | futuremc                                     | 0.2.6              | future-mc-1.12.2-0.2.6.1.jar                  | None                                     |     | LCHIJA | gamestages                                   | 2.0.123            | GameStages-1.12.2-2.0.123.jar                 | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | geographicraft                               | 0.8.7              | GeographiCraft-1.12-0.8.9b.jar                | None                                     |     | LCHIJA | grapplemod                                   | 1.12.2-v11.1       | grapplemod-v11.1-1.12.2.jar                   | None                                     |     | LCHIJA | gravestone                                   | 1.10.3             | gravestone-1.10.3.jar                         | None                                     |     | LCHIJA | happytrails                                  | 1.0.0.5            | HappyTrails-1.12.2-1.0.0.5.jar                | None                                     |     | LCHIJA | waila                                        | 1.8.26             | Hwyla-1.8.26-B41_1.12.2.jar                   | None                                     |     | LCHIJA | ichunutil                                    | 7.2.2              | iChunUtil-1.12.2-7.2.2.jar                    | 4db5c2bd1b556f252a5b8b54b256d381b2a0a6b8 |     | LCHIJA | ido                                          | 1.0.6              | ido-1.12.2-1.1.0.jar                          | None                                     |     | LCHIJA | ic2                                          | 2.8.170-ex112      | industrialcraft-2-2.8.170-ex112.jar           | de041f9f6187debbc77034a344134053277aa3b0 |     | LCHIJA | mantle                                       | 1.12-1.3.3.55      | Mantle-1.12-1.3.3.55.jar                      | None                                     |     | LCHIJA | inspirations                                 | 1.12.2-0.2.9       | Inspirations-1.12.2-0.2.9.jar                 | None                                     |     | LCHIJA | ironchest                                    | 1.12.2-7.0.67.844  | ironchest-1.12.2-7.0.72.847.jar               | None                                     |     | LCHIJA | journeymap                                   | 1.12.2-5.7.1       | journeymap-1.12.2-5.7.1.jar                   | None                                     |     | LCHIJA | guilib                                       | $version           | morepaintings-paintings-1.12.2-5.0.1.2.jar    | None                                     |     | LCHIJA | paintingselgui                               | $version           | morepaintings-paintings-1.12.2-5.0.1.2.jar    | None                                     |     | LCHIJA | morepaintings                                | $version           | morepaintings-paintings-1.12.2-5.0.1.2.jar    | None                                     |     | LCHIJA | naturescompass                               | 1.8.5              | NaturesCompass-1.12.2-1.8.5.jar               | None                                     |     | LCHIJA | netherendingores                             | 1.12.2-1.4.2       | Netherending-Ores-1.12.2-1.4.2.jar            | None                                     |     | LCHIJA | examplemod                                   | 1.0                | NuclearCraft-2.18z-1.12.2.jar                 | None                                     |     | LCHIJA | nuclearcraft                                 | 2.18z              | NuclearCraft-2.18z-1.12.2.jar                 | None                                     |     | LCHIJA | pixelmon                                     | 8.2.0              | Pixelmon-1.12.2-8.2.0-universal.jar           | None                                     |     | LCHIJA | placeableitems                               | 3.3                | placeableitems-3.3.jar                        | None                                     |     | LCHIJA | refinedstorage                               | 1.6.16             | refinedstorage-1.6.16.jar                     | 57893d5b90a7336e8c63fe1c1e1ce472c3d59578 |     | LCHIJA | spartanshields                               | 1.5.4              | SpartanShields-1.12.2-1.5.4.jar               | None                                     |     | LCHIJA | spartanweaponry                              | beta 1.3.8         | SpartanWeaponry-1.12.2-beta-1.3.8.jar         | None                                     |     | LCHIJA | streams                                      | 0.4.9              | Streams-1.12-0.4.9.jar                        | None                                     |     | LCHIJA | tinymobfarm                                  | 1.0.5              | TinyMobFarm-1.12.2-1.0.5.jar                  | None                                     |     | LCHIJA | travelersbackpack                            | 1.0.35             | TravelersBackpack-1.12.2-1.0.35.jar           | None                                     |     | LCHIJA | treeharvester                                | 3.2                | treeharvester_1.12.2-3.2.jar                  | None                                     |     | LCHIJA | wailastages                                  | 2.0.23             | WailaStages-1.12.2-2.0.23.jar                 | d476d1b22b218a10d845928d1665d45fce301b27 |     | LCHIJA | waystones                                    | 4.1.0              | Waystones_1.12.2-4.1.0.jar                    | None                                     |     | LCHIJA | rtg                                          | 6.1.0.0-snapshot.1 | RTG-1.12.2-6.1.0.0-snapshot.1.jar             | None                                     |     Loaded coremods (and transformers): TransformLoader (DynamicSurroundings-1.12.2-3.6.1.0.jar)   ForgelinPlugin (Forgelin-1.8.4.jar)   MovingWorldCore (movingworld-1.12-6.353-full.jar)   Quark Plugin (Quark-r1.6-179.jar)   vazkii.quark.base.asm.ClassTransformer CorePlugin (ForgeEndertech-1.12.2-4.5.5.0-build.0561.jar)   CTMCorePlugin (CTM-MC1.12.2-1.0.2.31.jar)   team.chisel.ctm.client.asm.CTMTransformer FarseekCoreMod (Farseek-1.12-2.5.1.jar)   farseek.core.FarseekClassTransformer FutureMC (future-mc-1.12.2-0.2.6.1.jar)   thedarkcolour.futuremc.asm.CoreTransformer     Pulsar/inspirations loaded Pulses:         - InspirationsShared (Enabled/Forced)         - InspirationsBuilding (Enabled/Not Forced)         - InspirationsUtility (Enabled/Not Forced)         - InspirationsTools (Enabled/Not Forced)         - InspirationsRecipes (Enabled/Not Forced)         - InspirationsTweaks (Enabled/Not Forced)         - InspirationsShared (Enabled/Forced)         - WailaPlugin (Enabled/Not Forced)     Profiler Position: N/A (disabled)     Player Count: 2 / 20; [EntityPlayerMP['T3rm1n6t0r'/17, l='world', x=9.98, y=73.00, z=99.44], EntityPlayerMP['ZtiromDE'/383, l='world', x=136.18, y=35.14, z=-88.54]]     Is Modded: Definitely; Server brand changed to 'fml,forge'     Type: Dedicated Server (map_server.txt)
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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