package tc.oc.pgm.wool; import java.util.Optional; import java.util.stream.Stream; import javax.annotation.Nullable; import net.md_5.bungee.api.chat.BaseComponent; import org.apache.commons.lang.StringUtils; import org.bukkit.DyeColor; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.material.Wool; import org.bukkit.util.Vector; import tc.oc.api.docs.virtual.MapDoc; import tc.oc.commons.bukkit.util.BukkitUtils; import tc.oc.commons.core.chat.ChatUtils; import tc.oc.commons.core.chat.Component; import tc.oc.pgm.features.FeatureInfo; import tc.oc.pgm.features.GamemodeFeature; import tc.oc.pgm.goals.ProximityGoalDefinition; import tc.oc.pgm.goals.ProximityGoalDefinitionImpl; import tc.oc.pgm.goals.ProximityMetric; import tc.oc.pgm.match.Match; import tc.oc.pgm.regions.Region; import tc.oc.pgm.teams.TeamFactory; @FeatureInfo(name = "wool") public interface MonumentWoolFactory extends ProximityGoalDefinition, GamemodeFeature { static BaseComponent makeComponentName(DyeColor color) { return new Component(makeName(color), ChatUtils.convert(BukkitUtils.dyeColorToChatColor(color))); } static String makeColorName(DyeColor color) { String[] name = StringUtils.split(color.toString(), '_'); for (int i = 0; i < name.length; i++) { name[i] = (i > 0 ? " " : "") + StringUtils.capitalize(name[i].toLowerCase()); } return StringUtils.join(name); } static String makeName(DyeColor color) { return makeColorName(color) + " Wool"; } @Override MonumentWool getGoal(Match match); @Override String getColoredName(); String getColorName(); DyeColor getColor(); @Override BaseComponent getComponentName(); Vector getLocation(); Region getPlacementRegion(); boolean isCraftable(); boolean isObjectiveWool(ItemStack stack); boolean isObjectiveWool(MaterialData material); boolean isHolding(InventoryHolder holder); boolean isHolding(Inventory inv); } class MonumentWoolFactoryImpl extends ProximityGoalDefinitionImpl implements MonumentWoolFactory { private final @Inspect DyeColor color; private final @Inspect Vector location; private final @Inspect Region placement; private final @Inspect boolean craftable; private final @Inspect boolean visible; private final @Inspect BaseComponent componentName; public MonumentWoolFactoryImpl(@Nullable Boolean required, boolean visible, TeamFactory owner, ProximityMetric woolProximityMetric, ProximityMetric monumentProximityMetric, DyeColor color, Vector location, Region placement, boolean craftable) { super(MonumentWoolFactory.makeName(color), required, visible, Optional.of(owner), woolProximityMetric, monumentProximityMetric); this.color = color; this.location = location; this.placement = placement; this.craftable = craftable; this.visible = visible; this.componentName = MonumentWoolFactory.makeComponentName(color); } @Override public String toString() { return "MonumentWoolFactory{owner=" + this.getOwner().getDefaultName() + ", color=" + this.color + ", location=" + this.location + ", placement=" + this.placement + ", craftable=" + this.craftable + ", visible=" + this.visible + "}"; } @Override public Stream<MapDoc.Gamemode> gamemodes() { return Stream.of(MapDoc.Gamemode.ctw); } @Override public MonumentWool getGoal(Match match) { return (MonumentWool) super.getGoal(match); } @Override public MonumentWool createFeature(Match match) { return new MonumentWool(this, match); } @Override public boolean isShared() { return false; } @Override public String getColoredName() { return BukkitUtils.dyeColorToChatColor(this.color) + this.getName(); } @Override public String getColorName() { return MonumentWoolFactory.makeColorName(this.color); } @Override public DyeColor getColor() { return this.color; } @Override public BaseComponent getComponentName() { return componentName; } @Override public Vector getLocation() { return this.location; } @Override public Region getPlacementRegion() { return this.placement; } @Override public boolean isCraftable() { return this.craftable; } @Override public boolean isObjectiveWool(ItemStack stack) { return stack != null && this.isObjectiveWool(stack.getData()); } @Override public boolean isObjectiveWool(MaterialData material) { return material instanceof Wool && ((Wool) material).getColor() == this.color; } @Override public boolean isHolding(InventoryHolder holder) { return this.isHolding(holder.getInventory()); } @Override public boolean isHolding(Inventory inv) { return inv.contents().stream().anyMatch(this::isObjectiveWool); } }