Commit e0a08f95 authored by Ashijin's avatar Ashijin
Browse files

breaking everything

parent 8c1114b3
package io.lumine.cosmetics.api.cosmetics; package io.lumine.cosmetics.api.cosmetics;
import java.util.Optional;
import io.lumine.cosmetics.api.cosmetics.manager.CosmeticManager; import io.lumine.cosmetics.api.cosmetics.manager.CosmeticManager;
import io.lumine.cosmetics.api.players.CosmeticInventory;
import io.lumine.cosmetics.api.players.CosmeticProfile; import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.utils.config.properties.PropertyHolder; import io.lumine.utils.config.properties.PropertyHolder;
import io.lumine.utils.menu.MenuData; import io.lumine.utils.menu.MenuData;
...@@ -20,29 +21,23 @@ public abstract class Cosmetic implements PropertyHolder,MenuData<CosmeticProfil ...@@ -20,29 +21,23 @@ public abstract class Cosmetic implements PropertyHolder,MenuData<CosmeticProfil
} }
public boolean has(CosmeticProfile profile) { public boolean has(CosmeticProfile profile) {
return has(profile.getCosmeticInventory()); return profile.has(this);
}
public boolean has(CosmeticInventory inventory) {
return inventory.getUnlocked(type).contains(key);
} }
public void equip(CosmeticProfile profile) { public void equip(CosmeticProfile profile) {
profile.equip(this); profile.equip(this);
} }
public void equip(CosmeticInventory inventory) {
inventory.equip(this);
}
public boolean isEquipped(CosmeticProfile profile) { public boolean isEquipped(CosmeticProfile profile) {
return profile.isEquipped(this); var maybeCosmetic = profile.getEquipped(getClass());
}
public boolean isEquipped(CosmeticInventory inventory) {
var maybeCosmetic = inventory.getEquipped(getClass());
return maybeCosmetic.isPresent() && maybeCosmetic.get().equals(this); return maybeCosmetic.isPresent() && maybeCosmetic.get().equals(this);
} }
public abstract String getPermission();
public abstract boolean hasVariants();
public abstract Optional<CosmeticVariant> getVariant(String id);
} }
package io.lumine.cosmetics.api.cosmetics;
import io.lumine.cosmetics.api.cosmetics.manager.CosmeticManager;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.utils.config.properties.PropertyHolder;
import io.lumine.utils.menu.MenuData;
import lombok.Getter;
public abstract class CosmeticVariant implements PropertyHolder,MenuData<CosmeticProfile> {
@Getter private final Cosmetic cosmetic;
@Getter private final String key;
public CosmeticVariant(Cosmetic cosmetic, String key) {
this.cosmetic = cosmetic;
this.key = key;
}
public abstract String getColor();
}
package io.lumine.cosmetics.api.cosmetics;
import lombok.Data;
@Data
public class EquippedCosmetic {
private final Cosmetic cosmetic;
private final CosmeticVariant variant;
public EquippedCosmetic(Cosmetic cosmetic) {
this.cosmetic = cosmetic;
this.variant = null;
}
public EquippedCosmetic(CosmeticVariant variant) {
this.cosmetic = variant.getCosmetic();
this.variant = variant;
}
}
...@@ -4,6 +4,6 @@ import org.bukkit.inventory.ItemStack; ...@@ -4,6 +4,6 @@ import org.bukkit.inventory.ItemStack;
public interface ItemCosmetic { public interface ItemCosmetic {
ItemStack getCosmetic(); ItemStack getCosmetic(CosmeticVariant variant);
} }
package io.lumine.cosmetics.api.players;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
public interface CosmeticInventory {
void initialize(CosmeticProfile profile);
Collection<String> getUnlocked(String type);
Optional<Cosmetic> getEquipped(Class<? extends Cosmetic> tClass);
Map<Class<? extends Cosmetic>, Cosmetic> getEquipped();
void equip(Cosmetic cosmetic);
void unequip(Class<? extends Cosmetic> tClass);
}
package io.lumine.cosmetics.api.players; package io.lumine.cosmetics.api.players;
import io.lumine.cosmetics.api.cosmetics.Cosmetic; import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public interface CosmeticProfile { public interface CosmeticProfile {
...@@ -13,18 +17,22 @@ public interface CosmeticProfile { ...@@ -13,18 +17,22 @@ public interface CosmeticProfile {
public Player getPlayer(); public Player getPlayer();
public CosmeticInventory getCosmeticInventory();
public boolean has(Cosmetic cosmetic); public boolean has(Cosmetic cosmetic);
public void equip(Cosmetic cosmetic); public void equip(Cosmetic cosmetic);
public void equip(CosmeticVariant cosmetic);
public void unequip(Cosmetic cosmetic); public void unequip(Cosmetic cosmetic);
void setHidden(Class<? extends Cosmetic> cosmetic, boolean flag); public void unequip(Class<? extends Cosmetic> tClass);
public Optional<EquippedCosmetic> getEquipped(Class<? extends Cosmetic> clazz);
public boolean isEquipped(Cosmetic cosmetic); public boolean isEquipped(Cosmetic cosmetic);
void setHidden(Class<? extends Cosmetic> cosmetic, boolean flag);
boolean isHidden(Class<? extends Cosmetic> cosmetic); boolean isHidden(Class<? extends Cosmetic> cosmetic);
} }
...@@ -18,12 +18,8 @@ ...@@ -18,12 +18,8 @@
<resources> <resources>
<resource> <resource>
<targetPath>.</targetPath> <targetPath>.</targetPath>
<filtering>true</filtering> <filtering>false</filtering>
<directory>${basedir}/src/main/resources/</directory> <directory>${basedir}/src/main/resources/</directory>
<includes>
<include>plugin.yml</include>
<include>config.yml</include>
</includes>
</resource> </resource>
</resources> </resources>
<plugins> <plugins>
......
...@@ -80,13 +80,17 @@ public class MCCosmeticsPlugin extends LuminePlugin { ...@@ -80,13 +80,17 @@ public class MCCosmeticsPlugin extends LuminePlugin {
} else { } else {
MCLogger.log("The server is running Spigot; disabled PaperSpigot exclusive functionality"); MCLogger.log("The server is running Spigot; disabled PaperSpigot exclusive functionality");
} }
configuration = new Configuration(this);
getConfiguration().load(this);
MCLogger.log("MCCosmetics configuration file loaded successfully.");
PlayerAnimatorImpl.initialize(this); PlayerAnimatorImpl.initialize(this);
/* /*
* Plugin Components * Plugin Components
*/ */
this.bind(configuration = new Configuration(this));
volatileCodeHandler = getVolatileCodeHandler(); volatileCodeHandler = getVolatileCodeHandler();
compatibility = new CompatibilityManager(this); compatibility = new CompatibilityManager(this);
...@@ -104,9 +108,6 @@ public class MCCosmeticsPlugin extends LuminePlugin { ...@@ -104,9 +108,6 @@ public class MCCosmeticsPlugin extends LuminePlugin {
menuManager = new MenuManager(this); menuManager = new MenuManager(this);
getConfiguration().load(this);
MCLogger.log("MCCosmetics configuration file loaded successfully.");
/* /*
* Events * Events
*/ */
...@@ -126,7 +127,7 @@ public class MCCosmeticsPlugin extends LuminePlugin { ...@@ -126,7 +127,7 @@ public class MCCosmeticsPlugin extends LuminePlugin {
new bStats(this); new bStats(this);
} }
MCLogger.log("" + ConsoleColor.GREEN + ConsoleColor.CHECK_MARK + " MCCosmetics" + (p() ? " Premium" : "") + " v" + getVersion() + " (build "+ getBuildNumber() +") has been successfully loaded!" + ConsoleColor.RESET); MCLogger.log("" + ConsoleColor.GREEN + ConsoleColor.CHECK_MARK + " MCCosmetics" + (isPremium() ? " Premium" : "") + " v" + getVersion() + " (build "+ getBuildNumber() +") has been successfully loaded!" + ConsoleColor.RESET);
} }
@Override @Override
...@@ -138,12 +139,10 @@ public class MCCosmeticsPlugin extends LuminePlugin { ...@@ -138,12 +139,10 @@ public class MCCosmeticsPlugin extends LuminePlugin {
public void disable() { public void disable() {
MCLogger.log("Disabling MCCosmetics..."); MCLogger.log("Disabling MCCosmetics...");
//configuration.save();
MCLogger.log("All active settings have been saved.");
configuration.unload(); configuration.unload();
compatibility.terminate(); compatibility.terminate();
MCLogger.log("All active settings have been saved.");
} }
/** /**
...@@ -156,13 +155,26 @@ public class MCCosmeticsPlugin extends LuminePlugin { ...@@ -156,13 +155,26 @@ public class MCCosmeticsPlugin extends LuminePlugin {
/** /**
* @exclude * @exclude
*/ */
private static boolean p = false; private static Object p = amIPremium();
/** /**
* @exclude * @exclude
*/ */
public static final boolean p() { public static final boolean isPremium() {
return p; return p != null;
}
/**
* @exclude
*/
private static Object amIPremium() {
try {
return Class.forName("io.lumine.cosmetics.CarsonJF");
} catch (final ClassNotFoundException e) {
return null;
} catch (final Exception e) {
throw new RuntimeException("An error occurred while enabling CarsonJF", e);
}
} }
/** /**
......
...@@ -24,8 +24,7 @@ public class SprayCommand extends Command<MCCosmeticsPlugin> { ...@@ -24,8 +24,7 @@ public class SprayCommand extends Command<MCCosmeticsPlugin> {
var player = (Player) sender; var player = (Player) sender;
var profile = getPlugin().getProfiles().getProfile(player); var profile = getPlugin().getProfiles().getProfile(player);
var inv = profile.getCosmeticInventory();
if(args.length > 0) { if(args.length > 0) {
var sprayName = args[1]; var sprayName = args[1];
var maybeSpray = getPlugin().getSprayManager().getCosmetic(sprayName); var maybeSpray = getPlugin().getSprayManager().getCosmetic(sprayName);
...@@ -36,19 +35,19 @@ public class SprayCommand extends Command<MCCosmeticsPlugin> { ...@@ -36,19 +35,19 @@ public class SprayCommand extends Command<MCCosmeticsPlugin> {
var spray = maybeSpray.get(); var spray = maybeSpray.get();
if(inv.hasUnlocked(spray)) { if(profile.has(spray)) {
getPlugin().getSprayManager().useSpray(player, spray); getPlugin().getSprayManager().useSpray(player, spray);
} }
} else { } else {
var maybeSpray = inv.getEquipped(Spray.class); var maybeSpray = profile.getEquipped(Spray.class);
if(maybeSpray.isEmpty()) { if(maybeSpray.isEmpty()) {
return true; return true;
} }
var spray = (Spray) maybeSpray.get(); var spray = (Spray) maybeSpray.get().getCosmetic();
if(inv.hasUnlocked(spray)) { if(profile.has(spray)) {
getPlugin().getSprayManager().useSpray(player, spray); getPlugin().getSprayManager().useSpray(player, spray);
} }
} }
......
...@@ -16,7 +16,8 @@ public class AdminCommand extends Command<MCCosmeticsPlugin> { ...@@ -16,7 +16,8 @@ public class AdminCommand extends Command<MCCosmeticsPlugin> {
addSubCommands( addSubCommands(
new ReloadCommand(this), new ReloadCommand(this),
new SprayCommand(this)); new SprayCommand(this),
new VersionCommand(this));
} }
@Override @Override
......
package io.lumine.cosmetics.commands.admin;
import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.commands.CommandHelper;
import io.lumine.cosmetics.constants.Permissions;
import io.lumine.cosmetics.nms.VolatileCodeDisabled;
import io.lumine.utils.chat.ColorString;
import io.lumine.utils.commands.Command;
import io.lumine.utils.version.ServerVersion;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import java.util.Collections;
import java.util.List;
public class VersionCommand extends Command<MCCosmeticsPlugin> {
public VersionCommand(AdminCommand plugin) {
super(plugin);
}
@Override
public boolean onCommand(CommandSender sender, String[] args) {
final String devBuilds = getPlugin().getDescription().getVersion().contains("SNAPSHOT") ? "&aYes" : "&aNo";
final String preBuilds = getPlugin().isPremium() ? "&aYes" : "&cNo";
final String supported = (getPlugin().getVolatileCodeHandler() instanceof VolatileCodeDisabled) ? "&cNo" : "&aYes";
String extraInfo = "";
if(ServerVersion.isPaper()) {
extraInfo = " &7(Paper)";
}
String[] messages = {
ColorString.get("&6Server Version&f: " + Bukkit.getServer().getClass().getPackage().getName() + extraInfo),
ColorString.get("&6Plugin Version&f: " + getPlugin().getVersion()),
ColorString.get("&6Plugin Build&f: " + getPlugin().getBuildNumber()),
ColorString.get("&6Is Premium&f: " + preBuilds),
ColorString.get("&6Is Dev Build&f: " + devBuilds),
ColorString.get("&6Supported Version&f: " + supported),
};
CommandHelper.sendCommandMessage(sender, messages);
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, String[] args) {
return Collections.emptyList();
}
@Override
public String getPermissionNode() {
return Permissions.COMMAND_ADMIN;
}
@Override
public boolean isConsoleFriendly() {
return true;
}
@Override
public String getName() {
return "version";
}
}
\ No newline at end of file
...@@ -6,17 +6,25 @@ import io.lumine.utils.config.properties.Property; ...@@ -6,17 +6,25 @@ import io.lumine.utils.config.properties.Property;
import io.lumine.utils.config.properties.PropertyHolder; import io.lumine.utils.config.properties.PropertyHolder;
import io.lumine.utils.config.properties.types.EnumProp; import io.lumine.utils.config.properties.types.EnumProp;
import io.lumine.utils.config.properties.types.IntProp; import io.lumine.utils.config.properties.types.IntProp;
import io.lumine.utils.logging.Log;
import io.lumine.utils.plugin.ReloadableModule; import io.lumine.utils.plugin.ReloadableModule;
import lombok.Getter; import lombok.Getter;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Collection; import java.util.Collection;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implements PropertyHolder { public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implements PropertyHolder {
private static final IntProp CLOCK_INTERVAL = Property.Int(Scope.CONFIG, "Clock.Interval", 1); private static final IntProp CLOCK_INTERVAL = Property.Int(Scope.CONFIG, "Clock.Interval", 1);
private static final EnumProp<StorageDriver> STORAGE_DRIVER = Property.Enum(Scope.CONFIG, StorageDriver.class, "Storage.Driver", StorageDriver.JSON); private static final EnumProp<StorageDriver> STORAGE_DRIVER = Property.Enum(Scope.CONFIG, StorageDriver.class, "Storage.Driver", StorageDriver.JSON);
@Getter private boolean allowingMetrics = true; @Getter private boolean allowingMetrics = true;
public Configuration(MCCosmeticsPlugin plugin) { public Configuration(MCCosmeticsPlugin plugin) {
...@@ -25,7 +33,8 @@ public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implement ...@@ -25,7 +33,8 @@ public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implement
@Override @Override
public void load(MCCosmeticsPlugin plugin) { public void load(MCCosmeticsPlugin plugin) {
Log.info("Loading Configuration...");
generateDefaultConfigFiles();
} }
@Override @Override
...@@ -61,5 +70,61 @@ public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implement ...@@ -61,5 +70,61 @@ public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implement
return STORAGE_DRIVER.get(this); return STORAGE_DRIVER.get(this);
} }
private void generateDefaultConfigFiles() {
final var menuFolder = new File(plugin.getDataFolder(), "menus");
final var packFolder = new File(plugin.getDataFolder(), "packs");
final var demoFolder = new File(packFolder, "starter");
final String copyFolder;
if(getPlugin().isPremium()) {
copyFolder = "premium";
} else {
copyFolder = "default";
}
if(!menuFolder.exists()) {
Log.info("Generating Menu files...");
if(menuFolder.mkdir()) {
try {
JarFile jarFile = new JarFile(getPlugin().getJarFile());
for(Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {
String name = entries.nextElement().getName();
if(name.startsWith(copyFolder + "/menus/") && name.length() > (copyFolder + "/menus/").length()) {
Files.copy(getPlugin().getResource(name), new File(getPlugin().getDataFolder() + "/menus", name.split("/")[2]).toPath());
}
}
jarFile.close();
} catch(IOException exception) {
Log.error("Could not load default menu configuration.");
}
} else Log.error("Could not create directory!");
}
if(!packFolder.exists()) {
if(!packFolder.mkdir()) {
Log.error("Could not create packs directory!");
}
}
if(getPlugin().isPremium() && !demoFolder.exists()) {
Log.info("Generating Start Pack files...");
if(demoFolder.mkdir()) {
try {
JarFile jarFile = new JarFile(getPlugin().getJarFile());
for(Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {
String name = entries.nextElement().getName();
if(name.startsWith(copyFolder + "/packs/") && name.length() > (copyFolder + "/packs/").length()) {
Files.copy(getPlugin().getResource(name), new File(getPlugin().getDataFolder() + "/packs", name.split("/")[2]).toPath());
}
}
jarFile.close();
} catch(IOException exception) {
Log.error("Could not load starter pack files.");
}
} else Log.error("Could not create directory!");
}
}
} }
...@@ -20,11 +20,11 @@ public class CosmeticType { ...@@ -20,11 +20,11 @@ public class CosmeticType {
private static final Map<Class<? extends Cosmetic>, CosmeticConstant> constants = new HashMap<>(); private static final Map<Class<? extends Cosmetic>, CosmeticConstant> constants = new HashMap<>();
static { static {
register(BackAccessory.class, new CosmeticConstant("BACK_ACCESSORY", "backs")); register(BackAccessory.class, new CosmeticConstant("BACK", "backs"));
register(Hat.class, new CosmeticConstant("HAT", "hats")); register(Hat.class, new CosmeticConstant("HAT", "hats"));
register(MEGAccessory.class, new CosmeticConstant("MEG", "megs")); register(MEGAccessory.class, new CosmeticConstant("ACCESSORY", "accessories"));
register(ParticleAccessory.class, new CosmeticConstant("PARTICLE", "particle")); register(ParticleAccessory.class, new CosmeticConstant("PARTICLE", "particles"));
register(Pet.class, new CosmeticConstant("PET", "pet")); register(Pet.class, new CosmeticConstant("PET", "pets"));
register(Spray.class, new CosmeticConstant("SPRAY", "sprays")); register(Spray.class, new CosmeticConstant("SPRAY", "sprays"));
register(Offhand.class, new CosmeticConstant("OFFHAND", "offhands")); register(Offhand.class, new CosmeticConstant("OFFHAND", "offhands"));
register(Gesture.class, new CosmeticConstant("GESTURE", "gestures")); register(Gesture.class, new CosmeticConstant("GESTURE", "gestures"));
......
package io.lumine.cosmetics.constants; package io.lumine.cosmetics.constants;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
public class Permissions { public class Permissions {
public static final String cosmeticPermission(Cosmetic cosmetic) {
return "mccosmetics.cosmetic." + cosmetic.getKey().toLowerCase();
}
public static final String COMMAND_BASE = "mccosmetics.command.base"; public static final String COMMAND_BASE = "mccosmetics.command.base";
public static final String COMMAND_ADMIN = "mccosmetics.command.admin"; public static final String COMMAND_ADMIN = "mccosmetics.command.admin";
......
package io.lumine.cosmetics.managers; package io.lumine.cosmetics.managers;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import io.lumine.cosmetics.api.cosmetics.Cosmetic; import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
import io.lumine.cosmetics.api.players.CosmeticProfile; import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.commands.CommandHelper; import io.lumine.cosmetics.commands.CommandHelper;
import io.lumine.cosmetics.config.Scope; import io.lumine.cosmetics.config.Scope;
import io.lumine.cosmetics.constants.Permissions;
import io.lumine.utils.config.properties.Property; import io.lumine.utils.config.properties.Property;
import io.lumine.utils.config.properties.types.*; import io.lumine.utils.config.properties.types.*;
import io.lumine.utils.items.ItemFactory; import io.lumine.utils.items.ItemFactory;
...@@ -17,6 +21,8 @@ import org.bukkit.inventory.ItemStack; ...@@ -17,6 +21,8 @@ import org.bukkit.inventory.ItemStack;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional;
public abstract class AbstractCosmetic extends Cosmetic { public abstract class AbstractCosmetic extends Cosmetic {
...@@ -24,21 +30,28 @@ public abstract class AbstractCosmetic extends Cosmetic { ...@@ -24,21 +30,28 @@ public abstract class AbstractCosmetic extends Cosmetic {
protected static final IntProp MODEL = Property.Int(Scope.NONE, "Model"); protected static final IntProp MODEL = Property.Int(Scope.NONE, "Model");
protected static final LangProp DISPLAY = Property.Lang(Scope.NONE, "Display"); protected static final LangProp DISPLAY = Property.Lang(Scope.NONE, "Display");
protected static final LangListProp DESCRIPTION = Property.LangList(Scope.NONE, "Description"); protected static final LangListProp DESCRIPTION = Property.LangList(Scope.NONE, "Description");
protected static final StringProp TEXTURE = Property.String(Scope.NONE, "Texture"); protected static final StringProp COLOR = Property.String(Scope.NONE, "Color");
protected static final StringProp TEXTURE = Property.String(Scope.NONE, "SkullTexture");
protected static final BooleanProp COLORABLE = Property.Boolean(Scope.NONE, "Colorable", false);
protected static final NodeListProp VARIANTS = Property.NodeList(Scope.NONE, "Variants");
protected final File file; protected final File file;
protected final String key; protected final String key;
@Getter @Getter protected final List<String> sources = Lists.newArrayList();
protected final List<String> sources = Lists.newArrayList();
// Menu Item // Menu Item
protected Material material; protected Material material;
protected int model; protected int model;
@Getter @Getter protected String display;
protected String display;
protected List<String> description; protected List<String> description;
@Getter protected String color;
protected ItemStack menuItem;
@Getter protected ItemStack menuItem;
@Getter protected boolean colorable;
protected Map<String,CosmeticVariant> variants = Maps.newConcurrentMap();
public AbstractCosmetic(MCCosmeticsManager manager, File file, String type, String key) { public AbstractCosmetic(MCCosmeticsManager manager, File file, String type, String key) {
super(manager, type, key); super(manager, type, key);
...@@ -49,7 +62,14 @@ public abstract class AbstractCosmetic extends Cosmetic { ...@@ -49,7 +62,14 @@ public abstract class AbstractCosmetic extends Cosmetic {
this.model = MODEL.fget(file,this); this.model = MODEL.fget(file,this);
this.display = DISPLAY.fget(file,this); this.display = DISPLAY.fget(file,this);
this.description = DESCRIPTION.fget(file,this); this.description = DESCRIPTION.fget(file,this);
this.color = COLOR.fget(file,this);
this.colorable = COLORABLE.fget(file,this);
for(String node : VARIANTS.fget(file,this)) {
var variant = new AbstractCosmeticVariant(this,file,node);
variants.put(variant.getKey(), variant);
}
if(material == Material.PLAYER_HEAD) { if(material == Material.PLAYER_HEAD) {
this.menuItem = ItemFactory.of(this.material) this.menuItem = ItemFactory.of(this.material)
.name(Text.colorize(this.getDisplay())) .name(Text.colorize(this.getDisplay()))
...@@ -87,9 +107,21 @@ public abstract class AbstractCosmetic extends Cosmetic { ...@@ -87,9 +107,21 @@ public abstract class AbstractCosmetic extends Cosmetic {
CommandHelper.sendSuccess(p, "Set your " + type + " to " + getDisplay()); CommandHelper.sendSuccess(p, "Set your " + type + " to " + getDisplay());
p.closeInventory(); p.closeInventory();
} else { } else {
CommandHelper.sendError(p, "You haven't unlocked that hat yet!"); CommandHelper.sendError(p, "You haven't unlocked that cosmetic!");
} }
}).build(); }).build();
} }
public String getPermission() {
return Permissions.cosmeticPermission(this);
}
public boolean hasVariants() {
return variants.isEmpty() == false;
}
public Optional<CosmeticVariant> getVariant(String id) {
return Optional.ofNullable(variants.getOrDefault(id, null));
}
} }
package io.lumine.cosmetics.managers;
import java.io.File;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.config.Scope;
import io.lumine.utils.config.properties.Property;
import io.lumine.utils.config.properties.types.LangListProp;
import io.lumine.utils.config.properties.types.LangProp;
import io.lumine.utils.config.properties.types.StringProp;
import io.lumine.utils.menu.Icon;
import lombok.Getter;
public class AbstractCosmeticVariant extends CosmeticVariant {
protected static final LangProp DISPLAY = Property.Lang(Scope.NONE, "Display");
protected static final LangListProp DESCRIPTION = Property.LangList(Scope.NONE, "Description");
protected static final StringProp COLOR = Property.String(Scope.NONE, "Color");
@Getter private final String propertyNode;
@Getter private final String color;
public AbstractCosmeticVariant(Cosmetic cosmetic, File file, String key) {
super(cosmetic, key);
this.propertyNode = getCosmetic().getPropertyNode() + ".Variants." + key;
this.color = COLOR.fget(file, this);
}
@Override
public Icon<CosmeticProfile> getIcon() {
return null;
}
}
package io.lumine.cosmetics.managers.back; package io.lumine.cosmetics.managers.back;
import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
import io.lumine.cosmetics.api.cosmetics.ItemCosmetic; import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile; import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.constants.CosmeticType; import io.lumine.cosmetics.constants.CosmeticType;
import io.lumine.cosmetics.managers.AbstractCosmetic; import io.lumine.cosmetics.managers.AbstractCosmetic;
import io.lumine.utils.menu.Icon; import io.lumine.utils.menu.Icon;
import io.lumine.xikage.mythicmobs.utils.items.ItemFactory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.io.File; import java.io.File;
...@@ -25,8 +28,14 @@ public class BackAccessory extends AbstractCosmetic implements ItemCosmetic { ...@@ -25,8 +28,14 @@ public class BackAccessory extends AbstractCosmetic implements ItemCosmetic {
return buildIcon("back accessory"); return buildIcon("back accessory");
} }
@Override @Override
public ItemStack getCosmetic() { public ItemStack getCosmetic(CosmeticVariant variant) {
return getMenuItem(); var item = getMenuItem();
}
if(variant != null) {
item = ItemFactory.of(item).color(variant.getColor()).build();
}
return item;
}
} }
...@@ -8,6 +8,7 @@ import io.lumine.cosmetics.MCCosmeticsPlugin; ...@@ -8,6 +8,7 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.players.CosmeticProfile; import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.constants.CosmeticType; import io.lumine.cosmetics.constants.CosmeticType;
import io.lumine.cosmetics.managers.MCCosmeticsManager; import io.lumine.cosmetics.managers.MCCosmeticsManager;
import io.lumine.cosmetics.managers.modelengine.MEGAccessory;
import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper; import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
import io.lumine.utils.Events; import io.lumine.utils.Events;
import io.lumine.utils.files.Files; import io.lumine.utils.files.Files;
...@@ -56,9 +57,15 @@ public class GestureManager extends MCCosmeticsManager<Gesture> { ...@@ -56,9 +57,15 @@ public class GestureManager extends MCCosmeticsManager<Gesture> {
@Override @Override
public void equip(CosmeticProfile profile) { public void equip(CosmeticProfile profile) {
final var opt = profile.getCosmeticInventory().getEquipped(Gesture.class); final var maybeEquipped = profile.getEquipped(Gesture.class);
if(opt.isEmpty() || !(opt.get() instanceof Gesture gesture)) if(maybeEquipped.isEmpty()) {
return; return;
}
var opt = maybeEquipped.get().getCosmetic();
if(!(opt instanceof Gesture gesture)) {
return;
}
final var player = profile.getPlayer(); final var player = profile.getPlayer();
CustomPlayerModel model = new CustomPlayerModel(player, gesture.getQuitMethod(), () -> { CustomPlayerModel model = new CustomPlayerModel(player, gesture.getQuitMethod(), () -> {
......
package io.lumine.cosmetics.managers.hats; package io.lumine.cosmetics.managers.hats;
import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
import io.lumine.cosmetics.api.cosmetics.ItemCosmetic; import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
import io.lumine.cosmetics.api.players.CosmeticProfile; import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.constants.CosmeticType; import io.lumine.cosmetics.constants.CosmeticType;
import io.lumine.cosmetics.managers.AbstractCosmetic; import io.lumine.cosmetics.managers.AbstractCosmetic;
import io.lumine.utils.menu.Icon; import io.lumine.utils.menu.Icon;
import io.lumine.xikage.mythicmobs.utils.items.ItemFactory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.io.File; import java.io.File;
...@@ -26,7 +29,13 @@ public class Hat extends AbstractCosmetic implements ItemCosmetic { ...@@ -26,7 +29,13 @@ public class Hat extends AbstractCosmetic implements ItemCosmetic {
} }
@Override @Override
public ItemStack getCosmetic() { public ItemStack getCosmetic(CosmeticVariant variant) {
return getMenuItem(); var item = getMenuItem();
if(variant != null) {
item = ItemFactory.of(item).color(variant.getColor()).build();
}
return item;
} }
} }
...@@ -43,9 +43,15 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> { ...@@ -43,9 +43,15 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> {
@Override @Override
public void equip(CosmeticProfile profile) { public void equip(CosmeticProfile profile) {
final var opt = profile.getCosmeticInventory().getEquipped(MEGAccessory.class); final var maybeEquipped = profile.getEquipped(MEGAccessory.class);
if(opt.isEmpty() || !(opt.get() instanceof MEGAccessory meg)) if(maybeEquipped.isEmpty()) {
return;
}
var opt = maybeEquipped.get().getCosmetic();
if(!(opt instanceof MEGAccessory meg)) {
return; return;
}
final var blueprint = ModelEngineAPI.getModelBlueprint(meg.getModelId()); final var blueprint = ModelEngineAPI.getModelBlueprint(meg.getModelId());
if(blueprint == null) if(blueprint == null)
...@@ -77,9 +83,15 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> { ...@@ -77,9 +83,15 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> {
} }
public void unequip(CosmeticProfile profile) { public void unequip(CosmeticProfile profile) {
final var opt = profile.getCosmeticInventory().getEquipped(MEGAccessory.class); final var maybeEquipped = profile.getEquipped(MEGAccessory.class);
if(opt.isEmpty() || !(opt.get() instanceof MEGAccessory)) if(maybeEquipped.isEmpty()) {
return; return;
}
var opt = maybeEquipped.get().getCosmetic();
if(!(opt instanceof MEGAccessory meg)) {
return;
}
final var player = profile.getPlayer(); final var player = profile.getPlayer();
ModeledEntity modeledEntity = ModelEngineAPI.getModeledEntity(player.getUniqueId()); ModeledEntity modeledEntity = ModelEngineAPI.getModeledEntity(player.getUniqueId());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment