diff --git a/src/config.yml b/src/config.yml index f15ae8f..2bb13df 100644 --- a/src/config.yml +++ b/src/config.yml @@ -200,6 +200,7 @@ delays: fix_uuid: 50 # (ticks) Time (after login) before to fix UUID which can happens, especialy in offline mode. option_take_effect: 20 # (ticks) Time to wait before a new open takes effect in the currently active player compasses. refresh_status: 20 # (ticks) Refresh compass status after specific actions (enter vehicle, using elytra, ...). + pickup_refresh: 50 # (ticks) Refresh compass status after player has pickup some items. target_cancel: 2 # (ticks) Time after target creation input has been sent to perform the action # If compasses not appearing after (re)login, try a higher value. You can verify it's related by using /scompass-reload. # If after running this command, the compasses re-appear, the cause is a wrong player UUID discovery. diff --git a/src/me/arboriginal/SimpleCompass/compasses/AbstractCompass.java b/src/me/arboriginal/SimpleCompass/compasses/AbstractCompass.java index 96a598d..d9bbdde 100644 --- a/src/me/arboriginal/SimpleCompass/compasses/AbstractCompass.java +++ b/src/me/arboriginal/SimpleCompass/compasses/AbstractCompass.java @@ -123,11 +123,11 @@ private char getFacing() { return Arrays.asList('S', 'W', 'N', 'E').get(Math.round(owner.getLocation().getYaw() / 90f) & 0x3); } - private HashMap> getActiveTargets() { // @formatter:off + private HashMap>> getActiveTargets() { // @formatter:off String cacheKey = "trackers." + type; @SuppressWarnings("unchecked") - HashMap> trackers - = (HashMap>) sc.cache.get(owner.getUniqueId(), cacheKey); + HashMap>> trackers + = (HashMap>>) sc.cache.get(owner.getUniqueId(), cacheKey); if (trackers == null) { trackers = sc.targets.getTargetsCoords(owner); @@ -138,34 +138,41 @@ private HashMap> getActiveTargets() { // @formatter: } // @formatter:on private String injectActivatedTrackers(String compass, String sepColor) { - HashMap> targets = getActiveTargets(); + HashMap>> targets = getActiveTargets(); if (targets.isEmpty()) return compass; Location refPos = owner.getEyeLocation(); HashMap placeholders = new HashMap(); - for (String type : sc.targets.trackersPriority) { - ArrayList coords = targets.get(type); - AbstractTracker tracker = sc.trackers.get(type); - if (coords == null || tracker == null) continue; + for (String trackerID : sc.targets.trackersPriority) { + AbstractTracker tracker = sc.trackers.get(trackerID); + if (tracker == null) continue; - String marker = tracker.settings.getString("settings.temp"); - String symbol = tracker.settings.getString("settings.symbol"); - placeholders.put(marker, symbol + sepColor); + for (String targetType : targets.keySet()) { + ArrayList coords = targets.get(targetType).get(trackerID); + if (coords == null || coords.isEmpty()) continue; - for (double[] target : coords) { - Vector blockDirection = new Location(owner.getWorld(), target[0], refPos.getY(), target[1]) - .subtract(refPos).toVector().normalize(); + String marker = tracker.settings + .getString("settings." + (targetType.equals("off") ? "inactive_" : "") + "temp"); + String symbol = tracker.settings + .getString("settings." + (targetType.equals("off") ? "inactive_" : "") + "symbol"); - Vector lookAt = refPos.getDirection().setY(0); - boolean viewable = (lookAt.dot(blockDirection) > 0); - double angle = Math.toDegrees(blockDirection.angle(lookAt.crossProduct(new Vector(0, 1, 0)))); - if (!viewable) angle = (angle > 90) ? 180 : 0; - int start = compass.length() - (int) Math.round(2 * angle * compass.length() / 360); + placeholders.put(marker, symbol + sepColor); - compass = (start < 2) ? marker + compass.substring(start + 1) - : compass.substring(0, start - 1) + marker + compass.substring(start); + for (double[] target : coords) { + Vector blockDirection = new Location(owner.getWorld(), target[0], refPos.getY(), target[1]) + .subtract(refPos).toVector().normalize(); + + Vector lookAt = refPos.getDirection().setY(0); + boolean viewable = (lookAt.dot(blockDirection) > 0); + double angle = Math.toDegrees(blockDirection.angle(lookAt.crossProduct(new Vector(0, 1, 0)))); + if (!viewable) angle = (angle > 90) ? 180 : 0; + int start = compass.length() - (int) Math.round(2 * angle * compass.length() / 360); + + compass = (start < 2) ? marker + compass.substring(start + 1) + : compass.substring(0, start - 1) + marker + compass.substring(start); + } } } diff --git a/src/me/arboriginal/SimpleCompass/managers/TargetManager.java b/src/me/arboriginal/SimpleCompass/managers/TargetManager.java index 19a3284..0d79970 100644 --- a/src/me/arboriginal/SimpleCompass/managers/TargetManager.java +++ b/src/me/arboriginal/SimpleCompass/managers/TargetManager.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.UUID; import org.bukkit.entity.Player; @@ -94,38 +95,60 @@ public void disableTarget(Player player, String type, String name) { sc.datas.activeTargetDel(player, type, name); } - public HashMap> getTargetsCoords(Player player) { - HashMap> list = new HashMap>(); + public HashMap>> getTargetsCoords(Player player) { + HashMap>> list = new HashMap>>(); + list.put("on", new HashMap>()); + list.put("off", new HashMap>()); + HashMap> stop = new HashMap>(); UUID uid = player.getUniqueId(); + List invalids = new ArrayList(); + for (String trackerID : sc.trackers.keySet()) { - if (!activeTargets.get(trackerID).containsKey(uid)) continue; AbstractTracker tracker = sc.trackers.get(trackerID); if (tracker == null) continue; - ArrayList sublist = new ArrayList(); - ArrayList closest = new ArrayList(); + HashMap sublistOn = new HashMap(); + + if (activeTargets.get(trackerID).containsKey(uid)) { + ArrayList closest = new ArrayList(); - for (String name : activeTargets.get(trackerID).get(uid)) { - double[] coords = tracker.get(player, name); + Iterator it = activeTargets.get(trackerID).get(uid).iterator(); + while (it.hasNext()) { + String name = it.next(); + double[] coords = tracker.get(player, name); + if (coords == null) invalids.add(trackerID + ":" + name); + if (coords == null || tracker.playerIsClose(player, coords)) + closest.add(name); + else + sublistOn.put(name, coords); + } - if (coords == null || tracker.playerIsClose(player, coords)) - closest.add(name); - else - sublist.add(coords); + if (!sublistOn.isEmpty()) list.get("on").put(trackerID, new ArrayList(sublistOn.values())); + if (!closest.isEmpty()) stop.put(tracker, closest); } - if (!sublist.isEmpty()) list.put(trackerID, sublist); - if (!closest.isEmpty()) stop.put(tracker, closest); + if (tracker.settings.getBoolean("settings.inactive_target", false)) { + ArrayList sublistOff = new ArrayList(); + + for (String name : tracker.availableTargets(player, "")) { + if (sublistOn.containsKey(name)) continue; + double[] coords = tracker.get(player, name); + if (coords != null) sublistOff.add(coords); + } + + if (!sublistOff.isEmpty()) list.get("off").put(trackerID, sublistOff); + } } if (!stop.isEmpty()) { stop.forEach((tracker, stopped) -> { stopped.forEach(name -> { tracker.disable(player, name); - tracker.sendMessage(player, "target_auto_disabled", - ImmutableMap.of("tracker", tracker.trackerName(), "target", name)); + if (!invalids.contains(tracker.trackerID() + ":" + name)) + tracker.sendMessage(player, "target_auto_disabled", + ImmutableMap.of("tracker", tracker.trackerName(), "target", name)); }); }); } diff --git a/src/me/arboriginal/SimpleCompass/managers/TaskManager.java b/src/me/arboriginal/SimpleCompass/managers/TaskManager.java index 1c62e76..921d71d 100644 --- a/src/me/arboriginal/SimpleCompass/managers/TaskManager.java +++ b/src/me/arboriginal/SimpleCompass/managers/TaskManager.java @@ -91,6 +91,11 @@ public void run() { sc.compasses.removeCompass(CompassTypes.BOSSBAR, player); sc.compasses.refreshCompassState(player); clear(type, uid, this); + + if (sc.trackers.isEmpty()) return; + sc.trackers.forEach((trackerID, tracker) -> { + for (String name : tracker.autoloadTargets(player, "")) tracker.activate(player, name, false); + }); } }; @@ -123,7 +128,8 @@ public void run() { } }; - task.runTaskLaterAsynchronously(sc, sc.config.getInt("delays.refresh_status")); + task.runTaskLaterAsynchronously(sc, + (data == null || !(data instanceof Integer)) ? sc.config.getInt("delays.refresh_status") : (int) data); break; case REMOVEWARNING: diff --git a/src/me/arboriginal/SimpleCompass/plugin/AbstractTracker.java b/src/me/arboriginal/SimpleCompass/plugin/AbstractTracker.java index 9a22e13..290b1c8 100644 --- a/src/me/arboriginal/SimpleCompass/plugin/AbstractTracker.java +++ b/src/me/arboriginal/SimpleCompass/plugin/AbstractTracker.java @@ -249,6 +249,18 @@ public List availableTargets(Player player, String startWith) { return list; } + public List autoloadTargets(Player player, String startWith) { + List list = new ArrayList(); + + if (settings.getBoolean("settings.autoload_target", false)) { + String perm = "scompass.track.auto." + trackerID() + "."; + for (String name : availableTargets(player, startWith)) + if (player.hasPermission(perm + "*") || player.hasPermission(perm + name)) list.add(name); + } + + return list; + } + public boolean del(Player player, String name) { String key = key(player, name); @@ -413,7 +425,7 @@ public String key(Player player) { } public String key(Player player, String name) { - return sc.datas.getKey(player, trackerID() + (name == null ? "" : "." + name.toLowerCase())); + return sc.datas.getKey(player, trackerID() + (name == null ? "" : "." + name)); } public boolean save(String key, Object value) { diff --git a/src/me/arboriginal/SimpleCompass/plugin/Listeners.java b/src/me/arboriginal/SimpleCompass/plugin/Listeners.java index 968ce95..15e6aaa 100644 --- a/src/me/arboriginal/SimpleCompass/plugin/Listeners.java +++ b/src/me/arboriginal/SimpleCompass/plugin/Listeners.java @@ -7,6 +7,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityToggleGlideEvent; +import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; @@ -43,7 +44,7 @@ public Listeners(SimpleCompass plugin) { public void onEntityPickupItem(EntityPickupItemEvent event) { if (event.isCancelled() || !(event.getEntity() instanceof Player)) return; - sc.tasks.set(TasksTypes.REFRESH_STATUS, (Player) event.getEntity()); + sc.tasks.set(TasksTypes.REFRESH_STATUS, (Player) event.getEntity(), sc.config.getInt("delays.pickup_refresh")); } @EventHandler @@ -83,6 +84,12 @@ public void onPlayerCommandSend(PlayerCommandSendEvent event) { sc.tasks.set(TasksTypes.REFRESH_STATUS, event.getPlayer()); } + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + if (!(event.getEntity() instanceof Player)) return; + sc.compasses.removeCompass((Player) event.getEntity()); + } + @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); diff --git a/src/me/arboriginal/SimpleCompass/utils/CacheUtil.java b/src/me/arboriginal/SimpleCompass/utils/CacheUtil.java index c4090d7..44c6b99 100644 --- a/src/me/arboriginal/SimpleCompass/utils/CacheUtil.java +++ b/src/me/arboriginal/SimpleCompass/utils/CacheUtil.java @@ -73,6 +73,7 @@ public void reset() { } public void set(UUID uid, String key, Object value, int duration) { + if (!datas.containsKey(uid)) init(uid); datas.get(uid).put(key, new Data((duration == PERMANENT) ? PERMANENT : now() + duration, value)); } diff --git a/src/plugin.yml b/src/plugin.yml index f6bff91..8fa0466 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: SimpleCompass description: Simple compass to help player who don't have sense of direction. -version: 0.9.7 +version: 0.9.8 author: arboriginal website: https://www.spigotmc.org/resources/simplecompass.63140/