Skip to content

Commit

Permalink
Autostart and inactive targets
Browse files Browse the repository at this point in the history
- Add target autostart ability
- Add inactive target ability
- Fix duplicate bossbar compass on respawn (sometimes happened when require item was picked quickly)
- Fix warning message (supposed when using NPC)
  • Loading branch information
arboriginal committed Feb 19, 2019
1 parent ca5bdd8 commit 51bc439
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 40 deletions.
1 change: 1 addition & 0 deletions src/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
49 changes: 28 additions & 21 deletions src/me/arboriginal/SimpleCompass/compasses/AbstractCompass.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,11 +123,11 @@ private char getFacing() {
return Arrays.asList('S', 'W', 'N', 'E').get(Math.round(owner.getLocation().getYaw() / 90f) & 0x3);
}

private HashMap<String, ArrayList<double[]>> getActiveTargets() { // @formatter:off
private HashMap<String, HashMap<String, ArrayList<double[]>>> getActiveTargets() { // @formatter:off
String cacheKey = "trackers." + type;
@SuppressWarnings("unchecked")
HashMap<String, ArrayList<double[]>> trackers
= (HashMap<String, ArrayList<double[]>>) sc.cache.get(owner.getUniqueId(), cacheKey);
HashMap<String, HashMap<String, ArrayList<double[]>>> trackers
= (HashMap<String, HashMap<String, ArrayList<double[]>>>) sc.cache.get(owner.getUniqueId(), cacheKey);

if (trackers == null) {
trackers = sc.targets.getTargetsCoords(owner);
Expand All @@ -138,34 +138,41 @@ private HashMap<String, ArrayList<double[]>> getActiveTargets() { // @formatter:
} // @formatter:on

private String injectActivatedTrackers(String compass, String sepColor) {
HashMap<String, ArrayList<double[]>> targets = getActiveTargets();
HashMap<String, HashMap<String, ArrayList<double[]>>> targets = getActiveTargets();
if (targets.isEmpty()) return compass;

Location refPos = owner.getEyeLocation();

HashMap<String, String> placeholders = new HashMap<String, String>();

for (String type : sc.targets.trackersPriority) {
ArrayList<double[]> 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<double[]> 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);
}
}
}

Expand Down
53 changes: 38 additions & 15 deletions src/me/arboriginal/SimpleCompass/managers/TargetManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -94,38 +95,60 @@ public void disableTarget(Player player, String type, String name) {
sc.datas.activeTargetDel(player, type, name);
}

public HashMap<String, ArrayList<double[]>> getTargetsCoords(Player player) {
HashMap<String, ArrayList<double[]>> list = new HashMap<String, ArrayList<double[]>>();
public HashMap<String, HashMap<String, ArrayList<double[]>>> getTargetsCoords(Player player) {
HashMap<String, HashMap<String, ArrayList<double[]>>> list = new HashMap<String, HashMap<String, ArrayList<double[]>>>();
list.put("on", new HashMap<String, ArrayList<double[]>>());
list.put("off", new HashMap<String, ArrayList<double[]>>());

HashMap<AbstractTracker, ArrayList<String>> stop = new HashMap<AbstractTracker, ArrayList<String>>();
UUID uid = player.getUniqueId();

List<String> invalids = new ArrayList<String>();

for (String trackerID : sc.trackers.keySet()) {
if (!activeTargets.get(trackerID).containsKey(uid)) continue;
AbstractTracker tracker = sc.trackers.get(trackerID);
if (tracker == null) continue;

ArrayList<double[]> sublist = new ArrayList<double[]>();
ArrayList<String> closest = new ArrayList<String>();
HashMap<String, double[]> sublistOn = new HashMap<String, double[]>();

if (activeTargets.get(trackerID).containsKey(uid)) {
ArrayList<String> closest = new ArrayList<String>();

for (String name : activeTargets.get(trackerID).get(uid)) {
double[] coords = tracker.get(player, name);
Iterator<String> 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<double[]>(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<double[]> sublistOff = new ArrayList<double[]>();

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));
});
});
}
Expand Down
8 changes: 7 additions & 1 deletion src/me/arboriginal/SimpleCompass/managers/TaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}
};

Expand Down Expand Up @@ -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:
Expand Down
14 changes: 13 additions & 1 deletion src/me/arboriginal/SimpleCompass/plugin/AbstractTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,18 @@ public List<String> availableTargets(Player player, String startWith) {
return list;
}

public List<String> autoloadTargets(Player player, String startWith) {
List<String> list = new ArrayList<String>();

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);

Expand Down Expand Up @@ -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) {
Expand Down
9 changes: 8 additions & 1 deletion src/me/arboriginal/SimpleCompass/plugin/Listeners.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down
1 change: 1 addition & 0 deletions src/me/arboriginal/SimpleCompass/utils/CacheUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down
2 changes: 1 addition & 1 deletion src/plugin.yml
Original file line number Diff line number Diff line change
@@ -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/
Expand Down

0 comments on commit 51bc439

Please sign in to comment.