From 973ae4b7735719d8b0e75fc785d5c1a5357447e8 Mon Sep 17 00:00:00 2001 From: alexbegt Date: Mon, 18 Feb 2019 23:49:32 -0500 Subject: [PATCH] Update readme, Update to latest forge. --- README.md | 22 +++++-- build.gradle | 61 +++++++++++------- gradle.properties | 3 +- .../TileEntityIronChestItemRenderer.java | 3 +- .../renderer/TileEntityIronChestRenderer.java | 1 + .../ironchest/common/blocks/BlockChest.java | 6 +- .../common/network/PacketHandler.java | 14 ++-- .../tileentity/TileEntityCrystalChest.java | 18 +----- src/main/resources/META-INF/mods.toml | 7 +- src/main/resources/itemsheet.xcf | Bin 11427 -> 0 bytes src/main/resources/pack.mcmeta | 2 +- src/main/resources/texturesheet.xcf | Bin 21529 -> 0 bytes 12 files changed, 72 insertions(+), 65 deletions(-) delete mode 100644 src/main/resources/itemsheet.xcf delete mode 100644 src/main/resources/texturesheet.xcf diff --git a/README.md b/README.md index 7c2d0e9..6dabc34 100755 --- a/README.md +++ b/README.md @@ -1,10 +1,20 @@ -ironchest -========= +Iron Chests [![Curseforge](http://cf.way2muchnoise.eu/full_iron-chests_downloads.svg)](https://minecraft.curseforge.com/projects/iron-chests) [![Curseforge](http://cf.way2muchnoise.eu/versions/For%20MC_iron-chests_all.svg)](https://minecraft.curseforge.com/projects/iron-chests) +=========== -Iron Chest minecraft mod +Iron Chests! A mod that adds new chests. -a GPL v3 licensed mod by cpw +Please note that the Shulker Boxes in 1.13 have been moved to their own mod: +Github: [Iron Shulker Boxes](https://github.com/progwml6/ironshulkerboxes) +CurseForge: [Iron Shulker Boxes](https://github.com/progwml6/ironshulkerboxes) -Currently Maintained by ProgWML6 +For issues with the Shulker Boxes starting in 1.13, Please report them to [Iron Shulker Boxes](https://github.com/progwml6/ironshulkerboxes) -See http://files.minecraftforge.net/IronChests2/ for downloads +## Setting up a Workspace/Compiling from Source +Note: Git MUST be installed and in the system path to use our scripts. +* Setup: Run [gradle]in the repository root: `gradlew[.bat] [eclipse] OR import build.gradle into idea` +* Build: Run [gradle]in the repository root: `gradlew[.bat] build` +* If obscure Gradle issues are found try running `gradlew clean` and `gradlew cleanCache` + +[![Discord](https://img.shields.io/discord/102860784329052160.svg?style=for-the-badge)](https://discord.gg/njGrvuh) + +If you have queries about any license or the other restrictions, please drop by our IRC channel, #progsmods on irc.esper.net diff --git a/build.gradle b/build.gradle index 839a3a8..8505698 100755 --- a/build.gradle +++ b/build.gradle @@ -30,21 +30,36 @@ minecraft { mappings channel: 'snapshot', version: mappings_version runs { - client = { - // recommended logging data for a userdev environment - properties 'forge.logging.markers': 'SCAN,REGISTRIES,REGISTRYDUMP' - // recommended logging level for the console - properties 'forge.logging.console.level': 'debug' - workingDirectory project.file('run').canonicalPath - source sourceSets.main + client { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + ironchest { + source sourceSets.main + } + } } - server = { - // recommended logging data for a userdev environment - properties 'forge.logging.markers': 'SCAN,REGISTRIES,REGISTRYDUMP' - // recommended logging level for the console - properties 'forge.logging.console.level': 'debug' - workingDirectory project.file('run').canonicalPath - source sourceSets.main + + server { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + ironchest { + source sourceSets.main + } + } } } } @@ -77,7 +92,7 @@ processResources { from(sourceSets.main.resources.srcDirs) { include 'META-INF/mods.toml' - expand 'version': project.version, 'mcversion': minecraft_version + expand 'version': project.version, 'mcversion': minecraft_version, 'forge_version': forge_version_toml } from(sourceSets.main.resources.srcDirs) { @@ -96,13 +111,15 @@ artifacts { jar { manifest { - attributes(["Specification-Title": "Iron Chests", - "Specification-Vendor": "Progwml6", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": "${version}", - "Implementation-Vendor" :"Progwml6", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")],) + attributes([ + "Specification-Title" : "Iron Chests", + "Specification-Vendor" : "Progwml6", + "Specification-Version" : "1", // We are version 1 of ourselves + "Implementation-Title" : project.name, + "Implementation-Version" : "${version}", + "Implementation-Vendor" : "Progwml6", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) } } diff --git a/gradle.properties b/gradle.properties index f8b4440..842bb16 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,9 +11,8 @@ minecraft_version=1.13.2 minecraft_version_toml=13 # Forge Version Information -forge_version=25.0.23 +forge_version=25.0.34 forge_version_toml=25 -forge_group=net.minecraftforge # Mappings Information mappings_version=20190215-1.13.1 diff --git a/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestItemRenderer.java b/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestItemRenderer.java index 24ad8a6..e740fb7 100644 --- a/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestItemRenderer.java +++ b/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestItemRenderer.java @@ -44,8 +44,7 @@ public class TileEntityIronChestItemRenderer extends TileEntityItemStackRenderer private static final TileEntityDirtChest DIRT_CHEST = new TileEntityDirtChest(); - private static final TileEntityIronChest[] CHESTS = { IRON_CHEST, GOLD_CHEST, DIAMOND_CHEST, COPPER_CHEST, SILVER_CHEST, CRYSTAL_CHEST, OBSIDIAN_CHEST, - DIRT_CHEST }; + private static final TileEntityIronChest[] CHESTS = { IRON_CHEST, GOLD_CHEST, DIAMOND_CHEST, COPPER_CHEST, SILVER_CHEST, CRYSTAL_CHEST, OBSIDIAN_CHEST, DIRT_CHEST }; public static TileEntityIronChestItemRenderer instance = new TileEntityIronChestItemRenderer(); diff --git a/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestRenderer.java b/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestRenderer.java index 868a881..3161055 100644 --- a/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestRenderer.java +++ b/src/main/java/com/progwml6/ironchest/client/renderer/TileEntityIronChestRenderer.java @@ -102,6 +102,7 @@ public class TileEntityIronChestRenderer exten GlStateManager.scalef(1.0F, -1.0F, -1.0F); float f = iBlockState.get(BlockChest.FACING).getHorizontalAngle(); + if (Math.abs(f) > 1.0E-5D) { GlStateManager.translatef(0.5F, 0.5F, 0.5F); diff --git a/src/main/java/com/progwml6/ironchest/common/blocks/BlockChest.java b/src/main/java/com/progwml6/ironchest/common/blocks/BlockChest.java index 036acfb..5b09f8f 100644 --- a/src/main/java/com/progwml6/ironchest/common/blocks/BlockChest.java +++ b/src/main/java/com/progwml6/ironchest/common/blocks/BlockChest.java @@ -11,7 +11,6 @@ package com.progwml6.ironchest.common.blocks; import com.progwml6.ironchest.common.tileentity.TileEntityIronChest; -import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.block.BlockHorizontal; import net.minecraft.block.state.BlockFaceShape; @@ -27,7 +26,6 @@ import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; import net.minecraft.pathfinding.PathType; import net.minecraft.state.DirectionProperty; import net.minecraft.state.StateContainer; @@ -143,10 +141,8 @@ public abstract class BlockChest extends Block if (player instanceof EntityPlayerMP && !(player instanceof FakePlayer)) { EntityPlayerMP entityPlayerMP = (EntityPlayerMP) player; - PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); - buffer.writeBlockPos(pos); - NetworkHooks.openGui(entityPlayerMP, ilockablecontainer, buffer); + NetworkHooks.openGui(entityPlayerMP, ilockablecontainer, buf -> buf.writeBlockPos(pos)); } player.addStat(StatList.OPEN_CHEST); diff --git a/src/main/java/com/progwml6/ironchest/common/network/PacketHandler.java b/src/main/java/com/progwml6/ironchest/common/network/PacketHandler.java index 6b63071..4f6de71 100644 --- a/src/main/java/com/progwml6/ironchest/common/network/PacketHandler.java +++ b/src/main/java/com/progwml6/ironchest/common/network/PacketHandler.java @@ -14,9 +14,13 @@ import com.progwml6.ironchest.IronChest; import com.progwml6.ironchest.common.network.packets.PacketTopStackSyncChest; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.network.NetworkDirection; import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.fml.network.simple.SimpleChannel; public final class PacketHandler @@ -33,15 +37,11 @@ public final class PacketHandler { int disc = 0; - HANDLER.registerMessage(disc++, PacketTopStackSyncChest.class, PacketTopStackSyncChest::encode, PacketTopStackSyncChest::decode, - PacketTopStackSyncChest.Handler::handle); + HANDLER.registerMessage(disc++, PacketTopStackSyncChest.class, PacketTopStackSyncChest::encode, PacketTopStackSyncChest::decode, PacketTopStackSyncChest.Handler::handle); } - public static void sendTo(Object msg, EntityPlayerMP player) + public static void send(PacketDistributor.PacketTarget target, MSG message) { - if (!(player instanceof FakePlayer)) - { - HANDLER.sendTo(msg, player.connection.netManager, NetworkDirection.PLAY_TO_CLIENT); - } + HANDLER.send(target, message); } } diff --git a/src/main/java/com/progwml6/ironchest/common/tileentity/TileEntityCrystalChest.java b/src/main/java/com/progwml6/ironchest/common/tileentity/TileEntityCrystalChest.java index 454ebb3..0763dbb 100644 --- a/src/main/java/com/progwml6/ironchest/common/tileentity/TileEntityCrystalChest.java +++ b/src/main/java/com/progwml6/ironchest/common/tileentity/TileEntityCrystalChest.java @@ -17,10 +17,9 @@ import com.progwml6.ironchest.common.network.PacketHandler; import com.progwml6.ironchest.common.network.packets.PacketTopStackSyncChest; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.server.ServerLifecycleHooks; +import net.minecraftforge.fml.network.PacketDistributor; import java.util.Collections; @@ -220,20 +219,7 @@ public class TileEntityCrystalChest extends TileEntityIronChest { NonNullList stacks = this.buildItemStackDataList(); - for (EntityPlayerMP player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) - { - if (player.dimension == world.getDimension().getType()) - { - double d4 = getPos().getX() - player.posX; - double d5 = getPos().getY() - player.posY; - double d6 = getPos().getZ() - player.posZ; - - if (d4 * d4 + d5 * d5 + d6 * d6 < 16384) - { - PacketHandler.sendTo(new PacketTopStackSyncChest(this.getWorld().getDimension().getType().getId(), this.getPos(), stacks), player); - } - } - } + PacketHandler.send(PacketDistributor.TRACKING_CHUNK.with(() -> this.getWorld().getChunk(this.getPos())), new PacketTopStackSyncChest(this.getWorld().getDimension().getType().getId(), this.getPos(), stacks)); } public void receiveMessageFromServer(NonNullList topStacks) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 73eb1ec..ddd1591 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,9 +1,10 @@ modLoader="javafml" loaderVersion="[24,)" - +issueTrackerURL="https://github.com/progwml6/ironchest/issues" [[mods]] modId="ironchest" + namespace="ironchest" version="${version}" displayName="Iron Chests" authors="cpw, alexbegt, progwml6" @@ -11,12 +12,10 @@ loaderVersion="[24,)" New chests with larger sizes, with in-place upgrade items. The feature chest is the crystal chest, which is transparent - some inventory contents are visible without opening the chest ''' - namespace="ironchest" - issueTrackerURL="https://github.com/progwml6/ironchest/issues" displayURL="https://minecraft.curseforge.com/projects/iron-chests" [[dependencies.ironchest]] modId="forge" mandatory=true - versionRange="[24,)" + versionRange="[${forge_version},)" ordering="NONE" side="BOTH" \ No newline at end of file diff --git a/src/main/resources/itemsheet.xcf b/src/main/resources/itemsheet.xcf deleted file mode 100644 index 47073b83da4fc9dcf7917878855b85d4ab06cdf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11427 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 d10u))_heb3sNH6!s`NokINW{{Zn