Lock changes

This commit is contained in:
Ilya 2022-11-08 23:15:21 +03:00
parent 53854664fd
commit 36e52df8a6
6 changed files with 917 additions and 917 deletions

View File

@ -1,59 +1,59 @@
plugins {
id 'java'
}
group = 'ru.redguy'
version = '1.0.0'
repositories {
mavenCentral()
maven {
name = 'papermc-repo'
url = 'https://papermc.io/repo/repository/maven-public/'
}
maven {
name = 'sonatype'
url = 'https://oss.sonatype.org/content/groups/public/'
}
maven {
url = 'https://repo.redguy.ru/repository/maven-public/'
}
}
dependencies {
compileOnly 'com.destroystokyo.paper:paper-api:1.12.2-R0.1-SNAPSHOT'
compileOnly 'org.bukkit:craftbukkit:1.12.2-R0.1-20190527.155144-32'
compileOnly "com.github.MilkBowl:VaultAPI:1.7"
compileOnly 'com.sk89q.worldguard:worldguard-legacy:6.2'
}
def targetJavaVersion = 8
java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
}
tasks.withType(JavaCompile).configureEach {
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
options.release = targetJavaVersion
}
}
processResources {
def props = [version: version]
inputs.properties props
filteringCharset 'UTF-8'
filesMatching('plugin.yml') {
expand props
}
}
task copytorun(type: Copy) {
delete file("$projectDir/Server/plugins/Extended*")
from file("$projectDir/build/libs/ExtendedPistons-${version}.jar")
into file("$projectDir/Server/plugins/")
plugins {
id 'java'
}
group = 'ru.redguy'
version = '1.0.1'
repositories {
mavenCentral()
maven {
name = 'papermc-repo'
url = 'https://papermc.io/repo/repository/maven-public/'
}
maven {
name = 'sonatype'
url = 'https://oss.sonatype.org/content/groups/public/'
}
maven {
url = 'https://repo.redguy.ru/repository/maven-public/'
}
}
dependencies {
compileOnly 'com.destroystokyo.paper:paper-api:1.12.2-R0.1-SNAPSHOT'
compileOnly 'org.bukkit:craftbukkit:1.12.2-R0.1-20190527.155144-32'
compileOnly "com.github.MilkBowl:VaultAPI:1.7"
compileOnly 'com.sk89q.worldguard:worldguard-legacy:6.2'
}
def targetJavaVersion = 8
java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
}
tasks.withType(JavaCompile).configureEach {
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
options.release = targetJavaVersion
}
}
processResources {
def props = [version: version]
inputs.properties props
filteringCharset 'UTF-8'
filesMatching('plugin.yml') {
expand props
}
}
task copytorun(type: Copy) {
delete file("$projectDir/Server/plugins/Extended*")
from file("$projectDir/build/libs/ExtendedPistons-${version}.jar")
into file("$projectDir/Server/plugins/")
}

178
gradlew.bat vendored
View File

@ -1,89 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@ -1,17 +1,17 @@
package ru.redguy.extendedpistons;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.block.BlockPistonExtendEvent;
import java.util.List;
public class BlockPistonExtendedExtendEvent extends BlockPistonExtendEvent {
public BlockPistonExtendedExtendEvent(Block block, int length, BlockFace direction) {
super(block, length, direction);
}
public BlockPistonExtendedExtendEvent(Block block, List<Block> blocks, BlockFace direction) {
super(block, blocks, direction);
}
}
package ru.redguy.extendedpistons;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.block.BlockPistonExtendEvent;
import java.util.List;
public class BlockPistonExtendedExtendEvent extends BlockPistonExtendEvent {
public BlockPistonExtendedExtendEvent(Block block, int length, BlockFace direction) {
super(block, length, direction);
}
public BlockPistonExtendedExtendEvent(Block block, List<Block> blocks, BlockFace direction) {
super(block, blocks, direction);
}
}

View File

