From 1b282bd49cee27b9232561a65c8af7b73079f5b4 Mon Sep 17 00:00:00 2001 From: jottyfan Date: Sun, 13 Feb 2022 21:22:27 +0100 Subject: [PATCH] drill optimization --- gradle.properties | 2 +- .../blockentity/DrillBlockDownEntity.java | 37 +++++++++++++++++- .../blockentity/DrillBlockEastEntity.java | 8 +++- .../blockentity/DrillBlockEntity.java | 22 +++++++---- .../blockentity/DrillBlockNorthEntity.java | 8 +++- .../blockentity/DrillBlockSouthEntity.java | 8 +++- .../blockentity/DrillBlockWestEntity.java | 8 +++- .../textures/block/drilleast.png | Bin 1531 -> 6014 bytes .../textures/block/drillnorth.png | Bin 1546 -> 6059 bytes .../textures/block/drillsouth.png | Bin 1509 -> 6034 bytes .../textures/block/drillwest.png | Bin 1517 -> 6047 bytes 11 files changed, 80 insertions(+), 13 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3af1f63..82eaba6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ loader_version=0.12.12 # Mod Properties - mod_version = 1.18.1.4 + mod_version = 1.18.1.5 maven_group = de.jottyfan.minecraft archives_base_name = quickiefabric diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockDownEntity.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockDownEntity.java index cb2adb1..7cbe2d2 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockDownEntity.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockDownEntity.java @@ -1,5 +1,8 @@ package de.jottyfan.minecraft.quickiefabric.blockentity; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; @@ -21,7 +24,39 @@ public class DrillBlockDownEntity extends DrillBlockEntity { public static void tick(World world, BlockPos pos, BlockState state, BlockEntity be) { if (be instanceof DrillBlockDownEntity) { DrillBlockDownEntity dbe = (DrillBlockDownEntity) be; - DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, pos.down()); + DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, generateBlockPos(pos)); } } + + public static final List generateBlockPos(BlockPos pos) { + List list = new ArrayList<>(); + Integer tracesMod = pos.getY() % 8; + tracesMod = tracesMod < 0 ? tracesMod * -1 : tracesMod; // lower that 0 makes it negative + if (tracesMod != 0) { + list.add(pos.north()); + } + if (tracesMod != 1) { + list.add(pos.north().west()); + } + if (tracesMod != 2) { + list.add(pos.west()); + } + if (tracesMod != 3) { + list.add(pos.south().west()); + } + if (tracesMod != 4) { + list.add(pos.south()); + } + if (tracesMod != 5) { + list.add(pos.south().east()); + } + if (tracesMod != 6) { + list.add(pos.east()); + } + if (tracesMod != 7) { + list.add(pos.north().east()); + } + list.add(pos.down()); // must be last position + return list; + } } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEastEntity.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEastEntity.java index 698de15..5224054 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEastEntity.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEastEntity.java @@ -1,5 +1,8 @@ package de.jottyfan.minecraft.quickiefabric.blockentity; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; @@ -21,7 +24,10 @@ public class DrillBlockEastEntity extends DrillBlockEntity { public static void tick(World world, BlockPos pos, BlockState state, BlockEntity be) { if (be instanceof DrillBlockEastEntity) { DrillBlockEastEntity dbe = (DrillBlockEastEntity) be; - DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, pos.east().down()); + List list = new ArrayList<>(); + list.add(pos.east()); + list.add(pos.east().down()); // must be last position + DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, list); } } } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEntity.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEntity.java index fd6cc6f..587a707 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEntity.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockEntity.java @@ -1,5 +1,7 @@ package de.jottyfan.minecraft.quickiefabric.blockentity; +import java.util.List; + import de.jottyfan.minecraft.quickiefabric.blocks.QuickieBlocks; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -29,19 +31,25 @@ public abstract class DrillBlockEntity extends BlockEntity { } } - protected static final void drill(BlockPos pos, BlockPos to, World world) { - if (!world.getBlockState(to).isOf(Blocks.BEDROCK) && !world.getBlockState(to).isOf(QuickieBlocks.DRILLSTOP)) { - world.breakBlock(to, true); - if (pos.down() != to) { // no need for the falling one - moveBlockWithEntity(pos, to, world); + protected static final Boolean drill(BlockPos pos, List toList, World world) { + Boolean lastSuccess = false; + for (BlockPos to : toList) { + if (!world.getBlockState(to).isOf(Blocks.BEDROCK) && !world.getBlockState(to).isOf(QuickieBlocks.DRILLSTOP)) { + world.breakBlock(to, true); + lastSuccess = pos.down() != to; // no need for the falling one + } else { + lastSuccess = false; // in case that the last one is a bedrock or a drillstop } } + return lastSuccess; } - public static void tick(World world, BlockPos pos, BlockState state, DrillBlockEntity be, Integer maxDrillStep, BlockPos drillPosition) { + public static void tick(World world, BlockPos pos, BlockState state, DrillBlockEntity be, Integer maxDrillStep, List drillPosition) { if (be.getDrillstep() < 1) { be.setDrillstep(maxDrillStep); - drill(pos, drillPosition, world); + if (drill(pos, drillPosition, world)) { + moveBlockWithEntity(pos, drillPosition.get(drillPosition.size() - 1), world); + } } else { be.doDrillstep(); } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockNorthEntity.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockNorthEntity.java index 42585d9..7cda76c 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockNorthEntity.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockNorthEntity.java @@ -1,5 +1,8 @@ package de.jottyfan.minecraft.quickiefabric.blockentity; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; @@ -21,7 +24,10 @@ public class DrillBlockNorthEntity extends DrillBlockEntity { public static void tick(World world, BlockPos pos, BlockState state, BlockEntity be) { if (be instanceof DrillBlockNorthEntity) { DrillBlockNorthEntity dbe = (DrillBlockNorthEntity) be; - DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, pos.north().down()); + List list = new ArrayList<>(); + list.add(pos.north()); + list.add(pos.north().down()); // must be last position + DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, list); } } } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockSouthEntity.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockSouthEntity.java index 2126553..afebe7d 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockSouthEntity.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockSouthEntity.java @@ -1,5 +1,8 @@ package de.jottyfan.minecraft.quickiefabric.blockentity; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; @@ -20,7 +23,10 @@ public class DrillBlockSouthEntity extends DrillBlockEntity { public static void tick(World world, BlockPos pos, BlockState state, BlockEntity be) { if (be instanceof DrillBlockSouthEntity) { DrillBlockSouthEntity dbe = (DrillBlockSouthEntity) be; - DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, pos.south().down()); + List list = new ArrayList<>(); + list.add(pos.south()); + list.add(pos.south().down()); // must be last position + DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, list); } } } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockWestEntity.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockWestEntity.java index 2238b7f..983ab24 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockWestEntity.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/blockentity/DrillBlockWestEntity.java @@ -1,5 +1,8 @@ package de.jottyfan.minecraft.quickiefabric.blockentity; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; @@ -21,7 +24,10 @@ public class DrillBlockWestEntity extends DrillBlockEntity { public static void tick(World world, BlockPos pos, BlockState state, BlockEntity be) { if (be instanceof DrillBlockWestEntity) { DrillBlockWestEntity dbe = (DrillBlockWestEntity) be; - DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, pos.west().down()); + List list = new ArrayList<>(); + list.add(pos.west()); + list.add(pos.west().down()); // must be last position + DrillBlockEntity.tick(world, pos, state, dbe, MAXDRILLSTEP, list); } } } diff --git a/src/main/resources/assets/quickiefabric/textures/block/drilleast.png b/src/main/resources/assets/quickiefabric/textures/block/drilleast.png index f77028aa8e9c4c127f637de2b6eba965b2935917..0b151bd0d1f2ffe2cbce2890c3443625828c946a 100644 GIT binary patch literal 6014 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 delta 1386 zcmV-w1(o{#F8d3RBLW2DktHF2<0=gOXBE8!Br%BPV1{$v4&L(nGT0d^RbA=okQgjv zA#|^VW7_}!b@K}!wyMVYs3C=5@o~u|&KRg&pVgCf^SW>BIe3tpYl0yX^s;V4+xi)D ze|sRhEk7RRCYEhSx1rPWHYj6d#$fB|HYB{{wC_#Y&t-SFo&A$IO4WEK{jh

