Skip to content

Commit

Permalink
fix: Fix decoding sign facing direction. Closes #7
Browse files Browse the repository at this point in the history
  • Loading branch information
Philip Urban committed Jan 4, 2021
1 parent dead2a8 commit c2d98c4
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 199 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ dependencies {
testImplementation "org.mockito:mockito-core:3.+"
testImplementation 'org.assertj:assertj-core:3.+'
testImplementation 'com.github.seeseemelk:MockBukkit-v1.16:0.16.0'
testImplementation 'org.jetbrains:annotations:16.0.2'
}

shadowJar {
Expand Down
63 changes: 30 additions & 33 deletions src/main/java/de/raidcraft/rcelevator/ElevatorSign.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
import de.raidcraft.rcelevator.exceptions.NoTargetException;
import de.raidcraft.rcelevator.exceptions.UnknownFloorException;
import de.raidcraft.rcelevator.exceptions.WrongSignFormatException;
import de.raidcraft.rcelevator.utils.BlockDataUtils;
import de.raidcraft.rcelevator.utils.SignUtils;
import lombok.Getter;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.material.Directional;
import org.bukkit.material.MaterialData;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -160,36 +160,29 @@ private void updateSign() {

private Location getTarget() throws NoTargetException {
Location signLocation = sign.getLocation();

// Walk through each layer of blocks to find targeted Elevator sign
for(int i = signLocation.getBlockY(); checkSearchCount(i); i = incDecSearchCount(i)) {

Block block = signLocation.getWorld().getBlockAt(signLocation.getBlockX(), i, signLocation.getBlockZ());
if(block == null || !(block.getState() instanceof Sign)) {
World world = signLocation.getWorld();
if(world == null) continue;
Block block = world.getBlockAt(signLocation.getBlockX(), i, signLocation.getBlockZ());
if(!(block.getState() instanceof Sign)) {
continue;
}

ElevatorSign elevatorSign = new ElevatorSign((Sign)block.getState());
if(elevatorSign.isValid() && elevatorSign.getThisFloor() == targetFloor) {

MaterialData materialData = block.getState().getData();
BlockFace facing = SignUtils.getFacing(materialData);
// We found the correct Elevator sign
if(elevatorSign.isValid() && elevatorSign.getThisFloor() == targetFloor) {

Block targetBlock = null;
if(facing == BlockFace.NORTH) {
targetBlock = block.getRelative(-1, 0, 0);
}
if(facing == BlockFace.EAST) {
targetBlock = block.getRelative(0, 0, -1);
}
if(facing == BlockFace.SOUTH) {
targetBlock = block.getRelative(1, 0, 0);
}
if(facing == BlockFace.WEST) {
targetBlock = block.getRelative(0, 0, 1);
}
BlockFace elevatorSignFacing = BlockDataUtils.getFacing(block.getState().getBlockData());
Block targetBlock = block.getRelative(elevatorSignFacing);

if(targetBlock == null) {
if(targetBlock.getType() != Material.AIR) {
throw new NoTargetException("Das gewählte Stockwerk bietet nicht genug Platz!");
}

// Search floor block
for(i = 0; i < 5; i++) {
Block below = targetBlock.getRelative(0, -1, 0);
if(below.getType() == Material.AIR) {
Expand All @@ -216,7 +209,9 @@ private int incDecSearchCount(int i) {

private boolean checkSearchCount(int i) {
if(targetFloor > thisFloor) {
return (i < sign.getLocation().getWorld().getMaxHeight());
World world = sign.getLocation().getWorld();
if(world == null) return false;
return (i < world.getMaxHeight());
}
else {
return (i > 0);
Expand All @@ -225,24 +220,26 @@ private boolean checkSearchCount(int i) {

private List<Player> getPassenger() {
List<Player> passenger = new ArrayList<>();
for(Player player : sign.getLocation().getWorld().getPlayers()) {
World world = sign.getLocation().getWorld();
if(world == null) return passenger;
for(Player player : world.getPlayers()) {
if(Math.abs(Math.abs(player.getLocation().getY()) - Math.abs(sign.getLocation().getY())) > 2) continue;
if(SignUtils.isWallSign(sign.getType())) {

MaterialData materialData = sign.getBlock().getState().getData();
BlockFace facing = SignUtils.getFacing(materialData);
BlockFace facing = BlockDataUtils.getFacing(sign.getBlock().getState().getBlockData());

// Check if player is behind sign
if(facing == BlockFace.NORTH) {
if(player.getLocation().getX()-1 > sign.getLocation().getX()) continue;
if(player.getLocation().getZ() > sign.getLocation().getZ()) continue;
}
if(facing == BlockFace.EAST) {
if(player.getLocation().getZ()-1 > sign.getLocation().getZ()) continue;
if(player.getLocation().getX() < sign.getLocation().getX()) continue;
}
if(facing == BlockFace.SOUTH) {
if(player.getLocation().getX()+1 < sign.getLocation().getX()) continue;
if(player.getLocation().getZ() < sign.getLocation().getZ()) continue;
}
if(facing == BlockFace.WEST) {
if(player.getLocation().getZ()+1 < sign.getLocation().getZ()) continue;
if(player.getLocation().getX() > sign.getLocation().getX()) continue;
}


Expand Down
6 changes: 0 additions & 6 deletions src/main/java/de/raidcraft/rcelevator/RCElevator.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package de.raidcraft.rcelevator;

import co.aikar.commands.PaperCommandManager;
import de.raidcraft.rcelevator.listener.ElevatorListener;
import io.ebean.Database;
import kr.entree.spigradle.annotations.PluginMain;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import net.silthus.ebean.Config;
import net.silthus.ebean.EbeanWrapper;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.plugin.PluginDescriptionFile;
Expand Down
69 changes: 69 additions & 0 deletions src/main/java/de/raidcraft/rcelevator/utils/BlockDataUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package de.raidcraft.rcelevator.utils;

import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BlockDataUtils {

public static BlockFace getFacing(BlockData blockData) {

String blockDataString = blockData.getAsString();

if(blockDataString.contains("facing=")) {
Pattern pattern = Pattern.compile("facing=([a-zA-Z]+)");
Matcher matcher = pattern.matcher(blockDataString);
if (matcher.find()) {
String facingName = matcher.group(1);
return BlockFace.valueOf(facingName.toUpperCase());
}
} else if(blockDataString.contains("rotation=")) {
Pattern pattern = Pattern.compile("rotation=([\\d]+)");
Matcher matcher = pattern.matcher(blockDataString);
if (matcher.find()) {
int rotation = Integer.parseInt(matcher.group(1));
switch(rotation) {
case 0:
return BlockFace.SOUTH;
case 1:
return BlockFace.SOUTH_SOUTH_WEST;
case 2:
return BlockFace.SOUTH_WEST;
case 3:
return BlockFace.WEST_SOUTH_WEST;
case 4:
return BlockFace.WEST;
case 5:
return BlockFace.WEST_NORTH_WEST;
case 6:
return BlockFace.NORTH_WEST;
case 7:
return BlockFace.NORTH_NORTH_WEST;
case 8:
return BlockFace.NORTH;
case 9:
return BlockFace.NORTH_NORTH_EAST;
case 10:
return BlockFace.NORTH_EAST;
case 11:
return BlockFace.EAST_NORTH_EAST;
case 12:
return BlockFace.EAST;
case 13:
return BlockFace.EAST_SOUTH_EAST;
case 14:
return BlockFace.SOUTH_EAST;
case 15:
return BlockFace.SOUTH_SOUTH_EAST;
default:
return BlockFace.DOWN;
}
}
}

// Facing not found
return BlockFace.DOWN;
}
}
161 changes: 1 addition & 160 deletions src/main/java/de/raidcraft/rcelevator/utils/SignUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import org.bukkit.material.MaterialData;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand All @@ -34,7 +30,7 @@ public static boolean isLineEqual(String strSign, String strText) {
public static String strip(String strText) {

strText = ChatColor.stripColor(strText).trim();
Pattern pattern = Pattern.compile("\\[(.*?)\\]");
Pattern pattern = Pattern.compile("\\[(.*?)]");
Matcher matcher = pattern.matcher(strText);
if (matcher.matches()) {
strText = matcher.group(1);
Expand Down Expand Up @@ -87,159 +83,4 @@ public static Sign getSignByBlock(Block block)

return (Sign)block.getState();
}

/**
* Get the attached face of the sign
* Stolen from: https://github.com/NLthijs48/AreaShop
* @param materialData the material data of the sign
* @return The attached BlockFace
*/
public static BlockFace getAttachedFace(MaterialData materialData) {
if (isWallSign(materialData.getItemType())) {
byte data = materialData.getData();
switch(data) {
case 2:
return BlockFace.SOUTH;
case 3:
return BlockFace.NORTH;
case 4:
return BlockFace.EAST;
case 5:
return BlockFace.WEST;
default:
return null;
}
} else {
return BlockFace.DOWN;
}
}

/**
* Get the facing direction of the sign.
* Stolen from: https://github.com/NLthijs48/AreaShop
* @param materialData the material data of the sign
* @return The facing BlockFace of the sign
*/
public static BlockFace getFacing(MaterialData materialData) {
byte data = materialData.getData();
if (!isWallSign(materialData.getItemType())) {
switch(data) {
case 0:
return BlockFace.SOUTH;
case 1:
return BlockFace.SOUTH_SOUTH_WEST;
case 2:
return BlockFace.SOUTH_WEST;
case 3:
return BlockFace.WEST_SOUTH_WEST;
case 4:
return BlockFace.WEST;
case 5:
return BlockFace.WEST_NORTH_WEST;
case 6:
return BlockFace.NORTH_WEST;
case 7:
return BlockFace.NORTH_NORTH_WEST;
case 8:
return BlockFace.NORTH;
case 9:
return BlockFace.NORTH_NORTH_EAST;
case 10:
return BlockFace.NORTH_EAST;
case 11:
return BlockFace.EAST_NORTH_EAST;
case 12:
return BlockFace.EAST;
case 13:
return BlockFace.EAST_SOUTH_EAST;
case 14:
return BlockFace.SOUTH_EAST;
case 15:
return BlockFace.SOUTH_SOUTH_EAST;
default:
return null;
}
} else {
return getAttachedFace(materialData).getOppositeFace();
}
}

/**
* Set the facing direction of the sign.
* Stolen from: https://github.com/NLthijs48/AreaShop
* @param materialData the material data of the sign
* @param face The block face to set to
*/
public static void setFacingDirection(MaterialData materialData, BlockFace face) {
byte data;
if (isWallSign(materialData.getItemType())) {
switch(face) {
case NORTH:
data = 2;
break;
case SOUTH:
data = 3;
break;
case WEST:
data = 4;
break;
case EAST:
default:
data = 5;
}
} else {
switch(face) {
case NORTH:
data = 8;
break;
case SOUTH:
data = 0;
break;
case WEST:
data = 4;
break;
case EAST:
data = 12;
break;
case SOUTH_SOUTH_WEST:
data = 1;
break;
case SOUTH_WEST:
data = 2;
break;
case WEST_SOUTH_WEST:
data = 3;
break;
case WEST_NORTH_WEST:
data = 5;
break;
case NORTH_WEST:
data = 6;
break;
case NORTH_NORTH_WEST:
data = 7;
break;
case NORTH_NORTH_EAST:
data = 9;
break;
case NORTH_EAST:
data = 10;
break;
case EAST_NORTH_EAST:
data = 11;
break;
case EAST_SOUTH_EAST:
data = 13;
break;
case SOUTH_SOUTH_EAST:
data = 15;
break;
case SOUTH_EAST:
default:
data = 14;
}
}

materialData.setData(data);
}
}
Loading

0 comments on commit c2d98c4

Please sign in to comment.