Add BauSystem module

Fix ci java version
Fix LinkageProcessor
This commit is contained in:
2024-08-05 13:28:50 +02:00
parent 41d31e6c9c
commit 3366a30b0c
526 changed files with 43550 additions and 149479 deletions
@@ -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;
}
};
}
}
@@ -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;
}
}
}
@@ -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;
}
}
@@ -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);
}
}