^OnnFD2xqTAw0!s%gMiv z-Hgx^YUj!i6GS%J`_EnMdav4hTf56HAX35XO`ThrBPbpSrOd|yTEx#|9A`^tiY*od zy#mbxtr$wgh;}DOl`?gIYO^m?;G*Nk5j}GO21BM2IdPd_xY4L{lqA)N0;dAh1Y*8? zp}B6F>lIS0TnU;?Fh+RdLo=_0f732Qy_XeYyj(zu}mDEZrqZIvp~;VXY8Uo#kvh3L|EIy84@6WU;`*k0c2o~M2MpT zpA64g93Mb{yyr@$0~?V5aFoZ|cqY=+WzS2D(lSy*0#ZeRPzG4edGIGX1&6X1?~M08 z_~_LqpMwM!dyhtp+`D$0ey-qzJwBsmQ-@(Di!HpLye|tO*J=api*ME8a3Le4aD5ki#OCDj`1`>qn!AG84zPfKs*ivKxiJA zStaLqAU80xiIEhZfg1S%PNjhu5Oj^$ce=2J5SC7qnPR(5)d25+8A3A1lv7>z=-=wfTh ze(ka}>Z5Ac#cxo%$w@VHan9>eH&y}1&#GaYYOp zH=TQuwI`oSd9I=6{p$SK$F*~BCRa~F(sAZfL^!hqul0*Git6!{1oyr9Y~ss)Mg3qo z5TF$gga3H69kOSV&ZG0qlheF?q<(T@nt5dQyQ+H7m9X!ena2JUwtr?Q;^hl})y;2q zHqffz;H3?djuvNsAR44v8oo0~kU`cpv^9EZXdr{w%)MJ9Z%%h)5K_OpJ=E7V5U5xwG<0SV sM3-k7M7#J-sDYZ>V0LYVGQa=;8&Dcosh8mN00000NkvWtM6N<$g4tK8`2YX_ diff --git a/src/main/resources/assets/quickiefabric/textures/block/drillnorth.png b/src/main/resources/assets/quickiefabric/textures/block/drillnorth.png index 1ef914262dd25b7162e6b34444328934ee4d3de9..c8b1ccea749d0165d8a13fd4185958a83f57f6b1 100644 GIT binary patch literal 6059 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⁣ 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 delta 1401 zcmV-<1%~>cFYODEBYyaB^>EX>4U6ba`-PAZ2)IW&i+q+O3vZmK-Sz zMgLhvF9AsmVmXZG^bUIY{TL#rN|&9sGpZ6&K?w1#5Mla%{|@sHK5SKu^HD(=-AVXw}U-P~?4OoCSS&(P2K478tMeXlON z0HuOCi@KJwdVd&LAf>Fw0K?eB8*9Heq$7X&^Vgz-Wl(G@X@PJJ_iXd_z*%2vqt48(M2Caj8S8X zSw)?C4SyO{HEB+q1SQO;kfKSNQpy>VX1LCHI%7o6g^Ltdd*pb4%KIB^g`}?YILYg zVs4F#cWN-lc)6fiPW)sBV(bXS<0OED=E=+|Ie*8K++=1GV^eqrHS!Zqqe%<|T_^T~ zZtU*lzU5}T`-mI=h@6?|{suWS(H(MMxxJy*@;Xsu0h+sTYHDSmunl&Z6@RG5zu%fa zb?}iR97C&DM6wp(A?Jl16rbjis*GTudD)}7x=|ybVHo+Gs-^Xa{iW9Y>cH7XH&zej zoqtakdY9FK*ht2GI~A=vIFIvmtt#7JZOu;yA`@1x)}Fbx6th zCy(*UHOO$@vG)?QRtex>~JiK)|QKJ^OSgP*p#naxFzJ-D|fx`NZzHyTYov{ zUVHYDFVIINoD4e}+`T-7lNTt|{eI6pVI;m-7r|C4?@;{5{YX5 zq|mMk`SSw1vj@j7Ufsflj2>fTHfVbx!-a?g@X5@0{g*P zU_Lx7-ku4!llC0`rDLZz$P@Z0J%rNJJ}GSWH;VL2_L+P7or;Lpl-jnHLzTUh=K4?0 zB=dLPMgEE-8F>9l=703?!WlMApc<2|7H5Cu0Ui-12-h0x+yDRoVo5|nR0!8&5QG8- zAdYf^GO{N@7^1TaA&m4XfnbK}%+OFJAVW0dN@(@nB1Hy~%DGdcZ_f;55Dksm8W9?j z2vjq>G(1Q(kU>!N%2bFh!AN%~Lo~DqYDFl_F3}_?0}KG`j~hyR##jgd0000