commit 2ec001e8d07cc2d87c67fa840a32e4be8e34d781 Author: Andrew nuark G Date: Thu Jun 3 13:34:56 2021 +0700 Ver. 1.0.0 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c37caf --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Cache of project +.gradletasknamecache + +**/build/ + +# Common working directory +run/ + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..84515d6 --- /dev/null +++ b/build.gradle @@ -0,0 +1,150 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '4.1.+', changing: true + } +} + + +repositories { + maven { url = "https://repo.refinedmods.com" } + maven { + url "https://www.cursemaven.com" + content { + includeGroup "curse.maven" + } + } +} + +apply plugin: 'net.minecraftforge.gradle' + +group = 'xyz.nuark' +version = '1.0.0' +archivesBaseName = 'rdmover' + +java.toolchain.languageVersion = JavaLanguageVersion.of(8) // Mojang ships Java 8 to end users, so your mod should target Java 8. + +minecraft { + // The mappings can be changed at any time, and must be in the following format. + // Channel: Version: + // snapshot YYYYMMDD Snapshot are built nightly. + // stable # Stables are built at the discretion of the MCP team. + // official MCVersion Official field/method names from Mojang mapping files + // + // You must be aware of the Mojang license when using the 'official' mappings. + // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md + // + // Use non-default mappings at your own risk. they may not always work. + // Simply re-run your setup task after changing the mappings to update your workspace. + mappings channel: 'snapshot', version: '20210309-1.16.5' + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + + // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. + runs { + client { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + // The markers can be changed as needed. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + property 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + property 'forge.logging.console.level', 'debug' + + mods { + rdmover { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + // The markers can be changed as needed. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + property 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + property 'forge.logging.console.level', 'debug' + + mods { + rdmover { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + // The markers can be changed as needed. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + property 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + property 'forge.logging.console.level', 'debug' + + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + args '--mod', 'rdmover', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + + mods { + rdmover { + source sourceSets.main + } + } + } + } +} + +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } + +dependencies { + minecraft 'net.minecraftforge:forge:1.16.5-36.1.24' + + def rs_version = "1.9.13+158" + + implementation fg.deobf("com.refinedmods:refinedstorage:$rs_version") + implementation fg.deobf("curse.maven:storage-drawers-223852:3180569") + compileOnly fileTree(dir: 'lib', include: ['*.jar']) + runtimeOnly fileTree(dir: 'lib', include: ['*.jar']) +} + +// Example for how to get properties into the manifest for reading by the runtime.. +jar { + manifest { + attributes([ + "Specification-Title" : "rdmover", + "Specification-Vendor" : "nuark", + "Specification-Version" : "1", // We are version 1 of ourselves + "Implementation-Title" : project.name, + "Implementation-Version" : project.version, + "Implementation-Vendor" : "nuark", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} + +jar.finalizedBy('reobfJar') diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..29b2ac4 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ea018cc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..df8fffe --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'rdmover' diff --git a/src/main/java/xyz/nuark/rdmover/DriveRightClickHandler.java b/src/main/java/xyz/nuark/rdmover/DriveRightClickHandler.java new file mode 100644 index 0000000..481f263 --- /dev/null +++ b/src/main/java/xyz/nuark/rdmover/DriveRightClickHandler.java @@ -0,0 +1,86 @@ +package xyz.nuark.rdmover; + +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; +import com.refinedmods.refinedstorage.api.storage.StorageType; +import com.refinedmods.refinedstorage.api.storage.disk.IStorageDisk; +import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskProvider; +import com.refinedmods.refinedstorage.api.util.Action; +import com.refinedmods.refinedstorage.api.util.IComparer; +import com.refinedmods.refinedstorage.apiimpl.API; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.fml.common.Mod; + +import java.util.Collection; + +@Mod.EventBusSubscriber +public class DriveRightClickHandler { + static final Object lock = new Object(); + + @SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true) + public static void handleDriveRightClick(final PlayerInteractEvent.RightClickBlock event) { + if (event.getSide() != LogicalSide.SERVER) { + return; + } + + ItemStack handIS = event.getItemStack(); + BlockPos blockPos = event.getPos(); + + @SuppressWarnings("rawtypes") + IStorageDisk disk = API.instance().getStorageDiskManager((ServerWorld) event.getWorld()).getByStack(handIS); + if (disk == null) { + return; + } + + + StorageType type = ((IStorageDiskProvider) handIS.getItem()).getType(); + if (type != StorageType.ITEM) { + return; + } + + @SuppressWarnings("unchecked") + IStorageDisk itemDisk = (IStorageDisk) disk; + + Collection stacks = itemDisk.getStacks(); + if (stacks.isEmpty()) { + return; + } + + TileEntity te = event.getWorld().getTileEntity(blockPos); + if (!(te instanceof TileEntityDrawers)) { + return; + } + + + synchronized (lock) { + TileEntityDrawers dte = (TileEntityDrawers) te; + boolean infiniteStorage = dte.getDrawerAttributes().isUnlimitedStorage() || dte.getDrawerAttributes().isVoid(); + for (int i = 0; i < dte.getGroup().getDrawerCount(); i++) { + IDrawer drawer = dte.getGroup().getDrawer(i); + stacks.stream().filter(itemStack -> itemStack.getItem() == drawer.getStoredItemPrototype().getItem()).findFirst().ifPresent(itemStack -> { + int remainingCap = drawer.getRemainingCapacity(); + int stackAmount = itemStack.getCount(); + int extractAmount = infiniteStorage? stackAmount : Math.min(stackAmount, remainingCap); + + ItemStack extSim = itemDisk.extract(itemStack, extractAmount, IComparer.COMPARE_NBT, Action.SIMULATE); + if (extSim.getCount() > 0) { + itemDisk.extract(itemStack, extSim.getCount(), IComparer.COMPARE_NBT, Action.PERFORM); + drawer.setStoredItemCount(drawer.getStoredItemCount() + extSim.getCount()); + + event.getPlayer().sendStatusMessage(new StringTextComponent( + "Put " + extSim.getCount() + " items into drawer" + ), true); + } + }); + } + } + } +} diff --git a/src/main/java/xyz/nuark/rdmover/RDMover.java b/src/main/java/xyz/nuark/rdmover/RDMover.java new file mode 100644 index 0000000..0f31982 --- /dev/null +++ b/src/main/java/xyz/nuark/rdmover/RDMover.java @@ -0,0 +1,15 @@ +package xyz.nuark.rdmover; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Mod("rdmover") +public class RDMover { + private static final Logger LOGGER = LogManager.getLogger(); + + public RDMover() { + MinecraftForge.EVENT_BUS.register(this); + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..3097e37 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,72 @@ +# 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="[36,)" #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="http://my.issue.tracker/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="rdmover" #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="1.0.0" #mandatory +# A display name for the mod +displayName="RDMover" #mandatory +# A URL to query for updates for this mod. See the JSON update specification +#updateJSONURL="http://myurl.me/" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="http://example.com/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="rdmover.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="nuark" #optional +# The description text for the mod (multi line!) (#mandatory) +description=''' +RDMover - easilly move items from RefinedStorage drives to StorageDrawers drawers +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.rdmover]] #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="[36,)" #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.rdmover]] + 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.16.5,1.17)" + ordering="NONE" + side="BOTH" +# Here's another dependency +[[dependencies.rdmover]] + modId="refinedstorage" + mandatory=true + versionRange="[1.9.13,)" + ordering="NONE" + side="BOTH" +# Here's another dependency +[[dependencies.rdmover]] + modId="storagedrawers" + mandatory=true + versionRange="[8.2.2,)" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..de6172e --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "rdmover resources", + "pack_format": 6, + "_comment": "A pack_format of 6 requires json lang files and some texture changes from 1.16.2. Note: we require v6 pack meta for all mods." + } +}