GoodPushes

This commit is contained in:
Ilya 2022-02-11 14:26:39 +03:00
parent 506bb66b13
commit d60b1aa716
3 changed files with 274 additions and 76 deletions

View File

@ -1,4 +1,4 @@
package ru.redguy.extendedpistons; package ru.redguy.extendedpistons; //TODO: Block 3th chest is his at the sides, slime blocks, power supply remove, refactor
import net.milkbowl.vault.permission.Permission; import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;

View File

@ -0,0 +1,264 @@
package ru.redguy.extendedpistons;
import com.google.common.collect.Lists;
import net.minecraft.server.v1_12_R1.*;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class PistonExtendsChecker {
private final net.minecraft.server.v1_12_R1.World a;
private final BlockPosition b;
private final BlockPosition c;
private final EnumDirection d;
private final List<BlockPosition> e = Lists.newArrayList();
private final List<BlockPosition> f = Lists.newArrayList();
private org.bukkit.World bw;
private int maxLength;
private PistonExtendsChecker(World var1, BlockPosition var2, EnumDirection var3, boolean var4) {
this.a = var1;
this.b = var2;
if (var4) {
this.d = var3;
this.c = var2.shift(var3);
} else {
this.d = var3.opposite();
this.c = var2.shift(var3, 2);
}
}
public PistonExtendsChecker(org.bukkit.World var1, Location var2, BlockFace var3, boolean var4, int maxLength) {
this(((CraftWorld)var1).getHandle(),new BlockPosition(var2.getBlockX(),var2.getBlockY(),var2.getBlockZ()),cast(var3),var4);
this.bw = var1;
this.maxLength = maxLength;
}
public boolean a() {
this.e.clear();
this.f.clear();
IBlockData var1 = this.a.getType(this.c);
if (!BlockPiston.a(var1, this.a, this.c, this.d, false, this.d)) {
if (var1.o() == EnumPistonReaction.DESTROY) {
this.f.add(this.c);
return true;
} else {
System.out.println("A"+var1.getBlock().isTileEntity());
return false;
}
} else if (!this.a(this.c, this.d)) {
System.out.println("B");
return false;
} else {
for(int var2 = 0; var2 < this.e.size(); ++var2) {
BlockPosition var3 = (BlockPosition)this.e.get(var2);
if (this.a.getType(var3).getBlock() == Blocks.SLIME && !this.a(var3)) {
System.out.println("C");
return false;
}
}
return true;
}
}
private boolean a(BlockPosition var1, EnumDirection var2) {
IBlockData var3 = this.a.getType(var1);
Block var4 = var3.getBlock();
if (var3.getMaterial() == Material.AIR) {
return true;
} else if (!BlockPiston.a(var3, this.a, var1, this.d, false, var2)) {
return true;
} else if (var1.equals(this.b)) {
return true;
} else if (this.e.contains(var1)) {
return true;
} else {
int var5 = 1;
if (var5 + this.e.size() > maxLength) {//Надо найти почему false и сделать сундуки
return false;
} else {
while(var4 == Blocks.SLIME) {
BlockPosition var6 = var1.shift(this.d.opposite(), var5);
var3 = this.a.getType(var6);
var4 = var3.getBlock();
if (var3.getMaterial() == Material.AIR || !BlockPiston.a(var3, this.a, var6, this.d, false, this.d.opposite()) || var6.equals(this.b)) {
break;
}
++var5;
if (var5 + this.e.size() > maxLength) {
return false;
}
}
int var12 = 0;
int var7;
for(var7 = var5 - 1; var7 >= 0; --var7) {
this.e.add(var1.shift(this.d.opposite(), var7));
++var12;
}
var7 = 1;
while(true) {
BlockPosition var8 = var1.shift(this.d, var7);
int var9 = this.e.indexOf(var8);
if (var9 > -1) {
this.a(var12, var9);
for(int var10 = 0; var10 <= var9 + var12; ++var10) {
BlockPosition var11 = (BlockPosition)this.e.get(var10);
if (this.a.getType(var11).getBlock() == Blocks.SLIME && !this.a(var11)) {
return false;
}
}
return true;
}
var3 = this.a.getType(var8);
if (var3.getMaterial() == Material.AIR) {
return true;
}
if (!BlockPiston.a(var3, this.a, var8, this.d, true, this.d) || var8.equals(this.b)) {
return false;
}
if (var3.o() == EnumPistonReaction.DESTROY) {
this.f.add(var8);
return true;
}
if (this.e.size() >= maxLength) {
return false;
}
this.e.add(var8);
++var12;
++var7;
}
}
}
}
private void a(int var1, int var2) {
ArrayList var3 = Lists.newArrayList();
ArrayList var4 = Lists.newArrayList();
ArrayList var5 = Lists.newArrayList();
var3.addAll(this.e.subList(0, var2));
var4.addAll(this.e.subList(this.e.size() - var1, this.e.size()));
var5.addAll(this.e.subList(var2, this.e.size() - var1));
this.e.clear();
this.e.addAll(var3);
this.e.addAll(var4);
this.e.addAll(var5);
}
private boolean a(BlockPosition var1) {
EnumDirection[] var2 = EnumDirection.values();
int var3 = var2.length;
for(int var4 = 0; var4 < var3; ++var4) {
EnumDirection var5 = var2[var4];
if (var5.k() != this.d.k() && !this.a(var1.shift(var5), var5)) {
return false;
}
}
return true;
}
public List<BlockPosition> getMovedBlocks() {
return this.e;
}
public List<BlockPosition> getBrokenBlocks() {
return this.f;
}
public List<Location> getMovedBlocksLocations() {
return this.e.stream().map(bp -> new Location(bw,bp.getX(),bp.getY(),bp.getZ())).collect(Collectors.toList());
}
public List<Location> getBrokenBlocksLocations() {
return this.f.stream().map(bp -> new Location(bw,bp.getX(),bp.getY(),bp.getZ())).collect(Collectors.toList());
}
public List<org.bukkit.block.Block> getMovedBlocksObjects() {
return this.e.stream().map(bp -> bw.getBlockAt(bp.getX(),bp.getY(),bp.getZ())).collect(Collectors.toList());
}
public List<org.bukkit.block.Block> getBrokenBlocksObjects() {
return this.f.stream().map(bp -> bw.getBlockAt(bp.getX(),bp.getY(),bp.getZ())).collect(Collectors.toList());
}
public static EnumDirection cast(BlockFace face) {
switch (face) {
case UP:
return EnumDirection.UP;
case DOWN:
return EnumDirection.DOWN;
case WEST:
return EnumDirection.WEST;
case SOUTH:
return EnumDirection.SOUTH;
case NORTH:
return EnumDirection.NORTH;
case EAST:
return EnumDirection.EAST;
}
return null;
}
public static class BlockPiston {
public static boolean a(IBlockData iblockdata, World world, BlockPosition blockposition, EnumDirection enumdirection, boolean flag, EnumDirection enumdirection1) {
Block block = iblockdata.getBlock();
if (block == Blocks.OBSIDIAN) {
return false;
} else if (!world.getWorldBorder().a(blockposition)) {
return false;
} else if (blockposition.getY() < 0 || enumdirection == EnumDirection.DOWN && blockposition.getY() == 0) {
return false;
} else if (blockposition.getY() > world.getHeight() - 1 || enumdirection == EnumDirection.UP && blockposition.getY() == world.getHeight() - 1) {
return false;
} else {
if (block != Blocks.PISTON && block != Blocks.STICKY_PISTON) {
if (iblockdata.b(world, blockposition) == -1.0F) {
return false;
}
switch(iblockdata.o().ordinal()) {
case 2:
return flag;
case 3:
return false;
case 4:
default:
break;
case 5:
if (enumdirection == enumdirection1) {
return true;
}
return false;
}
} else if ((Boolean)iblockdata.get(net.minecraft.server.v1_12_R1.BlockPiston.EXTENDED)) {
return false;
}
if(block.isTileEntity()) {
return block == Blocks.CHEST || block == Blocks.FURNACE || block == Blocks.LIT_FURNACE;
} else {
return true;
}
}
}
}
}

