Development: Difference between revisions

From GT New Horizons
Content added Content deleted
(Updated the instructions for starting a repo to match the ones from ExampleMod's README, and link to GTNH ExampleMod's migration guide instead of SinTh0r4s')
m (→‎Contribution Procedure: Put testing before pushing to the repo)
Line 52: Line 52:
# Find something to contribute.
# Find something to contribute.
# Fork the needed repos.
# Fork the needed repos.
# Test your changes thoroughly.
# Push code into your fork.
# Push code into your fork.
# Test your changes thoroughly
# Open a pull request and provide a description on what it changes/adds/removes. Include pictures/graphs if necessary. If there is a related issue, link it. Ask for a review from the following members:
# Open a pull request and provide a description on what it changes/adds/removes. Include pictures/graphs if necessary. If there is a related issue, link it. Ask for a review from the following members:
#* Java/Scala/Kotlin code changes: GTNewHorizons/developers team,
#* Java/Scala/Kotlin code changes: GTNewHorizons/developers team,

Revision as of 19:37, 12 July 2023

Introduction

Everyone can contribute to GTNH in one way or another. One possible way is to improve or expand the source code of the mods.

To get started, you first need a vision for what you want to do.
If you don't have it yet, you can look through issues and try to address some.
If you do have a vision but want to hear more opinions on it, you can discuss it in a new Github issue or in Discord.

Getting started

If you found a mod that you want to edit, then create a fork of it by pressing the Fork button on its GitHub page.
After that, you can clone your fork to a local repository, import it to your IDE, and get started on development.
If you are not sure how to do something, try to look up how things similar to it were done before.

Starting from an existing repository

  1. Clone the repository.
  2. Update the buildscript automatically through ./gradlew updateBuildScript or if it doesn't work, manually with this guide.

Starting from scratch

See the ExampleMod README.md if the instructions below don't work.

  1. Unzip project starter into project directory.
  2. Replace placeholders in LICENSE-template and rename it to LICENSE, or remove LICENSE-template and put any other license you like on your code. This is an permissive OSS project and we encourage you participate in OSS movement by having permissive license like one in template. You can find out pros and cons of OSS software in this article.
  3. Ensure your project is under VCS. For example initialize git repository by running git init; git commit --message "initialized repository".
  4. Replace placeholders (edit values in gradle.properties, change example package and class names, etc.).
  5. Run ./gradlew build.
  6. Make sure to check out the rest sections of this file.
  7. You are good to go!

Next steps

  1. Run ./gradlew updateBuildScript to update the Gradle build-script for the repository.
  2. Run ./gradlew build --build-cache to build the project. The flag --build-cache makes builds faster. For more info, see documentation.
  3. If the build fails, check what was printed in console. Usually it fails because of outdated dependencies or Spotless. You can fix it with ./gradlew updateDependencies or ./gradlew spotlessApply respectively.
  4. In Eclipse / IntelliJ IDEA, import your workspace as an existing Gradle project. If the import fails, you may need to adjust the Gradle version and/or the buildscript. If you are developing for Minecraft 1.7.10, read this guide.
  5. After you made changes, test them:
    1. Build the project with ./gradlew build. You will find several jars in build/libs. What you need is the one without affixes like -dev or -api.
    2. Download the last nightly build and import it in the launcher of your choice.
    3. Replace the target mod with your version or add if it's a new one.
    4. Launch the pack and check that things work as they should.

Common issues

  • If your IDE tells you that stuff is missing even after you executed gradlew build, then try to reload Gradle.
  • You need a 64-bit Java for development. Most mods work with any Java 8-19. However, some mods now use enableModernJavaSyntaxin gradle.properties. In that case you need at least Java 11 to compile them. If you have multiple Java versions on your machine, then you may need to set the JAVA_HOME environment variable to the location of your desired Java installation and also configure it in your IDE.

Git Configuration

If you want to avoid signing commits with your real name, then please refer to the page Managing Git Identities.

Contribution Procedure

  1. Find something to contribute.
  2. Fork the needed repos.
  3. Test your changes thoroughly.
  4. Push code into your fork.
  5. Open a pull request and provide a description on what it changes/adds/removes. Include pictures/graphs if necessary. If there is a related issue, link it. Ask for a review from the following members:
    • Java/Scala/Kotlin code changes: GTNewHorizons/developers team,
    • Quest or recipe changes: chochom or DreamMasterXXL,
    • NEI changes: mitchej123,
    • Original mod developer if you are contributing to their mod and they are still around. For example, glease for TC4Tweaks, SinTh0r4s for VisualProspecting, GlodBlock for GoodGenerators.
  6. Address review problems. Resolve merge conflicts. Wait for final merge. DO NOT merge the PR yourself, even if approved! This is a task of GTNewHorizons/admin members.

Please do not make multiple changes/features in a single PR, make a separate PR for each. If they depend on each other, you can leave a note in the PR's description.

If you are not sure how to fork and open pull requests, read this gist by Chaser324.

GTNH-specific Contribution Guides

  • You can find the Code of Conduct of the GTNH dev community here.
  • See which GTNH mods are supported outside of the modpack and see an overview of licenses in this spreadsheet.
  • For the GTNH Code Style guidelines please see the dedicated page Code Style.
  • For quest development, read the Quests Development Guide.
  • The StructureLib documentation can be found here. Use this for your multiblock structures.
  • To understand how chemical formulas are balanced in recipes, read Chemical Balance.

Tools

All applications that are grouped together can do about the same. This does not mean that you can pick any one of them, as they differ in functionality, style, performance and customizability. It is recommended you look at what they can do and try each one out, so you can decide which application you want to use for which use case.

Code Editors
Integrated Development Environments
  • Eclipse Note: as of version 2020-09, using Java 8 became more difficult. 2020-06 is the last version with official support for Java 8.
  • IntelliJ IDEA
Image Editors
Modeling
Animation
Miscellaneous

Maven/Jenkins Selection

class="wikitable mw-collapsible mw-collapsed"
URL Mods
https://aidancbrady.com/mekanism/download/ Mekanism, MekanismGenerators, MekanismTools
https://api.modrinth.com/maven All Modrinth mods
https://chickenbones.net/maven/ CodeChickenCore, CodeChickenLib, EnderStorage, NotEnoughItems, Translocator, WR-CBE, ...
https://ci.rs485.network/
http://downloads.gtnewhorizons.com/Mods_for_Jenkins/ Various
https://dvs1.progwml6.com/files/maven IguanaTinkerTweaks, HungerOverhaul, Mantle, Natura, TinkersConstruct, TinkersMechworks, ...
https://files.projectredwiki.com/maven MrTJPCore, ForgeRelocation, ProjectRed
https://files.vexatos.com Are We Endgame Yet?, AsieLib, BeeSpecific, BuildcraftOilTweak, CheatyComputers, Computronics, Conventional, CustomManualTab, Don't Stub Your Toe, FactumOpus, ForecatsersBackpacks, TGregworks, ...
https://gregtech.overminddl1.com/ Various
https://immibis.com/ Advanced Machines, Advanced Repulsion Systems, AutoFood, Cloud Storage, Connected Glass, Dimensional Anchors, Immibis Core, Immibis's Macroblocks, Immibis's Microblocks, Immibis's Peripherals, InfiView, InfiniTubes, Liquid XP, RedLogic, Simple Recycling, TinyCarts, TubeStuff, ...
https://jenkins.bdew.net/maven AE2Stuff, BDLib, CoFHLib, Compacter, Computercraft, Generators, Gendustry, Mekanism, Pressure, ...
https://jenkins.dries007.net/ AutoCrafter2000, BetterFoliage, CrayCrafting, D3Backend, D3Log, GooglyEyes, GreenThumb, HoloInventory, InsiderTrading, MCLink, MineSafety, MorphAdditions, Pay2Spawn, Pay2SpawnBlocks, PlaceableTools, TapeMouse, TerraFirmaCraft, TerraFirmaStuff, TFCraft-NEIplugin, TFC-Tweaks, Thermal Expansion, TorchTools, WeepingAngels, ...
https://jenkins.ironhide.de/ CraftingUtilities, Open Modular Turrets, FloodLights, ...
http://jenkins.usrv.eu:8080/ Various
http://jenkins.usrv.eu:8081/nexus/content/repositories/public/ Various
https://jitpack.io/ Any GitHub project
https://maven.blamejared.com/ MineTweaker3, CraftTweaker, ...
https://maven.cil.li/ AppliedEnergistics 2, BetterStorage, BloodMagic, BluePower, BuildCraft, Charset, CodeChickenCore, CodeChickenLib, CoFHCore, CoFHLib, ColoredLightsCore, ComputerCraft, CraftGuide, EnderCore, EnderIO, EnderStorage, Forestry, Forge Multipart, GalacticraftCore, GregTech, Immibis Multipart, InGameWiki, Inventory Tweaks, Mantle, Mekanism, MineFactory Reloaded, MrTJPCore, NotEnoughItems, NotEnoughKeys, OpenComputers, PowerAdvantage, QmunityLib, ProjectRed, Railcraft, RedLogic, RedstoneFlux API, RotaryCraft, RotateableBlocks, ThaumicEnergistics, TinkersConstruct, TinkersMechworks, TIS-3D, Waila, WR-CBE, ...
https://maven.covers1624.net/

https://nexus.covers1624.net/repository/maven-hosted/

ChickenChunks, CodeChickenCore, CodeChickenLib, EnderStorage, ForgeMultipart, NotEnoughItems, Translocators, WR-CBE
https://maven.falsepattern.com/releases LightningOverhaul, AnimFix, CrashGuard, DyamicRendering, EndlessIDs, FalsePatternLib, JarLoader, LagGoggles, SSMLegacy, Triangulator, ...
https://maven.ic2.player.to/ IndustrialCraft, Forestry, ...
https://maven.k-4u.nl/ Boilerplate, InGameWiki, K4Lib, MoarCarts, PneumaticCraft, ServerInfoProvider, Steamcraft2, ...
https://maven.latmod.com/
https://maven.mcmoddev.com

Backup: https://maven.tophatcat.dev/

Baubles, LLibrary, Thaumcraft, VeinMiner, ...
https://maven.minecraftforge.net/ Biomes O' Plenty, HelpFixer, MalisisCore, MalisisDoors, Mixin, IronChest, ...
https://maven.modmuss50.me/
https://maven.mjrlegends.com/ ExtraPlanets, ...
https://ci.tterrag.com/

https://maven.tterrag.com

Chisel, CTMLib, CustomThings, DifficultyRecipes, EnderIO, EnderCore, EnderZoo, Ex-Astris, Ex-Nihilo, RecipeTweakingCore, SuperMassiveTech, ttCore, ...
http://mc.lunatri.us/files/ Config Patcher, DynIMC, Extension Fixer, InGame Info XML, InGame Mod Configs, Laser, Level, LunatriusCore, Monster Spawner Highlighter, Profiles, Schematica, SchematicaPlugin, Stackie, Tracer
https://minecraft.curseforge.com/api/maven/ Any CurseForge file
http://minetweaker3.powerofbytes.com/download/ MineTweaker3
https://mobiusstrip.eu/maven AdminCommandsToolbox, JABBA, MobiusCore, Netty-Opis, Opis, WAILA, ...
https://modmaven.dev/ AccountSync, AddictedToRed, AI Improvements, Announcement Mod, Armory, Armory Gem Items, AssemblyLine, Atomic Science, Bagable Plants, Basic Industry, boilerplate, BoneTorch, cardboardboxes, ChickenChunks, CodeChickenCore, CodeChickenLib, Colored Chests, Colored Pots, Come Closer, Controlling, Corruption, Ender Storage, Forge Multipart, GasCan, GrapplingHook, HelmBucket, ICBM, ICBM Classic, ICBM Classic Sentry, IguanaTinkerTweaks, IguanaTweaks, Magic Mirror, MC Profiler, MFFS, MilitaryBaseDecour, MinecraftJUnit, moarcarts, NotEnoughItems, NVFix, ProgressWorldCleanup, RedCow, Sentry AA, SkyIslandGenerator, steamcraft2, Translocator, VE Fluid Handling, Voltz Engine, Voltz Engine Essentials, Wooden Bucket, Wooden Rails, Wooden Shears, WR-CBE, ...
https://mvn.falsepattern.com/releases GasStation, LightingOverhaul, MixinExtras, AnimFix, CartLoad, CrashGuard, DynamicRendering, EndlessIDs, FalsePatternLib, FalseTweaks, JarLoader, LagGogglesLegacy, SSMLegacy, Triangulator, GalactiCraft-Core, GalactiCraft-Planets, MicdoodleCore, Biome Wand, Space Core, CoroUtil, EnhancedBiomes, Tropicraft, ...
https://purpleposeidon.github.io/fz_archive/ Factorization
https://repo.spongepowered.org/maven/ Mixin, ...
https://www.cursemaven.com Any CurseForge file
https://www.mod-buildcraft.com/releases/BuildCraft/ Buildcraft, BuildCraft Compat
https://www.ryanliptak.com/maven/ AppleCore

Resources

Not every wiki/tutorial/article/... listed here contains information about Minecraft version 1.7.10 but some topics haven't changed much and often the general methodology is the same. The newer the version, the less comparable the inner workings of Minecraft/Forge are to 1.7.10.

You can look at the source-code of most mods included in GTNH here.

If you look for something specific, use the search-function of your browser!

You can find an extensive list of modding resources, made by the MMD-Team, here.

Tutorials / Blogs

Name Version(s) Topics (including, but often not limited to)
MMD Modding-Resources Various Blocks, Commands, Entities, Fluids, Items, Rendering, ...
Jabelar's Minecraft Forge Modding Tutorials Various Getting Started, Concepts, Registries, Entities, Blocks, Items, Armor, Weapons, Tools, Fluids, Tanks, Recipes, Ore Dictionary, Loot, Tile Entities, Networking, Events, Models, Animations, Rendering, Assets, Enchantments, GUIs, Keybindings & Mouse, Achievements / Advancements, Configs, World Generation, Creative Tabs, Particles, Sounds, Commands, IMC / Compat, ...
#knowledgebase (Minecraft Pack Development Discord) All Various bits of information on Mod(pack) Development
#resources (Blockbench Discord) All Modeling, Textures, Animation
Mixin-Cheatsheet All Cheatsheet for mixins
Mapping and Modding Tutorials on Minecraft Forum All? Various Topics
Old Forge Wiki Tutorials 1.3 - 1.7 Gettings Started, Concepts, Blocks, Items, Recipes, Events, Ore Generation, Tile Entities, Commands, Rendering, Configs, Models, Biome Dictionary, Ore Dictionary, Achievements, Sounds, GUIs, Networking, NBT, Containers, Entities, Multiblocks, Fluids, Scala, ...
Wuppy's Tutorials 1.3 - 1.8 Gettings Started, Recipes, Loot, Assets, Blocks, Items, Tools, Rendering, World Generation, Crops, Entities, Dimensions, ...
Vswe's Summer Courses 1.6.2 Java Basics, Getting Started, Items, Blocks, Tile Entities, Entities, World Gen, Sounds, Particles, Models, Textures, Animations
The Grey Ghost's Minecraft By Example [Blog|GitHub] 1.6 - 1.16 Concepts, Blocks, Items, Rendering, User Input, Packets, Entities, GUIs, Containers, Tools, Redstone, ...
EMX Tutorials 1.7 Getting Started, Items, Blocks, Recipes, Keybindings, Textures, Drops, GUIs, NBT, Models, Containers, ...
coolAlias' Forge Tutorials 1.7 Armor, Villager Trades, Inventories, Events, Rendering, ...
Vike's ASM Tutorial [Part 1|Part 2] 1.7 ASM
Bedrock Miner's Tutorials 1.7, 1.8 Getting started, Concepts, Blocks, Items, Tools, Armor, Food, Recipes, ...
TheXFactor117's Forge Modding Tutorials 1.7, 1.8 Getting Started, Items, Blocks, Armor, Tools, Ore Generation, NBT, Tile Entities, Assets, Creative Tabs, Recipes, Entities, ...
Darkhax' Tutorials 1.8 - 1.12 Custom Entity Data, Loot Tables, Events, Structure Generation, Update Checker, IMC, Jar Signing, Access Transformers, Rendering, CraftTweaker Support, Mixin
McJty's Tutorials 1.9+ Getting Started, Concepts, Configs, Blocks, Items, Tile Entities, Recipes, GUIs, Inventories, Entities, Rendering, Networking, Commands, Dimensions, WAILA Integration, ...
ShadowFacts' Tutorials 1.10 - 1.12 Getting Started, Concepts, Items, Models, Blocks, Blockstates, Assets, Crops, Creative Tabs, Recipes, Ore Dictionary, Food, Tools, Armor, World Generation, Tile Entities, Inventories, GUIs, Rendering, ...
suppergerrie2's Tutorials 1.12 - 1.15 Getting Started, Items, Blocks, Recipes, Ore Generation, Food, Creative Tabs, Tools, Slabs, Enchantments, Crops, Block States, Events, ...
Cubic Interpolation - Helpful Things for Making Mods with Forge for Minecraft 1.15 1.15 Events, Registries, Tile Entities, Dimensions, Loot, Data Generators, Configs, NBT, ...
Forge Community Wiki LTS, Latest Getting Started, Concepts, Blocks, Items, Tile Entities, Events, Resources, Data, Models, Networking, Potions, Particles, Sound, Events, Loot, Key Bindings, Access Transformers, ...
Java Docs Tutorials Not Minecraft specific Java
Red Blob Games Not Minecraft specific Path Finding, Graph Theory, Map Generation, Procedural Generation
0 FPS Not Minecraft specific Collision Detection, Geometry, Mathematics, Voxels, Shape Modeling, Ambient Occlusion, ...
Lazy Foo OpenGL tutorials Not Minecraft specific OpenGL tutorial for beginners, Computer Graphics

Wikis / Docs

Name Topics
CraftTweaker Docs CraftTweaker
Gradle User Manual Gradle
Minecraft Forge Event List Vanilla and Forge Events (MC 1.12+)
Fabric Wiki - Introduction to Mixins Mixins
FTB Wiki [Official|Unofficial] Information on many Mods
Git Docs Git
Data Driven Shaders by Ladysnake MC 1.7+ Post Process Shaders
Mixin Extras Wiki Mixin Extras
Mixin Wiki Mixins
Official Forge Docs [Latest|Legacy] Forge
OpenGL Wiki OpenGL
MineTweaker 3 Wiki MineTweaker 3
ForgeJavaDocs Javadocs for MC, Forge and FML
VisualVM Docs VisualVM
wiki.vg Protocols, Authentification, NBT, etc.
Wikipedia More than you can think of (but not everything)
docs.gl quick reference A nice viewer for OpenGL reference documentation, choose the OpenGL 2.1 version

Help

Using DCEVM

For better hot-reload support in intellij you can use DCEVM. Instructions for linux:

  • Unpack Trava JDK 8 DCEVM on your machine.
  • Go into the unpacked JVM. In jre/lib/amd64/server, make a copy of libjvm.so called libjvm.so.backup. After that, copy the entire server folder and name it client. This tricks the IntelliJ plugin into thinking that the DCEVM install is valid as installed by the old 2018 installer.
  • Install HotSwapAgent plugin in IntelliJ.
  • Add the DCEVM JDK as an SDK in IntelliJ, it should autodetect most stuff but I had to manually copy over the javadoc path from my other java8 JDK.
  • Set DCEVM JDK as default for the project and Gradle.
  • Set the non-DCE JDK in Build, Exec & Deployment -> Compiler -> Scala Compiler -> Scala Compile Server.
  • In Build tools -> Gradle, set both build-and-run and run tests to using IntelliJ IDEA instead of Gradle.
  • In Tools -> HotSwapAgent, enable it for all configurations, and set the agent path to dcevm8u282b08/lib/hotswap/hotswap-agent.jar in your DCEVM installation.
  • Make sure to use the Minecraft Client/Server IntelliJ configurations with the square frame icons instead of the runClient/etc. configurations with Gradle icons.
  • Debugging that config should show up loading the hot swap agent at the beginning of the logs.
  • If you have custom JVM args in the configs, make sure to remove all garbage-collection options as DCEVM works only with the default garbage collector.

Dependency types

The following table shows if a source dependency - later called the Source - you included in Your Mod is visible to Your Mod and the mods that depend on Your Mod. For instance, implementation makes the Source visible to Your Mod at compile and runtime, but only at runtime to the Dependent mods, meaning that the Dependent mods are not able to use a class from Your Mod if it implements an interface from the Source.

Your mod Dependent mod
compile runtime compile runtime
api Yes Yes Yes Yes
implementation Yes Yes No Yes
compileOnly Yes No No No
compileOnlyApi Yes No Yes No
runtimeOnlyNonPublishable No Yes No No
devOnlyNonPublishable Yes Yes No No
runtimeOnly No Yes No Yes
compile Deprecated. Use api or implementation

You can also read document on ExampleMod repository for details.

Mixins

Useful Options

  • -Dmixin.debug=true # Enable Mixin Debug
  • -Dmixin.debug.verbose=true # Verbose Debug Messages
  • -Dmixin.debug.export=true # Export classes after mixins have been applied. If you include fernflower in your classpath, or copy org.jetbrains.fernflower into your mixin jar the exported classes will be decompiled
  • -Dmixin.debug.countInjections=true # Throw an error if the injection count doesn't match expectations
  • -Dlegacy.debugClassLoading=true # Class Load Debugging
  • -Dlegacy.debugClassLoading=true -Dlegacy.debugClassLoadingFiner=true -Dlegacy.debugClassLoadingSave=true # Dump classes to `.minecraft/CLASSLOADER_TEMP`

Remote debugging

  • -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 to wait for a debugger to be attached to the game before running code, put this in launcher args to debug the full pack
  • In IntelliJ, use Run->Attach to process to attach the debugger to the running instance.