mirror of
https://github.com/amalthea-mc/ShopChest.git
synced 2024-11-22 18:32:24 +00:00
parent
785dde70bc
commit
fc27480d37
@ -20,6 +20,7 @@ import org.bukkit.block.Chest;
|
|||||||
import org.bukkit.block.DoubleChest;
|
import org.bukkit.block.DoubleChest;
|
||||||
import org.bukkit.block.data.Directional;
|
import org.bukkit.block.data.Directional;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
@ -33,6 +34,18 @@ public class Shop {
|
|||||||
ADMIN,
|
ADMIN,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class PreCreateResult {
|
||||||
|
private final Inventory inventory;
|
||||||
|
private final Chest[] chests;
|
||||||
|
private final BlockFace face;
|
||||||
|
|
||||||
|
private PreCreateResult(Inventory inventory, Chest[] chests, BlockFace face) {
|
||||||
|
this.inventory = inventory;
|
||||||
|
this.chests = chests;
|
||||||
|
this.face = face;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final ShopChest plugin;
|
private final ShopChest plugin;
|
||||||
private final OfflinePlayer vendor;
|
private final OfflinePlayer vendor;
|
||||||
private final ItemStack product;
|
private final ItemStack product;
|
||||||
@ -114,8 +127,14 @@ public class Shop {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PreCreateResult preResult = preCreateHologram();
|
||||||
|
|
||||||
|
if (preResult == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
plugin.getShopCreationThreadPool().execute(() -> {
|
plugin.getShopCreationThreadPool().execute(() -> {
|
||||||
if (hologram == null || !hologram.exists()) createHologram();
|
if (hologram == null || !hologram.exists()) createHologram(preResult);
|
||||||
if (item == null) createItem();
|
if (item == null) createItem();
|
||||||
|
|
||||||
// Update shops for players in the same world after creation has finished
|
// Update shops for players in the same world after creation has finished
|
||||||
@ -171,17 +190,17 @@ public class Shop {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the hologram of the shop
|
* Runs everything that needs to be called synchronously in order
|
||||||
|
* to prepare creating the hologram.
|
||||||
*/
|
*/
|
||||||
private void createHologram() {
|
private PreCreateResult preCreateHologram() {
|
||||||
plugin.debug("Creating hologram (#" + id + ")");
|
plugin.debug("Creating hologram (#" + id + ")");
|
||||||
|
|
||||||
InventoryHolder ih = getInventoryHolder();
|
InventoryHolder ih = getInventoryHolder();
|
||||||
|
|
||||||
if (ih == null) return;
|
if (ih == null) return null;
|
||||||
|
|
||||||
Chest[] chests = new Chest[2];
|
Chest[] chests = new Chest[2];
|
||||||
boolean doubleChest;
|
|
||||||
BlockFace face;
|
BlockFace face;
|
||||||
|
|
||||||
if (ih instanceof DoubleChest) {
|
if (ih instanceof DoubleChest) {
|
||||||
@ -191,10 +210,8 @@ public class Shop {
|
|||||||
|
|
||||||
chests[0] = r;
|
chests[0] = r;
|
||||||
chests[1] = l;
|
chests[1] = l;
|
||||||
doubleChest = true;
|
|
||||||
} else {
|
} else {
|
||||||
chests[0] = (Chest) ih;
|
chests[0] = (Chest) ih;
|
||||||
doubleChest = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Utils.getMajorVersion() < 13) {
|
if (Utils.getMajorVersion() < 13) {
|
||||||
@ -203,8 +220,15 @@ public class Shop {
|
|||||||
face = ((Directional) chests[0].getBlockData()).getFacing();
|
face = ((Directional) chests[0].getBlockData()).getFacing();
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] holoText = getHologramText();
|
return new PreCreateResult(ih.getInventory(), chests, face);
|
||||||
holoLocation = getHologramLocation(doubleChest, chests, face);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Acuatlly creates the hologram (async)
|
||||||
|
*/
|
||||||
|
private void createHologram(PreCreateResult preResult) {
|
||||||
|
String[] holoText = getHologramText(preResult.inventory);
|
||||||
|
holoLocation = getHologramLocation(preResult.chests, preResult.face);
|
||||||
|
|
||||||
new BukkitRunnable(){
|
new BukkitRunnable(){
|
||||||
@Override
|
@Override
|
||||||
@ -215,10 +239,11 @@ public class Shop {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Keep hologram text up to date
|
* Keep hologram text up to date.
|
||||||
|
* <p><b>Has to be called synchronously!</b></p>
|
||||||
*/
|
*/
|
||||||
public void updateHologramText() {
|
public void updateHologramText() {
|
||||||
String[] lines = getHologramText();
|
String[] lines = getHologramText(getInventoryHolder().getInventory());
|
||||||
String[] currentLines = hologram.getLines();
|
String[] currentLines = hologram.getLines();
|
||||||
|
|
||||||
int max = Math.max(lines.length, currentLines.length);
|
int max = Math.max(lines.length, currentLines.length);
|
||||||
@ -232,7 +257,7 @@ public class Shop {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] getHologramText() {
|
private String[] getHologramText(Inventory inventory) {
|
||||||
List<String> lines = new ArrayList<>();
|
List<String> lines = new ArrayList<>();
|
||||||
|
|
||||||
Map<HologramFormat.Requirement, Object> requirements = new EnumMap<>(HologramFormat.Requirement.class);
|
Map<HologramFormat.Requirement, Object> requirements = new EnumMap<>(HologramFormat.Requirement.class);
|
||||||
@ -249,9 +274,9 @@ public class Shop {
|
|||||||
requirements.put(HologramFormat.Requirement.IS_WRITTEN_BOOK, getProduct().getType() == Material.WRITTEN_BOOK);
|
requirements.put(HologramFormat.Requirement.IS_WRITTEN_BOOK, getProduct().getType() == Material.WRITTEN_BOOK);
|
||||||
requirements.put(HologramFormat.Requirement.ADMIN_SHOP, getShopType() == ShopType.ADMIN);
|
requirements.put(HologramFormat.Requirement.ADMIN_SHOP, getShopType() == ShopType.ADMIN);
|
||||||
requirements.put(HologramFormat.Requirement.NORMAL_SHOP, getShopType() == ShopType.NORMAL);
|
requirements.put(HologramFormat.Requirement.NORMAL_SHOP, getShopType() == ShopType.NORMAL);
|
||||||
requirements.put(HologramFormat.Requirement.IN_STOCK, Utils.getAmount(getInventoryHolder().getInventory(), getProduct()));
|
requirements.put(HologramFormat.Requirement.IN_STOCK, Utils.getAmount(inventory, getProduct()));
|
||||||
requirements.put(HologramFormat.Requirement.MAX_STACK, getProduct().getMaxStackSize());
|
requirements.put(HologramFormat.Requirement.MAX_STACK, getProduct().getMaxStackSize());
|
||||||
requirements.put(HologramFormat.Requirement.CHEST_SPACE, Utils.getFreeSpaceForItem(getInventoryHolder().getInventory(), getProduct()));
|
requirements.put(HologramFormat.Requirement.CHEST_SPACE, Utils.getFreeSpaceForItem(inventory, getProduct()));
|
||||||
requirements.put(HologramFormat.Requirement.DURABILITY, getProduct().getDurability());
|
requirements.put(HologramFormat.Requirement.DURABILITY, getProduct().getDurability());
|
||||||
|
|
||||||
Map<Placeholder, Object> placeholders = new EnumMap<>(Placeholder.class);
|
Map<Placeholder, Object> placeholders = new EnumMap<>(Placeholder.class);
|
||||||
@ -264,9 +289,9 @@ public class Shop {
|
|||||||
placeholders.put(Placeholder.POTION_EFFECT, LanguageUtils.getPotionEffectName(getProduct()));
|
placeholders.put(Placeholder.POTION_EFFECT, LanguageUtils.getPotionEffectName(getProduct()));
|
||||||
placeholders.put(Placeholder.MUSIC_TITLE, LanguageUtils.getMusicDiscName(getProduct().getType()));
|
placeholders.put(Placeholder.MUSIC_TITLE, LanguageUtils.getMusicDiscName(getProduct().getType()));
|
||||||
placeholders.put(Placeholder.GENERATION, LanguageUtils.getBookGenerationName(getProduct()));
|
placeholders.put(Placeholder.GENERATION, LanguageUtils.getBookGenerationName(getProduct()));
|
||||||
placeholders.put(Placeholder.STOCK, Utils.getAmount(getInventoryHolder().getInventory(), getProduct()));
|
placeholders.put(Placeholder.STOCK, Utils.getAmount(inventory, getProduct()));
|
||||||
placeholders.put(Placeholder.MAX_STACK, getProduct().getMaxStackSize());
|
placeholders.put(Placeholder.MAX_STACK, getProduct().getMaxStackSize());
|
||||||
placeholders.put(Placeholder.CHEST_SPACE, Utils.getFreeSpaceForItem(getInventoryHolder().getInventory(), getProduct()));
|
placeholders.put(Placeholder.CHEST_SPACE, Utils.getFreeSpaceForItem(inventory, getProduct()));
|
||||||
placeholders.put(Placeholder.DURABILITY, getProduct().getDurability());
|
placeholders.put(Placeholder.DURABILITY, getProduct().getDurability());
|
||||||
|
|
||||||
int lineCount = plugin.getHologramFormat().getLineCount();
|
int lineCount = plugin.getHologramFormat().getLineCount();
|
||||||
@ -298,7 +323,7 @@ public class Shop {
|
|||||||
return lines.toArray(new String[0]);
|
return lines.toArray(new String[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Location getHologramLocation(boolean doubleChest, Chest[] chests, BlockFace face) {
|
private Location getHologramLocation(Chest[] chests, BlockFace face) {
|
||||||
World w = location.getWorld();
|
World w = location.getWorld();
|
||||||
int x = location.getBlockX();
|
int x = location.getBlockX();
|
||||||
int y = location.getBlockY();
|
int y = location.getBlockY();
|
||||||
@ -310,7 +335,7 @@ public class Shop {
|
|||||||
|
|
||||||
if (Config.hologramFixedBottom) deltaY = -0.85;
|
if (Config.hologramFixedBottom) deltaY = -0.85;
|
||||||
|
|
||||||
if (doubleChest) {
|
if (chests[1] != null) {
|
||||||
Chest c1 = Utils.getMajorVersion() >= 13 && (face == BlockFace.NORTH || face == BlockFace.EAST) ? chests[1] : chests[0];
|
Chest c1 = Utils.getMajorVersion() >= 13 && (face == BlockFace.NORTH || face == BlockFace.EAST) ? chests[1] : chests[0];
|
||||||
Chest c2 = Utils.getMajorVersion() >= 13 && (face == BlockFace.NORTH || face == BlockFace.EAST) ? chests[0] : chests[1];
|
Chest c2 = Utils.getMajorVersion() >= 13 && (face == BlockFace.NORTH || face == BlockFace.EAST) ? chests[0] : chests[1];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user