View File

@ -27,43 +27,9 @@ public class WorldListener implements Listener {
PistonBaseMaterial piston = (PistonBaseMaterial) state.getData(); PistonBaseMaterial piston = (PistonBaseMaterial) state.getData();
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation()); int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
ArrayList<Block> blocks = new ArrayList<>(); PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(),e.getBlock().getLocation(),piston.getFacing(),true,maxBlocks);
boolean isMovable = true;
Block firstBlock = block.getRelative(piston.getFacing());
if (firstBlock.isLiquid() || firstBlock.isEmpty()) {
} else {
for (int i = 1; i < maxBlocks + 1; i++) {
Block b = block.getRelative(piston.getFacing(), i);
if (b.isLiquid() || b.isEmpty()) break;
if (b.getPistonMoveReaction().equals(PistonMoveReaction.IGNORE) || b.getPistonMoveReaction().equals(PistonMoveReaction.BLOCK)) {
break;
} else if (b.getPistonMoveReaction().equals(PistonMoveReaction.BREAK)) {
break;
} else if(b.getPistonMoveReaction().equals(PistonMoveReaction.MOVE)) {
if (b.getType() == Material.CHEST || b.getType() == Material.FURNACE || b.getType() == Material.BURNING_FURNACE) {
if (ExtendedPistons.INSTANCE.isAllowedTime()) {
if(b.getType() == Material.CHEST) {
Block b2 = block.getRelative(piston.getFacing(), i+2);
if(b2.getType() == Material.CHEST) {
Chest chest = (Chest) b2.getState();
InventoryHolder ih = chest.getInventory().getHolder();
if (ih instanceof DoubleChest) {
isMovable = false;
} else blocks.add(b);
} else blocks.add(b);
} else blocks.add(b);
} else isMovable = false;
}
} else {
blocks.add(b);
}
}
Block lastBlock = block.getRelative(piston.getFacing(), blocks.size() + 1);
if (!(lastBlock.getPistonMoveReaction().equals(PistonMoveReaction.BREAK) || lastBlock.isEmpty() || lastBlock.isLiquid()))
isMovable = false;
}
if (!isMovable) { if (!checker.a()) {
e.setCancelled(true); e.setCancelled(true);
} }
} }
@ -147,51 +113,19 @@ public class WorldListener implements Listener {
PistonBaseMaterial piston = (PistonBaseMaterial) state.getData(); PistonBaseMaterial piston = (PistonBaseMaterial) state.getData();
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation()); int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
ArrayList<Block> blocks = new ArrayList<>(); PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(),block.getLocation(),piston.getFacing(),true,maxBlocks);
Block toBreak = null; boolean isMovable = checker.a();
boolean isMovable = true; List<Block> blocks = checker.getMovedBlocksObjects();
Block firstBlock = block.getRelative(piston.getFacing()); List<Block> toBreak = checker.getBrokenBlocksObjects();
if (firstBlock.isLiquid() || firstBlock.isEmpty()) {
} else {
for (int i = 1; i < maxBlocks + 1; i++) {
Block b = block.getRelative(piston.getFacing(), i);
if (b.isLiquid() || b.isEmpty()) break;
if (b.getPistonMoveReaction().equals(PistonMoveReaction.IGNORE) || b.getPistonMoveReaction().equals(PistonMoveReaction.BLOCK)) {
break;
} else if (b.getPistonMoveReaction().equals(PistonMoveReaction.BREAK)) {
toBreak = b;
break;
} else if(b.getPistonMoveReaction().equals(PistonMoveReaction.MOVE)) {
if (b.getType() == Material.CHEST || b.getType() == Material.FURNACE || b.getType() == Material.BURNING_FURNACE) {
if (ExtendedPistons.INSTANCE.isAllowedTime()) {
if(b.getType() == Material.CHEST) {
Block b2 = block.getRelative(piston.getFacing(), i+2);
if(b2.getType() == Material.CHEST) {
Chest chest = (Chest) b2.getState();
InventoryHolder ih = chest.getInventory().getHolder();
if (ih instanceof DoubleChest) {
isMovable = false;
} else blocks.add(b);
} else blocks.add(b);
} else blocks.add(b);
} else isMovable = false;
}
} else {
blocks.add(b);
}
}
Block lastBlock = block.getRelative(piston.getFacing(), blocks.size() + 1);
if (!(lastBlock.getPistonMoveReaction().equals(PistonMoveReaction.BREAK) || lastBlock.isEmpty() || lastBlock.isLiquid()))
isMovable = false;
}
if (isMovable) { if (isMovable) {
BlockPistonExtendedExtendEvent event = new BlockPistonExtendedExtendEvent(block, blocks, piston.getFacing()); BlockPistonExtendedExtendEvent event = new BlockPistonExtendedExtendEvent(block, blocks, piston.getFacing());
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) return; if (event.isCancelled()) return;
Collections.reverse(blocks); Collections.reverse(blocks);
if (toBreak != null) toBreak.breakNaturally(); for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) { for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing()); Block b2 = b.getRelative(piston.getFacing());
b2.setType(b.getType()); b2.setType(b.getType());