Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
948c19167a
Commit
6830852c78
@ -33,8 +33,6 @@ import lombok.AllArgsConstructor;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.bukkit.block.data.Waterlogged;
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@ -44,10 +42,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Linked(LinkageType.COMMAND)
|
@Linked(LinkageType.COMMAND)
|
||||||
@Linked(LinkageType.LISTENER)
|
@Linked(LinkageType.LISTENER)
|
||||||
@ -57,150 +52,26 @@ public class MaterialCommand extends SWCommand implements Listener {
|
|||||||
super("material");
|
super("material");
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MaterialData> materialData = new ArrayList<>();
|
|
||||||
private Map<Player, Search> searchMap = new HashMap<>();
|
private Map<Player, Search> searchMap = new HashMap<>();
|
||||||
|
|
||||||
{
|
|
||||||
for (Material value : Material.values()) {
|
|
||||||
if (!value.isBlock()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (value.isLegacy()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
materialData.add(new MaterialData(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class MaterialData {
|
|
||||||
private Material material;
|
|
||||||
private Material originalMaterial;
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
private double blastResistance;
|
|
||||||
private double hardness;
|
|
||||||
private boolean transparent;
|
|
||||||
private boolean solid;
|
|
||||||
private boolean gravity;
|
|
||||||
private boolean occluding;
|
|
||||||
private boolean interacteable;
|
|
||||||
private boolean flammable;
|
|
||||||
private boolean burnable;
|
|
||||||
private boolean waterloggable;
|
|
||||||
|
|
||||||
public MaterialData(Material material) {
|
|
||||||
this.originalMaterial = material;
|
|
||||||
|
|
||||||
name = material.name();
|
|
||||||
blastResistance = material.getBlastResistance();
|
|
||||||
hardness = material.getHardness();
|
|
||||||
transparent = material.isTransparent();
|
|
||||||
solid = material.isSolid();
|
|
||||||
gravity = material.hasGravity();
|
|
||||||
occluding = material.isOccluding();
|
|
||||||
interacteable = material.isInteractable();
|
|
||||||
flammable = material.isFlammable();
|
|
||||||
burnable = material.isBurnable();
|
|
||||||
BlockData blockData = material.createBlockData();
|
|
||||||
waterloggable = blockData instanceof Waterlogged;
|
|
||||||
|
|
||||||
if (material.isItem() && material != Material.AIR) {
|
|
||||||
this.material = material;
|
|
||||||
} else {
|
|
||||||
this.material = Material.GHAST_TEAR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SWListInv.SWListEntry<Material> toSWItem(Player p) {
|
|
||||||
List<String> lore = new ArrayList<>();
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_BLAST_RESISTANCE", p, blastResistance));
|
|
||||||
lore.add(BauSystem.MESSAGE.parse(blastResistance > 9 ? "MATERIAL_TNT_UNBREAKABLE" : "MATERIAL_TNT_BREAKABLE", p));
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_HARDNESS", p, hardness));
|
|
||||||
if (transparent) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_TRANSPARENT", p));
|
|
||||||
}
|
|
||||||
if (solid) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_SOLID", p));
|
|
||||||
}
|
|
||||||
if (gravity) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_GRAVITY", p));
|
|
||||||
}
|
|
||||||
if (occluding) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_OCCLUDING", p));
|
|
||||||
}
|
|
||||||
if (interacteable) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_INTERACTABLE", p));
|
|
||||||
}
|
|
||||||
if (flammable) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_FLAMMABLE", p));
|
|
||||||
}
|
|
||||||
if (burnable) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_BURNABLE", p));
|
|
||||||
}
|
|
||||||
if (waterloggable) {
|
|
||||||
lore.add(BauSystem.MESSAGE.parse("MATERIAL_WATERLOGGABLE", p));
|
|
||||||
}
|
|
||||||
return new SWListInv.SWListEntry<>(new SWItem(material, "§e" + name, lore, false, clickType -> {
|
|
||||||
}), originalMaterial);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean is(Search search) {
|
|
||||||
boolean result = true;
|
|
||||||
result &= search.transparent.test(transparent);
|
|
||||||
result &= search.solid.test(solid);
|
|
||||||
result &= search.gravity.test(gravity);
|
|
||||||
result &= search.occluding.test(occluding);
|
|
||||||
result &= search.interacteable.test(interacteable);
|
|
||||||
result &= search.flammable.test(flammable);
|
|
||||||
result &= search.burnable.test(burnable);
|
|
||||||
result &= search.waterloggable.test(waterloggable);
|
|
||||||
if (!result) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!search.blastResistance.isEmpty()) {
|
|
||||||
String[] strings = search.blastResistance.split(" ");
|
|
||||||
for (String string : strings) {
|
|
||||||
string = string.replace(",", ".");
|
|
||||||
if (string.startsWith("=")) {
|
|
||||||
if (blastResistance != Double.parseDouble(string.substring(1))) return false;
|
|
||||||
} else if (string.startsWith(">=")) {
|
|
||||||
if (blastResistance < Double.parseDouble(string.substring(2))) return false;
|
|
||||||
} else if (string.startsWith("<=")) {
|
|
||||||
if (blastResistance > Double.parseDouble(string.substring(2)))return false;
|
|
||||||
} else if (string.startsWith(">")) {
|
|
||||||
if (blastResistance <= Double.parseDouble(string.substring(1))) return false;
|
|
||||||
} else if (string.startsWith("<")) {
|
|
||||||
if (blastResistance >= Double.parseDouble(string.substring(1))) return false;
|
|
||||||
} else if (string.startsWith("!")) {
|
|
||||||
if (blastResistance == Double.parseDouble(string.substring(1))) return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (search.name.isEmpty()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return Pattern.compile(search.name.toLowerCase().replace(".", ".+").replace(" ", ".")).asPredicate().test(name.toLowerCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private static class Search {
|
static class Search {
|
||||||
private SearchType transparent = SearchType.IGNORE;
|
SearchType transparent = SearchType.IGNORE;
|
||||||
private SearchType solid = SearchType.IGNORE;
|
SearchType solid = SearchType.IGNORE;
|
||||||
private SearchType gravity = SearchType.IGNORE;
|
SearchType gravity = SearchType.IGNORE;
|
||||||
private SearchType occluding = SearchType.IGNORE;
|
SearchType occluding = SearchType.IGNORE;
|
||||||
private SearchType interacteable = SearchType.IGNORE;
|
SearchType interacteable = SearchType.IGNORE;
|
||||||
private SearchType flammable = SearchType.IGNORE;
|
SearchType flammable = SearchType.IGNORE;
|
||||||
private SearchType burnable = SearchType.IGNORE;
|
SearchType burnable = SearchType.IGNORE;
|
||||||
private SearchType waterloggable = SearchType.IGNORE;
|
SearchType waterloggable = SearchType.IGNORE;
|
||||||
|
|
||||||
private String blastResistance = ">=0";
|
String blastResistance = ">=0";
|
||||||
private String name = "";
|
String name = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
private enum SearchType implements EnumDisplay {
|
enum SearchType implements EnumDisplay {
|
||||||
TRUE("MATERIAL_SEARCH_PROPERTY_TRUE", b -> b),
|
TRUE("MATERIAL_SEARCH_PROPERTY_TRUE", b -> b),
|
||||||
FALSE("MATERIAL_SEARCH_PROPERTY_FALSE", b -> !b),
|
FALSE("MATERIAL_SEARCH_PROPERTY_FALSE", b -> !b),
|
||||||
IGNORE("MATERIAL_SEARCH_PROPERTY_IGNORE", b -> true);
|
IGNORE("MATERIAL_SEARCH_PROPERTY_IGNORE", b -> true);
|
||||||
@ -307,12 +178,12 @@ public class MaterialCommand extends SWCommand implements Listener {
|
|||||||
|
|
||||||
public void materialGUI(Player p, Search search) {
|
public void materialGUI(Player p, Search search) {
|
||||||
List<SWListInv.SWListEntry<Material>> swListEntries = new ArrayList<>();
|
List<SWListInv.SWListEntry<Material>> swListEntries = new ArrayList<>();
|
||||||
materialData.forEach(data -> {
|
MaterialLazyInit.materialData.forEach(data -> {
|
||||||
if (data.is(search)) {
|
if (data.is(search)) {
|
||||||
swListEntries.add(data.toSWItem(p));
|
swListEntries.add(data.toSWItem(p));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
SWListInv<Material> materialSWListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("MATERIAL_INV_NAME", p, swListEntries.size(), materialData.size()), false, swListEntries, (clickType, material) -> {
|
SWListInv<Material> materialSWListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("MATERIAL_INV_NAME", p, swListEntries.size(), MaterialLazyInit.materialData.size()), false, swListEntries, (clickType, material) -> {
|
||||||
});
|
});
|
||||||
materialSWListInv.setItem(49, new SWItem(Material.NAME_TAG, BauSystem.MESSAGE.parse("MATERIAL_SEARCH", p), clickType -> {
|
materialSWListInv.setItem(49, new SWItem(Material.NAME_TAG, BauSystem.MESSAGE.parse("MATERIAL_SEARCH", p), clickType -> {
|
||||||
searchGUI(p);
|
searchGUI(p);
|
||||||
|
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bausystem.features.util;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.inventory.SWItem;
|
||||||
|
import de.steamwar.inventory.SWListInv;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.Waterlogged;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class MaterialLazyInit {
|
||||||
|
|
||||||
|
static List<MaterialData> materialData = new ArrayList<>();
|
||||||
|
|
||||||
|
{
|
||||||
|
for (Material value : Material.values()) {
|
||||||
|
if (!value.isBlock()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (value.isLegacy()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
materialData.add(new MaterialData(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class MaterialData {
|
||||||
|
private Material material;
|
||||||
|
private Material originalMaterial;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private double blastResistance;
|
||||||
|
private double hardness;
|
||||||
|
private boolean transparent;
|
||||||
|
private boolean solid;
|
||||||
|
private boolean gravity;
|
||||||
|
private boolean occluding;
|
||||||
|
private boolean interacteable;
|
||||||
|
private boolean flammable;
|
||||||
|
private boolean burnable;
|
||||||
|
private boolean waterloggable;
|
||||||
|
|
||||||
|
public MaterialData(Material material) {
|
||||||
|
this.originalMaterial = material;
|
||||||
|
|
||||||
|
name = material.name();
|
||||||
|
blastResistance = material.getBlastResistance();
|
||||||
|
hardness = material.getHardness();
|
||||||
|
transparent = material.isTransparent();
|
||||||
|
solid = material.isSolid();
|
||||||
|
gravity = material.hasGravity();
|
||||||
|
occluding = material.isOccluding();
|
||||||
|
interacteable = material.isInteractable();
|
||||||
|
flammable = material.isFlammable();
|
||||||
|
burnable = material.isBurnable();
|
||||||
|
BlockData blockData = material.createBlockData();
|
||||||
|
waterloggable = blockData instanceof Waterlogged;
|
||||||
|
|
||||||
|
if (material.isItem() && material != Material.AIR) {
|
||||||
|
this.material = material;
|
||||||
|
} else {
|
||||||
|
this.material = Material.GHAST_TEAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public SWListInv.SWListEntry<Material> toSWItem(Player p) {
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_BLAST_RESISTANCE", p, blastResistance));
|
||||||
|
lore.add(BauSystem.MESSAGE.parse(blastResistance > 9 ? "MATERIAL_TNT_UNBREAKABLE" : "MATERIAL_TNT_BREAKABLE", p));
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_HARDNESS", p, hardness));
|
||||||
|
if (transparent) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_TRANSPARENT", p));
|
||||||
|
}
|
||||||
|
if (solid) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_SOLID", p));
|
||||||
|
}
|
||||||
|
if (gravity) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_GRAVITY", p));
|
||||||
|
}
|
||||||
|
if (occluding) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_OCCLUDING", p));
|
||||||
|
}
|
||||||
|
if (interacteable) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_INTERACTABLE", p));
|
||||||
|
}
|
||||||
|
if (flammable) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_FLAMMABLE", p));
|
||||||
|
}
|
||||||
|
if (burnable) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_BURNABLE", p));
|
||||||
|
}
|
||||||
|
if (waterloggable) {
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("MATERIAL_WATERLOGGABLE", p));
|
||||||
|
}
|
||||||
|
return new SWListInv.SWListEntry<>(new SWItem(material, "§e" + name, lore, false, clickType -> {
|
||||||
|
}), originalMaterial);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean is(MaterialCommand.Search search) {
|
||||||
|
boolean result = true;
|
||||||
|
result &= search.transparent.test(transparent);
|
||||||
|
result &= search.solid.test(solid);
|
||||||
|
result &= search.gravity.test(gravity);
|
||||||
|
result &= search.occluding.test(occluding);
|
||||||
|
result &= search.interacteable.test(interacteable);
|
||||||
|
result &= search.flammable.test(flammable);
|
||||||
|
result &= search.burnable.test(burnable);
|
||||||
|
result &= search.waterloggable.test(waterloggable);
|
||||||
|
if (!result) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!search.blastResistance.isEmpty()) {
|
||||||
|
String[] strings = search.blastResistance.split(" ");
|
||||||
|
for (String string : strings) {
|
||||||
|
string = string.replace(",", ".");
|
||||||
|
if (string.startsWith("=")) {
|
||||||
|
if (blastResistance != Double.parseDouble(string.substring(1))) return false;
|
||||||
|
} else if (string.startsWith(">=")) {
|
||||||
|
if (blastResistance < Double.parseDouble(string.substring(2))) return false;
|
||||||
|
} else if (string.startsWith("<=")) {
|
||||||
|
if (blastResistance > Double.parseDouble(string.substring(2)))return false;
|
||||||
|
} else if (string.startsWith(">")) {
|
||||||
|
if (blastResistance <= Double.parseDouble(string.substring(1))) return false;
|
||||||
|
} else if (string.startsWith("<")) {
|
||||||
|
if (blastResistance >= Double.parseDouble(string.substring(1))) return false;
|
||||||
|
} else if (string.startsWith("!")) {
|
||||||
|
if (blastResistance == Double.parseDouble(string.substring(1))) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (search.name.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Pattern.compile(search.name.toLowerCase().replace(".", ".+").replace(" ", ".")).asPredicate().test(name.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
In neuem Issue referenzieren
Einen Benutzer sperren