diff --git a/src/main/java/de/lunarakai/blockfox/commands/DeleteCommand.java b/src/main/java/de/lunarakai/blockfox/commands/DeleteCommand.java new file mode 100644 index 0000000..c680ddd --- /dev/null +++ b/src/main/java/de/lunarakai/blockfox/commands/DeleteCommand.java @@ -0,0 +1,4 @@ +package de.lunarakai.blockfox.commands; + +public class DeleteCommand { +} diff --git a/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java new file mode 100644 index 0000000..460efea --- /dev/null +++ b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java @@ -0,0 +1,55 @@ +package de.lunarakai.blockfox.common; + +import com.google.common.base.Preconditions; +import de.lunarakai.blockfox.BlockFoxPlugin; +import java.util.List; +import java.util.UUID; +import org.bukkit.Location; +import org.bukkit.block.BlockFace; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; + +public class BlockFoxDisplay { + private final BlockFoxPlugin plugin; + private final String name; + private final Location location; + private final Location centerLocation; + private final BlockFace orientation; + private DisplayStatus displayStatus = DisplayStatus.INACTIVE; + private BlockFoxDisplayMode blockFoxDisplayMode = BlockFoxDisplayMode.RSS_FEED; + private UUID[] textDisplays; + private Player currentPlayer; + + public BlockFoxDisplay(BlockFoxPlugin plugin, ConfigurationSection displaySection) { + this.plugin = plugin; + this.name = Preconditions.checkNotNull(displaySection.getString("name")); + this.location = Preconditions.checkNotNull(displaySection.getLocation("location")); + this.textDisplays = new UUID[99]; // TODO + + BlockFace orientation = BlockFace.NORTH; + try { + orientation = BlockFace.valueOf(displaySection.getString("orientation")); + } catch (IllegalArgumentException ignored) { + + } + this.orientation = orientation; + this.centerLocation = location.clone().add(0.5, 0, 0.5); + + String modeValue = displaySection.getString("mode"); + + switch(modeValue) { + case "fediverse": this.blockFoxDisplayMode = BlockFoxDisplayMode.FEDIVERSE_CLIENT; break; + default: this.blockFoxDisplayMode = BlockFoxDisplayMode.RSS_FEED; + } + + List list = displaySection.getStringList("textdisplays"); + for(int i = 0; i < list.size(); i++) { + String textDisplay = list.get(i); + if(textDisplay != null) { + textDisplays[i] = UUID.fromString(textDisplay); + } + } + } + + +} diff --git a/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java new file mode 100644 index 0000000..1f74d25 --- /dev/null +++ b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java @@ -0,0 +1,6 @@ +package de.lunarakai.blockfox.common; + +public enum BlockFoxDisplayMode { + RSS_FEED, + FEDIVERSE_CLIENT +} diff --git a/src/main/java/de/lunarakai/blockfox/common/DisplayList.java b/src/main/java/de/lunarakai/blockfox/common/DisplayList.java index b126941..cec4028 100644 --- a/src/main/java/de/lunarakai/blockfox/common/DisplayList.java +++ b/src/main/java/de/lunarakai/blockfox/common/DisplayList.java @@ -1,4 +1,150 @@ package de.lunarakai.blockfox.common; +import de.lunarakai.blockfox.BlockFoxPlugin; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.UUID; +import java.util.logging.Level; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + public class DisplayList { + private static final String DISPLAY_LIST_FILENAME = "blockfox_displays.yml"; + private final BlockFoxPlugin plugin; + private File displayListFile; + + private final HashMap bfDisplays; + private final HashMap playerUsingBFDisplay; + private final HashMap bfdisplayBlocks; + private final HashMap bfdisplayItemDisplays; + private final HashMap bfDisplayMode; + + public DisplayList(BlockFoxPlugin plugin) { + this.plugin = plugin; + this.bfDisplays = new HashMap<>(); + this.bfdisplayBlocks = new HashMap<>(); + this.playerUsingBFDisplay = new HashMap<>(); + this.bfdisplayItemDisplays = new HashMap<>(); + this.bfDisplayMode = new HashMap<>(); + this.displayListFile = new File(plugin.getDataFolder(), DISPLAY_LIST_FILENAME); + } + + public void load() { + bfDisplays.clear(); + if(!this.displayListFile.exists()) { + return; + } + + YamlConfiguration conf = new YamlConfiguration(); + try { + conf.load(this.displayListFile); + } catch (IOException | InvalidConfigurationException e) { + plugin.getLogger().log(Level.SEVERE, "could not load display list file ", e); + } + ConfigurationSection displaysSection = conf.getConfigurationSection("displays"); + if(displaysSection != null) { + for(String displayName : displaysSection.getKeys(false)) { + ConfigurationSection displaySection = displaysSection.getConfigurationSection(displayName); + if(displaySection != null) { + BlockFoxDisplay blockFoxDisplay = new BlockFoxDisplay(plugin, displaySection); + this.bfDisplays.put(blockFoxDisplay.getName(), blockFoxDisplay); + setDisplayBlocks(blockFoxDisplay); + } + } + } + } + + public void save() { + YamlConfiguration conf = new YamlConfiguration(); + ConfigurationSection displaysSection = conf.createSection("displays"); + int i = 0; + for(BlockFoxDisplay display : bfDisplays.values()) { + display.save(displaysSection.createSection(Integer.toString(i++))); + } + this.displayListFile.getParentFile().mkdirs(); + try { + conf.save(this.displayListFile); + } catch (IOException e) { + plugin.getLogger().log(Level.SEVERE, "could not save display list file ", e); + } + } + + private void setDisplayBlocks(BlockFoxDisplay blockFoxDisplay) { + for(Location loc : blockFoxDisplay.getBlocks()) { + bfdisplayBlocks.put(loc.clone(), blockFoxDisplay); + } + for(UUID uuid : blockFoxDisplay.getItemDisplays()) { + if(uuid != null) { + bfdisplayItemDisplays.put(uuid, blockFoxDisplay); + } + } + } + + public BlockFoxDisplay getBlockFoxDisplay(String blockFoxDisplayName) { + return bfDisplays.get(blockFoxDisplayName); + } + + public Collection getBlockFoxDisplays() { + return bfDisplays.values(); + } + + public void addBlockFoxDisplay(BlockFoxDisplay blockFoxDisplay) { + this.bfDisplays.put(blockFoxDisplay.getName(), blockFoxDisplay); + setDisplayBlocks(blockFoxDisplay); + save(); + } + + public boolean collidesWithBlockFoxDisplay(BlockFoxDisplay newBlockFoxDisplay) { + for(Location location : newBlockFoxDisplay.getBlocks()) { + if(bfdisplayBlocks.get(location) != null) { + return true; + } + } + return false; + } + + public void setBlockFoxDisplayForPlayer(Player player, BlockFoxDisplay blockFoxDisplay) { + if(blockFoxDisplay != null) { + playerUsingBFDisplay.put(player.getUniqueId(), blockFoxDisplay); + } else { + playerUsingBFDisplay.remove(player.getUniqueId()); + } + } + + public BlockFoxDisplay getPlayerDisplay(Player player) { + return playerUsingBFDisplay.get(player.getUniqueId()); + } + + public BlockFoxDisplay getBFDisplayAtBlock(Block block) { + return bfdisplayBlocks.get(block.getLocation()); + } + + public BlockFoxDisplay getDisplayForItemDisplay(UUID id) { + return bfdisplayItemDisplays.get(id); + } + + public void removeBlockFoxDisplay(BlockFoxDisplay blockFoxDisplay) { + if(blockFoxDisplay.hasPlayer()) { + plugin.getManager().quitDisplay(blockFoxDisplay.getCurrentPlayer(), true, true); + } + + for(UUID uuid : arena.getItemDisplays()) { + if(uuid != null) { + bfdisplayItemDisplays.remove(uuid); + } + } + for(Location block : blockFoxDisplay.getBlocks()) { + bfdisplayBlocks.remove(block); + } + blockFoxDisplay.removeItemDisplay(); + + bfDisplays.remove(blockFoxDisplay.getName()); + save(); + } }