GoodPushes
This commit is contained in:
parent
506bb66b13
commit
d60b1aa716
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
Reference in New Issue
Block a user