Fixed issue that the holograms of further shops are displayed

This commit is contained in:
Eric 2017-05-22 20:39:54 +02:00
parent cb8eb29112
commit a50738bc8c

View File

@ -7,8 +7,6 @@ import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Chest; import org.bukkit.block.Chest;
import org.bukkit.block.DoubleChest; import org.bukkit.block.DoubleChest;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -16,7 +14,6 @@ import org.bukkit.inventory.InventoryHolder;
import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -39,9 +36,7 @@ public class ShopUtils {
* @return Shop at the given location or <b>null</b> if no shop is found there * @return Shop at the given location or <b>null</b> if no shop is found there
*/ */
public Shop getShop(Location location) { public Shop getShop(Location location) {
Location newLocation = new Location(location.getWorld(), location.getX(), location.getY(), location.getZ()); return shopLocation.get(location.getBlock().getLocation());
return shopLocation.get(newLocation);
} }
/** /**
@ -50,8 +45,7 @@ public class ShopUtils {
* @return Whether there is a shop at the given location * @return Whether there is a shop at the given location
*/ */
public boolean isShop(Location location) { public boolean isShop(Location location) {
Location newLocation = new Location(location.getWorld(), location.getX(), location.getY(), location.getZ()); return shopLocation.containsKey(location.getBlock().getLocation());
return shopLocation.containsKey(newLocation);
} }
/** /**
@ -269,35 +263,17 @@ public class ShopUtils {
} }
if (plugin.getShopChestConfig().only_show_shops_in_sight) { if (plugin.getShopChestConfig().only_show_shops_in_sight) {
Set<Block> sight = getBlocksInSight(player); Set<Shop> sight = getShopsInSight(player);
ArrayList<Shop> shopsInSight = new ArrayList<>(); Set<Shop> _sight = new HashSet<>();
for (Block block : sight) { for (Shop shop : sight) {
if (block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST) { _sight.add(shop);
Shop shop = getShop(block.getLocation()); if (shop.getHologram() != null && !shop.getHologram().isVisible(player)) {
if (shop != null) { shop.getHologram().showPlayer(player);
shopsInSight.add(shop);
if (shop.getHologram() != null && !shop.getHologram().isVisible(player)) {
shop.getHologram().showPlayer(player);
}
if (plugin.getShopChestConfig().only_show_first_shop_in_sight) break;
}
} else {
Block below = block.getRelative(BlockFace.DOWN);
Shop shop = getShop(below.getLocation());
if (shop != null) {
shopsInSight.add(shop);
if (shop.getHologram() != null && !shop.getHologram().isVisible(player)) {
shop.getHologram().showPlayer(player);
}
if (plugin.getShopChestConfig().only_show_first_shop_in_sight) break;
}
} }
if (plugin.getShopChestConfig().only_show_first_shop_in_sight) break;
} }
double itemDistSqr = Math.pow(plugin.getShopChestConfig().maximal_item_distance, 2); double itemDistSqr = Math.pow(plugin.getShopChestConfig().maximal_item_distance, 2);
@ -311,7 +287,7 @@ public class ShopUtils {
} }
} }
if (!shopsInSight.contains(shop)) { if (!_sight.contains(shop)) {
if (shop.getHologram() != null) { if (shop.getHologram() != null) {
shop.getHologram().hidePlayer(player); shop.getHologram().hidePlayer(player);
} }
@ -326,26 +302,43 @@ public class ShopUtils {
playerLocation.put(player, player.getLocation()); playerLocation.put(player, player.getLocation());
} }
private Set<Block> getBlocksInSight(Player player) { private Set<Shop> getShopsInSight(Player player) {
double dist = plugin.getShopChestConfig().maximal_distance; double dist = plugin.getShopChestConfig().maximal_distance;
Location loc = player.getEyeLocation(); Location loc = player.getEyeLocation();
Vector direction = loc.getDirection(); Vector direction = loc.getDirection();
Set<Block> blocks = new HashSet<>(); Set<Shop> shops = new HashSet<>();
blocks.add(loc.getBlock());
double i = 0; double i = 0;
do { do {
blocks.add(loc.add(direction).getBlock()); Location below = loc.clone().subtract(0, 1, 0);
Shop shop = getShop(loc);
if (shop != null) {
shops.add(shop);
} else if ((shop = getShop(below)) != null) {
shops.add(shop);
}
loc.add(direction);
i++; i++;
} while (i < dist - (dist%1)); } while (i <= dist - (dist%1));
direction.multiply(dist - (dist%1)); direction.multiply(dist - (dist%1));
blocks.add(loc.add(direction).getBlock()); loc.add(direction);
return blocks; Location below = loc.clone().subtract(0, 1, 0);
Shop shop = getShop(loc);
if (shop != null) {
shops.add(shop);
} else if ((shop = getShop(below)) != null) {
shops.add(shop);
}
return shops;
} }
/** /**