From f3233d948babbbef574dee9f8d2eb86388c96e23 Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 27 Jun 2020 15:30:07 +0200 Subject: [PATCH 01/17] Sign jars (#4435) --- .github/workflows/branches.yml | 1 + .github/workflows/release.yml | 45 +++++++++++++++++++++++---------- build.gradle | 24 +++++++++++++++++- gradle/scripts/artifacts.gradle | 3 +++ 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/.github/workflows/branches.yml b/.github/workflows/branches.yml index 21f0c3f1d..ec8a64c04 100644 --- a/.github/workflows/branches.yml +++ b/.github/workflows/branches.yml @@ -27,3 +27,4 @@ jobs: run: ./gradlew runData --no-daemon - name: Build with Gradle run: ./gradlew build --no-daemon + \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2728b511e..5e788d798 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,8 +11,16 @@ jobs: steps: - name: Validate semver env: - RELEASE: ${{ github.event.release.tag_name }} - run: echo $RELEASE | grep -oP '^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' + TAG: ${{ github.event.release.tag_name }} + run: | + echo $TAG | grep -oP '^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' + echo "::set-env name=RELEASE::${TAG:1}" + - name: Export keystore + env: + KEY_STORE: ${{ secrets.KEY_STORE }} + run: | + echo $KEY_STORE | base64 -d > $HOME/keystore.jks + echo "::set-env name=KEY_STORE_FILE::$HOME/keystore.jks" - uses: actions/checkout@v2 - name: Set up JDK 1.8 uses: actions/setup-java@v1 @@ -20,23 +28,32 @@ jobs: java-version: 1.8 - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Use gradle cache for faster builds - uses: actions/cache@v1 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - name: Generate assets uses: GabrielBB/xvfb-action@v1.2 - env: - RELEASE: ${{ github.event.release.tag_name }} with: run: ./gradlew runData --no-daemon - - name: Build with Gradle + - name: Build with Gradle and sign env: - RELEASE: ${{ github.event.release.tag_name }} + KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} + KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} + KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} run: ./gradlew build --no-daemon - - name: Publish package + - name: Prepare artifact metadata + id: prepare_artifact_metadata + run: | + echo ::set-output name=ARTIFACT_PATH::./build/libs/appliedenergistics2-${RELEASE}.jar + echo ::set-output name=ARTIFACT_NAME::appliedenergistics2-${RELEASE}.jar + - name: Upload Release Artifact + uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE: ${{ github.event.release.tag_name }} - run: ./gradlew publish --no-daemon + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_PATH }} + asset_name: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_NAME }} +# Disabled for testing releases +# - name: Publish package +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# RELEASE: ${{ github.event.release.tag_name }} +# run: ./gradlew publish --no-daemon diff --git a/build.gradle b/build.gradle index 2a83f8868..36ac4474c 100644 --- a/build.gradle +++ b/build.gradle @@ -69,7 +69,7 @@ if (ext.branch) { ext.release = System.getenv('RELEASE') ?: "" if (ext.release) { - version = ext.release.substring(1) + version = ext.release } @@ -142,6 +142,28 @@ minecraft { } } +def signProps = [:] +if (System.getenv("KEY_STORE_FILE")) { + signProps['keyStore'] = System.getenv("KEY_STORE_FILE") + signProps['storePass'] = System.getenv("KEY_STORE_PASS") + signProps['alias'] = System.getenv("KEY_STORE_ALIAS") + signProps['keyPass'] = System.getenv("KEY_STORE_KEY_PASS") +} + +task signJar(type: net.minecraftforge.gradle.common.task.SignJar, dependsOn: 'reobfJar') { + onlyIf { !signProps.isEmpty() } + + if (!signProps.isEmpty()) { + keyStore = signProps.keyStore + alias = signProps.alias + storePass = signProps.storePass + keyPass = signProps.keyPass + + inputFile = jar.archivePath + outputFile = jar.archivePath + } +} + apply from: 'gradle/scripts/artifacts.gradle' publishing { diff --git a/gradle/scripts/artifacts.gradle b/gradle/scripts/artifacts.gradle index e3f1caf90..f9503ff9b 100644 --- a/gradle/scripts/artifacts.gradle +++ b/gradle/scripts/artifacts.gradle @@ -21,6 +21,9 @@ processResources { } jar { + finalizedBy 'reobfJar' + finalizedBy 'signJar' + from sourceSets.main.output.classesDirs from sourceSets.api.output.classesDirs from sourceSets.main.output.resourcesDir From 3c53fddd8e007ef58536895bee7129a555030a8b Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 27 Jun 2020 15:53:12 +0200 Subject: [PATCH 02/17] Added content type for release assets --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5e788d798..9b74cff6a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,6 +51,7 @@ jobs: upload_url: ${{ github.event.release.upload_url }} asset_path: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_PATH }} asset_name: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_NAME }} + asset_content_type: application/zip # Disabled for testing releases # - name: Publish package # env: From 3faab6ae25e5ad5befe1cede8a878afeb103a4b8 Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 27 Jun 2020 16:03:46 +0200 Subject: [PATCH 03/17] Reenable maven publish --- .github/workflows/release.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b74cff6a..9a08b3714 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,9 +52,8 @@ jobs: asset_path: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_PATH }} asset_name: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_NAME }} asset_content_type: application/zip -# Disabled for testing releases -# - name: Publish package -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# RELEASE: ${{ github.event.release.tag_name }} -# run: ./gradlew publish --no-daemon + - name: Publish package + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE: ${{ github.event.release.tag_name }} + run: ./gradlew publish --no-daemon From e323e081925eb0ccf215249da4714747b3e22b20 Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 27 Jun 2020 16:17:45 +0200 Subject: [PATCH 04/17] Merge build and publish steps --- .github/workflows/release.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9a08b3714..8e949311b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,12 +32,12 @@ jobs: uses: GabrielBB/xvfb-action@v1.2 with: run: ./gradlew runData --no-daemon - - name: Build with Gradle and sign + - name: Build, sign, and publish with Gradle env: KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} - run: ./gradlew build --no-daemon + run: ./gradlew build publish --no-daemon - name: Prepare artifact metadata id: prepare_artifact_metadata run: | @@ -52,8 +52,3 @@ jobs: asset_path: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_PATH }} asset_name: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_NAME }} asset_content_type: application/zip - - name: Publish package - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE: ${{ github.event.release.tag_name }} - run: ./gradlew publish --no-daemon From 4ee44970b634f920e01244cc4cc5204490837ebe Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 27 Jun 2020 16:28:45 +0200 Subject: [PATCH 05/17] Forgot github token --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8e949311b..cdcab17fb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,6 +37,7 @@ jobs: KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./gradlew build publish --no-daemon - name: Prepare artifact metadata id: prepare_artifact_metadata From 55d7ac82e5a872408deb066f4e81d084a3d871fc Mon Sep 17 00:00:00 2001 From: yueh Date: Sun, 28 Jun 2020 19:19:05 +0200 Subject: [PATCH 06/17] Removed no channels pathing. Also use default values for features without a config option --- src/main/java/appeng/core/AEConfig.java | 2 +- src/main/java/appeng/me/cache/PathGridCache.java | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 09837c5ae..0922e7032 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -203,7 +203,7 @@ public final class AEConfig { } public boolean isFeatureEnabled(final AEFeature f) { - return this.featureFlags.contains(f); + return (!f.isConfig() && f.isEnabled()) || this.featureFlags.contains(f); } public boolean areFeaturesEnabled(Collection features) { diff --git a/src/main/java/appeng/me/cache/PathGridCache.java b/src/main/java/appeng/me/cache/PathGridCache.java index 10f3840c1..14183479b 100644 --- a/src/main/java/appeng/me/cache/PathGridCache.java +++ b/src/main/java/appeng/me/cache/PathGridCache.java @@ -95,16 +95,7 @@ public class PathGridCache implements IPathingGrid { this.updateNetwork = false; this.setChannelsInUse(0); - if (!AEConfig.instance().isFeatureEnabled(AEFeature.CHANNELS)) { - final int used = this.calculateRequiredChannels(); - - final int nodes = this.myGrid.getNodes().size(); - this.ticksUntilReady = 20 + Math.max(0, nodes / 100 - 20); - this.setChannelsByBlocks(nodes * used); - this.setChannelPowerUsage(this.getChannelsByBlocks() / 128.0); - - this.myGrid.getPivot().beginVisit(new AdHocChannelUpdater(used)); - } else if (this.controllerState == ControllerState.NO_CONTROLLER) { + if (this.controllerState == ControllerState.NO_CONTROLLER) { final int requiredChannels = this.calculateRequiredChannels(); int used = requiredChannels; if (requiredChannels > 8) { From 6bbea481b8ae10c0a2e2b26deda22b07059474f1 Mon Sep 17 00:00:00 2001 From: yueh Date: Sun, 28 Jun 2020 19:35:19 +0200 Subject: [PATCH 07/17] Grid connections to the front of a drive are no longer valid. --- src/main/java/appeng/tile/storage/DriveTileEntity.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/appeng/tile/storage/DriveTileEntity.java b/src/main/java/appeng/tile/storage/DriveTileEntity.java index c4dd5cfd6..044e37357 100644 --- a/src/main/java/appeng/tile/storage/DriveTileEntity.java +++ b/src/main/java/appeng/tile/storage/DriveTileEntity.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; @@ -35,6 +36,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.items.IItemHandler; @@ -111,6 +113,12 @@ public class DriveTileEntity extends AENetworkInvTileEntity implements IChestOrD this.inventoryHandlers = new IdentityHashMap<>(); } + @Override + public void setOrientation(Direction inForward, Direction inUp) { + super.setOrientation(inForward, inUp); + this.getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(inForward))); + } + @Override protected void writeToStream(final PacketBuffer data) throws IOException { super.writeToStream(data); From 130fc7476829642b27049b16b3fa3a346c501813 Mon Sep 17 00:00:00 2001 From: yueh Date: Sun, 28 Jun 2020 20:01:22 +0200 Subject: [PATCH 08/17] Render cells in offline drives as offline. --- .../appeng/client/render/tesr/DriveLedTileEntityRenderer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java index 426ab87a2..a599ddb84 100644 --- a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java +++ b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java @@ -125,6 +125,10 @@ public class DriveLedTileEntityRenderer extends TileEntityRenderer Date: Sun, 28 Jun 2020 20:59:51 +0200 Subject: [PATCH 09/17] Readded cullface to drive model. Also fixed a debug machine --- .../debug/EnergyGeneratorTileEntity.java | 3 + .../models/block/drive/drive_base.json | 212 +++++++++++++++--- 2 files changed, 179 insertions(+), 36 deletions(-) diff --git a/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java b/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java index f07e7a539..145682ea0 100644 --- a/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java +++ b/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java @@ -65,6 +65,9 @@ public class EnergyGeneratorTileEntity extends AEBaseTileEntity implements ITick for (Direction facing : Direction.values()) { final TileEntity te = this.getWorld().getTileEntity(this.getPos().offset(facing)); + if (te == null) { + continue; + } final LazyOptional cap = te.getCapability(CapabilityEnergy.ENERGY, facing.getOpposite()); cap.ifPresent(consumer -> { diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json index 6ae955650..abd6e0a17 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json @@ -14,10 +14,23 @@ "from": [0, 1, 0], "to": [1, 15, 16], "faces": { - "north": { "uv": [15, 1, 16, 15], "texture": "#front" }, - "east": { "uv": [0, 0, 16, 16], "rotation": 180, "texture": "#inside" }, - "south": { "uv": [0, 1, 1, 15], "texture": "#side" }, - "west": { "uv": [0, 1, 16, 15], "texture": "#side" } + "north": { + "uv": [15, 1, 16, 15], + "texture": "#front", + "cullface": "north" + }, + "east": { + "uv": [0, 0, 16, 16], + "rotation": 180, + "texture": "#inside", + "cullface": "north" + }, + "south": { + "uv": [0, 1, 1, 15], + "texture": "#side", + "cullface": "south" + }, + "west": { "uv": [0, 1, 16, 15], "texture": "#side", "cullface": "west" } } }, { @@ -25,10 +38,26 @@ "from": [15, 1, 0], "to": [16, 15, 16], "faces": { - "north": { "uv": [0, 1, 1, 15], "texture": "#front" }, - "east": { "uv": [0, 1, 16, 15], "texture": "#side" }, - "south": { "uv": [15, 1, 16, 15], "texture": "#side" }, - "west": { "uv": [0, 0, 16, 16], "texture": "#inside" } + "north": { + "uv": [0, 1, 1, 15], + "texture": "#front", + "cullface": "north" + }, + "east": { + "uv": [0, 1, 16, 15], + "texture": "#side", + "cullface": "east" + }, + "south": { + "uv": [15, 1, 16, 15], + "texture": "#side", + "cullface": "south" + }, + "west": { + "uv": [0, 0, 16, 16], + "texture": "#inside", + "cullface": "north" + } } }, { @@ -38,7 +67,11 @@ "rotation": { "angle": 0, "axis": "y", "origin": [8, 8, 9] }, "faces": { "north": { "uv": [15, 1, 16, 15], "texture": "#inside" }, - "south": { "uv": [1, 1, 15, 15], "texture": "#side" } + "south": { + "uv": [1, 1, 15, 15], + "texture": "#side", + "cullface": "south" + } } }, { @@ -46,12 +79,37 @@ "from": [0, 0, 0], "to": [16, 1, 16], "faces": { - "north": { "uv": [0, 15, 16, 16], "texture": "#front" }, - "east": { "uv": [0, 15, 16, 16], "texture": "#side" }, - "south": { "uv": [0, 15, 16, 16], "texture": "#side" }, - "west": { "uv": [0, 15, 16, 16], "texture": "#side" }, - "up": { "uv": [0, 0, 16, 16], "rotation": 90, "texture": "#inside" }, - "down": { "uv": [0, 0, 16, 16], "texture": "#bottom" } + "north": { + "uv": [0, 15, 16, 16], + "texture": "#front", + "cullface": "north" + }, + "east": { + "uv": [0, 15, 16, 16], + "texture": "#side", + "cullface": "east" + }, + "south": { + "uv": [0, 15, 16, 16], + "texture": "#side", + "cullface": "south" + }, + "west": { + "uv": [0, 15, 16, 16], + "texture": "#side", + "cullface": "west" + }, + "up": { + "uv": [0, 0, 16, 16], + "rotation": 90, + "texture": "#inside", + "cullface": "north" + }, + "down": { + "uv": [0, 0, 16, 16], + "texture": "#bottom", + "cullface": "down" + } } }, { @@ -59,12 +117,25 @@ "from": [0, 15, 0], "to": [16, 16, 16], "faces": { - "north": { "uv": [0, 0, 16, 1], "texture": "#front" }, - "east": { "uv": [0, 0, 16, 1], "texture": "#side" }, - "south": { "uv": [0, 0, 16, 1], "texture": "#side" }, - "west": { "uv": [0, 0, 16, 1], "texture": "#side" }, - "up": { "uv": [0, 0, 16, 16], "texture": "#top" }, - "down": { "uv": [0, 0, 16, 16], "rotation": 270, "texture": "#inside" } + "north": { + "uv": [0, 0, 16, 1], + "texture": "#front", + "cullface": "north" + }, + "east": { "uv": [0, 0, 16, 1], "texture": "#side", "cullface": "east" }, + "south": { + "uv": [0, 0, 16, 1], + "texture": "#side", + "cullface": "south" + }, + "west": { "uv": [0, 0, 16, 1], "texture": "#side", "cullface": "west" }, + "up": { "uv": [0, 0, 16, 16], "texture": "#top", "cullface": "up" }, + "down": { + "uv": [0, 0, 16, 16], + "rotation": 270, + "texture": "#inside", + "cullface": "north" + } } }, { @@ -72,9 +143,22 @@ "from": [7, 1, 1], "to": [9, 15, 7], "faces": { - "north": { "uv": [7, 1, 9, 15], "texture": "#front" }, - "east": { "uv": [1, 1, 7, 15], "rotation": 180, "texture": "#inside" }, - "west": { "uv": [1, 1, 7, 15], "texture": "#inside" } + "north": { + "uv": [7, 1, 9, 15], + "texture": "#front", + "cullface": "north" + }, + "east": { + "uv": [1, 1, 7, 15], + "rotation": 180, + "texture": "#inside", + "cullface": "north" + }, + "west": { + "uv": [1, 1, 7, 15], + "texture": "#inside", + "cullface": "north" + } } }, { @@ -82,9 +166,23 @@ "from": [1, 3, 2], "to": [15, 4, 7], "faces": { - "north": { "uv": [1, 12, 15, 13], "texture": "#front" }, - "up": { "uv": [2, 1, 7, 15], "rotation": 90, "texture": "#inside" }, - "down": { "uv": [2, 1, 7, 15], "rotation": 270, "texture": "#inside" } + "north": { + "uv": [1, 12, 15, 13], + "texture": "#front", + "cullface": "north" + }, + "up": { + "uv": [2, 1, 7, 15], + "rotation": 90, + "texture": "#inside", + "cullface": "north" + }, + "down": { + "uv": [2, 1, 7, 15], + "rotation": 270, + "texture": "#inside", + "cullface": "north" + } } }, { @@ -92,9 +190,23 @@ "from": [1, 6, 2], "to": [15, 7, 7], "faces": { - "north": { "uv": [1, 9, 15, 10], "texture": "#front" }, - "up": { "uv": [2, 1, 7, 15], "rotation": 90, "texture": "#inside" }, - "down": { "uv": [2, 1, 7, 15], "rotation": 270, "texture": "#inside" } + "north": { + "uv": [1, 9, 15, 10], + "texture": "#front", + "cullface": "north" + }, + "up": { + "uv": [2, 1, 7, 15], + "rotation": 90, + "texture": "#inside", + "cullface": "north" + }, + "down": { + "uv": [2, 1, 7, 15], + "rotation": 270, + "texture": "#inside", + "cullface": "north" + } } }, { @@ -102,9 +214,23 @@ "from": [1, 9, 2], "to": [15, 10, 7], "faces": { - "north": { "uv": [1, 6, 15, 7], "texture": "#front" }, - "up": { "uv": [2, 1, 7, 15], "rotation": 90, "texture": "#inside" }, - "down": { "uv": [2, 1, 7, 15], "rotation": 270, "texture": "#inside" } + "north": { + "uv": [1, 6, 15, 7], + "texture": "#front", + "cullface": "north" + }, + "up": { + "uv": [2, 1, 7, 15], + "rotation": 90, + "texture": "#inside", + "cullface": "north" + }, + "down": { + "uv": [2, 1, 7, 15], + "rotation": 270, + "texture": "#inside", + "cullface": "north" + } } }, { @@ -112,9 +238,23 @@ "from": [1, 12, 2], "to": [15, 13, 7], "faces": { - "north": { "uv": [1, 3, 15, 4], "texture": "#front" }, - "up": { "uv": [2, 1, 7, 15], "rotation": 90, "texture": "#inside" }, - "down": { "uv": [2, 1, 7, 15], "rotation": 270, "texture": "#inside" } + "north": { + "uv": [1, 3, 15, 4], + "texture": "#front", + "cullface": "north" + }, + "up": { + "uv": [2, 1, 7, 15], + "rotation": 90, + "texture": "#inside", + "cullface": "north" + }, + "down": { + "uv": [2, 1, 7, 15], + "rotation": 270, + "texture": "#inside", + "cullface": "north" + } } } ] From 6379cfe3a28192f8adcfb1059201130f5ce4e8b7 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 28 Jun 2020 23:57:19 +0200 Subject: [PATCH 10/17] Removed unused interface. --- .../core/worlddata/IWorldSpawnData.java | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 src/main/java/appeng/core/worlddata/IWorldSpawnData.java diff --git a/src/main/java/appeng/core/worlddata/IWorldSpawnData.java b/src/main/java/appeng/core/worlddata/IWorldSpawnData.java deleted file mode 100644 index a0f964cb8..000000000 --- a/src/main/java/appeng/core/worlddata/IWorldSpawnData.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.worlddata; - -import java.util.Collection; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.dimension.Dimension; - -/** - * @author thatsIch - * @version rv3 - 30.05.2015 - * @since rv3 30.05.2015 - */ -public interface IWorldSpawnData { - void setGenerated(Dimension dim, int chunkX, int chunkZ); - - boolean hasGenerated(Dimension dim, int chunkX, int chunkZ); - - boolean addNearByMeteorites(Dimension dim, int chunkX, int chunkZ, CompoundNBT newData); - - Collection getNearByMeteorites(Dimension dim, int chunkX, int chunkZ); -} From 312abce95613565a6d11a49dcf70dea9f4143706 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 28 Jun 2020 23:58:36 +0200 Subject: [PATCH 11/17] Removed unused interface. --- .../core/worlddata/IWorldDimensionData.java | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 src/main/java/appeng/core/worlddata/IWorldDimensionData.java diff --git a/src/main/java/appeng/core/worlddata/IWorldDimensionData.java b/src/main/java/appeng/core/worlddata/IWorldDimensionData.java deleted file mode 100644 index 064552f25..000000000 --- a/src/main/java/appeng/core/worlddata/IWorldDimensionData.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.worlddata; - -import javax.annotation.Nullable; - -import net.minecraft.network.NetworkManager; - -import appeng.api.util.WorldCoord; - -/** - * @author thatsIch - * @version rv3 - 30.05.2015 - * @since rv3 30.05.2015 - */ -public interface IWorldDimensionData { - void addStorageCell(int newStorageCellID); - - WorldCoord getStoredSize(int dim); - - void setStoredSize(int dim, int targetX, int targetY, int targetZ); - - void sendToPlayer(@Nullable NetworkManager manager); -} From 42c2be5c058627b9dc88b322a5f125829bc7b3f9 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 29 Jun 2020 02:57:38 +0200 Subject: [PATCH 12/17] Add version constraint on Forge. --- src/main/resources/META-INF/mods.toml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 699a80cd3..27d6b05db 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -13,9 +13,16 @@ version="${file.jarVersion}" displayName="Applied Energistics 2" description="A Mod about Matter, Energy and using them to conquer the world.." -[[dependencies.jei]] +[[dependencies.appliedenergistics2]] modId="forge" mandatory=true versionRange="[31.0.0,)" ordering="NONE" - side="BOTH" \ No newline at end of file + side="BOTH" + +[[dependencies.appliedenergistics2]] + modId="minecraft" + mandatory=true + versionRange="[1.15.2]" + ordering="NONE" + side="BOTH" From 346e58ff257272318173df638bed74eb9a11720a Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 29 Jun 2020 02:58:52 +0200 Subject: [PATCH 13/17] Remove duplicate registration of disassembly recipes. --- src/main/java/appeng/core/Registration.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 2f0dc473e..3ee9f956e 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -340,8 +340,7 @@ final class Registration { FacadeItem facadeItem = (FacadeItem) Api.INSTANCE.definitions().items().facade().item(); r.registerAll(DisassembleRecipe.SERIALIZER, GrinderRecipeSerializer.INSTANCE, - InscriberRecipeSerializer.INSTANCE, FacadeRecipe.getSerializer(facadeItem), - DisassembleRecipe.SERIALIZER); + InscriberRecipeSerializer.INSTANCE, FacadeRecipe.getSerializer(facadeItem)); } public void registerEntities(RegistryEvent.Register> event) { From 57fa5576af96c220b99038387f073a138e7c878c Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 29 Jun 2020 15:32:49 +0200 Subject: [PATCH 14/17] Fix rendering of the dummy fluid item (i.e. in cell workbenches, fluid terminals are unaffected). --- .../CellWorkbenchContainer.java | 9 ----- .../appeng/core/api/definitions/ApiItems.java | 15 ++++++-- .../fluids/items/FluidDummyItemColor.java | 27 ++++++++++++++ .../fluids/items/FluidDummyItemRendering.java | 35 ------------------- .../models/item/dummy_fluid_item.json | 3 ++ 5 files changed, 43 insertions(+), 46 deletions(-) create mode 100644 src/main/java/appeng/fluids/items/FluidDummyItemColor.java delete mode 100644 src/main/java/appeng/fluids/items/FluidDummyItemRendering.java create mode 100644 src/main/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json diff --git a/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java b/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java index 44c318444..da81328ed 100644 --- a/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java +++ b/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java @@ -128,15 +128,6 @@ public class CellWorkbenchContainer extends UpgradeableContainer { upgradeInventory, this, iSLot, 187 + zz * 18, 8 + 18 * z, iSLot, this.getPlayerInventory())); } } - /* - * if ( supportCapacity() ) { for (int w = 0; w < 2; w++) for (int z = 0; z < 9; - * z++) addSlotToContainer( new OptionalSlotFakeTypeOnly( inv, this, offset++, - * x, y, z, w, 1 ) ); for (int w = 0; w < 2; w++) for (int z = 0; z < 9; z++) - * addSlotToContainer( new OptionalSlotFakeTypeOnly( inv, this, offset++, x, y, - * z, w + 2, 2 ) ); for (int w = 0; w < 2; w++) for (int z = 0; z < 9; z++) - * addSlotToContainer( new OptionalSlotFakeTypeOnly( inv, this, offset++, x, y, - * z, w + 4, 3 ) ); } - */ } @Override diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index eb835857e..4437cee71 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -20,9 +20,14 @@ package appeng.core.api.definitions; import java.util.function.Consumer; +import appeng.bootstrap.IItemRendering; +import appeng.bootstrap.ItemRenderingCustomizer; +import appeng.fluids.items.FluidDummyItemColor; import net.minecraft.entity.EntityClassification; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ToolType; import appeng.api.definitions.IItemDefinition; @@ -42,7 +47,6 @@ import appeng.debug.ReplicatorCardItem; import appeng.entity.GrowingCrystalEntity; import appeng.fluids.items.BasicFluidStorageCell; import appeng.fluids.items.FluidDummyItem; -import appeng.fluids.items.FluidDummyItemRendering; import appeng.hooks.BlockToolDispenseItemBehavior; import appeng.hooks.MatterCannonDispenseItemBehavior; import appeng.items.materials.MaterialType; @@ -303,7 +307,14 @@ public final class ApiItems implements IItems { debugTools.item("debug_part_placer", DebugPartPlacerItem::new).build(); this.dummyFluidItem = registry.item("dummy_fluid_item", FluidDummyItem::new) - .rendering(new FluidDummyItemRendering()).build(); + .rendering(new ItemRenderingCustomizer() { + @Override + @OnlyIn(Dist.CLIENT) + public void customize(IItemRendering rendering) { + rendering.color(new FluidDummyItemColor()); + } + }) + .build(); } private static AEColoredItemDefinition createPaintBalls(FeatureFactory registry, String idSuffix, boolean lumen) { diff --git a/src/main/java/appeng/fluids/items/FluidDummyItemColor.java b/src/main/java/appeng/fluids/items/FluidDummyItemColor.java new file mode 100644 index 000000000..f0ef7658e --- /dev/null +++ b/src/main/java/appeng/fluids/items/FluidDummyItemColor.java @@ -0,0 +1,27 @@ +package appeng.fluids.items; + +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; + +@OnlyIn(Dist.CLIENT) +public class FluidDummyItemColor implements IItemColor { + + @Override + public int getColor(ItemStack stack, int tintIndex) { + + Item item = stack.getItem(); + if (!(item instanceof FluidDummyItem)) { + return -1; + } + + FluidDummyItem fluidItem = (FluidDummyItem) item; + FluidStack fluidStack = fluidItem.getFluidStack(stack); + + return fluidStack.getFluid().getAttributes().getColor(fluidStack); + } + +} diff --git a/src/main/java/appeng/fluids/items/FluidDummyItemRendering.java b/src/main/java/appeng/fluids/items/FluidDummyItemRendering.java deleted file mode 100644 index fb8e6b51b..000000000 --- a/src/main/java/appeng/fluids/items/FluidDummyItemRendering.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.fluids.items; - -import appeng.bootstrap.IItemRendering; -import appeng.bootstrap.ItemRenderingCustomizer; - -/** - * @author DrummerMC - * @version rv6 - 2018-01-22 - * @since rv6 2018-01-22 - */ -public class FluidDummyItemRendering extends ItemRenderingCustomizer { - @Override - public void customize(IItemRendering rendering) { - // FIXME rendering.builtInModel( "models/item/dummy_fluid_item", new - // DummyFluidItemModel() ); - } -} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json b/src/main/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json new file mode 100644 index 000000000..5c062247d --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/item/dummy_fluid_item.json @@ -0,0 +1,3 @@ +{ + "loader": "appliedenergistics2:dummy_fluid_item" +} From f9431064194039fab2e0cff852214f8b71e158c5 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 29 Jun 2020 17:13:04 +0200 Subject: [PATCH 15/17] Fix serialization of 0-amount fluidstacks which is required for properly updating an ME inventory where an existing fluid stack should be fully removed. (I.e. Taking out the last amount of a given fluid via a terminal). --- .../java/appeng/fluids/util/AEFluidStack.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/appeng/fluids/util/AEFluidStack.java b/src/main/java/appeng/fluids/util/AEFluidStack.java index 841f82e83..5355cf08d 100644 --- a/src/main/java/appeng/fluids/util/AEFluidStack.java +++ b/src/main/java/appeng/fluids/util/AEFluidStack.java @@ -23,7 +23,6 @@ import javax.annotation.Nullable; import com.google.common.base.Preconditions; -import net.minecraft.fluid.EmptyFluid; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemStack; @@ -240,26 +239,24 @@ public final class AEFluidStack extends AEStack implements IAEFlu public static IAEFluidStack fromPacket(final PacketBuffer buffer) { final boolean isCraftable = buffer.readBoolean(); - final FluidStack fluidStack = buffer.readFluidStack(); + Fluid fluid = buffer.readRegistryIdUnsafe(ForgeRegistries.FLUIDS); + CompoundNBT tag = buffer.readCompoundTag(); final long stackSize = buffer.readVarLong(); final long countRequestable = buffer.readVarLong(); - if (fluidStack.isEmpty()) { - return null; - } - - final AEFluidStack fluid = AEFluidStack.fromFluidStack(fluidStack); - fluid.setStackSize(stackSize); - fluid.setCountRequestable(countRequestable); - fluid.setCraftable(isCraftable); - return fluid; + final AEFluidStack stack = new AEFluidStack(fluid, stackSize, tag); + stack.setCountRequestable(countRequestable); + stack.setCraftable(isCraftable); + return stack; } @Override public void writeToPacket(final PacketBuffer buffer) { buffer.writeBoolean(this.isCraftable()); - buffer.writeFluidStack(this.getFluidStack()); + // Cannot use writeFluidStack here because for FluidStacks with amount==0, it will not write the fluid + buffer.writeRegistryIdUnsafe(ForgeRegistries.FLUIDS, fluid); + buffer.writeCompoundTag(getFluidStack().getTag()); buffer.writeVarLong(this.getStackSize()); buffer.writeVarLong(this.getCountRequestable()); } From d5491549eb8c44ce2def46677ba4f45779e0806f Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 29 Jun 2020 21:01:30 +0200 Subject: [PATCH 16/17] Fixes TinyTNT not being primable with flint & steel. --- src/main/java/appeng/block/AEBaseBlock.java | 5 ----- src/main/java/appeng/block/AEBaseTileBlock.java | 5 +++++ src/main/java/appeng/block/misc/TinyTNTBlock.java | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/appeng/block/AEBaseBlock.java b/src/main/java/appeng/block/AEBaseBlock.java index b9a7993ab..6999bc01c 100644 --- a/src/main/java/appeng/block/AEBaseBlock.java +++ b/src/main/java/appeng/block/AEBaseBlock.java @@ -129,11 +129,6 @@ public abstract class AEBaseBlock extends Block { return false; } - public ActionResultType onActivated(final World w, final BlockPos pos, final PlayerEntity player, final Hand hand, - final @Nullable ItemStack heldItem, final BlockRayTraceResult hit) { - return ActionResultType.PASS; - } - public final Direction mapRotation(final IOrientable ori, final Direction dir) { // case DOWN: return bottomIcon; // case UP: return blockIcon; diff --git a/src/main/java/appeng/block/AEBaseTileBlock.java b/src/main/java/appeng/block/AEBaseTileBlock.java index da13512ff..8a1191b2d 100644 --- a/src/main/java/appeng/block/AEBaseTileBlock.java +++ b/src/main/java/appeng/block/AEBaseTileBlock.java @@ -278,6 +278,11 @@ public abstract class AEBaseTileBlock extends AEBase return this.onActivated(world, pos, player, hand, player.getHeldItem(hand), hit); } + public ActionResultType onActivated(final World w, final BlockPos pos, final PlayerEntity player, final Hand hand, + final @Nullable ItemStack heldItem, final BlockRayTraceResult hit) { + return ActionResultType.PASS; + } + @Override public IOrientable getOrientable(final IBlockReader w, final BlockPos pos) { return this.getTileEntity(w, pos); diff --git a/src/main/java/appeng/block/misc/TinyTNTBlock.java b/src/main/java/appeng/block/misc/TinyTNTBlock.java index 8efc2d908..5e00e5016 100644 --- a/src/main/java/appeng/block/misc/TinyTNTBlock.java +++ b/src/main/java/appeng/block/misc/TinyTNTBlock.java @@ -67,17 +67,17 @@ public class TinyTNTBlock extends AEBaseBlock { } @Override - public ActionResultType onActivated(final World w, final BlockPos pos, final PlayerEntity player, final Hand hand, - final @Nullable ItemStack heldItem, final BlockRayTraceResult hit) { - if (heldItem != null && heldItem.getItem() == Items.FLINT_AND_STEEL) { - this.startFuse(w, pos, player); - w.removeBlock(pos, false); + public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { + ItemStack heldItem = player.getHeldItem(handIn); + if (!heldItem.isEmpty() && heldItem.getItem() == Items.FLINT_AND_STEEL) { + this.startFuse(world, pos, player); + world.removeBlock(pos, false); heldItem.damageItem(1, player, p -> { - p.sendBreakAnimation(hand); + p.sendBreakAnimation(handIn); }); // FIXME Check if onBroken is equivalent return ActionResultType.SUCCESS; } else { - return super.onActivated(w, pos, player, hand, heldItem, hit); + return super.onBlockActivated(state, world, pos, player, handIn, hit); } } From 7233b112844fe4854e28fe143cc87a7b2f4e0e07 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 29 Jun 2020 21:14:58 +0200 Subject: [PATCH 17/17] Fix TinyTNT not spawning the correct entity client-side (and the renderer using the wrong shadow). --- .../appeng/entity/TinyTNTPrimedEntity.java | 27 ++++++++++++++++++- .../appeng/entity/TinyTNTPrimedRenderer.java | 2 +- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java index 2e97668d3..646a233cc 100644 --- a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java +++ b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java @@ -29,6 +29,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.MoverType; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.TNTEntity; +import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.DamageSource; @@ -47,11 +48,16 @@ import appeng.core.AEConfig; import appeng.core.AppEng; import appeng.core.sync.packets.MockExplosionPacket; import appeng.util.Platform; +import net.minecraftforge.fml.network.NetworkHooks; + +import javax.annotation.Nullable; public final class TinyTNTPrimedEntity extends TNTEntity implements IEntityAdditionalSpawnData { public static EntityType TYPE; + private LivingEntity placedBy; + public TinyTNTPrimedEntity(EntityType type, World worldIn) { super(type, worldIn); this.preventEntitySpawning = true; @@ -59,7 +65,21 @@ public final class TinyTNTPrimedEntity extends TNTEntity implements IEntityAddit public TinyTNTPrimedEntity(final World w, final double x, final double y, final double z, final LivingEntity igniter) { - super(w, x, y, z, igniter); + super(TYPE, w); + this.setPosition(x, y, z); + double d0 = w.rand.nextDouble() * (double)((float)Math.PI * 2F); + this.setMotion(-Math.sin(d0) * 0.02D, (double)0.2F, -Math.cos(d0) * 0.02D); + this.setFuse(80); + this.prevPosX = x; + this.prevPosY = y; + this.prevPosZ = z; + this.placedBy = igniter; + } + + @Nullable + @Override + public LivingEntity getTntPlacedBy() { + return this.placedBy; } /** @@ -170,6 +190,11 @@ public final class TinyTNTPrimedEntity extends TNTEntity implements IEntityAddit new MockExplosionPacket(this.getPosX(), this.getPosY(), this.getPosZ())); } + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + @Override public void writeSpawnData(PacketBuffer buffer) { buffer.writeByte(this.getFuse()); diff --git a/src/main/java/appeng/entity/TinyTNTPrimedRenderer.java b/src/main/java/appeng/entity/TinyTNTPrimedRenderer.java index 83b994939..581ea43ab 100644 --- a/src/main/java/appeng/entity/TinyTNTPrimedRenderer.java +++ b/src/main/java/appeng/entity/TinyTNTPrimedRenderer.java @@ -38,7 +38,7 @@ public class TinyTNTPrimedRenderer extends EntityRenderer { public TinyTNTPrimedRenderer(final EntityRendererManager manager) { super(manager); - this.shadowSize = 0.5F; + this.shadowSize = 0.25F; } @Override