From 65f58913a41e3f98bada4ea4e7807caccac67d15 Mon Sep 17 00:00:00 2001 From: shartte Date: Thu, 10 Sep 2020 22:34:16 +0200 Subject: [PATCH 1/7] Make players assume ownership of networks when they place security stations onto unsecured ones (#4714) * Fixes #4712: When a security station is placed onto an unsecured network, the placer assumes ownership of the entire network. Otherwise the contiguous network would not necessarily reconnect in the same way when the chunk is reloaded due to differing player-ids throughout the network. In addition, changes to the node's owner were not being persisted due to the host never being marked as dirty. * Fix formatting --- .../appeng/api/networking/GridNotification.java | 5 +++++ .../java/appeng/api/networking/IGridBlock.java | 3 ++- src/main/java/appeng/me/GridNode.java | 3 ++- src/main/java/appeng/me/cache/SecurityCache.java | 16 ++++++++++++++-- .../java/appeng/me/helpers/AENetworkProxy.java | 6 +++++- .../java/appeng/me/helpers/IGridProxyable.java | 3 +++ 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/api/java/appeng/api/networking/GridNotification.java b/src/api/java/appeng/api/networking/GridNotification.java index 48c7a29b0..b172f9dd1 100644 --- a/src/api/java/appeng/api/networking/GridNotification.java +++ b/src/api/java/appeng/api/networking/GridNotification.java @@ -28,4 +28,9 @@ public enum GridNotification { * the visible connections for this node have changed, useful for cable. */ CONNECTIONS_CHANGED, + + /** + * the owner of the grid node has changed, and the node needs to be re-saved + */ + OWNER_CHANGED } diff --git a/src/api/java/appeng/api/networking/IGridBlock.java b/src/api/java/appeng/api/networking/IGridBlock.java index 93fd3f37e..3a86fe2eb 100644 --- a/src/api/java/appeng/api/networking/IGridBlock.java +++ b/src/api/java/appeng/api/networking/IGridBlock.java @@ -87,7 +87,8 @@ public interface IGridBlock { AEColor getGridColor(); /** - * Notifies your IGridBlock that changes were made to your connections + * Called by the {@link IGridNode} to notify its {@link IGridBlock} about + * events. */ void onGridNotification(@Nonnull GridNotification notification); diff --git a/src/main/java/appeng/me/GridNode.java b/src/main/java/appeng/me/GridNode.java index 8a9699a04..2e0412502 100644 --- a/src/main/java/appeng/me/GridNode.java +++ b/src/main/java/appeng/me/GridNode.java @@ -327,8 +327,9 @@ public class GridNode implements IGridNode, IPathItem { @Override public void setPlayerID(final int playerID) { - if (playerID >= 0) { + if (playerID >= 0 && this.playerID != playerID) { this.playerID = playerID; + gridProxy.onGridNotification(GridNotification.OWNER_CHANGED); } } diff --git a/src/main/java/appeng/me/cache/SecurityCache.java b/src/main/java/appeng/me/cache/SecurityCache.java index 423372570..6a3bbfbe7 100644 --- a/src/main/java/appeng/me/cache/SecurityCache.java +++ b/src/main/java/appeng/me/cache/SecurityCache.java @@ -81,8 +81,16 @@ public class SecurityCache implements ISecurityGrid { private void updateSecurityKey() { final long lastCode = this.securityKey; + /** + * Placing a security station will propagate the security station's owner to all + * connected grid nodes to prevent the network from not reforming due to + * different owners later. + */ + int newOwner = -1; if (this.securityProvider.size() == 1) { - this.securityKey = this.securityProvider.get(0).getSecurityKey(); + ISecurityProvider securityProvider = this.securityProvider.get(0); + this.securityKey = securityProvider.getSecurityKey(); + newOwner = securityProvider.getOwner(); } else { this.securityKey = -1; } @@ -90,7 +98,11 @@ public class SecurityCache implements ISecurityGrid { if (lastCode != this.securityKey) { this.getGrid().postEvent(new MENetworkSecurityChange()); for (final IGridNode n : this.getGrid().getNodes()) { - ((GridNode) n).setLastSecurityKey(this.securityKey); + GridNode gridNode = (GridNode) n; + gridNode.setLastSecurityKey(this.securityKey); + if (gridNode.getPlayerID() != newOwner) { + gridNode.setPlayerID(newOwner); + } } } } diff --git a/src/main/java/appeng/me/helpers/AENetworkProxy.java b/src/main/java/appeng/me/helpers/AENetworkProxy.java index 57f7608a5..5617ef435 100644 --- a/src/main/java/appeng/me/helpers/AENetworkProxy.java +++ b/src/main/java/appeng/me/helpers/AENetworkProxy.java @@ -167,7 +167,6 @@ public class AENetworkProxy implements IGridBlock { * short cut! * * @return grid of node - * * @throws GridAccessException of node or grid is null */ public IGrid getGrid() throws GridAccessException { @@ -280,6 +279,11 @@ public class AENetworkProxy implements IGridBlock { @Override public void onGridNotification(final GridNotification notification) { + if (notification == GridNotification.OWNER_CHANGED) { + gp.saveChanges(); + return; + } + if (this.gp instanceof CablePart) { ((CablePart) this.gp).markForUpdate(); } diff --git a/src/main/java/appeng/me/helpers/IGridProxyable.java b/src/main/java/appeng/me/helpers/IGridProxyable.java index 4f47bdb91..30638a075 100644 --- a/src/main/java/appeng/me/helpers/IGridProxyable.java +++ b/src/main/java/appeng/me/helpers/IGridProxyable.java @@ -28,4 +28,7 @@ public interface IGridProxyable extends IGridHost { DimensionalCoord getLocation(); void gridChanged(); + + void saveChanges(); + } From d07937fa930e8c6c87cb4db27afef859ac2016a1 Mon Sep 17 00:00:00 2001 From: shartte Date: Thu, 10 Sep 2020 22:56:50 +0200 Subject: [PATCH 2/7] Render Performance Improvements (#4721) * Return a fixed bounding box for frustrum culling of AE tile entity renderers to prevent Forge from re-retrieving the TE from the world and calculating the collision box (very costly for cables). * Changed dynamic cable bus lighting to be based on block states to improved rendering speed and fix optifine issues. (Potential fix for #4716). --- .../block/networking/CableBusBlock.java | 25 ++++++++++++++----- .../java/appeng/tile/AEBaseTileEntity.java | 14 +++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/appeng/block/networking/CableBusBlock.java b/src/main/java/appeng/block/networking/CableBusBlock.java index 6a9794f33..ace257fa7 100644 --- a/src/main/java/appeng/block/networking/CableBusBlock.java +++ b/src/main/java/appeng/block/networking/CableBusBlock.java @@ -39,6 +39,8 @@ import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.DyeColor; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.state.IntegerProperty; +import net.minecraft.state.StateContainer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -82,8 +84,12 @@ public class CableBusBlock extends AEBaseTileBlock implement private static final ICableBusContainer NULL_CABLE_BUS = new NullCableBusContainer(); + private static final IntegerProperty LIGHT_LEVEL = IntegerProperty.create("light_level", 0, 15); + public CableBusBlock() { - super(defaultProps(AEMaterials.GLASS).notSolid().noDrops().variableOpacity()); + super(defaultProps(AEMaterials.GLASS).notSolid().noDrops().variableOpacity() + .setLightLevel(state -> state.get(LIGHT_LEVEL))); + setDefaultState(getDefaultState().with(LIGHT_LEVEL, 0)); } @Override @@ -126,11 +132,9 @@ public class CableBusBlock extends AEBaseTileBlock implement } @Override - public int getLightValue(final BlockState state, final IBlockReader world, final BlockPos pos) { - if (state.getBlock() != this) { - return state.getBlock().getLightValue(state, world, pos); - } - return this.cb(world, pos).getLightValue(); + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(LIGHT_LEVEL); } @Override @@ -386,4 +390,13 @@ public class CableBusBlock extends AEBaseTileBlock implement } } + @Override + protected BlockState updateBlockStateFromTileEntity(BlockState currentState, CableBusTileEntity te) { + if (currentState.getBlock() != this) { + return currentState; + } + int lightLevel = te.getCableBus().getLightValue(); + return super.updateBlockStateFromTileEntity(currentState, te).with(LIGHT_LEVEL, lightLevel); + } + } diff --git a/src/main/java/appeng/tile/AEBaseTileEntity.java b/src/main/java/appeng/tile/AEBaseTileEntity.java index 02fc63c1d..9d8430c27 100644 --- a/src/main/java/appeng/tile/AEBaseTileEntity.java +++ b/src/main/java/appeng/tile/AEBaseTileEntity.java @@ -39,10 +39,13 @@ import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.items.IItemHandler; @@ -458,4 +461,15 @@ public class AEBaseTileEntity extends TileEntity implements IOrientable, ICommon return new AEModelData(up, forward); } + /** + * AE Tile Entities will generally confine themselves to rendering within the + * bounding block. Forge however would retrieve the collision box here, which is + * very expensive. + */ + @OnlyIn(Dist.CLIENT) + @Override + public AxisAlignedBB getRenderBoundingBox() { + return new AxisAlignedBB(pos, pos.add(1, 1, 1)); + } + } From 0147e1ddfbab06cc45e27f2addb9da2023feceb6 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 13 Sep 2020 22:09:47 +0200 Subject: [PATCH 3/7] Fixes #4730 and also introduces repeat-pageup/pagedown when holding the mouse on the area above or below the scrollbar handle. --- .../java/appeng/client/gui/AEBaseScreen.java | 31 ++- .../client/gui/widgets/EventRepeater.java | 93 +++++++++ .../appeng/client/gui/widgets/Scrollbar.java | 182 +++++++++++++++--- 3 files changed, 277 insertions(+), 29 deletions(-) create mode 100644 src/main/java/appeng/client/gui/widgets/EventRepeater.java diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index d0d6e11a9..74e2e2668 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -229,7 +229,7 @@ public abstract class AEBaseScreen extends ContainerS RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); if (this.getScrollBar() != null) { - this.getScrollBar().draw(this); + this.getScrollBar().draw(matrixStack, this); } this.drawFG(matrixStack, ox, oy, x, y); @@ -291,22 +291,36 @@ public abstract class AEBaseScreen extends ContainerS } } - if (this.getScrollBar() != null) { - this.getScrollBar().click(xCoord - this.guiLeft, yCoord - this.guiTop); + // Forward left mouse button down events to the scrollbar + if (btn == 0 && this.getScrollBar() != null) { + if (this.getScrollBar().mouseDown(xCoord - this.guiLeft, yCoord - this.guiTop)) { + return true; + } } return super.mouseClicked(xCoord, yCoord, btn); } @Override - public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double dragX, double dragY) { + public boolean mouseReleased(double mouseX, double mouseY, int button) { + // Forward left mouse button up events to the scrollbar + if (button == 0 && this.getScrollBar() != null) { + if (this.getScrollBar().mouseUp(mouseX - this.guiLeft, mouseY - this.guiTop)) { + return true; + } + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double dragX, double dragY) { final Slot slot = this.getSlot((int) mouseX, (int) mouseY); final ItemStack itemstack = getPlayer().inventory.getItemStack(); if (this.getScrollBar() != null) { // FIXME: Coordinate system of mouseX/mouseY is unclear - this.getScrollBar().click((int) mouseX - this.guiLeft, (int) mouseY - this.guiTop); + this.getScrollBar().mouseDragged((int) mouseX - this.guiLeft, (int) mouseY - this.guiTop); } if (slot instanceof FakeSlot && !itemstack.isEmpty()) { @@ -581,7 +595,7 @@ public abstract class AEBaseScreen extends ContainerS if (slot instanceof SlotME) { final IAEItemStack item = ((SlotME) slot).getAEStack(); if (item != null) { - ((AEBaseContainer) this.container).setTargetStack(item); + this.container.setTargetStack(item); final InventoryAction direction = wheel > 0 ? InventoryAction.ROLL_DOWN : InventoryAction.ROLL_UP; final int times = (int) Math.abs(wheel); final int inventorySize = this.getInventorySlots().size(); @@ -796,6 +810,11 @@ public abstract class AEBaseScreen extends ContainerS public void tick() { super.tick(); + + if (this.getScrollBar() != null) { + this.getScrollBar().tick(); + } + for (IGuiEventListener child : children) { if (child instanceof ITickingWidget) { ((ITickingWidget) child).tick(); diff --git a/src/main/java/appeng/client/gui/widgets/EventRepeater.java b/src/main/java/appeng/client/gui/widgets/EventRepeater.java new file mode 100644 index 000000000..bac50ec5c --- /dev/null +++ b/src/main/java/appeng/client/gui/widgets/EventRepeater.java @@ -0,0 +1,93 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, 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.client.gui.widgets; + +import java.time.Duration; + +/** + * This class can be used to implement repeating events such as holding down a button to fire + * an event repeatedly while the button is still being held, or repeatedly scrolling down + * a page, while the mouse is held down on the scrollbar. + */ +public class EventRepeater { + + /** + * -1 if no repeat event is scheduled. + * Otherwise contains the {@link System#nanoTime()} at which the next event should occur. + */ + private long nextEventTime = -1; + + private EventCallback eventCallback = null; + + private final long eventDelay; // In nanoseconds + + private final long eventInterval; // In nanoseconds + + public EventRepeater(Duration delay, Duration interval) { + this.eventDelay = delay.toNanos(); + this.eventInterval = interval.toNanos(); + } + + public void tick() { + if (this.eventCallback == null) { + return; // No event scheduled + } + + // Use nanoTime here because it is monotonically increasing, while System.currentTimeMillis is not + long nanoTime = System.nanoTime(); + if (nanoTime < this.nextEventTime) { + return; // Event time not reached + } + + // Before triggering, recompute the next event, since + // the event callback itself may reschedule/cancel, and + // we should not overwrite that + this.nextEventTime = nanoTime + this.eventInterval; + this.eventCallback.trigger(); + } + + /** + * Schedule the given callback to be called after a given initial delay, and then + * after the given interval repeatedly. + * + *

Replaces any previously queued callback. + */ + public void repeat(EventCallback callback) { + long time = System.nanoTime(); + this.eventCallback = callback; + this.nextEventTime = time + eventDelay; + } + + public boolean isRepeating() { + return this.eventCallback != null; + } + + /** + * Stop repeating the event. + */ + public void stop() { + this.eventCallback = null; + } + + @FunctionalInterface + public interface EventCallback { + void trigger(); + } + +} diff --git a/src/main/java/appeng/client/gui/widgets/Scrollbar.java b/src/main/java/appeng/client/gui/widgets/Scrollbar.java index 4b842ed18..90ffff101 100644 --- a/src/main/java/appeng/client/gui/widgets/Scrollbar.java +++ b/src/main/java/appeng/client/gui/widgets/Scrollbar.java @@ -18,17 +18,62 @@ package appeng.client.gui.widgets; -import com.mojang.blaze3d.systems.RenderSystem; - -import net.minecraftforge.fml.client.gui.GuiUtils; - import appeng.client.gui.AEBaseScreen; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.client.renderer.Rectangle2d; +import net.minecraft.util.ResourceLocation; -public class Scrollbar implements IScrollSource { +import java.time.Duration; +public class Scrollbar extends AbstractGui implements IScrollSource { + + /** + * Width of the scrollbar handle sprite in the source texture. + */ + private static final int HANDLE_WIDTH = 12; + + /** + * Height of the scrollbar handle sprite in the source texture. + */ + private static final int HANDLE_HEIGHT = 15; + + /** + * Texture containing the scrollbar handle sprites. + */ + private static final ResourceLocation TEXTURE = new ResourceLocation("minecraft", + "textures/gui/container/creative_inventory/tabs.png"); + + /** + * Rectangle in the source texture that contains the sprite for an enabled + * handle. + */ + private static final Rectangle2d ENABLED = new Rectangle2d(232, 0, HANDLE_WIDTH, HANDLE_HEIGHT); + + /** + * Rectangle in the source texture that contains the sprite for a disabled + * handle. + */ + private static final Rectangle2d DISABLED = new Rectangle2d(232 + HANDLE_WIDTH, 0, HANDLE_WIDTH, HANDLE_HEIGHT); + + /** + * The screen x-coordinate of the scrollbar's inner track. + */ private int displayX = 0; + + /** + * The screen y-coordinate of the scrollbar's inner track. + */ private int displayY = 0; - private int width = 12; + + /** + * The inner width of the scrollbar track. + */ + private int width = HANDLE_WIDTH; + + /** + * The inner height of the scrollbar track. + */ private int height = 16; private int pageSize = 1; @@ -36,18 +81,51 @@ public class Scrollbar implements IScrollSource { private int minScroll = 0; private int currentScroll = 0; - public void draw(final AEBaseScreen g) { - g.bindTexture("minecraft", "gui/container/creative_inventory/tabs.png"); - RenderSystem.color4f(1.0f, 1.0f, 1.0f, 1.0f); + /** + * True if the scrollbar's handle is currently being dragged. + */ + private boolean dragging; + private final EventRepeater eventRepeater = new EventRepeater( + Duration.ofMillis(250), + Duration.ofMillis(150) + ); + + /** + * Draws the handle of the scrollbar. + *

+ * The GUI is assumed to already contain a prebaked scrollbar track in its + * background. + */ + public void draw(MatrixStack matrices, final AEBaseScreen g) { + setBlitOffset(g.getBlitOffset()); + + // Draw the track (nice for debugging) + // fill(matrices, displayX, displayY, this.displayX + width, this.displayY + height, 0xffff0000); + + g.bindTexture(TEXTURE); + + int yOffset; + Rectangle2d sourceRect; if (this.getRange() == 0) { - GuiUtils.drawTexturedModalRect(this.displayX, this.displayY, 232 + this.width, 0, this.width, 15, - g.getBlitOffset()); + yOffset = 0; + sourceRect = DISABLED; } else { - final int offset = (this.currentScroll - this.minScroll) * (this.height - 15) / this.getRange(); - GuiUtils.drawTexturedModalRect(this.displayX, offset + this.displayY, 232, 0, this.width, 15, - g.getBlitOffset()); + yOffset = getHandleYOffset(); + sourceRect = ENABLED; } + + blit(matrices, this.displayX, this.displayY + yOffset, sourceRect.getX(), sourceRect.getY(), + sourceRect.getWidth(), sourceRect.getHeight()); + } + + /** + * Returns the y-position of the scrollbar handle in relation to the upper edge + * of the scrollbar's track. + */ + private int getHandleYOffset() { + int availableHeight = this.height - HANDLE_HEIGHT; + return (this.currentScroll - this.minScroll) * availableHeight / this.getRange(); } private int getRange() { @@ -111,18 +189,55 @@ public class Scrollbar implements IScrollSource { return this.currentScroll; } - public void click(final double x, final double y) { - if (this.getRange() == 0) { + public boolean mouseDown(double x, double y) { + this.dragging = false; + + // Clicks to the left or right of the scrollbar don't do anything + if (x < displayX || x >= displayX + width) { + return false; + } + + // Clicks to the top or bottom don't do anything either + int relY = (int) Math.round(y - displayY); + if (relY < 0 || relY >= height) { + return false; + } + + int handleYOffset = getHandleYOffset(); + + if (relY < handleYOffset) { + // Clicks above the handle will page up, repeatedly + repeatPageUp(); + eventRepeater.repeat(this::repeatPageUp); + + } else if (relY < handleYOffset + HANDLE_HEIGHT) { + // Clicks on the handle will initiate dragging it + this.dragging = true; + } else { + // Clicks below the handle will page down, repeatedly + repeatPageDown(); + eventRepeater.repeat(this::repeatPageDown); + } + + return true; + } + + public boolean mouseUp(double x, double y) { + this.dragging = false; + this.eventRepeater.stop(); + return false; + } + + public void mouseDragged(double x, double y) { + if (this.getRange() == 0 || !this.dragging || this.eventRepeater.isRepeating()) { return; } - if (x > this.displayX && x <= this.displayX + this.width) { - if (y > this.displayY && y <= this.displayY + this.height) { - this.currentScroll = (int) (y - this.displayY); - this.currentScroll = this.minScroll + ((this.currentScroll * 2 * this.getRange() / this.height)); - this.currentScroll = (this.currentScroll + 1) >> 1; - this.applyRange(); - } + if (y > this.displayY && y <= this.displayY + this.height) { + this.currentScroll = (int) (y - this.displayY); + this.currentScroll = this.minScroll + ((this.currentScroll * 2 * this.getRange() / this.height)); + this.currentScroll = (this.currentScroll + 1) >> 1; + this.applyRange(); } } @@ -131,4 +246,25 @@ public class Scrollbar implements IScrollSource { this.currentScroll += delta * this.pageSize; this.applyRange(); } + + /** + * Ticks the scrollbar for the purposes of input-repeats (since mouse-downs are not repeat-triggered), + * used to repeatedly page-up or page-down when the mouse is held in the area above or below the scrollbar handle. + */ + public void tick() { + this.eventRepeater.tick(); + } + + private void repeatPageUp() { + System.out.println("REPEAT PAGE UP"); + this.currentScroll -= this.pageSize; + this.applyRange(); + } + + private void repeatPageDown() { + System.out.println("REPEAT PAGE DOWN"); + this.currentScroll += this.pageSize; + this.applyRange(); + } + } From 4ba97ec89962517fde039cb51e93834ac02eb97d Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 13 Sep 2020 22:11:40 +0200 Subject: [PATCH 4/7] Remove unnecessary debug prints, and rename methods. --- .../java/appeng/client/gui/widgets/Scrollbar.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/appeng/client/gui/widgets/Scrollbar.java b/src/main/java/appeng/client/gui/widgets/Scrollbar.java index 90ffff101..2a6b02ea5 100644 --- a/src/main/java/appeng/client/gui/widgets/Scrollbar.java +++ b/src/main/java/appeng/client/gui/widgets/Scrollbar.java @@ -207,16 +207,16 @@ public class Scrollbar extends AbstractGui implements IScrollSource { if (relY < handleYOffset) { // Clicks above the handle will page up, repeatedly - repeatPageUp(); - eventRepeater.repeat(this::repeatPageUp); + pageUp(); + eventRepeater.repeat(this::pageUp); } else if (relY < handleYOffset + HANDLE_HEIGHT) { // Clicks on the handle will initiate dragging it this.dragging = true; } else { // Clicks below the handle will page down, repeatedly - repeatPageDown(); - eventRepeater.repeat(this::repeatPageDown); + pageDown(); + eventRepeater.repeat(this::pageDown); } return true; @@ -255,14 +255,12 @@ public class Scrollbar extends AbstractGui implements IScrollSource { this.eventRepeater.tick(); } - private void repeatPageUp() { - System.out.println("REPEAT PAGE UP"); + private void pageUp() { this.currentScroll -= this.pageSize; this.applyRange(); } - private void repeatPageDown() { - System.out.println("REPEAT PAGE DOWN"); + private void pageDown() { this.currentScroll += this.pageSize; this.applyRange(); } From d87ff9d1e7dc0b35cca886fe648a0df6eb841dfc Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 13 Sep 2020 22:18:38 +0200 Subject: [PATCH 5/7] Formatting fixes. --- .../client/gui/widgets/EventRepeater.java | 21 +++++++++++-------- .../appeng/client/gui/widgets/Scrollbar.java | 19 +++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main/java/appeng/client/gui/widgets/EventRepeater.java b/src/main/java/appeng/client/gui/widgets/EventRepeater.java index bac50ec5c..8c804c2d8 100644 --- a/src/main/java/appeng/client/gui/widgets/EventRepeater.java +++ b/src/main/java/appeng/client/gui/widgets/EventRepeater.java @@ -21,15 +21,16 @@ package appeng.client.gui.widgets; import java.time.Duration; /** - * This class can be used to implement repeating events such as holding down a button to fire - * an event repeatedly while the button is still being held, or repeatedly scrolling down - * a page, while the mouse is held down on the scrollbar. + * This class can be used to implement repeating events such as holding down a + * button to fire an event repeatedly while the button is still being held, or + * repeatedly scrolling down a page, while the mouse is held down on the + * scrollbar. */ public class EventRepeater { /** - * -1 if no repeat event is scheduled. - * Otherwise contains the {@link System#nanoTime()} at which the next event should occur. + * -1 if no repeat event is scheduled. Otherwise contains the + * {@link System#nanoTime()} at which the next event should occur. */ private long nextEventTime = -1; @@ -49,7 +50,8 @@ public class EventRepeater { return; // No event scheduled } - // Use nanoTime here because it is monotonically increasing, while System.currentTimeMillis is not + // Use nanoTime here because it is monotonically increasing, while + // System.currentTimeMillis is not long nanoTime = System.nanoTime(); if (nanoTime < this.nextEventTime) { return; // Event time not reached @@ -63,10 +65,11 @@ public class EventRepeater { } /** - * Schedule the given callback to be called after a given initial delay, and then - * after the given interval repeatedly. + * Schedule the given callback to be called after a given initial delay, and + * then after the given interval repeatedly. * - *

Replaces any previously queued callback. + *

+ * Replaces any previously queued callback. */ public void repeat(EventCallback callback) { long time = System.nanoTime(); diff --git a/src/main/java/appeng/client/gui/widgets/Scrollbar.java b/src/main/java/appeng/client/gui/widgets/Scrollbar.java index 2a6b02ea5..b25b0e703 100644 --- a/src/main/java/appeng/client/gui/widgets/Scrollbar.java +++ b/src/main/java/appeng/client/gui/widgets/Scrollbar.java @@ -18,13 +18,15 @@ package appeng.client.gui.widgets; -import appeng.client.gui.AEBaseScreen; +import java.time.Duration; + import com.mojang.blaze3d.matrix.MatrixStack; + import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.util.ResourceLocation; -import java.time.Duration; +import appeng.client.gui.AEBaseScreen; public class Scrollbar extends AbstractGui implements IScrollSource { @@ -86,10 +88,7 @@ public class Scrollbar extends AbstractGui implements IScrollSource { */ private boolean dragging; - private final EventRepeater eventRepeater = new EventRepeater( - Duration.ofMillis(250), - Duration.ofMillis(150) - ); + private final EventRepeater eventRepeater = new EventRepeater(Duration.ofMillis(250), Duration.ofMillis(150)); /** * Draws the handle of the scrollbar. @@ -101,7 +100,8 @@ public class Scrollbar extends AbstractGui implements IScrollSource { setBlitOffset(g.getBlitOffset()); // Draw the track (nice for debugging) - // fill(matrices, displayX, displayY, this.displayX + width, this.displayY + height, 0xffff0000); + // fill(matrices, displayX, displayY, this.displayX + width, this.displayY + + // height, 0xffff0000); g.bindTexture(TEXTURE); @@ -248,8 +248,9 @@ public class Scrollbar extends AbstractGui implements IScrollSource { } /** - * Ticks the scrollbar for the purposes of input-repeats (since mouse-downs are not repeat-triggered), - * used to repeatedly page-up or page-down when the mouse is held in the area above or below the scrollbar handle. + * Ticks the scrollbar for the purposes of input-repeats (since mouse-downs are + * not repeat-triggered), used to repeatedly page-up or page-down when the mouse + * is held in the area above or below the scrollbar handle. */ public void tick() { this.eventRepeater.tick(); From 38244000c9ba3dd07bf0c3c67dd7e6f0e74b1cc1 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 13 Sep 2020 23:12:59 +0200 Subject: [PATCH 6/7] Fixes #4731: Take the position where the user clicked the handle into account when calculating the new scrollbar position. Also fixes: The scrollbar did not subtract the handle height when determining the available space for moving the handle, thus introducing drift the further down a user scrolled. Also fixes: The scrollbar did not resize it's trackbar when the ME inventory screens were resized and the number of rows changed, same for craft confirm. --- .../implementations/CraftConfirmScreen.java | 2 + .../InterfaceTerminalScreen.java | 7 +-- .../implementations/MEMonitorableScreen.java | 2 + .../appeng/client/gui/widgets/Scrollbar.java | 47 ++++++++++++++++--- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java b/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java index 771d58cda..76c14ff85 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java @@ -97,6 +97,8 @@ public class CraftConfirmScreen extends AEBaseScreen { addButton(new Button(this.guiLeft + 6, this.guiTop + this.ySize - 25, 50, 20, GuiText.Cancel.text(), btn -> subGui.goBack())); + + this.setScrollBar(); } @Override diff --git a/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java b/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java index 1bd3157e3..5d93481cb 100644 --- a/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java +++ b/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java @@ -71,8 +71,7 @@ public class InterfaceTerminalScreen extends AEBaseScreen extends AEBas craftingGridOffsetX -= 25; craftingGridOffsetY -= 6; + this.setScrollBar(); + } @Override diff --git a/src/main/java/appeng/client/gui/widgets/Scrollbar.java b/src/main/java/appeng/client/gui/widgets/Scrollbar.java index b25b0e703..a580a2219 100644 --- a/src/main/java/appeng/client/gui/widgets/Scrollbar.java +++ b/src/main/java/appeng/client/gui/widgets/Scrollbar.java @@ -25,9 +25,20 @@ import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; import appeng.client.gui.AEBaseScreen; +/** + * Implements a vertical scrollbar using Vanilla's scrollbar handle texture from + * the creative tab. + *

+ * It is expected that the background of the UI contains a pre-baked scrollbar + * track border, and that the exact rectangle of that track is set on this + * object via {@link #setLeft(int)}, {@link #setTop(int)} and + * {@link #setHeight(int)}. While the width of the track can also be set, the + * drawn handle will use vanilla's sprite width (see {@link #HANDLE_WIDTH}. + */ public class Scrollbar extends AbstractGui implements IScrollSource { /** @@ -87,6 +98,12 @@ public class Scrollbar extends AbstractGui implements IScrollSource { * True if the scrollbar's handle is currently being dragged. */ private boolean dragging; + /** + * The y-coordinate relative to the upper edge of the scrollbar handle, where + * the user pressed the mouse button to drag. While dragging, this is applied as + * an offset to the effective scrollbar position. + */ + private int dragYOffset; private final EventRepeater eventRepeater = new EventRepeater(Duration.ofMillis(250), Duration.ofMillis(150)); @@ -124,6 +141,9 @@ public class Scrollbar extends AbstractGui implements IScrollSource { * of the scrollbar's track. */ private int getHandleYOffset() { + if (getRange() == 0) { + return 0; + } int availableHeight = this.height - HANDLE_HEIGHT; return (this.currentScroll - this.minScroll) * availableHeight / this.getRange(); } @@ -203,6 +223,11 @@ public class Scrollbar extends AbstractGui implements IScrollSource { return false; } + // Do nothing when there's no range, but swallow the event + if (getRange() == 0) { + return true; + } + int handleYOffset = getHandleYOffset(); if (relY < handleYOffset) { @@ -213,6 +238,7 @@ public class Scrollbar extends AbstractGui implements IScrollSource { } else if (relY < handleYOffset + HANDLE_HEIGHT) { // Clicks on the handle will initiate dragging it this.dragging = true; + this.dragYOffset = relY - handleYOffset; } else { // Clicks below the handle will page down, repeatedly pageDown(); @@ -233,15 +259,24 @@ public class Scrollbar extends AbstractGui implements IScrollSource { return; } - if (y > this.displayY && y <= this.displayY + this.height) { - this.currentScroll = (int) (y - this.displayY); - this.currentScroll = this.minScroll + ((this.currentScroll * 2 * this.getRange() / this.height)); - this.currentScroll = (this.currentScroll + 1) >> 1; - this.applyRange(); - } + // Compute the position of the mouse (adjusted for where it grabbed the handle, + // so as if it grabbed + // the upper edge of it) within the scrollable area of the track (minus the + // handle height). + double handleUpperEdgeY = y - this.displayY - this.dragYOffset; + double availableHeight = this.height - HANDLE_HEIGHT; + double position = MathHelper.clamp(handleUpperEdgeY / availableHeight, 0.0, 1.0); + + this.currentScroll = this.minScroll + (int) Math.round(position * this.getRange()); + this.applyRange(); } public void wheel(double delta) { + // Do nothing when there's no range + if (getRange() == 0) { + return; + } + delta = Math.max(Math.min(-delta, 1), -1); this.currentScroll += delta * this.pageSize; this.applyRange(); From 5b3ccf26d0e3690f02b7d397d54d4814b753cda7 Mon Sep 17 00:00:00 2001 From: yueh Date: Mon, 14 Sep 2020 14:14:00 +0200 Subject: [PATCH 7/7] Merge all gradle files (#4732) * Merge all gradle files The specific build files are now much smaller, so a single one is mostly acceptable now. Also updates Gradle to 5.6.3 * Disable the Mixin annotation processor when importing this project into IntelliJ since it should only be needed to generate refmaps on an actual build. * Removed Sonarqube and JaCoCo plugins. Co-authored-by: Sebastian Hartte --- build.gradle | 179 ++++++++++++++++++++--- gradle/scripts/artifacts.gradle | 81 ---------- gradle/scripts/curseforge.gradle | 39 ----- gradle/scripts/dependencies.gradle | 42 ------ gradle/scripts/spotless.gradle | 32 ---- gradle/wrapper/gradle-wrapper.jar | Bin 54413 -> 56177 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 157 insertions(+), 218 deletions(-) delete mode 100644 gradle/scripts/artifacts.gradle delete mode 100644 gradle/scripts/curseforge.gradle delete mode 100644 gradle/scripts/dependencies.gradle delete mode 100644 gradle/scripts/spotless.gradle diff --git a/build.gradle b/build.gradle index ead856fad..624b47371 100644 --- a/build.gradle +++ b/build.gradle @@ -30,11 +30,10 @@ buildscript { } plugins { - id "maven-publish" - id "com.diffplug.gradle.spotless" version "4.3.0" - id "com.matthewprenger.cursegradle" version "1.4.0" - id "org.sonarqube" version "2.8" - id "jacoco" + id "maven-publish" + id "com.diffplug.gradle.spotless" version "4.3.0" + id "com.matthewprenger.cursegradle" version "1.4.0" + id "idea" } apply plugin: 'net.minecraftforge.gradle' @@ -45,8 +44,32 @@ repositories { mavenLocal() jcenter() mavenCentral() + maven { // modmaven, maven proxy + name 'modmaven' + url "https://modmaven.k-4u.nl/" + } } +dependencies { + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + + // compile against provided APIs + compileOnly "mezz.jei:jei-${minecraft_version}:${jei_version}:api" + compileOnly "mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}:api" + + // Runtime, Mods + runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}") + runtimeOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}") + + // unit test dependencies + testCompile "junit:junit:4.13" + + // Annotation Processors + annotationProcessor 'org.spongepowered:mixin:0.8:processor' +} +group = artifact_group +archivesBaseName = artifact_basename + sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 compileJava { sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 @@ -58,7 +81,8 @@ tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } -// Create version number +/////////////////// +// Version Number version = version_major + "." + version_minor + "." + version_patch ext.pr = System.getenv('PR_NUMBER') ?: "" @@ -76,10 +100,8 @@ if (ext.release) { version = ext.release } - -// Maven group and artifact name -group = artifact_group -archivesBaseName = artifact_basename +ext.isAlpha = project.version.contains("alpha") +ext.isBeta = project.version.contains("beta") sourceSets { api @@ -103,9 +125,8 @@ configurations { apiCompile.extendsFrom(compile) } -apply from: 'gradle/scripts/dependencies.gradle' -apply from: 'gradle/scripts/spotless.gradle' - +//////////////////// +// Forge/Minecraft minecraft { mappings channel: "snapshot", version: project.mcp_mappings @@ -147,18 +168,14 @@ minecraft { } } +/////////// +// Mixins mixin { add sourceSets.main, "appliedenergistics2.mixins.refmap.json" } -jar { - manifest { - attributes([ - "MixinConfigs": "appliedenergistics2.mixins.json" - ]) - } -} - +//////////////// +// Jar Signing def signProps = [:] if (System.getenv("KEY_STORE_FILE")) { signProps['keyStore'] = System.getenv("KEY_STORE_FILE") @@ -181,9 +198,75 @@ task signJar(type: net.minecraftforge.gradle.common.task.SignJar, dependsOn: 're } } -apply from: 'gradle/scripts/artifacts.gradle' -apply from: 'gradle/scripts/curseforge.gradle' +////////////// +// Aritfacts +processResources { + exclude '.cache' +} +jar { + finalizedBy 'reobfJar' + finalizedBy 'signJar' + + from sourceSets.main.output.classesDirs + from sourceSets.api.output.classesDirs + from sourceSets.main.output.resourcesDir + from sourceSets.api.output.resourcesDir + + manifest { + attributes([ + "Specification-Title": "Applied Energistics 2", + "Specification-Vendor": "TeamAppliedEnergistics", + "Specification-Version": "${project.version}", + "Implementation-Title": "${project.name}", + "Implementation-Version": "${project.version}", + "Implementation-Vendor" :"TeamAppliedEnergistics", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + "MixinConfigs": "appliedenergistics2.mixins.json" + ]) + } +} + +task javadocs(type: Javadoc) { + classpath = sourceSets.main.compileClasspath + source = sourceSets.api.java + include "appeng/api/**" + + options.addStringOption('Xdoclint:none', '-quiet') + options.encoding = 'UTF-8' + options.charSet = 'UTF-8' +} + +task javadocJar(type: Jar, dependsOn: javadocs) { + classifier = "javadoc" + from javadoc.destinationDir +} + +task sourcesJar(type: Jar) { + classifier = "sources" + from sourceSets.main.allJava + from sourceSets.api.allJava +} + +task apiJar(type: Jar) { + classifier = "api" + from sourceSets.api.output + include "appeng/api/**" + + // TODO: when FG bug is fixed, remove allJava from the api jar. + // https://github.com/MinecraftForge/ForgeGradle/issues/369 + // Gradle should be able to pull them from the -sources jar. + from sourceSets.api.allJava +} + +artifacts { + archives javadocJar + archives sourcesJar + archives apiJar +} + +////////////////// +// Maven publish publishing { publications { maven(MavenPublication) { @@ -222,3 +305,53 @@ publishing { } } } + +///////////// +// Spotless +spotless { + java { + target 'src/*/java/appeng/**/*.java' + + indentWithSpaces() + eclipse().configFile 'codeformat/codeformat.xml' + importOrderFile 'codeformat/ae2.importorder' + } + format 'json', { + target 'src/*/resources/**/*.json' + targetExclude 'src/generated/resources/**' + prettier().config(['parser': 'json']) + } +} + +//////////////// +// Curse Forge +if (System.getenv("CURSEFORGE")) { + def cfReleaseType = "release" + if (ext.isAlpha) { + cfReleaseType = "alpha" + } else if (ext.isBeta) { + cfReleaseType = "beta" + } + + curseforge { + apiKey = System.getenv("CURSEFORGE") + project { + id = project.curseforge_project + changelogType = "markdown" + changelog = System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases) for a changelog" + releaseType = cfReleaseType + } + } +} + +//////////////// +// IntelliJ Project Import +// The Mixin annotation process does not have an obfuscation source when running through the IntelliJ compiler, +// thus we have to prevent it from being activated as part of importing this Gradle project into IntelliJ. +if (System.getProperty("idea.sync.active") == "true") { + afterEvaluate { + tasks.withType(JavaCompile).all { + it.options.annotationProcessorPath = files() + } + } +} diff --git a/gradle/scripts/artifacts.gradle b/gradle/scripts/artifacts.gradle deleted file mode 100644 index f9503ff9b..000000000 --- a/gradle/scripts/artifacts.gradle +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, 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 . - */ - -processResources { - exclude '.cache' -} - -jar { - finalizedBy 'reobfJar' - finalizedBy 'signJar' - - from sourceSets.main.output.classesDirs - from sourceSets.api.output.classesDirs - from sourceSets.main.output.resourcesDir - from sourceSets.api.output.resourcesDir - - manifest { - attributes([ - "Specification-Title": "Applied Energistics 2", - "Specification-Vendor": "TeamAppliedEnergistics", - "Specification-Version": "${project.version}", - "Implementation-Title": "${project.name}", - "Implementation-Version": "${project.version}", - "Implementation-Vendor" :"TeamAppliedEnergistics", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - ]) - } -} - -task javadocs(type: Javadoc) { - classpath = sourceSets.main.compileClasspath - source = sourceSets.api.java - include "appeng/api/**" - - options.addStringOption('Xdoclint:none', '-quiet') - options.encoding = 'UTF-8' - options.charSet = 'UTF-8' -} - -task javadocJar(type: Jar, dependsOn: javadocs) { - classifier = "javadoc" - from javadoc.destinationDir -} - -task sourcesJar(type: Jar) { - classifier = "sources" - from sourceSets.main.allJava - from sourceSets.api.allJava -} - -task apiJar(type: Jar) { - classifier = "api" - from sourceSets.api.output - include "appeng/api/**" - - // TODO: when FG bug is fixed, remove allJava from the api jar. - // https://github.com/MinecraftForge/ForgeGradle/issues/369 - // Gradle should be able to pull them from the -sources jar. - from sourceSets.api.allJava -} - -artifacts { - archives javadocJar - archives sourcesJar - archives apiJar -} \ No newline at end of file diff --git a/gradle/scripts/curseforge.gradle b/gradle/scripts/curseforge.gradle deleted file mode 100644 index a925a4506..000000000 --- a/gradle/scripts/curseforge.gradle +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2020, TeamAppliedEnergistics, 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 - *g 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 . - */ - -def isAlpha = project.version.contains("alpha") -def isBeta = project.version.contains("beta") - -def cfReleaseType = "release" -if (isAlpha) { - cfReleaseType = "alpha" -} else if (isBeta) { - cfReleaseType = "beta" -} - -if (System.getenv("CURSEFORGE")) { - curseforge { - apiKey = System.getenv("CURSEFORGE") - project { - id = project.curseforge_project - changelogType = "markdown" - changelog = System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases) for a changelog" - releaseType = cfReleaseType - } - } -} \ No newline at end of file diff --git a/gradle/scripts/dependencies.gradle b/gradle/scripts/dependencies.gradle deleted file mode 100644 index 064d84dde..000000000 --- a/gradle/scripts/dependencies.gradle +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, 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 . - */ - -repositories { - mavenLocal() - - maven { // modmaven, maven proxy - name 'modmaven' - url "https://modmaven.k-4u.nl/" - } -} - -dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - - // compile against provided APIs - compileOnly "mezz.jei:jei-${minecraft_version}:${jei_version}:api" - compileOnly "mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}:api" - - // Runtime, Mods - runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}") - runtimeOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}") - //runtimeOnly fg.deobf("team.chisel.ctm:CTM:${ctm_version}") - - // unit test dependencies - testCompile "junit:junit:4.13" -} diff --git a/gradle/scripts/spotless.gradle b/gradle/scripts/spotless.gradle deleted file mode 100644 index ef51ef3cf..000000000 --- a/gradle/scripts/spotless.gradle +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2020, 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 - *g 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 . - */ - -spotless { - java { - target 'src/*/java/appeng/**/*.java' - - indentWithSpaces() - eclipse().configFile 'codeformat/codeformat.xml' - importOrderFile 'codeformat/ae2.importorder' - } - format 'json', { - target 'src/*/resources/**/*.json' - targetExclude 'src/generated/resources/**' - prettier().config(['parser': 'json']) - } -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 0d4a9516871afd710a9d84d89e31ba77745607bd..94336fcae912db8a11d55634156fa011f4686124 100644 GIT binary patch delta 49463 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 z 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 Q!O6+7SG3svoCJvi08JSRr~m)} delta 47733 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 U01_x__aB<R diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 290541c73..f04d6a20a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists