forked from SteamWar/SteamWar
Add BauSystem module
Fix ci java version Fix LinkageProcessor
This commit is contained in:
+112
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* 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.attributescopy;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.command.PreviousArguments;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.command.TypeMapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.MinVersion;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class AttributeRemoveCommand extends SWCommand {
|
||||
|
||||
public AttributeRemoveCommand() {
|
||||
super("removeattribute", "attributesremove");
|
||||
}
|
||||
|
||||
@Register({"all"})
|
||||
@Register({"*"})
|
||||
public void genericCommand(@Validator Player player) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setLore(new ArrayList<>());
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_ALL", player);
|
||||
}
|
||||
|
||||
@Register(description = "ATTRIBUTE_REMOVE_COMMAND_HELP")
|
||||
public void genericCommand(@Validator Player player, @Mapper("attribute") String attribute) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
||||
return;
|
||||
}
|
||||
List<String> lore = itemMeta.getLore();
|
||||
if (lore == null) {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
||||
return;
|
||||
}
|
||||
if (lore.isEmpty()) {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
||||
return;
|
||||
}
|
||||
if (!lore.get(0).equals("§eAttributes§8:")) {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
||||
return;
|
||||
}
|
||||
lore.removeIf(s -> s.startsWith("§8-§7 " + attribute + "§8:"));
|
||||
if (lore.size() == 1) {
|
||||
itemStack.setItemMeta(null);
|
||||
} else {
|
||||
itemMeta.setLore(lore);
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
}
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_SINGLE", player, attribute);
|
||||
}
|
||||
|
||||
@Mapper(value = "attribute", local = true)
|
||||
public TypeMapper<String> attribute() {
|
||||
return new TypeMapper<String>() {
|
||||
@Override
|
||||
public Collection<String> tabCompletes(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
Player player = (Player) commandSender;
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) return null;
|
||||
List<String> lore = itemMeta.getLore();
|
||||
if (lore == null) return null;
|
||||
if (lore.isEmpty()) return null;
|
||||
if (!lore.get(0).equals("§eAttributes§8:")) return null;
|
||||
return lore.stream()
|
||||
.skip(1)
|
||||
.map(s1 -> s1.substring(6))
|
||||
.map(s1 -> s1.substring(0, s1.indexOf("§8:")))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
return s;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 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.attributescopy;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@UtilityClass
|
||||
public class AttributeUtils {
|
||||
|
||||
private Map<Method, String> names = new HashMap<>();
|
||||
private Map<Class<?>, List<Method>> getters = new HashMap<>();
|
||||
private Map<Class<?>, Map<String, Method>> setters = new HashMap<>();
|
||||
|
||||
private void generate(BlockData blockData) {
|
||||
Class<? extends BlockData> clazz = blockData.getClass();
|
||||
if (getters.containsKey(clazz) && setters.containsKey(clazz)) return;
|
||||
|
||||
Map<String, List<Method>> methods = new HashMap<>();
|
||||
for (Method declaredMethod : clazz.getMethods()) {
|
||||
String s = declaredMethod.getName();
|
||||
if (s.startsWith("get") && declaredMethod.getParameterCount() == 0) {
|
||||
methods.computeIfAbsent(s.substring(3), aClass -> new ArrayList<>()).add(declaredMethod);
|
||||
} else if (s.startsWith("is") && declaredMethod.getParameterCount() == 0) {
|
||||
methods.computeIfAbsent(s.substring(2), aClass -> new ArrayList<>()).add(declaredMethod);
|
||||
} else if (s.startsWith("set") && declaredMethod.getParameterCount() == 1) {
|
||||
methods.computeIfAbsent(s.substring(3), aClass -> new ArrayList<>()).add(declaredMethod);
|
||||
}
|
||||
}
|
||||
for (Map.Entry<String, List<Method>> entry : methods.entrySet()) {
|
||||
if (entry.getValue().size() != 2) continue;
|
||||
for (Method method : entry.getValue()) {
|
||||
names.put(method, entry.getKey());
|
||||
if (method.getName().startsWith("is") || method.getName().startsWith("get")) {
|
||||
getters.computeIfAbsent(clazz, aClass -> new ArrayList<>()).add(method);
|
||||
} else {
|
||||
setters.computeIfAbsent(clazz, aClass -> new HashMap<>()).put(entry.getKey(), method);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void copy(BlockData blockData, List<String> attributes) {
|
||||
generate(blockData);
|
||||
|
||||
getters.getOrDefault(blockData.getClass(), new ArrayList<>()).forEach(method -> {
|
||||
try {
|
||||
Object invoke = method.invoke(blockData);
|
||||
if (invoke != null) {
|
||||
attributes.add("§8-§7 " + names.get(method) + "§8:§7 " + convert(invoke));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void paste(BlockData blockData, List<String> attributes) {
|
||||
generate(blockData);
|
||||
|
||||
for (String attribute : attributes) {
|
||||
String[] split = attribute.split("§8:§7 ");
|
||||
if (split.length != 2) continue;
|
||||
String name = split[0].substring(6);
|
||||
String value = split[1];
|
||||
Method method = setters.getOrDefault(blockData.getClass(), new HashMap<>()).get(name);
|
||||
if (method == null) continue;
|
||||
try {
|
||||
method.invoke(blockData, convert(value, method.getParameterTypes()[0]));
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String convert(Object o) {
|
||||
if (o.getClass().isEnum()) {
|
||||
return ((Enum<?>) o).name();
|
||||
} else {
|
||||
return o.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private Object convert(String s, Class<?> type) {
|
||||
if (type.isEnum()) {
|
||||
return Enum.valueOf((Class<? extends Enum>) type, s);
|
||||
} else if (type == int.class || type == Integer.class) {
|
||||
return Integer.parseInt(s);
|
||||
} else if (type == double.class || type == Double.class) {
|
||||
return Double.parseDouble(s);
|
||||
} else if (type == float.class || type == Float.class) {
|
||||
return Float.parseFloat(s);
|
||||
} else if (type == long.class || type == Long.class) {
|
||||
return Long.parseLong(s);
|
||||
} else if (type == short.class || type == Short.class) {
|
||||
return Short.parseShort(s);
|
||||
} else if (type == byte.class || type == Byte.class) {
|
||||
return Byte.parseByte(s);
|
||||
} else if (type == boolean.class || type == Boolean.class) {
|
||||
return Boolean.parseBoolean(s);
|
||||
} else {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* 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.attributescopy;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.FluidCollisionMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Linked
|
||||
public class AttributesCopyCommand extends SWCommand {
|
||||
|
||||
public AttributesCopyCommand() {
|
||||
super("copyattributes", "attributescopy", "ac");
|
||||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(@Validator Player player) {
|
||||
Block block = player.getTargetBlockExact(8, FluidCollisionMode.ALWAYS);
|
||||
if (block == null) return;
|
||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||
|
||||
if (!(block.getType().isItem() && block.getType() == mainHand.getType() || isSame(block, mainHand))) {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTES_CANT_COPY", player);
|
||||
return;
|
||||
}
|
||||
|
||||
BlockData blockData = block.getBlockData();
|
||||
List<String> attributesToCopy = new ArrayList<>();
|
||||
if (block.getType() != mainHand.getType()) {
|
||||
attributesToCopy.add("§8-§7 Material§8:§7 " + block.getType().name());
|
||||
}
|
||||
AttributeUtils.copy(blockData, attributesToCopy);
|
||||
if (attributesToCopy.isEmpty()) {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTES_NO_COPY", player);
|
||||
return;
|
||||
}
|
||||
ItemMeta itemMeta = mainHand.getItemMeta();
|
||||
List<String> lore = new ArrayList<>(attributesToCopy);
|
||||
lore.add(0, "§eAttributes§8:");
|
||||
itemMeta.setLore(lore);
|
||||
mainHand.setItemMeta(itemMeta);
|
||||
player.getInventory().setItemInMainHand(mainHand);
|
||||
BauSystem.MESSAGE.send("ATTRIBUTES_COPIED", player);
|
||||
}
|
||||
|
||||
private boolean isSame(Block block, ItemStack itemStack) {
|
||||
if (itemStack.getType() == Material.REDSTONE && block.getType() == Material.REDSTONE_WIRE) return true;
|
||||
if (itemStack.getType() == Material.PLAYER_HEAD && block.getType() == Material.PLAYER_WALL_HEAD) return true;
|
||||
if (itemStack.getType() == Material.ZOMBIE_HEAD && block.getType() == Material.ZOMBIE_WALL_HEAD) return true;
|
||||
if (itemStack.getType() == Material.CREEPER_HEAD && block.getType() == Material.CREEPER_WALL_HEAD) return true;
|
||||
if (itemStack.getType() == Material.DRAGON_HEAD && block.getType() == Material.DRAGON_WALL_HEAD) return true;
|
||||
if (itemStack.getType() == Material.SKELETON_SKULL && block.getType() == Material.SKELETON_WALL_SKULL) return true;
|
||||
if (itemStack.getType() == Material.WITHER_SKELETON_SKULL && block.getType() == Material.WITHER_SKELETON_WALL_SKULL) return true;
|
||||
if (itemStack.getType() == Material.TORCH && block.getType() == Material.WALL_TORCH) return true;
|
||||
if (itemStack.getType() == Material.SOUL_TORCH && block.getType() == Material.SOUL_WALL_TORCH) return true;
|
||||
if (itemStack.getType() == Material.REDSTONE_TORCH && block.getType() == Material.REDSTONE_WALL_TORCH) return true;
|
||||
if (itemStack.getType() == Material.WHEAT_SEEDS && block.getType() == Material.WHEAT) return true;
|
||||
if (itemStack.getType().name().contains("_BANNER") && block.getType().name().contains("_WALL_BANNER")) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* 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.attributescopy;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Skull;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Linked
|
||||
public class AttributesPlaceListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
ItemStack itemStack = event.getItemInHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) return;
|
||||
List<String> strings = itemMeta.getLore();
|
||||
if (strings == null) return;
|
||||
if (strings.isEmpty()) return;
|
||||
if (!strings.get(0).equals("§eAttributes§8:")) return;
|
||||
Material type = event.getBlock().getType();
|
||||
OfflinePlayer offlinePlayer = null;
|
||||
if (event.getBlock().getState() instanceof Skull) {
|
||||
Skull skull = (Skull) event.getBlock().getState();
|
||||
offlinePlayer = skull.getOwningPlayer();
|
||||
}
|
||||
OfflinePlayer finalPlayerProfile = offlinePlayer;
|
||||
event.setCancelled(true);
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
Material material = strings.stream()
|
||||
.filter(s -> s.startsWith("§8-§7 Material§8:§7 "))
|
||||
.map(s -> s.replace("§8-§7 Material§8:§7 ", ""))
|
||||
.map(String::toUpperCase)
|
||||
.map(s -> {
|
||||
try {
|
||||
return Material.valueOf(s);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.findFirst()
|
||||
.orElse(type);
|
||||
event.getBlock().setType(material, false);
|
||||
Block block = event.getBlock();
|
||||
BlockData blockData = block.getBlockData();
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
if (block.getState() instanceof Skull && finalPlayerProfile != null) {
|
||||
Skull skull = (Skull) block.getState();
|
||||
skull.setOwningPlayer(finalPlayerProfile);
|
||||
skull.update(true, false);
|
||||
}
|
||||
}, 1);
|
||||
AttributeUtils.paste(blockData, strings);
|
||||
block.setBlockData(blockData, false);
|
||||
}, 1);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user