added LocatorBar preferences
This commit is contained in:
@@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.function.Consumer;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class Settings extends Appliance {
|
public class Settings extends Appliance {
|
||||||
@@ -34,7 +35,8 @@ public class Settings extends Appliance {
|
|||||||
ChatMentions,
|
ChatMentions,
|
||||||
DoubleDoors,
|
DoubleDoors,
|
||||||
KnockDoors,
|
KnockDoors,
|
||||||
BorderWarning
|
BorderWarning,
|
||||||
|
LocatorBarConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Settings instance() {
|
public static Settings instance() {
|
||||||
@@ -58,6 +60,16 @@ public class Settings extends Appliance {
|
|||||||
|
|
||||||
private final WeakHashMap<Player, OpenSettingsInventory> openSettingsInventories = new WeakHashMap<>();
|
private final WeakHashMap<Player, OpenSettingsInventory> openSettingsInventories = new WeakHashMap<>();
|
||||||
private final WeakHashMap<Player, List<Setting<?>>> settingsCache = new WeakHashMap<>();
|
private final WeakHashMap<Player, List<Setting<?>>> settingsCache = new WeakHashMap<>();
|
||||||
|
protected final Map<Class<? extends Setting<?>>, Consumer<Player>> changeListeners = new WeakHashMap<>();
|
||||||
|
|
||||||
|
public <TDataType extends Setting<?>> void addChangeListener(Class<TDataType> setting, Consumer<Player> listener) {
|
||||||
|
this.changeListeners.merge(setting, listener, Consumer::andThen);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <TDataType extends Setting<?>> void invokeChangeListener(Player player, Class<TDataType> setting) {
|
||||||
|
Optional.ofNullable(this.changeListeners.get(setting))
|
||||||
|
.ifPresent(listener -> listener.accept(player));
|
||||||
|
}
|
||||||
|
|
||||||
private List<Setting<?>> getSettings(Player player) {
|
private List<Setting<?>> getSettings(Player player) {
|
||||||
if(this.settingsCache.containsKey(player)) return this.settingsCache.get(player);
|
if(this.settingsCache.containsKey(player)) return this.settingsCache.get(player);
|
||||||
|
@@ -34,7 +34,24 @@ public abstract class Setting<TDataType> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void initializeFromPlayer(Player p) {
|
public void initializeFromPlayer(Player p) {
|
||||||
this.fromStorage(p.getPersistentDataContainer());
|
PersistentDataContainer dataContainer = p.getPersistentDataContainer();
|
||||||
|
try {
|
||||||
|
this.fromStorage(dataContainer);
|
||||||
|
} catch(IllegalArgumentException e) {
|
||||||
|
Main.logger().warning(String.format(
|
||||||
|
"Could not load state of setting %s from player %s: '%s'\n Did the datatype of the setting change?",
|
||||||
|
this.getNamespacedKey(),
|
||||||
|
e.getMessage(),
|
||||||
|
p.getName()
|
||||||
|
));
|
||||||
|
dataContainer.remove(this.getNamespacedKey());
|
||||||
|
this.fromStorage(dataContainer);
|
||||||
|
Main.logger().info(String.format(
|
||||||
|
"Restoring defaults of setting %s of player %s",
|
||||||
|
this.getNamespacedKey(),
|
||||||
|
p.getName()
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void triggerChange(Player p, ClickType clickType) {
|
public void triggerChange(Player p, ClickType clickType) {
|
||||||
@@ -42,6 +59,7 @@ public abstract class Setting<TDataType> {
|
|||||||
this.change(p, clickType);
|
this.change(p, clickType);
|
||||||
InteractSounds.of(p).click();
|
InteractSounds.of(p).click();
|
||||||
this.toStorage(p.getPersistentDataContainer(), this.state());
|
this.toStorage(p.getPersistentDataContainer(), this.state());
|
||||||
|
Settings.instance().invokeChangeListener(p, this.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemStack buildItem() {
|
public ItemStack buildItem() {
|
||||||
|
@@ -0,0 +1,50 @@
|
|||||||
|
package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.locatorBar;
|
||||||
|
|
||||||
|
import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings;
|
||||||
|
import eu.mhsl.craftattack.spawn.core.appliance.Appliance;
|
||||||
|
import org.bukkit.attribute.Attribute;
|
||||||
|
import org.bukkit.attribute.AttributeInstance;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class LocatorBar extends Appliance {
|
||||||
|
private enum Distance {
|
||||||
|
MAX(6.0e7),
|
||||||
|
ZERO(0.0);
|
||||||
|
|
||||||
|
final double distance;
|
||||||
|
Distance(double distance) {
|
||||||
|
this.distance = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
Settings.instance().declareSetting(LocatorBarSettings.class);
|
||||||
|
Settings.instance().addChangeListener(LocatorBarSettings.class, this::updateLocatorBar);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateLocatorBar(Player player) {
|
||||||
|
boolean enabled = Settings.instance().getSetting(player, Settings.Key.LocatorBarConfig, Boolean.class);
|
||||||
|
|
||||||
|
AttributeInstance receive = player.getAttribute(Attribute.WAYPOINT_RECEIVE_RANGE);
|
||||||
|
AttributeInstance transmit = player.getAttribute(Attribute.WAYPOINT_TRANSMIT_RANGE);
|
||||||
|
|
||||||
|
Objects.requireNonNull(receive);
|
||||||
|
Objects.requireNonNull(transmit);
|
||||||
|
|
||||||
|
receive.setBaseValue(enabled ? Distance.MAX.distance : Distance.ZERO.distance);
|
||||||
|
transmit.setBaseValue(enabled ? Distance.MAX.distance : Distance.ZERO.distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected @NotNull List<Listener> listeners() {
|
||||||
|
return List.of(
|
||||||
|
new LocatorBarUpdateListener()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,38 @@
|
|||||||
|
package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.locatorBar;
|
||||||
|
|
||||||
|
import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting;
|
||||||
|
import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory;
|
||||||
|
import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings;
|
||||||
|
import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.BoolSetting;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
public class LocatorBarSettings extends BoolSetting implements CategorizedSetting {
|
||||||
|
@Override
|
||||||
|
public SettingCategory category() {
|
||||||
|
return SettingCategory.Gameplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocatorBarSettings() {
|
||||||
|
super(Settings.Key.LocatorBarConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String title() {
|
||||||
|
return "Ortungsleiste / Locator Bar";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String description() {
|
||||||
|
return "Konfiguriere, ob andere Spieler deine Position und du die Position anderer sehen möchtest";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Material icon() {
|
||||||
|
return Material.COMPASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean defaultValue() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,12 @@
|
|||||||
|
package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.locatorBar;
|
||||||
|
|
||||||
|
import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
|
||||||
|
class LocatorBarUpdateListener extends ApplianceListener<LocatorBar> {
|
||||||
|
@EventHandler
|
||||||
|
public void onJoin(PlayerJoinEvent event) {
|
||||||
|
this.getAppliance().updateLocatorBar(event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user