Adds full configuration for quest area marker style

This commit is contained in:
Kristian Knarvik 2022-11-03 17:15:37 +01:00
parent 0cbc7ae1b2
commit ac5b82b3f1
5 changed files with 216 additions and 22 deletions

View File

@ -45,6 +45,8 @@ public final class DynmapCitizens extends JavaPlugin {
this.saveDefaultConfig(); this.saveDefaultConfig();
configuration.options().copyDefaults(true); configuration.options().copyDefaults(true);
this.saveConfig(); this.saveConfig();
this.reloadConfig();
configuration = this.getConfig();
this.globalSettings.load(configuration); this.globalSettings.load(configuration);
//Initialize all enabled traits //Initialize all enabled traits

View File

@ -8,6 +8,7 @@ import net.citizensnpcs.api.npc.NPCRegistry;
import net.knarcraft.dynmapcitizens.DynmapCitizens; import net.knarcraft.dynmapcitizens.DynmapCitizens;
import net.knarcraft.dynmapcitizens.handler.trait.AbstractTraitHandler; import net.knarcraft.dynmapcitizens.handler.trait.AbstractTraitHandler;
import net.knarcraft.dynmapcitizens.property.Icon; import net.knarcraft.dynmapcitizens.property.Icon;
import net.knarcraft.dynmapcitizens.settings.AreaMarkerSettings;
import net.knarcraft.dynmapcitizens.settings.QuestsSettings; import net.knarcraft.dynmapcitizens.settings.QuestsSettings;
import net.knarcraft.dynmapcitizens.settings.TraitSettings; import net.knarcraft.dynmapcitizens.settings.TraitSettings;
import net.knarcraft.dynmapcitizens.util.QuestsHelper; import net.knarcraft.dynmapcitizens.util.QuestsHelper;
@ -35,7 +36,8 @@ import java.util.logging.Level;
public class QuestsHandler extends AbstractTraitHandler { public class QuestsHandler extends AbstractTraitHandler {
private QuestsAPI questsAPI; private QuestsAPI questsAPI;
private MarkerSet questAreaMarkerSet; private MarkerSet killAreaMarkerSet;
private MarkerSet reachAreaMarkerSet;
private Map<Icon, MarkerIcon> markerIcons; private Map<Icon, MarkerIcon> markerIcons;
private Map<UUID, NPCQuestInfo> questGiverInfo; private Map<UUID, NPCQuestInfo> questGiverInfo;
private final QuestsSettings settings = new QuestsSettings(); private final QuestsSettings settings = new QuestsSettings();
@ -47,13 +49,10 @@ public class QuestsHandler extends AbstractTraitHandler {
markerIcons = DynmapCitizens.getInstance().getGlobalSettings().getMarkerIcons(); markerIcons = DynmapCitizens.getInstance().getGlobalSettings().getMarkerIcons();
if (questsAPI != null) { if (questsAPI != null) {
super.initializeMarkerSet(); super.initializeMarkerSet();
questAreaMarkerSet = getMarkerSet(dynmapAPI, "quest_areas", "Quest areas");
if (questAreaMarkerSet != null) {
questAreaMarkerSet.setHideByDefault(true);
questAreaMarkerSet.setLayerPriority(2);
//Remove old quest markers
super.markerSet.getMarkers().forEach(GenericMarker::deleteMarker); super.markerSet.getMarkers().forEach(GenericMarker::deleteMarker);
}
killAreaMarkerSet = initializeMarkerSet(dynmapAPI, settings.getKillAreaSettings());
reachAreaMarkerSet = initializeMarkerSet(dynmapAPI, settings.getReachAreaSettings());
} else { } else {
isEnabled = false; isEnabled = false;
} }
@ -87,6 +86,22 @@ public class QuestsHandler extends AbstractTraitHandler {
generateAllMarkers(); generateAllMarkers();
} }
/**
* Initializes a marker set from the given settings
*
* @param dynmapAPI <p>A reference to the Dynmap API</p>
* @param markerSettings <p>The settings to use for initialization</p>
* @return <p>The initialized marker</p>
*/
private MarkerSet initializeMarkerSet(DynmapAPI dynmapAPI, AreaMarkerSettings markerSettings) {
MarkerSet markerSet = getMarkerSet(dynmapAPI, markerSettings.getMarkerSetId(), markerSettings.getMarkerSetName());
if (markerSet != null) {
markerSet.setHideByDefault(markerSettings.markersHiddenByDefault());
markerSet.setLayerPriority(markerSettings.getMarkerSetPriority());
}
return markerSet;
}
/** /**
* Generates information about all NPCs involved in quests * Generates information about all NPCs involved in quests
*/ */
@ -227,10 +242,10 @@ public class QuestsHandler extends AbstractTraitHandler {
* Updates all quest area markers * Updates all quest area markers
*/ */
private void updateQuestAreas() { private void updateQuestAreas() {
questAreaMarkerSet.getCircleMarkers().forEach(GenericMarker::deleteMarker); this.killAreaMarkerSet.getCircleMarkers().forEach(GenericMarker::deleteMarker);
this.reachAreaMarkerSet.getCircleMarkers().forEach(GenericMarker::deleteMarker);
for (IQuest quest : questsAPI.getLoadedQuests()) { for (IQuest quest : questsAPI.getLoadedQuests()) {
for (IStage stage : quest.getStages()) { for (IStage stage : quest.getStages()) {
//TODO: Put kill and reach locations in separate marker sets
markKillLocations(quest, stage); markKillLocations(quest, stage);
markReachLocations(quest, stage); markReachLocations(quest, stage);
} }
@ -245,6 +260,9 @@ public class QuestsHandler extends AbstractTraitHandler {
* @param stage <p>The stage to search for reach locations</p> * @param stage <p>The stage to search for reach locations</p>
*/ */
private void markReachLocations(IQuest quest, IStage stage) { private void markReachLocations(IQuest quest, IStage stage) {
if (settings.getReachAreaSettings().isDisabled()) {
return;
}
for (int i = 0; i < stage.getLocationsToReach().size(); i++) { for (int i = 0; i < stage.getLocationsToReach().size(); i++) {
Location location = stage.getLocationsToReach().get(i); Location location = stage.getLocationsToReach().get(i);
int radius = stage.getRadiiToReachWithin().get(i); int radius = stage.getRadiiToReachWithin().get(i);
@ -254,7 +272,7 @@ public class QuestsHandler extends AbstractTraitHandler {
description += "<b>" + areaName + "</b><br>"; description += "<b>" + areaName + "</b><br>";
} }
description += "Target location for " + quest.getName(); description += "Target location for " + quest.getName();
markLocation(location, radius, description, "FFFF99", "36c90e"); markLocation(location, radius, description, reachAreaMarkerSet, settings.getReachAreaSettings());
} }
} }
@ -265,6 +283,9 @@ public class QuestsHandler extends AbstractTraitHandler {
* @param stage <p>The stage to search for kill locations</p> * @param stage <p>The stage to search for kill locations</p>
*/ */
private void markKillLocations(IQuest quest, IStage stage) { private void markKillLocations(IQuest quest, IStage stage) {
if (settings.getKillAreaSettings().isDisabled()) {
return;
}
for (int i = 0; i < stage.getLocationsToKillWithin().size(); i++) { for (int i = 0; i < stage.getLocationsToKillWithin().size(); i++) {
Location location = stage.getLocationsToKillWithin().get(i); Location location = stage.getLocationsToKillWithin().get(i);
int radius = stage.getRadiiToKillWithin().get(i); int radius = stage.getRadiiToKillWithin().get(i);
@ -278,7 +299,7 @@ public class QuestsHandler extends AbstractTraitHandler {
} }
description += "Kill location for " + quest.getName() + description += "Kill location for " + quest.getName() +
"<br>Kill " + QuestsHelper.normalizeName(mob.name()) + " x " + mobAmount; "<br>Kill " + QuestsHelper.normalizeName(mob.name()) + " x " + mobAmount;
markLocation(location, radius, description, "EDAFA0", "8B0000"); markLocation(location, radius, description, killAreaMarkerSet, settings.getKillAreaSettings());
} }
} }
@ -288,25 +309,40 @@ public class QuestsHandler extends AbstractTraitHandler {
* @param location <p>The location to mark</p> * @param location <p>The location to mark</p>
* @param radius <p>The radius of the circular area to mark</p> * @param radius <p>The radius of the circular area to mark</p>
* @param description <p>The description to put on the marker</p> * @param description <p>The description to put on the marker</p>
* @param fillColor <p>The color to use inside the marker area</p> * @param markerSet <p>The marker set to use when marking the location</p>
* @param lineColor <p>The color to use outside the marker area</p> * @param markerSettings <p>The settings to use for the marker</p>
*/ */
private void markLocation(Location location, Integer radius, String description, String fillColor, String lineColor) { private void markLocation(Location location, Integer radius, String description, MarkerSet markerSet,
AreaMarkerSettings markerSettings) {
//Skip if location is invalid //Skip if location is invalid
World world = location.getWorld(); World world = location.getWorld();
if (world == null) { if (world == null) {
return; return;
} }
CircleMarker circleMarker = questAreaMarkerSet.createCircleMarker(null, description, true, CircleMarker circleMarker = markerSet.createCircleMarker(null, description, true,
world.getName(), location.getX(), location.getY(), location.getZ(), radius, radius, false); world.getName(), location.getX(), location.getY(), location.getZ(), radius, radius, false);
if (circleMarker == null) { if (circleMarker == null) {
DynmapCitizens.getInstance().getLogger().log(Level.WARNING, "Unable to create circle marker at " + DynmapCitizens.getInstance().getLogger().log(Level.WARNING, "Unable to create circle marker at " +
location + " with radius " + radius); location + " with radius " + radius);
} else { } else {
//TODO: Make colors configurable circleMarker.setFillStyle(markerSettings.getFillOpacity(), getColor(markerSettings.getFillColor()));
circleMarker.setFillStyle(0.3, Integer.parseInt(fillColor, 16)); circleMarker.setLineStyle(markerSettings.getLineThickness(), markerSettings.getLineOpacity(),
circleMarker.setLineStyle(2, 1.0, Integer.parseInt(lineColor, 16)); getColor(markerSettings.getLineColor()));
}
}
/**
* Gets an integer representation from a hexadecimal color code
*
* @param color <p>A hexadecimal color</p>
* @return <p>An integer representation of the color</p>
*/
private int getColor(String color) {
try {
return Integer.parseInt(color, 16);
} catch (NumberFormatException exception) {
return 0;
} }
} }

View File

@ -0,0 +1,130 @@
package net.knarcraft.dynmapcitizens.settings;
import org.bukkit.configuration.file.FileConfiguration;
/**
* Stores information about one kind of area marker
*/
public class AreaMarkerSettings {
private boolean enabled;
private int markerSetPriority;
private String markerSetId;
private String markerSetName;
private boolean markersHiddenByDefault;
private String fillColor;
private String lineColor;
private double fillOpacity;
private double lineOpacity;
private int lineThickness;
/**
* Loads all configuration values for one area marker
*
* @param fileConfiguration <p>The file configuration to load settings from</p>
* @param configRoot <p>The config root node containing all config values for one marker</p>
*/
public void load(FileConfiguration fileConfiguration, String configRoot) {
this.enabled = fileConfiguration.getBoolean(configRoot + ".enabled", false);
this.markerSetPriority = fileConfiguration.getInt(configRoot + ".markerSetPriority", 1);
this.markerSetId = fileConfiguration.getString(configRoot + ".markerSetId", null);
this.markerSetName = fileConfiguration.getString(configRoot + ".markerSetName", null);
this.markersHiddenByDefault = fileConfiguration.getBoolean(configRoot + ".markersHiddenByDefault", true);
this.fillColor = fileConfiguration.getString(configRoot + ".fillColor", null);
this.lineColor = fileConfiguration.getString(configRoot + ".lineColor", null);
this.fillOpacity = fileConfiguration.getDouble(configRoot + ".lineColor", 0.3);
this.lineOpacity = fileConfiguration.getDouble(configRoot + ".lineOpacity", 1.0);
this.lineThickness = fileConfiguration.getInt(configRoot + ".lineThickness", 2);
}
/**
* Gets whether the display of this type of area marker is disabled
*
* @return <p>True if this are marker type is disabled</p>
*/
public boolean isDisabled() {
return !this.enabled;
}
/**
* Gets the priority of this marker-set's markers (dynmap layer priority)
*
* @return <p>The priority of this marker set</p>
*/
public int getMarkerSetPriority() {
return this.markerSetPriority;
}
/**
* Gets the dynmap id of this marker set
*
* @return <p>The dynmap id of this marker set</p>
*/
public String getMarkerSetId() {
return this.markerSetId;
}
/**
* Gets the name of this marker set
*
* @return <p>The name of this marker set</p>
*/
public String getMarkerSetName() {
return this.markerSetName;
}
/**
* Gets whether this marker set should be hidden by default
*
* @return <p>Whether this marker set should be hidden by default</p>
*/
public boolean markersHiddenByDefault() {
return this.markersHiddenByDefault;
}
/**
* Gets the color of the filled-in area of this set's markers
*
* @return <p>The marker fill color</p>
*/
public String getFillColor() {
return this.fillColor;
}
/**
* Gets the color of the line around the filled-in area of this set's markers
*
* @return <p>The marker outline color</p>
*/
public String getLineColor() {
return this.lineColor;
}
/**
* Gets the opacity of the filled-in are of this set's markers
*
* @return <p>The opacity of the filled area</p>
*/
public double getFillOpacity() {
return this.fillOpacity;
}
/**
* Gets the opacity of the line around the filled-in area of this set's markers
*
* @return <p>The marker outline opacity</p>
*/
public double getLineOpacity() {
return this.lineOpacity;
}
/**
* Gets the thickness of the line around the filled-in area of this set's markers
*
* @return <p>The marker outline thickness</p>
*/
public int getLineThickness() {
return this.lineThickness;
}
}

View File

@ -11,6 +11,8 @@ public class QuestsSettings extends AbstractTraitSettings {
private boolean displayPlannerInfo; private boolean displayPlannerInfo;
private boolean displayStageInfo; private boolean displayStageInfo;
private boolean displayRequirementInfo; private boolean displayRequirementInfo;
private final AreaMarkerSettings killAreaSettings = new AreaMarkerSettings();
private final AreaMarkerSettings reachAreaSettings = new AreaMarkerSettings();
@Override @Override
public void load(FileConfiguration configuration) { public void load(FileConfiguration configuration) {
@ -19,6 +21,8 @@ public class QuestsSettings extends AbstractTraitSettings {
this.displayPlannerInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayPlannerInfo", true); this.displayPlannerInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayPlannerInfo", true);
this.displayStageInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayStageInfo", true); this.displayStageInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayStageInfo", true);
this.displayRequirementInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayRequirementInfo", true); this.displayRequirementInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayRequirementInfo", true);
this.killAreaSettings.load(configuration, getTraitConfigRoot() + ".circleMarker.killMarker");
this.reachAreaSettings.load(configuration, getTraitConfigRoot() + ".circleMarker.reachMarker");
} }
@Override @Override
@ -62,4 +66,22 @@ public class QuestsSettings extends AbstractTraitSettings {
return this.displayRequirementInfo; return this.displayRequirementInfo;
} }
/**
* Gets settings for the kill area markers
*
* @return <p>Settings for the kill area markers</p>
*/
public AreaMarkerSettings getKillAreaSettings() {
return killAreaSettings;
}
/**
* Gets settings for the reach area markers
*
* @return <p>Settings for the reach area markers</p>
*/
public AreaMarkerSettings getReachAreaSettings() {
return reachAreaSettings;
}
} }

View File

@ -54,6 +54,8 @@ traits:
markerSetPriority: 1 markerSetPriority: 1
# The id of the quest kill area marker set. Change if it overlaps with an existing set id # The id of the quest kill area marker set. Change if it overlaps with an existing set id
markerSetId: "quests_kill" markerSetId: "quests_kill"
# The name of the kill areas marker set. Change it if you want a cooler name
markerSetName: "Kill regions"
# Whether to hide the quest kill area layer by default # Whether to hide the quest kill area layer by default
markersHiddenByDefault: true markersHiddenByDefault: true
# The color used for the filled in area # The color used for the filled in area
@ -73,6 +75,8 @@ traits:
markerSetPriority: 1 markerSetPriority: 1
# The id of the quest reach area marker set. Change if it overlaps with an existing set id # The id of the quest reach area marker set. Change if it overlaps with an existing set id
markerSetId: "quests_reach" markerSetId: "quests_reach"
# The name of the reach areas marker set. Change it if you want a cooler name
markerSetName: "Reach areas"
# Whether to hide the quest reach area layer by default # Whether to hide the quest reach area layer by default
markersHiddenByDefault: true markersHiddenByDefault: true
# The color used for the filled in area # The color used for the filled in area