@ -1,30 +1,30 @@
package ru.redguy.extendedpistons;
import java.time.Instant;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Period {
private final Instant from;
private final Instant to;
public Period(Date from, Date to) {
this.from = nowtifyDate(from);
this.to = nowtifyDate(to);
}
public boolean isBehind(Instant date) {
return from.isBefore(date)&&to.isAfter(date);
}
public Instant nowtifyDate(Date ins) {
Calendar now = GregorianCalendar.getInstance();
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(ins);
cal.set(Calendar.YEAR, now.get(Calendar.YEAR));
cal.set(Calendar.MONTH, now.get(Calendar.MONTH));
cal.set(Calendar.DAY_OF_MONTH, now.get(Calendar.DAY_OF_MONTH));
return cal.getTime().toInstant();
}
}
package ru.redguy.extendedpistons;
import java.time.Instant;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Period {
private final Instant from;
private final Instant to;
public Period(Date from, Date to) {
this.from = nowtifyDate(from);
this.to = nowtifyDate(to);
}
public boolean isBehind(Instant date) {
return from.isBefore(date)&&to.isAfter(date);
}
public Instant nowtifyDate(Date ins) {
Calendar now = GregorianCalendar.getInstance();
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(ins);
cal.set(Calendar.YEAR, now.get(Calendar.YEAR));
cal.set(Calendar.MONTH, now.get(Calendar.MONTH));
cal.set(Calendar.DAY_OF_MONTH, now.get(Calendar.DAY_OF_MONTH));
return cal.getTime().toInstant();
}
}

View File

@ -1,265 +1,265 @@
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 {
return false;
}
} else if (!this.a(this.c, this.d)) {
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)) {
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) {
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()) {
if(block == Blocks.CHEST || block == Blocks.FURNACE || block == Blocks.LIT_FURNACE) {
return ExtendedPistons.INSTANCE.isAllowedTime();
} else {
return false;
}
} else {
return true;
}
}
}
}
}
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 {
return false;
}
} else if (!this.a(this.c, this.d)) {
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)) {
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) {
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()) {
if(block == Blocks.CHEST || block == Blocks.FURNACE || block == Blocks.LIT_FURNACE) {
return ExtendedPistons.INSTANCE.isAllowedTime();
} else {
return false;
}
} else {
return true;
}
}
}
}
}

View File

