commit 16c24ce795a3afc2faadbba278bf804e151a9ffd Author: HypherionMC Date: Thu May 12 00:18:53 2022 +0200 Initial Setup and Classes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..20fc528 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +* text eol=lf +*.bat text eol=crlf +*.patch text eol=lf +*.java text eol=lf +*.gradle text eol=crlf +*.png binary +*.gif binary +*.exe binary +*.dll binary +*.jar binary +*.lzma binary +*.zip binary +*.pyd binary +*.cfg text eol=lf +*.jks binary \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..07115cd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Common/build.gradle b/Common/build.gradle new file mode 100644 index 0000000..1250ce6 --- /dev/null +++ b/Common/build.gradle @@ -0,0 +1,52 @@ +plugins { + id 'java' + id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' + id 'maven-publish' +} + +archivesBaseName = "${mod_name}-common-${minecraft_version}" + +minecraft { + version(minecraft_version) + runs { + if (project.hasProperty('common_runs_enabled') ? project.findProperty('common_runs_enabled').toBoolean() : true) { + + server(project.hasProperty('common_server_run_name') ? project.findProperty('common_server_run_name') : 'vanilla_server') { + workingDirectory(this.file("run")) + } + client(project.hasProperty('common_client_run_name') ? project.findProperty('common_client_run_name') : 'vanilla_client') { + workingDirectory(this.file("run")) + } + } + } +} + +dependencies { + compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' +} + +processResources { + + def buildProps = project.properties.clone() + + filesMatching(['pack.mcmeta']) { + + expand buildProps + } +} +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + from components.java + } + } + + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} \ No newline at end of file diff --git a/Common/src/main/java/me/hypherionmc/craterlib/Constants.java b/Common/src/main/java/me/hypherionmc/craterlib/Constants.java new file mode 100644 index 0000000..c80bfa9 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/Constants.java @@ -0,0 +1,10 @@ +package com.example.examplemod; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class Constants { + public static final String MOD_ID = "craterlib"; + public static final String MOD_NAME = "CraterLib"; + public static final Logger LOG = LogManager.getLogger(MOD_NAME); +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/ISidedTickable.java b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/ISidedTickable.java new file mode 100644 index 0000000..40adcac --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/ISidedTickable.java @@ -0,0 +1,13 @@ +package me.hypherionmc.craterlib.api; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public interface ISidedTickable { + + public void serverTick(Level level, BlockPos pos, BlockState state, BlockEntity blockEntity); + public void clientTick(Level level, BlockPos pos, BlockState state, BlockEntity blockEntity); + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/ITickable.java b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/ITickable.java new file mode 100644 index 0000000..df4a5e5 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/ITickable.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.api.blockentities;public interface ITickable { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/CustomRenderType.java b/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/CustomRenderType.java new file mode 100644 index 0000000..f59d4ea --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/CustomRenderType.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.api.rendering;public interface CustomRenderType { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/DyableBlock.java b/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/DyableBlock.java new file mode 100644 index 0000000..e3cd5e2 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/DyableBlock.java @@ -0,0 +1,12 @@ +package me.hypherionmc.craterlib.api.rendering; + +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.world.item.DyeColor; + +public interface DyeAble { + + BlockColors dyeHandler(); + + DyeColor defaultDyeColor(); + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/ItemDyable.java b/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/ItemDyable.java new file mode 100644 index 0000000..d846a54 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/rendering/ItemDyable.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.api.rendering;public interface ItemDyable { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/client/gui/widgets/TimeSliderWidget.java b/Common/src/main/java/me/hypherionmc/craterlib/client/gui/widgets/TimeSliderWidget.java new file mode 100644 index 0000000..e4ec2bc --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/client/gui/widgets/TimeSliderWidget.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.client.gui.widgets;public class TimeSliderWidget { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/client/rendering/ItemColorHandler.java b/Common/src/main/java/me/hypherionmc/craterlib/client/rendering/ItemColorHandler.java new file mode 100644 index 0000000..5738822 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/client/rendering/ItemColorHandler.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.client.rendering;public class ItemColorHandler { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/common/item/BlockItemDyable.java b/Common/src/main/java/me/hypherionmc/craterlib/common/item/BlockItemDyable.java new file mode 100644 index 0000000..77b07c2 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/common/item/BlockItemDyable.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.common.item;public class BlockItemDyable { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/common/item/DyableWaterBottle.java b/Common/src/main/java/me/hypherionmc/craterlib/common/item/DyableWaterBottle.java new file mode 100644 index 0000000..b3e1a9b --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/common/item/DyableWaterBottle.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.common.item;public class DyableWaterBottle { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/common/item/DyableWaterBucket.java b/Common/src/main/java/me/hypherionmc/craterlib/common/item/DyableWaterBucket.java new file mode 100644 index 0000000..ed2dab4 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/common/item/DyableWaterBucket.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.common.item;public class DyableWaterBucker { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java b/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java new file mode 100644 index 0000000..738a418 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/platform/Services.java @@ -0,0 +1,20 @@ +package com.example.examplemod.platform; + +import com.example.examplemod.Constants; +import com.example.examplemod.platform.services.IPlatformHelper; + +import java.util.ServiceLoader; + +public class Services { + + public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class); + + public static T load(Class clazz) { + + final T loadedService = ServiceLoader.load(clazz) + .findFirst() + .orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); + Constants.LOG.debug("Loaded {} for service {}", loadedService, clazz); + return loadedService; + } +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/platform/services/IPlatformHelper.java b/Common/src/main/java/me/hypherionmc/craterlib/platform/services/IPlatformHelper.java new file mode 100644 index 0000000..21e3452 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/platform/services/IPlatformHelper.java @@ -0,0 +1,26 @@ +package com.example.examplemod.platform.services; + +public interface IPlatformHelper { + + /** + * Gets the name of the current platform + * + * @return The name of the current platform. + */ + String getPlatformName(); + + /** + * Checks if a mod with the given id is loaded. + * + * @param modId The mod to check if it is loaded. + * @return True if the mod is loaded, false otherwise. + */ + boolean isModLoaded(String modId); + + /** + * Check if the game is currently in a development environment. + * + * @return True if in a development environment, false otherwise. + */ + boolean isDevelopmentEnvironment(); +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/systems/energy/CustomEnergyStorage.java b/Common/src/main/java/me/hypherionmc/craterlib/systems/energy/CustomEnergyStorage.java new file mode 100644 index 0000000..1944313 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/systems/energy/CustomEnergyStorage.java @@ -0,0 +1,91 @@ +package me.hypherionmc.craterlib.systems; + +import net.minecraft.nbt.CompoundTag; + +/*** + * Loosely based on the Forge Energy System + */ +public class CustomEnergyStorage { + + protected int powerLevel; + protected int powerCapacity; + protected int maxInput; + protected int maxOutput; + + public CustomEnergyStorage(int capacity) { + this(capacity, capacity, capacity, 0); + } + + public CustomEnergyStorage(int powerCapacity, int maxTransfer) { + this(powerCapacity, maxTransfer, maxTransfer, 0); + } + + public CustomEnergyStorage(int powerCapacity, int maxInput, int maxOutput) { + this(powerCapacity, maxInput, maxOutput, 0); + } + + public CustomEnergyStorage(int capacity, int maxInput, int maxOutput, int initialPower) { + this.powerLevel = initialPower; + this.maxInput = maxInput; + this.maxOutput = maxOutput; + this.powerCapacity = capacity; + } + + public CompoundTag writeNBT(CompoundTag compoundTag) { + compoundTag.putInt("powerLevel", this.powerLevel); + return compoundTag; + } + + public void readNBT(CompoundTag compoundTag) { + if (compoundTag.contains("powerLevel")) { + this.powerLevel = compoundTag.getInt("powerLevel"); + } + } + + public int receiveEnergyInternal(int toReceive, boolean test) { + int energyReceived = Math.min(this.powerCapacity - this.powerLevel, Math.min(this.maxInput, toReceive)); + if (!test) + this.powerLevel += energyReceived; + return energyReceived; + } + + public int receiveEnergy(int toReceive, boolean test) { + if (this.maxInput < 1) { + return 0; + } + return this.receiveEnergyInternal(toReceive, test); + } + + public int extractEnergyInternal(int toExtract, boolean test) { + int energyExtracted = Math.min(this.powerLevel, Math.min(this.powerCapacity, toExtract)); + if (!test) + this.powerLevel -= energyExtracted; + return energyExtracted; + } + + public int extractEnergy(int toExtract, boolean test) { + if (this.maxOutput < 1) { + return 0; + } + int energyExtracted = Math.min(this.powerLevel, Math.min(this.maxOutput, toExtract)); + if (!test) + this.powerLevel -= energyExtracted; + return energyExtracted; + } + + public int getPowerLevel() { + return powerLevel; + } + + public int getMaxInput() { + return maxInput; + } + + public int getMaxOutput() { + return maxOutput; + } + + public int getPowerCapacity() { + return powerCapacity; + } +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/util/BlockStateUtils.java b/Common/src/main/java/me/hypherionmc/craterlib/util/BlockStateUtils.java new file mode 100644 index 0000000..c5d4139 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/util/BlockStateUtils.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.util;public class BlockStateUtils { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/util/LangUtils.java b/Common/src/main/java/me/hypherionmc/craterlib/util/LangUtils.java new file mode 100644 index 0000000..c40e610 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/util/LangUtils.java @@ -0,0 +1,26 @@ +package me.hypherionmc.hyperlighting.utils; + +import net.minecraft.text.BaseText; +import net.minecraft.text.LiteralText; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Formatting; + +public class LangUtils { + + public static BaseText getTooltipTitle(String key) { + return new LiteralText(Formatting.YELLOW + new TranslatableText(key).getString()); + } + + public static String resolveTranslation(String key) { + return new TranslatableText(key).getString(); + } + + public static BaseText getTranslation(String key) { + return new TranslatableText(key); + } + + public static BaseText makeComponent(String text) { + return new LiteralText(text); + } + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/util/MathUtils.java b/Common/src/main/java/me/hypherionmc/craterlib/util/MathUtils.java new file mode 100644 index 0000000..ece0439 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/util/MathUtils.java @@ -0,0 +1,21 @@ +package me.hypherionmc.hyperlighting.utils; + +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; + +public class MathUtils { + + public static VoxelShape rotateShape(Direction from, Direction to, VoxelShape shape) { + VoxelShape[] buffer = new VoxelShape[]{ shape, VoxelShapes.empty() }; + + int times = (to.ordinal() - from.ordinal() + 4) % 4; + for (int i = 0; i < times; i++) { + buffer[0].forEachBox((minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = VoxelShapes.union(buffer[1], VoxelShapes.cuboid(1-maxZ, minY, minX, 1-minZ, maxY, maxX))); + buffer[0] = buffer[1]; + buffer[1] = VoxelShapes.empty(); + } + return buffer[0]; + } + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/util/OptifineUtils.java b/Common/src/main/java/me/hypherionmc/craterlib/util/OptifineUtils.java new file mode 100644 index 0000000..6c0cc62 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/util/OptifineUtils.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.util;public class OptifineUtils { +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/util/RenderUtils.java b/Common/src/main/java/me/hypherionmc/craterlib/util/RenderUtils.java new file mode 100644 index 0000000..1f5f771 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/util/RenderUtils.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.util;public class RenderUtils { +} diff --git a/Common/src/main/resources/craterlib.mixins.json b/Common/src/main/resources/craterlib.mixins.json new file mode 100644 index 0000000..d9b16ba --- /dev/null +++ b/Common/src/main/resources/craterlib.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.example.examplemod.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + "ExampleCommonMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "${refmap_target}refmap.json" +} \ No newline at end of file diff --git a/Common/src/main/resources/pack.mcmeta b/Common/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..52854ec --- /dev/null +++ b/Common/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "${mod_name}", + "pack_format": 8 + } +} \ No newline at end of file diff --git a/Fabric/build.gradle b/Fabric/build.gradle new file mode 100644 index 0000000..170f715 --- /dev/null +++ b/Fabric/build.gradle @@ -0,0 +1,73 @@ +plugins { + id 'fabric-loom' version '0.10-SNAPSHOT' + id 'maven-publish' + id 'idea' +} + +archivesBaseName = "${mod_name}-fabric-${minecraft_version}" + +dependencies { + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings loom.officialMojangMappings() + modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" + implementation project(":Common") +} + +loom { + runs { + client { + client() + setConfigName("Fabric Client") + ideConfigGenerated(true) + runDir("run") + } + server { + server() + setConfigName("Fabric Server") + ideConfigGenerated(true) + runDir("run") + } + } +} + + +processResources { + from project(":Common").sourceSets.main.resources + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } + + filesMatching('*.mixins.json') { + expand "refmap_target": "${archivesBaseName}-" + } +} + +tasks.withType(JavaCompile) { + source(project(":Common").sourceSets.main.allSource) +} + +jar { + from("LICENSE") { + rename { "${it}_${mod_name}" } + } +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + from components.java + } + } + + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/CraterLibInitializer.java b/Fabric/src/main/java/me/hypherionmc/craterlib/CraterLibInitializer.java new file mode 100644 index 0000000..9280593 --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/CraterLibInitializer.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib;public class CraterLibInitializer { +} diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/client/CraterLibClientInitializer.java b/Fabric/src/main/java/me/hypherionmc/craterlib/client/CraterLibClientInitializer.java new file mode 100644 index 0000000..2f0c541 --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/client/CraterLibClientInitializer.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.client;public class CraterLibClientInitializer { +} diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/client/gui/widgets/FluidStackWidget.java b/Fabric/src/main/java/me/hypherionmc/craterlib/client/gui/widgets/FluidStackWidget.java new file mode 100644 index 0000000..84684bb --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/client/gui/widgets/FluidStackWidget.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.client.gui.widgets;public class FluidStackWidget { +} diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/systems/fluid/FluidTank.java b/Fabric/src/main/java/me/hypherionmc/craterlib/systems/fluid/FluidTank.java new file mode 100644 index 0000000..5f58ac2 --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/systems/fluid/FluidTank.java @@ -0,0 +1,100 @@ +package me.hypherionmc.hyperlighting.api.fluid; + +import me.hypherionmc.hyperlighting.utils.ModUtils; +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; +import net.fabricmc.fabric.api.transfer.v1.storage.Storage; +import net.fabricmc.fabric.api.transfer.v1.storage.StoragePreconditions; +import net.fabricmc.fabric.api.transfer.v1.storage.StorageView; +import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleViewIterator; +import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; +import net.minecraft.nbt.NbtCompound; + +import java.util.Iterator; +import java.util.function.Predicate; + +public class FluidStorageTank implements Storage, StorageView { + + private final long capacity; + private final Predicate validFluid; + private long level = 0; + private FluidVariant fluid = FluidVariant.blank(); + + public FluidStorageTank(long capacity) { + this(capacity, e -> true); + } + + public FluidStorageTank(long capacity, Predicate validFluid) { + this.capacity = capacity; + this.validFluid = validFluid; + } + + public boolean isFluidValid(FluidVariant variant) { + return validFluid.test(variant); + } + + @Override + public long insert(FluidVariant resource, long maxAmount, TransactionContext transaction) { + StoragePreconditions.notBlankNotNegative(resource, maxAmount); + if (this.fluid.isBlank() || this.fluid.equals(resource)) { + long inserted = Math.min(maxAmount, capacity - level); + if (inserted > 0) { + level += inserted; + this.fluid = resource; + } + return inserted; + } + return 0; + } + + @Override + public long extract(FluidVariant resource, long maxAmount, TransactionContext transaction) { + StoragePreconditions.notBlankNotNegative(resource, maxAmount); + if (resource.equals(fluid)) { + long extracted = Math.min(maxAmount, level); + if (extracted > 0) { + level -= extracted; + if (level == 0) { + this.fluid = FluidVariant.blank(); + } + } + return extracted; + } + return 0; + } + + @Override + public boolean isResourceBlank() { + return fluid.isBlank(); + } + + @Override + public FluidVariant getResource() { + return fluid; + } + + @Override + public long getAmount() { + return level; + } + + @Override + public long getCapacity() { + return capacity; + } + + @Override + public Iterator> iterator(TransactionContext transaction) { + return SingleViewIterator.create(this, transaction); + } + + public NbtCompound writeNbt(NbtCompound compound) { + ModUtils.putFluid(compound, "fluid", getResource()); + compound.putLong("amt", level); + return compound; + } + + public void readNbt(NbtCompound nbtCompound) { + fluid = ModUtils.getFluidCompatible(nbtCompound, "fluid"); + level = nbtCompound.getLong("amt"); + } +} diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/systems/fluid/FluidUtils.java b/Fabric/src/main/java/me/hypherionmc/craterlib/systems/fluid/FluidUtils.java new file mode 100644 index 0000000..0928d2d --- /dev/null +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/systems/fluid/FluidUtils.java @@ -0,0 +1,2 @@ +package me.hypherionmc.craterlib.systems.fluid;public class FluidUtils { +} diff --git a/Fabric/src/main/resources/craterlib.fabric.mixins.json b/Fabric/src/main/resources/craterlib.fabric.mixins.json new file mode 100644 index 0000000..21525e9 --- /dev/null +++ b/Fabric/src/main/resources/craterlib.fabric.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.example.examplemod.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + "ExampleFabricMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} + \ No newline at end of file diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..f0d8a86 --- /dev/null +++ b/Fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,40 @@ +{ + "schemaVersion": 1, + "id": "modid", + "version": "${version}", + + "name": "Example Mod", + "description": "This is an example description! Tell everyone what your mod is about!", + "authors": [ + "Me!" + ], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + + "license": "CC0-1.0", + "icon": "assets/modid/icon.png", + + "environment": "*", + "entrypoints": { + "main": [ + "com.example.examplemod.ExampleMod" + ] + }, + "mixins": [ + "multiloader.mixins.json", + "multiloader.fabric.mixins.json" + ], + + "depends": { + "fabricloader": ">=0.12", + "fabric": "*", + "minecraft": "1.18.x", + "java": ">=17" + }, + "suggests": { + "another-mod": "*" + } + } + \ No newline at end of file diff --git a/Forge/build.gradle b/Forge/build.gradle new file mode 100644 index 0000000..05a3e94 --- /dev/null +++ b/Forge/build.gradle @@ -0,0 +1,117 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' + } +} +apply plugin: 'java' +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'eclipse' +apply plugin: 'org.spongepowered.mixin' +apply plugin: 'maven-publish' + +archivesBaseName = "${mod_name}-forge-${minecraft_version}" + +mixin { + add sourceSets.main, "${mod_id}.refmap.json" + + config "${mod_id}.mixins.json" + config "${mod_id}.forge.mixins.json" +} + +minecraft { + mappings channel: 'official', version: minecraft_version + + if (project.hasProperty('forge_ats_enabled') && project.findProperty('forge_ats_enabled').toBoolean()) { + // This location is hardcoded in Forge and can not be changed. + // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + project.logger.debug('Forge Access Transformers are enabled for this project.') + } + + runs { + client { + workingDirectory project.file('run') + ideaModule "${rootProject.name}.${project.name}.main" + taskName 'Client' + args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" + mods { + modClientRun { + source sourceSets.main + source project(":Common").sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + ideaModule "${rootProject.name}.${project.name}.main" + taskName 'Server' + args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" + mods { + modServerRun { + source sourceSets.main + source project(":Common").sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + ideaModule "${rootProject.name}.${project.name}.main" + args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + taskName 'Data' + args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" + mods { + modDataRun { + source sourceSets.main + source project(":Common").sourceSets.main + } + } + } + } +} + +sourceSets.main.resources.srcDir 'src/generated/resources' + +dependencies { + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + compileOnly project(":Common") + annotationProcessor 'org.spongepowered:mixin:0.8.4-SNAPSHOT:processor' +} + +tasks.withType(JavaCompile) { + source(project(":Common").sourceSets.main.allSource) +} + +processResources { + from project(":Common").sourceSets.main.resources + + filesMatching('*.mixins.json') { + expand "refmap_target": "${mod_id}." + } +} + + +jar.finalizedBy('reobfJar') + +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + artifact jar + } + } + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/CraterLib.java b/Forge/src/main/java/me/hypherionmc/craterlib/CraterLib.java new file mode 100644 index 0000000..f3ed7be --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/craterlib/CraterLib.java @@ -0,0 +1,34 @@ +package com.example.examplemod; + +import me.hypherionmc.craterlib.Constants; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod(Constants.MOD_ID) +public class ExampleMod { + + public ExampleMod() { + + // This method is invoked by the Forge mod loader when it is ready + // to load your mod. You can access Forge and Common code in this + // project. + + // Use Forge to bootstrap the Common mod. + Constants.LOG.info("Hello Forge world!"); + CommonClass.init(); + + // Some code like events require special initialization from the + // loader specific code. + MinecraftForge.EVENT_BUS.addListener(this::onItemTooltip); + + } + + // This method exists as a wrapper for the code in the Common project. + // It takes Forge's event object and passes the parameters along to + // the Common listener. + private void onItemTooltip(ItemTooltipEvent event) { + + CommonClass.onItemTooltip(event.getItemStack(), event.getFlags(), event.getToolTip()); + } +} diff --git a/Forge/src/main/resources/META-INF/mods.toml b/Forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..d000fe9 --- /dev/null +++ b/Forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,62 @@ +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader="javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the forge version +loaderVersion="[38,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license="All rights reserved" +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="multiloader" #mandatory +# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it +# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata +# see the associated build.gradle script for how to populate this completely automatically during a build +version="${file.jarVersion}" #mandatory + # A display name for the mod +displayName="Example Mod" #mandatory +# A URL to query for updates for this mod. See the JSON update specification https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/ +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +logoFile="multiloader.png" #optional +# A text field displayed in the mod UI +credits="Thanks for this example mod goes to Java" #optional +# A text field displayed in the mod UI +authors="Love, Cheese and small house plants" #optional +# The description text for the mod (multi line!) (#mandatory) +description=''' +This is a long form description of the mod. You can write whatever you want here + +Have some lorem ipsum. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.multiloader]] #optional + # the modid of the dependency + modId="forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory=true #mandatory + # The version range of the dependency + versionRange="[38,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side="BOTH" +# Here's another dependency +[[dependencies.multiloader]] + modId="minecraft" + mandatory=true +# This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange="[1.18,1.19)" + ordering="NONE" + side="BOTH" diff --git a/Forge/src/main/resources/craterlib.forge.mixins.json b/Forge/src/main/resources/craterlib.forge.mixins.json new file mode 100644 index 0000000..5964133 --- /dev/null +++ b/Forge/src/main/resources/craterlib.forge.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.example.examplemod.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + "ExampleForgeMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "${refmap_target}refmap.json" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/README.md b/README.md new file mode 100644 index 0000000..11af880 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# MultiLoader Template + +This project provides a Gradle project template that can compile mods for both Forge and Fabric using a common sourceset. This project does not require any third party libraries or dependencies. + +## Getting Started + +## IntelliJ IDEA +This guide will show how to import the MultiLoader Template into IntelliJ IDEA. The setup process is roughly equivalent to setting up Forge and Fabric independently and should be very familiar to anyone who has worked with their MDKs. + +1. Clone or download this repository to your computer. +2. Configure the project by editing the `group`, `mod_name`, `mod_author`, and `mod_id` properties in the `gradle.properties` file. You will also need to change the `rootProject.name` property in `settings.gradle`. +3. Open the template's root folder as a new project in IDEA. This is the folder that contains this README file and the gradlew executable. +4. If your default JVM/JDK is not Java 16 you will encounter an error when opening the project. This error is fixed by going to `File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JVM`and changing the value to a valid Java 16 JVM. You will also need to set the Project SDK to Java 16. This can be done by going to `File > Project Structure > Project SDK`. Once both have been set open the Gradle tab in IDEA and click the refresh button to reload the project. +5. Open the Gradle tab in IDEA if it has not already been opened. Navigate to `Your Project > Common > Tasks > vanilla gradle > decompile`. Run this task to decompile Minecraft. +6. Open the Gradle tab in IDEA if it has not already been opened. Navigate to `Your Project > Forge > Tasks > forgegradle runs > genIntellijRuns`. Run this task to set up run configurations for Forge. +7. Open your Run/Debug Configurations. Under the Application category there should now be options to run Forge and Fabric projects. Select one of the client options and try to run it. +8. Assuming you were able to run the game in step 7 your workspace should now be set up. + +### Eclipse +While it is possible to use this template in Eclipse it is not recommended. During the development of this template multiple critical bugs and quirks related to Eclipse were found at nearly every level of the required build tools. While we continue to work with these tools to report and resolve issues support for projects like these are not there yet. For now Eclipse is considered unsupported by this project. The development cycle for build tools is notoriously slow so there are no ETAs available. + +## Development Guide +When using this template the majority of your mod is developed in the Common project. The Common project is compiled against the vanilla game and is used to hold code that is shared between the different loader-specific versions of your mod. The Common project has no knwoledge or access to ModLoader specific code, apis, or concepts. Code that requires something from a specific loader must be done through the project that is specific to that loader, such as the Forge or Fabric project. + +Loader specific projects such as the Forge and Fabric project are used to load the Common project into the game. These projects also define code that is specific to that loader. Loader specific projects can access all of the code in the Common project. It is important to remember that the Common project can not access code from loader specific projects. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c15265c --- /dev/null +++ b/build.gradle @@ -0,0 +1,55 @@ +subprojects { + + apply plugin: 'java' + + java.toolchain.languageVersion = JavaLanguageVersion.of(17) + java.withSourcesJar() + java.withJavadocJar() + + jar { + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_author, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version' : project.jar.archiveVersion, + 'Implementation-Vendor' : mod_author, + 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + 'Timestampe' : System.currentTimeMillis(), + 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", + 'Build-On-Minecraft' : minecraft_version + ]) + } + } + + repositories { + + mavenCentral() + + maven { + name = 'Sponge / Mixin' + url = 'https://repo.spongepowered.org/repository/maven-public/' + } + + maven { + name = 'BlameJared Maven (CrT / Bookshelf)' + url = 'https://maven.blamejared.com' + } + } + + + tasks.withType(JavaCompile).configureEach { + + it.options.encoding = 'UTF-8' + it.options.release = 17 + } + + // Disables Gradle's custom module metadata from being published to maven. The + // metadata includes mapped dependencies which are not reasonably consumable by + // other mod developers. + tasks.withType(GenerateModuleMetadata) { + + enabled = false + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..0e8f5fd --- /dev/null +++ b/gradle.properties @@ -0,0 +1,27 @@ +# Project +version=1.0.0 +group=com.example.examplemod + +# Common +minecraft_version=1.18.1 +common_runs_enabled=false +common_client_run_name=Common Client +common_server_run_name=Common Server + + +# Forge +forge_version=39.0.7 +//forge_ats_enabled=true + +# Fabric +fabric_version=0.44.0+1.18 +fabric_loader_version=0.12.12 + +# Mod options +mod_name=MultiLoader +mod_author=Jared +mod_id=multiloader + +# Gradle +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..7454180 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e750102 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..b4f908a --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +ARGV=("$@") +eval set -- $DEFAULT_JVM_OPTS + +IFS=$' +' read -rd '' -a JAVA_OPTS_ARR <<< "$(echo $JAVA_OPTS | xargs -n1)" +IFS=$' +' read -rd '' -a GRADLE_OPTS_ARR <<< "$(echo $GRADLE_OPTS | xargs -n1)" + +exec "$JAVACMD" "$@" "${JAVA_OPTS_ARR[@]}" "${GRADLE_OPTS_ARR[@]}" "-Dorg.gradle.appname=$APP_BASE_NAME" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "${ARGV[@]}" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..174e944 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + maven { + name = 'Sponge Snapshots' + url = 'https://repo.spongepowered.org/repository/maven-public/' + } + } +} + +rootProject.name = 'MultiLoader' +include("Common", "Fabric", "Forge") \ No newline at end of file