@ -1,458 +1,458 @@
package ru.redguy.extendedpistons;
import com.sk89q.worldguard.bukkit.RegionContainer;
import com.sk89q.worldguard.bukkit.RegionQuery;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.*;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.inventory.DoubleChestInventory;
import org.bukkit.material.PistonBaseMaterial;
import java.util.Comparator;
import java.util.*;
public class WorldListener implements Listener {
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPistonChanged(BlockPistonExtendEvent e) {
if(e.getBlocks().size()>0) e.setCancelled(true);
/*if (e instanceof BlockPistonExtendedExtendEvent) return;
Block block = e.getBlock();
BlockState state = block.getState();
PistonBaseMaterial piston = (PistonBaseMaterial) state.getData();
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), e.getBlock().getLocation(), piston.getFacing(), true, maxBlocks);
if (!checker.a()) {
e.setCancelled(true);
}*/
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPistonChanged(BlockPistonRetractEvent e) {
if(e.getBlocks().size()>0) e.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
Material blockType = e.getBlock().getType();
if (!(blockType.equals(Material.REDSTONE_BLOCK) || blockType.equals(Material.REDSTONE_TORCH_ON))) return;
HashMap<BlockFace, BlockState> states = new HashMap<>();
HashMap<BlockFace, Integer> powers = new HashMap<>();
for (BlockFace face : new BlockFace[]{BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
states.put(face, e.getBlock().getRelative(face).getState());
powers.put(face, e.getBlock().getRelative(face).getBlockPower());
}
Bukkit.getScheduler().runTask(ExtendedPistons.INSTANCE, () -> {
if (ExtendedPistons.INSTANCE.isStickyPistonPulls()) {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() == 0 && powers.get(blockFace) != 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
Block block = e.getBlock().getRelative(face);
BlockState state = states.get(face);
if (state.getType().equals(Material.PISTON_STICKY_BASE)) {
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), false, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
if (isMovable) {
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing())) continue;
Collections.reverse(blocks);
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing().getOppositeFace());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
}
});
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent e) {
Material blockType = e.getBlock().getType();
if (!(blockType.equals(Material.REDSTONE_BLOCK) || blockType.equals(Material.REDSTONE_TORCH_ON))) return;
HashMap<BlockFace, BlockState> states = new HashMap<>();
HashMap<BlockFace, Integer> powers = new HashMap<>();
for (BlockFace face : new BlockFace[]{BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
states.put(face, e.getBlock().getRelative(face).getState());
powers.put(face, e.getBlock().getRelative(face).getBlockPower());
}
Bukkit.getScheduler().runTask(ExtendedPistons.INSTANCE, () -> {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() != 0 && powers.get(blockFace) == 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
Block block = e.getBlock().getRelative(face);
if (block.getType().equals(Material.PISTON_BASE) || block.getType().equals(Material.PISTON_STICKY_BASE)) {
BlockState state = states.get(face);
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), true, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
upper:
for (Block b : blocks) {
if (b.getType().equals(Material.CHEST)) {
Block b2 = b.getRelative(piston.getFacing());
ArrayList<BlockFace> faces = new ArrayList<BlockFace>() {{
add(BlockFace.NORTH);
add(BlockFace.SOUTH);
add(BlockFace.WEST);
add(BlockFace.EAST);
}};
faces.remove(piston.getFacing().getOppositeFace());
int chests = 0;
for (BlockFace blockFace : faces) {
Block b3 = b2.getRelative(blockFace);
if (b3.getType() == Material.CHEST) {
chests++;
Chest chest = (Chest) b3.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break upper;
}
}
}
if (chests > 1) {
isMovable = false;
break;
} else if (chests == 1) {
if (b.getType() == Material.CHEST) {
Chest chest = (Chest) b.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break;
}
}
}
}
}
if (isMovable) {
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing())) return;
Collections.reverse(blocks);
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
});
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onRedstone(BlockRedstoneEvent e) {
HashMap<BlockFace, HashMap<BlockFace,BlockState>> states = new HashMap<>();
for (BlockFace face : new BlockFace[]{BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
states.put(face, new HashMap<>());
for (BlockFace blockFace : new BlockFace[]{BlockFace.UP, BlockFace.SELF, BlockFace.DOWN}) {
states.get(face).put(blockFace,e.getBlock().getRelative(face).getRelative(blockFace).getState());
}
}
Bukkit.getScheduler().runTask(ExtendedPistons.INSTANCE, () -> {
if (e.getOldCurrent() != 0 && e.getNewCurrent() == 0) {
if (ExtendedPistons.INSTANCE.isStickyPistonPulls()) {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() == 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
ArrayList<BlockFace> subs = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
}};
if (e.getBlock().getType().equals(Material.LEVER)) {
subs.add(BlockFace.UP);
subs.add(BlockFace.DOWN);
}
for (BlockFace sub : subs) {
Block block = e.getBlock().getRelative(face);
block = block.getRelative(sub);
BlockState state = states.get(face).get(sub);
if (state.getType().equals(Material.PISTON_STICKY_BASE)) {
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), false, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
if (isMovable) {
Collections.reverse(blocks);
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing()))
continue;
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing().getOppositeFace());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
}
}
} else {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() != 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
ArrayList<BlockFace> subs = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
}};
if (e.getBlock().getType().equals(Material.LEVER)) {
subs.add(BlockFace.UP);
subs.add(BlockFace.DOWN);
}
for (BlockFace sub : subs) {
Block block = e.getBlock().getRelative(face);
block = block.getRelative(sub);
if (block.getType().equals(Material.PISTON_BASE) || block.getType().equals(Material.PISTON_STICKY_BASE)) {
BlockState state = states.get(face).get(sub);
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), true, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
upper:
for (Block b : blocks) {
if (b.getType().equals(Material.CHEST)) {
Block b2 = b.getRelative(piston.getFacing());
ArrayList<BlockFace> faces = new ArrayList<BlockFace>() {{
add(BlockFace.NORTH);
add(BlockFace.SOUTH);
add(BlockFace.WEST);
add(BlockFace.EAST);
}};
faces.remove(piston.getFacing().getOppositeFace());
int chests = 0;
for (BlockFace blockFace : faces) {
Block b3 = b2.getRelative(blockFace);
if (b3.getType() == Material.CHEST) {
chests++;
Chest chest = (Chest) b3.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break upper;
}
}
}
if (chests > 1) {
isMovable = false;
break;
} else if (chests == 1) {
if (b.getType() == Material.CHEST) {
Chest chest = (Chest) b.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break;
}
}
}
}
}
if (isMovable) {
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing()))
return;
Collections.reverse(blocks);
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
}
}
});
}
public int findNearbyPlayerMaxBlocks(Location location) {
Optional<? extends Player> op = Bukkit.getOnlinePlayers().stream().filter(p -> p.getLocation().getWorld().equals(location.getWorld())).min(Comparator.comparingDouble(p -> p.getLocation().distance(location)));
if (op.isPresent()) {
String[] groups = ExtendedPistons.INSTANCE.permsService.getPlayerGroups(op.get());
Optional<Integer> intOp = Arrays.stream(groups).map(group -> (ExtendedPistons.INSTANCE.conf.isSet("piston-move-limitations." + group) && ExtendedPistons.INSTANCE.conf.isInt("piston-move-limitations." + group)) ? ExtendedPistons.INSTANCE.conf.getInt("piston-move-limitations." + group) : 0).max(Comparator.comparingInt(i -> i));
if (intOp.isPresent()) {
return intOp.get() == 0 ? 12 : intOp.get();
}
}
return 12;
}
public boolean isBlocksAllowedToInteract(List<Block> blocks, BlockFace bf) {
WorldGuardPlugin wg = ExtendedPistons.INSTANCE.wg;
RegionContainer container = wg.getRegionContainer();
RegionQuery query = container.createQuery();
for (Block block : blocks) {
boolean state = query.testState(block.getLocation(), (Player) null, DefaultFlag.PISTONS);
if (!state)
return false;
state = query.testState(block.getRelative(bf).getLocation(), (Player) null, DefaultFlag.PISTONS);
if (!state)
return false;
}
return true;
}
public <T> List<T> copyWithAdd(List<T> original, List<T> add) {
List<T> copy = new ArrayList<>(original);
copy.addAll(add);
return copy;
}
}
package ru.redguy.extendedpistons;
import com.sk89q.worldguard.bukkit.RegionContainer;
import com.sk89q.worldguard.bukkit.RegionQuery;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.*;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.inventory.DoubleChestInventory;
import org.bukkit.material.PistonBaseMaterial;
import java.util.Comparator;
import java.util.*;
public class WorldListener implements Listener {
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPistonChanged(BlockPistonExtendEvent e) {
if(e.getBlocks().size()>0) e.setCancelled(true);
/*if (e instanceof BlockPistonExtendedExtendEvent) return;
Block block = e.getBlock();
BlockState state = block.getState();
PistonBaseMaterial piston = (PistonBaseMaterial) state.getData();
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), e.getBlock().getLocation(), piston.getFacing(), true, maxBlocks);
if (!checker.a()) {
e.setCancelled(true);
}*/
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPistonChanged(BlockPistonRetractEvent e) {
if(e.getBlocks().size()>0) e.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent e) {
Material blockType = e.getBlock().getType();
if (!(blockType.equals(Material.REDSTONE_BLOCK) || blockType.equals(Material.REDSTONE_TORCH_ON))) return;
HashMap<BlockFace, BlockState> states = new HashMap<>();
HashMap<BlockFace, Integer> powers = new HashMap<>();
for (BlockFace face : new BlockFace[]{BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
states.put(face, e.getBlock().getRelative(face).getState());
powers.put(face, e.getBlock().getRelative(face).getBlockPower());
}
Bukkit.getScheduler().runTask(ExtendedPistons.INSTANCE, () -> {
if (ExtendedPistons.INSTANCE.isStickyPistonPulls()) {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() == 0 && powers.get(blockFace) != 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
Block block = e.getBlock().getRelative(face);
BlockState state = states.get(face);
if (state.getType().equals(Material.PISTON_STICKY_BASE)) {
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), false, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
if (isMovable) {
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing())) continue;
Collections.reverse(blocks);
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing().getOppositeFace());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
}
});
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent e) {
Material blockType = e.getBlock().getType();
if (!(blockType.equals(Material.REDSTONE_BLOCK) || blockType.equals(Material.REDSTONE_TORCH_ON))) return;
HashMap<BlockFace, BlockState> states = new HashMap<>();
HashMap<BlockFace, Integer> powers = new HashMap<>();
for (BlockFace face : new BlockFace[]{BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
states.put(face, e.getBlock().getRelative(face).getState());
powers.put(face, e.getBlock().getRelative(face).getBlockPower());
}
Bukkit.getScheduler().runTask(ExtendedPistons.INSTANCE, () -> {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() != 0 && powers.get(blockFace) == 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
Block block = e.getBlock().getRelative(face);
if (block.getType().equals(Material.PISTON_BASE) || block.getType().equals(Material.PISTON_STICKY_BASE)) {
BlockState state = states.get(face);
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), true, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
upper:
for (Block b : blocks) {
if (b.getType().equals(Material.CHEST)) {
Block b2 = b.getRelative(piston.getFacing());
ArrayList<BlockFace> faces = new ArrayList<BlockFace>() {{
add(BlockFace.NORTH);
add(BlockFace.SOUTH);
add(BlockFace.WEST);
add(BlockFace.EAST);
}};
faces.remove(piston.getFacing().getOppositeFace());
int chests = 0;
for (BlockFace blockFace : faces) {
Block b3 = b2.getRelative(blockFace);
if (b3.getType() == Material.CHEST) {
chests++;
Chest chest = (Chest) b3.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break upper;
}
}
}
if (chests > 1) {
isMovable = false;
break;
} else if (chests == 1) {
if (b.getType() == Material.CHEST) {
Chest chest = (Chest) b.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break;
}
}
}
}
}
if (isMovable) {
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing())) return;
Collections.reverse(blocks);
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
});
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onRedstone(BlockRedstoneEvent e) {
HashMap<BlockFace, HashMap<BlockFace,BlockState>> states = new HashMap<>();
for (BlockFace face : new BlockFace[]{BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
states.put(face, new HashMap<>());
for (BlockFace blockFace : new BlockFace[]{BlockFace.UP, BlockFace.SELF, BlockFace.DOWN}) {
states.get(face).put(blockFace,e.getBlock().getRelative(face).getRelative(blockFace).getState());
}
}
Bukkit.getScheduler().runTask(ExtendedPistons.INSTANCE, () -> {
if (e.getOldCurrent() != 0 && e.getNewCurrent() == 0) {
if (ExtendedPistons.INSTANCE.isStickyPistonPulls()) {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() == 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
ArrayList<BlockFace> subs = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
}};
if (e.getBlock().getType().equals(Material.LEVER)) {
subs.add(BlockFace.UP);
subs.add(BlockFace.DOWN);
}
for (BlockFace sub : subs) {
Block block = e.getBlock().getRelative(face);
block = block.getRelative(sub);
BlockState state = states.get(face).get(sub);
if (state.getType().equals(Material.PISTON_STICKY_BASE)) {
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), false, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
if (isMovable) {
Collections.reverse(blocks);
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing()))
continue;
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing().getOppositeFace());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
}
}
} else {
ArrayList<BlockFace> checkedBlockFaces = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
add(BlockFace.UP);
add(BlockFace.DOWN);
}};
if (e.getBlock().getType().equals(Material.REDSTONE_WIRE)) {
for (BlockFace blockFace : new BlockFace[]{BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST}) {
Block block = e.getBlock().getRelative(blockFace);
if (block.getBlockPower() != 0) checkedBlockFaces.add(blockFace);
}
} else {
checkedBlockFaces.add(BlockFace.NORTH);
checkedBlockFaces.add(BlockFace.SOUTH);
checkedBlockFaces.add(BlockFace.EAST);
checkedBlockFaces.add(BlockFace.WEST);
}
for (BlockFace face : checkedBlockFaces) {
ArrayList<BlockFace> subs = new ArrayList<BlockFace>() {{
add(BlockFace.SELF);
}};
if (e.getBlock().getType().equals(Material.LEVER)) {
subs.add(BlockFace.UP);
subs.add(BlockFace.DOWN);
}
for (BlockFace sub : subs) {
Block block = e.getBlock().getRelative(face);
block = block.getRelative(sub);
if (block.getType().equals(Material.PISTON_BASE) || block.getType().equals(Material.PISTON_STICKY_BASE)) {
BlockState state = states.get(face).get(sub);
PistonBaseMaterial piston;
try {
piston = (PistonBaseMaterial) state.getData();
} catch (ClassCastException ex) {
continue;
}
int maxBlocks = findNearbyPlayerMaxBlocks(block.getLocation());
PistonExtendsChecker checker = new PistonExtendsChecker(e.getBlock().getWorld(), block.getLocation(), piston.getFacing(), true, maxBlocks);
boolean isMovable = checker.a();
List<Block> blocks = checker.getMovedBlocksObjects();
List<Block> toBreak = checker.getBrokenBlocksObjects();
upper:
for (Block b : blocks) {
if (b.getType().equals(Material.CHEST)) {
Block b2 = b.getRelative(piston.getFacing());
ArrayList<BlockFace> faces = new ArrayList<BlockFace>() {{
add(BlockFace.NORTH);
add(BlockFace.SOUTH);
add(BlockFace.WEST);
add(BlockFace.EAST);
}};
faces.remove(piston.getFacing().getOppositeFace());
int chests = 0;
for (BlockFace blockFace : faces) {
Block b3 = b2.getRelative(blockFace);
if (b3.getType() == Material.CHEST) {
chests++;
Chest chest = (Chest) b3.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break upper;
}
}
}
if (chests > 1) {
isMovable = false;
break;
} else if (chests == 1) {
if (b.getType() == Material.CHEST) {
Chest chest = (Chest) b.getState();
if (chest.getInventory() instanceof DoubleChestInventory) {
isMovable = false;
break;
}
}
}
}
}
if (isMovable) {
if (!isBlocksAllowedToInteract(copyWithAdd(blocks, toBreak), piston.getFacing()))
return;
Collections.reverse(blocks);
for (Block block1 : toBreak) {
block1.breakNaturally();
}
for (Block b : blocks) {
Block b2 = b.getRelative(piston.getFacing());
b2.setType(b.getType());
b2.setData(b.getData()); //Deprecated but powerful
if (b.getType().equals(Material.CHEST)) {
Chest oldChest = (Chest) b.getState();
Chest newChest = (Chest) b2.getState();
newChest.getBlockInventory().setContents(oldChest.getBlockInventory().getContents());
oldChest.getBlockInventory().clear();
} else if (b.getType().equals(Material.FURNACE) || b.getType().equals(Material.BURNING_FURNACE)) {
Furnace oldFurnace = (Furnace) b.getState();
Furnace newFurnace = (Furnace) b2.getState();
newFurnace.getInventory().setContents(oldFurnace.getInventory().getContents());
oldFurnace.getInventory().clear();
}
b.setType(Material.AIR);
}
}
}
}
}
}
});
}
public int findNearbyPlayerMaxBlocks(Location location) {
Optional<? extends Player> op = Bukkit.getOnlinePlayers().stream().filter(p -> p.getLocation().getWorld().equals(location.getWorld())).min(Comparator.comparingDouble(p -> p.getLocation().distance(location)));
if (op.isPresent()) {
String[] groups = ExtendedPistons.INSTANCE.permsService.getPlayerGroups(op.get());
Optional<Integer> intOp = Arrays.stream(groups).map(group -> (ExtendedPistons.INSTANCE.conf.isSet("piston-move-limitations." + group) && ExtendedPistons.INSTANCE.conf.isInt("piston-move-limitations." + group)) ? ExtendedPistons.INSTANCE.conf.getInt("piston-move-limitations." + group) : 0).max(Comparator.comparingInt(i -> i));
if (intOp.isPresent()) {
return intOp.get() == 0 ? 12 : intOp.get();
}
}
return 12;
}
public boolean isBlocksAllowedToInteract(List<Block> blocks, BlockFace bf) {
WorldGuardPlugin wg = ExtendedPistons.INSTANCE.wg;
RegionContainer container = wg.getRegionContainer();
RegionQuery query = container.createQuery();
for (Block block : blocks) {
boolean state = query.testState(block.getLocation(), (Player) null, DefaultFlag.PISTONS);
if (!state)
return false;
state = query.testState(block.getRelative(bf).getLocation(), (Player) null, DefaultFlag.PISTONS);
if (!state)
return false;
}
return true;
}
public <T> List<T> copyWithAdd(List<T> original, List<T> add) {
List<T> copy = new ArrayList<>(original);
copy.addAll(add);
return copy;
}
}