Merge pull request 'AutoChecker' (#136) from autocheck_rework into master
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Reviewed-on: #136 Reviewed-by: Lixfel <lixfel@steamwar.de>
Dieser Commit ist enthalten in:
Commit
0e13b0d010
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
This file is a part of the SteamWar software.
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
Copyright (C) 2022 SteamWar.de-Serverteam
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
@ -17,20 +17,21 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.schematicsystem;
|
package de.steamwar.schematicsystem.autocheck;
|
||||||
|
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class CheckSchemType15 implements CheckSchemType.ICheckSchemType {
|
public class AutoChecker15 implements AutoChecker.IAutoChecker {
|
||||||
private static final Set<Material> INVENTORY = EnumSet.of(
|
private static final Set<Material> INVENTORY = EnumSet.of(
|
||||||
Material.BARREL,
|
Material.BARREL,
|
||||||
Material.BLAST_FURNACE,
|
Material.BLAST_FURNACE,
|
||||||
@ -75,7 +76,6 @@ public class CheckSchemType15 implements CheckSchemType.ICheckSchemType {
|
|||||||
Material.WHITE_TULIP,
|
Material.WHITE_TULIP,
|
||||||
Material.PINK_TULIP,
|
Material.PINK_TULIP,
|
||||||
Material.OXEYE_DAISY,
|
Material.OXEYE_DAISY,
|
||||||
Material.CORNFLOWER,
|
|
||||||
Material.LILY_OF_THE_VALLEY,
|
Material.LILY_OF_THE_VALLEY,
|
||||||
Material.WITHER_ROSE,
|
Material.WITHER_ROSE,
|
||||||
Material.SUNFLOWER,
|
Material.SUNFLOWER,
|
||||||
@ -85,48 +85,41 @@ public class CheckSchemType15 implements CheckSchemType.ICheckSchemType {
|
|||||||
Material.HONEY_BOTTLE);
|
Material.HONEY_BOTTLE);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void autoCheck(AutoCheckResult result, Clipboard clipboard) {
|
public AutoChecker.BlockScanResult scan(Clipboard clipboard, CheckSchemType type) {
|
||||||
BlockVector3 dimensions = clipboard.getDimensions();
|
AutoChecker.BlockScanResult result = new AutoChecker.BlockScanResult();
|
||||||
result.setLength(dimensions.getBlockX());
|
BlockVector3 min = clipboard.getMinimumPoint();
|
||||||
result.setHeight(dimensions.getBlockY());
|
BlockVector3 max = clipboard.getMaximumPoint();
|
||||||
result.setWidth(dimensions.getBlockZ());
|
|
||||||
|
|
||||||
Region region = clipboard.getRegion();
|
|
||||||
BlockVector3 min = region.getMinimumPoint();
|
|
||||||
BlockVector3 max = region.getMaximumPoint();
|
|
||||||
|
|
||||||
int blocks = 0;
|
|
||||||
for(int x = min.getBlockX(); x <= max.getBlockX(); x++){
|
for(int x = min.getBlockX(); x <= max.getBlockX(); x++){
|
||||||
for(int y = min.getBlockY(); y <= max.getBlockY(); y++) {
|
for(int y = min.getBlockY(); y <= max.getBlockY(); y++) {
|
||||||
for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
|
for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
|
||||||
|
final BlockPos pos = new BlockPos(x, y, z);
|
||||||
final BaseBlock block = clipboard.getFullBlock(BlockVector3.at(x, y, z));
|
final BaseBlock block = clipboard.getFullBlock(BlockVector3.at(x, y, z));
|
||||||
final Material blockMaterial = Material.matchMaterial(block.getBlockType().getId());
|
final Material material = Material.matchMaterial(block.getBlockType().getId());
|
||||||
if(blockMaterial == null)
|
if(material == null) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
result.checkMaterial(blockMaterial.name());
|
result.getBlockCounts().merge(material, 1, Integer::sum);
|
||||||
|
|
||||||
if(blockMaterial != Material.AIR)
|
if(INVENTORY.contains(material)) {
|
||||||
blocks++;
|
checkInventory(result, block, material, pos);
|
||||||
|
|
||||||
if(INVENTORY.contains(blockMaterial))
|
|
||||||
checkInventory(result, block, blockMaterial);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
result.setBlocks(blocks);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkInventory(AutoCheckResult result, BaseBlock block, Material blockMaterial) {
|
private void checkInventory(AutoChecker.BlockScanResult result, BaseBlock block, Material material, BlockPos pos) {
|
||||||
CompoundTag nbt = block.getNbtData();
|
CompoundTag nbt = block.getNbtData();
|
||||||
if(nbt == null) {
|
if(nbt == null) {
|
||||||
result.defunctNbt(blockMaterial.name());
|
result.getDefunctNbt().add(pos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(blockMaterial == Material.JUKEBOX && nbt.getValue().containsKey("RecordItem")){
|
|
||||||
result.foundRecord();
|
if(material == Material.JUKEBOX && nbt.getValue().containsKey("RecordItem")){
|
||||||
|
result.getRecords().add(pos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +130,7 @@ public class CheckSchemType15 implements CheckSchemType.ICheckSchemType {
|
|||||||
int counter = 0;
|
int counter = 0;
|
||||||
for(CompoundTag item : items){
|
for(CompoundTag item : items){
|
||||||
if(!item.containsKey("id")){
|
if(!item.containsKey("id")){
|
||||||
result.defunctNbt(blockMaterial.name());
|
result.getDefunctNbt().add(pos);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,14 +138,14 @@ public class CheckSchemType15 implements CheckSchemType.ICheckSchemType {
|
|||||||
if(itemType == null) //Leere Slots
|
if(itemType == null) //Leere Slots
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(blockMaterial == Material.DISPENSER && (itemType.equals(Material.FIRE_CHARGE) || itemType.equals(Material.ARROW)))
|
if(material == Material.DISPENSER && (itemType.equals(Material.FIRE_CHARGE) || itemType.equals(Material.ARROW))) {
|
||||||
counter += item.getByte("Count");
|
counter += item.getByte("Count");
|
||||||
else if(!FLOWERS.contains(itemType) && !((blockMaterial == Material.CHEST || blockMaterial == Material.BARREL) && itemType.equals(Material.TNT)))
|
} else if(!FLOWERS.contains(itemType) && !((material == Material.CHEST || material == Material.BARREL) && itemType.equals(Material.TNT))) {
|
||||||
result.foundForbiddenItem(blockMaterial.name(), itemType.name(), item.getByte("Count"));
|
result.getForbiddenItems().computeIfAbsent(pos, blockVector3 -> new HashSet<>()).add(itemType);
|
||||||
else if(item.containsKey("tag"))
|
}else if(item.containsKey("tag")) {
|
||||||
result.foundItemWithTag(blockMaterial.name(), itemType.name(), item.getByte("Count"));
|
result.getForbiddenNbt().computeIfAbsent(pos, blockVector3 -> new HashSet<>()).add(itemType);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
result.dispenserItems(counter);
|
result.getDispenserItems().put(pos, counter);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
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.schematicsystem.commands;
|
||||||
|
|
||||||
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
|
import com.sk89q.jnbt.CompoundTagBuilder;
|
||||||
|
import com.sk89q.jnbt.ListTag;
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.AutoCheckerResult;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.BlockPos;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class SchematicCommand15 implements SchematicCommand.ISchematicCommand {
|
||||||
|
@Override
|
||||||
|
public Clipboard fixClipboard(Clipboard clipboard, AutoCheckerResult result, CheckSchemType type) throws Exception {
|
||||||
|
for (BlockPos blockPos : result.getRecords()) {
|
||||||
|
BlockVector3 vector = BlockVector3.at(blockPos.getX(), blockPos.getY(), blockPos.getZ());
|
||||||
|
clipboard.setBlock(vector, clipboard.getFullBlock(vector).toBaseBlock(new CompoundTag(Collections.emptyMap())));
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<BlockPos, Set<Material>> toBeCheckedInvs = new HashMap<>();
|
||||||
|
|
||||||
|
toBeCheckedInvs.putAll(result.getForbiddenItems());
|
||||||
|
toBeCheckedInvs.putAll(result.getForbiddenNbt());
|
||||||
|
|
||||||
|
for (Map.Entry<BlockPos, Set<Material>> entry: toBeCheckedInvs.entrySet()) {
|
||||||
|
BlockPos pos = entry.getKey();
|
||||||
|
Set<Material> materials = entry.getValue();
|
||||||
|
BlockVector3 vector = BlockVector3.at(pos.getX(), pos.getY(), pos.getZ());
|
||||||
|
BaseBlock block = clipboard.getFullBlock(vector);
|
||||||
|
CompoundTag tag = block.getNbtData();
|
||||||
|
CompoundTagBuilder builder = CompoundTagBuilder.create();
|
||||||
|
List<CompoundTag> list = new ArrayList<>();
|
||||||
|
for (CompoundTag items : tag.getList("Items", CompoundTag.class)) {
|
||||||
|
if(materials.contains(Material.matchMaterial(items.getString("id")))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(items.containsKey("tag")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(items);
|
||||||
|
}
|
||||||
|
builder.put("Items", new ListTag(CompoundTag.class, list));
|
||||||
|
clipboard.setBlock(vector, block.toBaseBlock(builder.build()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(type.getMaxDispenserItems() > 0 ) {
|
||||||
|
for (Map.Entry<BlockPos, Integer> entry : result.getDispenserItems().entrySet()) {
|
||||||
|
if(entry.getValue() <= type.getMaxDispenserItems()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockPos pos = entry.getKey();
|
||||||
|
BlockVector3 vector = BlockVector3.at(pos.getX(), pos.getY(), pos.getZ());
|
||||||
|
BaseBlock block = clipboard.getFullBlock(vector);
|
||||||
|
CompoundTag tag = block.getNbtData();
|
||||||
|
CompoundTagBuilder builder = tag.createBuilder();
|
||||||
|
List<CompoundTag> items = tag.getList("Items", CompoundTag.class);
|
||||||
|
Collections.reverse(items); // To let the first item be in the Dispenser
|
||||||
|
List<CompoundTag> list = new ArrayList<>();
|
||||||
|
int diff = entry.getValue() - type.getMaxDispenserItems();
|
||||||
|
for (CompoundTag item : items) {
|
||||||
|
if(item == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(diff == 0) {
|
||||||
|
list.add(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(diff > item.getByte("Count")) {
|
||||||
|
diff -= item.getByte("Count");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
item = item.createBuilder().putByte("Count", (byte) (item.getByte("Count") - diff)).build();
|
||||||
|
diff = 0;
|
||||||
|
list.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.put("Items", new ListTag(CompoundTag.class, list));
|
||||||
|
clipboard.setBlock(vector, block.toBaseBlock(builder.build()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!result.isLimitedBlocksOK()) {
|
||||||
|
Set<Material> toReplace = type.getLimits().entrySet().stream()
|
||||||
|
.filter(setIntegerEntry -> setIntegerEntry.getValue() == 0)
|
||||||
|
.flatMap(setIntegerEntry -> setIntegerEntry.getKey().stream())
|
||||||
|
.map(Material::matchMaterial)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
BlockState replaceType = Objects.requireNonNull(toReplace.contains(Material.END_STONE) ? BlockTypes.IRON_BLOCK : BlockTypes.END_STONE).getDefaultState();
|
||||||
|
BlockVector3 min = clipboard.getMinimumPoint();
|
||||||
|
BlockVector3 max = clipboard.getMaximumPoint();
|
||||||
|
for (int i = min.getBlockX(); i <= max.getBlockX(); i++) {
|
||||||
|
for (int j = min.getBlockY(); j <= max.getBlockY(); j++) {
|
||||||
|
for (int k = min.getBlockZ(); k <= max.getBlockZ(); k++) {
|
||||||
|
BlockVector3 vector = BlockVector3.at(i, j, k);
|
||||||
|
BaseBlock block = clipboard.getFullBlock(vector);
|
||||||
|
if(toReplace.contains(Material.matchMaterial(block.getBlockType().getId()))) {
|
||||||
|
clipboard.setBlock(vector, replaceType.toBaseBlock());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return clipboard;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
This file is a part of the SteamWar software.
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
Copyright (C) 2022 SteamWar.de-Serverteam
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
@ -17,13 +17,14 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.schematicsystem;
|
package de.steamwar.schematicsystem.autocheck;
|
||||||
|
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -31,7 +32,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public class CheckSchemType8 implements CheckSchemType.ICheckSchemType {
|
public class AutoChecker8 implements AutoChecker.IAutoChecker {
|
||||||
private static final int TNT = Material.TNT.getId();
|
private static final int TNT = Material.TNT.getId();
|
||||||
private static final int SLIME = Material.SLIME_BLOCK.getId();
|
private static final int SLIME = Material.SLIME_BLOCK.getId();
|
||||||
private static final int OBSIDIAN = Material.OBSIDIAN.getId();
|
private static final int OBSIDIAN = Material.OBSIDIAN.getId();
|
||||||
@ -68,13 +69,7 @@ public class CheckSchemType8 implements CheckSchemType.ICheckSchemType {
|
|||||||
FLOWERS = flowers;
|
FLOWERS = flowers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void scan(AutoChecker.BlockScanResult result, Clipboard clipboard) {
|
||||||
public void autoCheck(AutoCheckResult result, Clipboard clipboard) {
|
|
||||||
Vector dimensions = clipboard.getDimensions();
|
|
||||||
result.setLength(dimensions.getBlockX());
|
|
||||||
result.setHeight(dimensions.getBlockY());
|
|
||||||
result.setWidth(dimensions.getBlockZ());
|
|
||||||
|
|
||||||
Region region = clipboard.getRegion();
|
Region region = clipboard.getRegion();
|
||||||
Vector min = region.getMinimumPoint();
|
Vector min = region.getMinimumPoint();
|
||||||
Vector max = region.getMaximumPoint();
|
Vector max = region.getMaximumPoint();
|
||||||
@ -86,30 +81,28 @@ public class CheckSchemType8 implements CheckSchemType.ICheckSchemType {
|
|||||||
final BaseBlock block = clipboard.getBlock(new Vector(x, y, z));
|
final BaseBlock block = clipboard.getBlock(new Vector(x, y, z));
|
||||||
final int blockId = block.getId();
|
final int blockId = block.getId();
|
||||||
|
|
||||||
result.checkMaterial(Material.getMaterial(blockId).name());
|
result.getBlockCounts().merge(Material.getMaterial(blockId), 1, Integer::sum);
|
||||||
|
|
||||||
if (blockId != AIR)
|
if (blockId != AIR)
|
||||||
blocks++;
|
blocks++;
|
||||||
|
|
||||||
if(INVENTORY.contains(blockId)){
|
if(INVENTORY.contains(blockId)){
|
||||||
checkInventory(result, block, blockId);
|
checkInventory(result, block, blockId, new BlockPos(x, y, z));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.setBlocks(blocks);
|
private static void checkInventory(AutoChecker.BlockScanResult result, BaseBlock block, int blockId, BlockPos pos) {
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkInventory(AutoCheckResult result, BaseBlock block, int blockId) {
|
|
||||||
CompoundTag nbt = block.getNbtData();
|
CompoundTag nbt = block.getNbtData();
|
||||||
if(nbt == null){
|
if(nbt == null){
|
||||||
result.defunctNbt(Material.getMaterial(blockId).name());
|
result.getDefunctNbt().add(pos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(blockId == JUKEBOX && nbt.getValue().containsKey("RecordItem")){
|
if(blockId == JUKEBOX && nbt.getValue().containsKey("RecordItem")){
|
||||||
result.foundRecord();
|
result.getRecords().add(pos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +113,7 @@ public class CheckSchemType8 implements CheckSchemType.ICheckSchemType {
|
|||||||
int counter = 0;
|
int counter = 0;
|
||||||
for(CompoundTag item : items){
|
for(CompoundTag item : items){
|
||||||
if(!item.containsKey("id")){
|
if(!item.containsKey("id")){
|
||||||
result.defunctNbt(Material.getMaterial(blockId).name());
|
result.getDefunctNbt().add(pos);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,12 +129,19 @@ public class CheckSchemType8 implements CheckSchemType.ICheckSchemType {
|
|||||||
|
|
||||||
if(blockId == DISPENSER && (itemType.equals(Material.FIREBALL) || itemType.equals(Material.ARROW)))
|
if(blockId == DISPENSER && (itemType.equals(Material.FIREBALL) || itemType.equals(Material.ARROW)))
|
||||||
counter += item.getByte("Count");
|
counter += item.getByte("Count");
|
||||||
else if(!FLOWERS.contains(itemType) && !(blockId == CHEST && itemType.equals(Material.TNT)))
|
else if(!FLOWERS.contains(itemType) && !(blockId == CHEST && itemType.equals(Material.TNT))) {
|
||||||
result.foundForbiddenItem(Material.getMaterial(blockId).name(), itemType.name(), item.getByte("Count"));
|
result.getForbiddenItems().computeIfAbsent(pos, blockPos -> new HashSet<>()).add(Material.getMaterial(blockId));
|
||||||
else if(item.containsKey("tag"))
|
}
|
||||||
result.foundItemWithTag(Material.getMaterial(blockId).name(), itemType.name(), item.getByte("Count"));
|
else if(item.containsKey("tag")) {
|
||||||
|
result.getForbiddenNbt().computeIfAbsent(pos, blockPos -> new HashSet<>()).add(Material.getMaterial(blockId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.dispenserItems(counter);
|
result.getDispenserItems().put(pos, counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AutoChecker.BlockScanResult scan(Clipboard clipboard, CheckSchemType type) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -82,6 +82,8 @@ UTIL_SUBMIT_DIRECT=§eSubmit directly
|
|||||||
UTIL_SUBMIT_DIRECT_DONE=§aThe Schematic will be reviewed in a timely manner
|
UTIL_SUBMIT_DIRECT_DONE=§aThe Schematic will be reviewed in a timely manner
|
||||||
UTIL_SUBMIT_EXTEND=§eExtend Schematic
|
UTIL_SUBMIT_EXTEND=§eExtend Schematic
|
||||||
UTIL_SUBMIT_EXTEND_DONE=§aThe preparation server is starting
|
UTIL_SUBMIT_EXTEND_DONE=§aThe preparation server is starting
|
||||||
|
UTIL_CHECK_TYPE_NOT_FOUND=§cThe type {0} was not found
|
||||||
|
UTIL_CHECK_SUCCESS=§aThe schematic was checked successfully
|
||||||
|
|
||||||
COMMAND_INVALID_NODE=§cInvalid Schematic
|
COMMAND_INVALID_NODE=§cInvalid Schematic
|
||||||
COMMAND_NOT_OWN=§cYou can only use this command on your own Schematic
|
COMMAND_NOT_OWN=§cYou can only use this command on your own Schematic
|
||||||
@ -130,6 +132,14 @@ COMMAND_DELETE_MEMBER=§aYou have removed yourself from the Schematic
|
|||||||
COMMAND_DELETE_DIR=§aThe folder §e{0}§a is deleted...
|
COMMAND_DELETE_DIR=§aThe folder §e{0}§a is deleted...
|
||||||
COMMAND_DELETE_DIR_FULL=§cThe folder must be empty to delete it
|
COMMAND_DELETE_DIR_FULL=§cThe folder must be empty to delete it
|
||||||
COMMAND_DELETE_SCHEM=§aThe Schematic §e{0}§a is deleted...
|
COMMAND_DELETE_SCHEM=§aThe Schematic §e{0}§a is deleted...
|
||||||
|
COMMAND_CHECK_SELECTION_INCOMPLETE=§cThe selection is incomplete
|
||||||
|
COMMAND_CHECK_CLIPBOARD_EMPTY=§cThe clipboard is empty
|
||||||
|
COMMAND_FIX_OK=§aThe schematic is already fixed
|
||||||
|
COMMAND_FIX_DONE=§aThe schematic has been fixed
|
||||||
|
COMMAND_FIX_COULD_NOT_FIX=§cCould not fix this in the schematic
|
||||||
|
COMMAND_FIX_MANUAL=manually fix
|
||||||
|
COMMAND_FIX_ERROR=§cError while fixing the schematic, please contact a developer
|
||||||
|
COMMAND_FIX_WRONG_VERSION=§cThis feature is only available for version 1.15 and greater
|
||||||
|
|
||||||
HELP_HEADER=§e§lSchematicSystem §8§lHelp
|
HELP_HEADER=§e§lSchematicSystem §8§lHelp
|
||||||
HELP_VIEW=Find & Load
|
HELP_VIEW=Find & Load
|
||||||
@ -141,6 +151,7 @@ HELP_VIEW_4=§8/§7schem §esearch §8[§7keyword§8] - §7Searches for matching
|
|||||||
HELP_VIEW_5=§8/§7schem §eload §8[§7schematic§8] - §7Loads a schematic
|
HELP_VIEW_5=§8/§7schem §eload §8[§7schematic§8] - §7Loads a schematic
|
||||||
HELP_VIEW_6=§8/§7schem §edownload §8[§7schematic§8] - §7Gives you a download link (valid for 1 min)
|
HELP_VIEW_6=§8/§7schem §edownload §8[§7schematic§8] - §7Gives you a download link (valid for 1 min)
|
||||||
HELP_VIEW_7=§8/§7download §8- §7Gives you a download link for your current clipboard (valid for 1 min)
|
HELP_VIEW_7=§8/§7download §8- §7Gives you a download link for your current clipboard (valid for 1 min)
|
||||||
|
HELP_VIEW_8=§8/§7schem §echeck §8[§7schematic§8|§7selection§8|§7clipboard§8] [§7schematictype§8] - §7Checks the schematic for errors
|
||||||
HELP_EDIT=Save & Edit
|
HELP_EDIT=Save & Edit
|
||||||
HELP_EDIT_HOVER=Modification of schematics and folders
|
HELP_EDIT_HOVER=Modification of schematics and folders
|
||||||
HELP_EDIT_1=§8/§7schem §esave §8[§7schematic§8] - §7Saves your clipboard as a schematic
|
HELP_EDIT_1=§8/§7schem §esave §8[§7schematic§8] - §7Saves your clipboard as a schematic
|
||||||
@ -151,6 +162,7 @@ HELP_EDIT_5=§8/§7schem §echangetype §8[§7schematic§8] - §7Changes the typ
|
|||||||
HELP_EDIT_6=§8/§7schem §elockreplay §8[§7schematic§8] - §7Locks replays of the schematic
|
HELP_EDIT_6=§8/§7schem §elockreplay §8[§7schematic§8] - §7Locks replays of the schematic
|
||||||
HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7schematic§8] - §7Changes color substitution in the arena
|
HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7schematic§8] - §7Changes color substitution in the arena
|
||||||
HELP_EDIT_8=§8/§7schem §edelete §8[§7schematic§8] - §7Deletes a schematic
|
HELP_EDIT_8=§8/§7schem §edelete §8[§7schematic§8] - §7Deletes a schematic
|
||||||
|
HELP_EDIT_9=§8/§7schem §efix §8[§7schematictype§8] - §7Tries to fix the schematic in your clipboard
|
||||||
HELP_SHARE=Ownership
|
HELP_SHARE=Ownership
|
||||||
HELP_SHARE_HOVER=Share Schematics with others
|
HELP_SHARE_HOVER=Share Schematics with others
|
||||||
HELP_SHARE_1=§8/§7schem §eaddmember §8[§7schematic§8] §8[§7Spieler§8] - §7Adds a player to a schematic
|
HELP_SHARE_1=§8/§7schem §eaddmember §8[§7schematic§8] §8[§7Spieler§8] - §7Adds a player to a schematic
|
||||||
@ -209,3 +221,19 @@ SAFE_NODE_INVALID_NAME=§cThis name is illegal
|
|||||||
SAFE_NODE_NOT_OWNER=§cYou are not the owner of this schematic
|
SAFE_NODE_NOT_OWNER=§cYou are not the owner of this schematic
|
||||||
|
|
||||||
DOWNLOAD_ERROR=§cAn error occurred while uploading the schematic
|
DOWNLOAD_ERROR=§cAn error occurred while uploading the schematic
|
||||||
|
|
||||||
|
AUTO_CHECKER_RESULT_HEADER=§7---=== (§eAuto-Check: {0}§7) ===---
|
||||||
|
AUTO_CHECKER_RESULT_WIDTH =§7Width: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_LENGTH=§7Length: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_HEIGHT=§7Height: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_BLOCKS=§7Blocks: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_UNKNOWN_MATERIAL=§7Unknown block: §c{0}
|
||||||
|
AUTO_CHECKER_RESULT_TOO_MANY_BLOCK=§7{0}: §c{1}§7, Max: §e{2}
|
||||||
|
AUTO_CHECKER_RESULT_FORBIDDEN_BLOCK=§7Forbidden block: §c{0}
|
||||||
|
AUTO_CHECKER_RESULT_FORBIDDEN_ITEM=§7Forbidden Item: [{0}, {1}, {2}] -> §c{3}
|
||||||
|
AUTO_CHECKER_RESULT_DEFUNCT_NBT=§7Defunct NBT: §7[{0}, {1}, {2}]
|
||||||
|
AUTO_CHECKER_RESULT_RECORD=§7Record: §c[{0}, {1}, {2}]
|
||||||
|
AUTO_CHECKER_RESULT_TOO_MANY_DISPENSER_ITEMS=§7Dispenser: §c[{0}, {1}, {2}]§7, §c{3} §7items, Max: §e{4}
|
||||||
|
AUTO_CHECKER_RESULT_FORBIDDEN_ITEM_NBT=§7Forbidden Item NBT: [{0}, {1}, {2}] -> §c{3}
|
||||||
|
AUTO_CHECKER_RESULT_TELEPORT_HERE=§7Teleport to block
|
||||||
|
AUTO_CHECKER_RESULT_AFTER_DEADLINE=§cThe deadline has expired: {0}
|
@ -117,6 +117,14 @@ COMMAND_DELETE_MEMBER=§aDu hast dich von der Schematic entfernt
|
|||||||
COMMAND_DELETE_DIR=§aDer Ordner §e{0}§a wird gelöscht...
|
COMMAND_DELETE_DIR=§aDer Ordner §e{0}§a wird gelöscht...
|
||||||
COMMAND_DELETE_DIR_FULL=§cDer Ordner muss leer sein, um ihn zu löschen
|
COMMAND_DELETE_DIR_FULL=§cDer Ordner muss leer sein, um ihn zu löschen
|
||||||
COMMAND_DELETE_SCHEM=§aDie Schematic §e{0}§a wird gelöscht...
|
COMMAND_DELETE_SCHEM=§aDie Schematic §e{0}§a wird gelöscht...
|
||||||
|
COMMAND_CHECK_SELECTION_INCOMPLETE=§cDeine Auswahl ist unvollständig
|
||||||
|
COMMAND_CHECK_CLIPBOARD_EMPTY=§cDein Clipboard ist leer
|
||||||
|
COMMAND_FIX_OK=§aDie Schematic ist bereits gefixt
|
||||||
|
COMMAND_FIX_DONE=§aDie Schematic wurde repariert
|
||||||
|
COMMAND_FIX_COULD_NOT_FIX=§cKonnte diese nicht sachen in der Schematic reparieren
|
||||||
|
COMMAND_FIX_MANUAL=Manuel Fixen
|
||||||
|
COMMAND_FIX_ERROR=§cFehler beim Fixen der Schematic, bitte kontaktiere einen Developer
|
||||||
|
COMMAND_FIX_WRONG_VERSION=§cDiese Funktion ist nur für Version 1.15 und höher verfügbar
|
||||||
|
|
||||||
HELP_HEADER=§e§lSchematicSystem §8§lHilfe
|
HELP_HEADER=§e§lSchematicSystem §8§lHilfe
|
||||||
HELP_VIEW=Finden & Laden
|
HELP_VIEW=Finden & Laden
|
||||||
@ -128,6 +136,7 @@ HELP_VIEW_4=§8/§7schem §esearch §8[§7Stichwort§8] - §7Sucht nach passende
|
|||||||
HELP_VIEW_5=§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic
|
HELP_VIEW_5=§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic
|
||||||
HELP_VIEW_6=§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig)
|
HELP_VIEW_6=§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig)
|
||||||
HELP_VIEW_7=§8/§7download §8- §7Gibt dir einen Downloadlink von deinem Clipboard (1 min gültig)
|
HELP_VIEW_7=§8/§7download §8- §7Gibt dir einen Downloadlink von deinem Clipboard (1 min gültig)
|
||||||
|
HELP_VIEW_8=§8/§7schem §echeck §8[§7Schematic§8|§7selection§8|§7clipboard§8] [§7SchematicTyp§8] - §7Überprüft deine Schematic
|
||||||
HELP_EDIT=Speichern & Bearbeiten
|
HELP_EDIT=Speichern & Bearbeiten
|
||||||
HELP_EDIT_HOVER=Modifizierung von Schematics und Ordnern
|
HELP_EDIT_HOVER=Modifizierung von Schematics und Ordnern
|
||||||
HELP_EDIT_1=§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic
|
HELP_EDIT_1=§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic
|
||||||
@ -138,6 +147,7 @@ HELP_EDIT_5=§8/§7schem §echangetype §8[§7Schematic§8] - §7Ändert die Art
|
|||||||
HELP_EDIT_6=§8/§7schem §elockreplay §8[§7Schematic§8] - §7Sperrt Replays mit der Schematic
|
HELP_EDIT_6=§8/§7schem §elockreplay §8[§7Schematic§8] - §7Sperrt Replays mit der Schematic
|
||||||
HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7Schematic§8] - §7Ändert Farbersetzung in der Arena
|
HELP_EDIT_7=§8/§7schem §ereplacecolor §8[§7Schematic§8] - §7Ändert Farbersetzung in der Arena
|
||||||
HELP_EDIT_8=§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic
|
HELP_EDIT_8=§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic
|
||||||
|
HELP_EDIT_9=§8/§7schem §efix §8[§7SchematicTyp§8] - §7Versucht die Schematic in deinem Clipboard konform zu machen
|
||||||
HELP_SHARE=Besitzrechte
|
HELP_SHARE=Besitzrechte
|
||||||
HELP_SHARE_HOVER=Schematics mit anderen teilen
|
HELP_SHARE_HOVER=Schematics mit anderen teilen
|
||||||
HELP_SHARE_1=§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu
|
HELP_SHARE_1=§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu
|
||||||
@ -192,3 +202,19 @@ SAFE_NODE_INVALID_NAME=§cDieser Name ist unzulässig
|
|||||||
SAFE_NODE_NOT_OWNER=§cDu bist nicht der Besitzer dieser Schematic
|
SAFE_NODE_NOT_OWNER=§cDu bist nicht der Besitzer dieser Schematic
|
||||||
|
|
||||||
DOWNLOAD_ERROR=§cFehler beim Hochladen deines Clipboards
|
DOWNLOAD_ERROR=§cFehler beim Hochladen deines Clipboards
|
||||||
|
|
||||||
|
AUTO_CHECKER_RESULT_HEADER=§7---=== (§eAutoPrüfer: {0}§7) ===---
|
||||||
|
AUTO_CHECKER_RESULT_WIDTH=§7Breite: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_LENGTH=§7Länge: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_HEIGHT=§7Höhe: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_BLOCKS=§7Blöcke: §c{0}§7, Max: §e{1}
|
||||||
|
AUTO_CHECKER_RESULT_UNKNOWN_MATERIAL=§7Unbekannter Block: §c{0}
|
||||||
|
AUTO_CHECKER_RESULT_TOO_MANY_BLOCK=§7{0}: §c{1}§7, Max: §e{2}
|
||||||
|
AUTO_CHECKER_RESULT_FORBIDDEN_BLOCK=§7Verbotener Block: §c{0}
|
||||||
|
AUTO_CHECKER_RESULT_FORBIDDEN_ITEM=§7Verbotener gegenstand: [{0}, {1}, {2}] -> §c{3}
|
||||||
|
AUTO_CHECKER_RESULT_DEFUNCT_NBT=§7Keine NBT-Daten: §c[{0}, {1}, {2}]
|
||||||
|
AUTO_CHECKER_RESULT_RECORD=§7Schallplatte: §c[{0}, {1}, {2}]
|
||||||
|
AUTO_CHECKER_RESULT_TOO_MANY_DISPENSER_ITEMS=§7Dispenser: §c[{0}, {1}, {2}]§7, §c{3} §7gegenstände, Max: §e{4}
|
||||||
|
AUTO_CHECKER_RESULT_FORBIDDEN_ITEM_NBT=§7Verbotene NBT-Daten: [{0}, {1}, {2}] -> §c{3}
|
||||||
|
AUTO_CHECKER_RESULT_TELEPORT_HERE=§7Zum block teleportieren
|
||||||
|
AUTO_CHECKER_RESULT_AFTER_DEADLINE=§cDer einsendeschluss ist bereits vorbei: {0}
|
@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is a part of the SteamWar software.
|
|
||||||
|
|
||||||
Copyright (C) 2020 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.schematicsystem;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
public class AutoCheckResult {
|
|
||||||
|
|
||||||
private final CheckSchemType type;
|
|
||||||
|
|
||||||
private boolean errorLoadingSchematic = false;
|
|
||||||
|
|
||||||
private int width = 0;
|
|
||||||
private int height = 0;
|
|
||||||
private int length = 0;
|
|
||||||
|
|
||||||
private int blocks = 0;
|
|
||||||
|
|
||||||
private final Map<Set<String>, Integer> limitedMaterials;
|
|
||||||
|
|
||||||
private final Map<String, Integer> defunctNbt = new HashMap<>(); // Amount of defect NBT-Blocks with material name
|
|
||||||
|
|
||||||
private int records = 0; // Amount of found records
|
|
||||||
private final Map<String, Map<String, Integer>> forbiddenItems = new HashMap<>(); // Amount forbidden items per inventory block
|
|
||||||
private final Map<String, Map<String, Integer>> itemsWithTag = new HashMap<>(); // Amount of items with forbidden nbt tags
|
|
||||||
private int tooManyDispenserItems = 0; // Amount of dispensers with too many items
|
|
||||||
|
|
||||||
public AutoCheckResult(CheckSchemType type) {
|
|
||||||
this.type = type;
|
|
||||||
this.limitedMaterials = type.getLimits();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, Object[]> errors() {
|
|
||||||
Map<String, Object[]> errors = new HashMap<>();
|
|
||||||
|
|
||||||
if(errorLoadingSchematic) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_NOT_LOAD", new Object[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert type != null;
|
|
||||||
// SW Quality Code, Check the Comments!
|
|
||||||
if(width > type.getDepth())
|
|
||||||
// Width
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_WIDE", new Object[]{width, type.getDepth()});
|
|
||||||
if(length > type.getWidth())
|
|
||||||
// Length
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_LONG", new Object[]{width, type.getWidth()});
|
|
||||||
if(height > type.getHeight())
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_HIGH", new Object[]{height, type.getHeight()});
|
|
||||||
|
|
||||||
for(Map.Entry<Set<String>, Integer> entry : limitedMaterials.entrySet()) {
|
|
||||||
if(entry.getValue() < 0) {
|
|
||||||
errors.put((entry.getKey().size() == 1 ? "AUTO_CHECK_RESULT_TOO_MANY_BLOCK" : "AUTO_CHECK_RESULT_TOO_MANY_BLOCKS"), new Object[]{String.join(" ", entry.getKey()), -entry.getValue()});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(type.getMaxBlocks() != 0 && blocks > type.getMaxBlocks()) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_MANY_ALL_BLOCKS", new Object[]{blocks, type.getMaxBlocks()});
|
|
||||||
}
|
|
||||||
|
|
||||||
if(records > 0) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_MANY_RECORDS", new Object[]{records});
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Map.Entry<String, Map<String, Integer>> block : forbiddenItems.entrySet()) {
|
|
||||||
for (Map.Entry<String, Integer> item : block.getValue().entrySet()) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_FORBIDDEN_ITEM", new Object[]{block.getKey(), item.getKey(), item.getValue()});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(Map.Entry<String, Map<String, Integer>> block : itemsWithTag.entrySet()) {
|
|
||||||
for (Map.Entry<String, Integer> item : block.getValue().entrySet()) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_FORBIDDEN_ITEM_NBT", new Object[]{block.getKey(), item.getKey(), item.getValue()});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(tooManyDispenserItems == 1) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_MANY_DISPENSER_ITEMS", new Object[]{type.getMaxDispenserItems()});
|
|
||||||
}
|
|
||||||
else if(tooManyDispenserItems > 1) {
|
|
||||||
errors.put("AUTO_CHECK_RESULT_TOO_MANY_DISPENSERS_ITEMS", new Object[]{tooManyDispenserItems, type.getMaxDispenserItems()});
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, Object[]> warnings(){
|
|
||||||
Map<String, Object[]> warnings = new HashMap<>();
|
|
||||||
|
|
||||||
for(Map.Entry<String, Integer> nbtBlock : defunctNbt.entrySet()){
|
|
||||||
if(nbtBlock.getValue() > 1) {
|
|
||||||
warnings.put("AUTO_CHECK_RESULT_NBTS_WARNING", new Object[]{nbtBlock.getValue(), nbtBlock.getKey()});
|
|
||||||
} else {
|
|
||||||
warnings.put("AUTO_CHECK_RESULT_NBT_WARNING", new Object[]{nbtBlock.getKey()});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return warnings;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setErrorLoadingSchematic(){
|
|
||||||
errorLoadingSchematic = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setWidth(int width){
|
|
||||||
this.width = width;
|
|
||||||
}
|
|
||||||
void setLength(int length){
|
|
||||||
this.length = length;
|
|
||||||
}
|
|
||||||
void setHeight(int height){
|
|
||||||
this.height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setBlocks(int blocks) {
|
|
||||||
this.blocks = blocks;
|
|
||||||
}
|
|
||||||
|
|
||||||
void checkMaterial(String name){
|
|
||||||
for(Map.Entry<Set<String>, Integer> entry : limitedMaterials.entrySet()) {
|
|
||||||
if(entry.getKey().contains(name))
|
|
||||||
entry.setValue(entry.getValue() - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void defunctNbt(String name){
|
|
||||||
defunctNbt.compute(name, (k, v) -> v == null ? 1 : v+1);
|
|
||||||
}
|
|
||||||
void foundRecord(){
|
|
||||||
records++;
|
|
||||||
}
|
|
||||||
void foundForbiddenItem(String material, String item, int count){
|
|
||||||
forbiddenItems.compute(material, (k1, v) -> {
|
|
||||||
if(v == null)
|
|
||||||
v = new HashMap<>();
|
|
||||||
v.compute(item, (k2, v2) -> v2 == null ? count : v2 + count);
|
|
||||||
return v;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
void foundItemWithTag(String material, String item, int count){
|
|
||||||
itemsWithTag.compute(material, (k1, v) -> {
|
|
||||||
if(v == null)
|
|
||||||
v = new HashMap<>();
|
|
||||||
v.compute(item, (k2, v2) -> v2 == null ? count : v2 + count);
|
|
||||||
return v;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
void dispenserItems(int counter){
|
|
||||||
assert type != null;
|
|
||||||
if(counter > type.getMaxDispenserItems())
|
|
||||||
tooManyDispenserItems++;
|
|
||||||
}
|
|
||||||
}
|
|
@ -19,24 +19,16 @@
|
|||||||
|
|
||||||
package de.steamwar.schematicsystem;
|
package de.steamwar.schematicsystem;
|
||||||
|
|
||||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
|
||||||
import de.steamwar.core.VersionDependent;
|
|
||||||
import de.steamwar.sql.NoClipboardException;
|
|
||||||
import de.steamwar.sql.SchematicData;
|
|
||||||
import de.steamwar.sql.SchematicNode;
|
|
||||||
import de.steamwar.sql.SchematicType;
|
import de.steamwar.sql.SchematicType;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
public class CheckSchemType {
|
public class CheckSchemType {
|
||||||
|
|
||||||
@ -106,21 +98,6 @@ public class CheckSchemType {
|
|||||||
return types.get(type);
|
return types.get(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoCheckResult autoCheck(SchematicNode schematic) {
|
|
||||||
AutoCheckResult result = new AutoCheckResult(this);
|
|
||||||
Clipboard clipboard;
|
|
||||||
try {
|
|
||||||
clipboard = new SchematicData(schematic).load();
|
|
||||||
} catch (IOException | NoClipboardException e) {
|
|
||||||
Bukkit.getLogger().log(Level.SEVERE, "Schematic could not be loaded", e);
|
|
||||||
result.setErrorLoadingSchematic();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl.autoCheck(result, clipboard);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWidth() {
|
public int getWidth() {
|
||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
@ -149,14 +126,7 @@ public class CheckSchemType {
|
|||||||
return deadline != null && deadline.before(Date.from(Instant.now()));
|
return deadline != null && deadline.before(Date.from(Instant.now()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDeadline() {
|
public Date getDeadline() {
|
||||||
return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.GERMAN).format(deadline);
|
return deadline;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static final ICheckSchemType impl = VersionDependent.getVersionImpl(SchematicSystem.getInstance());
|
|
||||||
|
|
||||||
public interface ICheckSchemType {
|
|
||||||
void autoCheck(AutoCheckResult result, Clipboard clipboard);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
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.schematicsystem.autocheck;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
|
import de.steamwar.core.VersionDependent;
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
|
import de.steamwar.schematicsystem.SchematicSystem;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class AutoChecker {
|
||||||
|
|
||||||
|
public static AutoCheckerResult check(Clipboard clipboard, CheckSchemType type) {
|
||||||
|
BlockScanResult blockScanResult = impl.scan(clipboard, type);
|
||||||
|
return AutoCheckerResult.builder()
|
||||||
|
.type(type)
|
||||||
|
.height(clipboard.getDimensions().getBlockY())
|
||||||
|
.width(clipboard.getDimensions().getBlockX())
|
||||||
|
.depth(clipboard.getDimensions().getBlockZ())
|
||||||
|
.blockCounts(blockScanResult.getBlockCounts())
|
||||||
|
.defunctNbt(blockScanResult.getDefunctNbt())
|
||||||
|
.dispenserItems(blockScanResult.getDispenserItems())
|
||||||
|
.records(blockScanResult.getRecords())
|
||||||
|
.forbiddenItems(blockScanResult.getForbiddenItems())
|
||||||
|
.forbiddenNbt(blockScanResult.getForbiddenNbt())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AutoCheckerResult sizeCheck(Clipboard clipboard, CheckSchemType type) {
|
||||||
|
return AutoCheckerResult.builder()
|
||||||
|
.type(type)
|
||||||
|
.height(clipboard.getDimensions().getBlockY())
|
||||||
|
.width(clipboard.getDimensions().getBlockX())
|
||||||
|
.depth(clipboard.getDimensions().getBlockZ())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final IAutoChecker impl = VersionDependent.getVersionImpl(SchematicSystem.getInstance());
|
||||||
|
|
||||||
|
public interface IAutoChecker {
|
||||||
|
BlockScanResult scan(Clipboard clipboard, CheckSchemType type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@ToString
|
||||||
|
public static class BlockScanResult {
|
||||||
|
private final Map<Material, Integer> blockCounts = new EnumMap<>(Material.class);
|
||||||
|
private final List<BlockPos> defunctNbt = new ArrayList<>();
|
||||||
|
private final List<BlockPos> records = new ArrayList<>();
|
||||||
|
private final Map<BlockPos, Integer> dispenserItems = new HashMap<>();
|
||||||
|
private final Map<BlockPos, Set<Material>> forbiddenItems = new HashMap<>();
|
||||||
|
private final Map<BlockPos, Set<Material>> forbiddenNbt = new HashMap<>();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
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.schematicsystem.autocheck;
|
||||||
|
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
|
import de.steamwar.schematicsystem.SchematicSystem;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
@ToString
|
||||||
|
public class AutoCheckerResult {
|
||||||
|
private final CheckSchemType type;
|
||||||
|
private final int width;
|
||||||
|
private final int height;
|
||||||
|
private final int depth;
|
||||||
|
private final Map<Material, Integer> blockCounts;
|
||||||
|
private final List<BlockPos> defunctNbt;
|
||||||
|
private final Map<BlockPos, Integer> dispenserItems;
|
||||||
|
private final List<BlockPos> records;
|
||||||
|
private final Map<BlockPos, Set<Material>> forbiddenItems;
|
||||||
|
private final Map<BlockPos, Set<Material>> forbiddenNbt;
|
||||||
|
|
||||||
|
public boolean isOk() {
|
||||||
|
return records.isEmpty() &&
|
||||||
|
forbiddenItems.isEmpty() &&
|
||||||
|
forbiddenNbt.isEmpty() &&
|
||||||
|
isSizeOk() &&
|
||||||
|
isBlockCountOk() &&
|
||||||
|
isLimitedBlocksOK() &&
|
||||||
|
isDispenserItemsOK() &&
|
||||||
|
!type.isAfterDeadline();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean fastOk() {
|
||||||
|
return isSizeOk() &&
|
||||||
|
!type.isAfterDeadline();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDispenserItemsOK() {
|
||||||
|
return dispenserItems.values().stream().allMatch(i -> i <= type.getMaxDispenserItems());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasWarnings() {
|
||||||
|
return defunctNbt.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSizeOk() {
|
||||||
|
return !isTooWide() && !isTooHigh() && !isTooDeep();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTooWide() {
|
||||||
|
return width > type.getWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTooHigh() {
|
||||||
|
return height > type.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTooDeep() {
|
||||||
|
return depth > type.getDepth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBlockCountOk() {
|
||||||
|
return type.getMaxBlocks() == 0 || blockCounts.values().stream().reduce(Integer::sum).map(i -> i <= type.getMaxBlocks()).orElse(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLimitedBlocksOK() {
|
||||||
|
try {
|
||||||
|
return type.getLimits().entrySet().stream()
|
||||||
|
.map(setIntegerEntry -> setIntegerEntry.getKey().stream().map(Material::getMaterial).map(blockCounts::get).map(i -> i == null || i <= setIntegerEntry.getValue()).reduce(Boolean::logicalAnd).orElse(false))
|
||||||
|
.reduce(Boolean::logicalAnd).orElse(true);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendErrorMessage(Player p, String schemName) {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_HEADER", p, schemName);
|
||||||
|
if(isTooWide()) SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_WIDTH", p, width, type.getWidth());
|
||||||
|
if(isTooHigh()) SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_HEIGHT", p, height, type.getHeight());
|
||||||
|
if(isTooDeep()) SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_LENGTH", p, depth, type.getDepth());
|
||||||
|
if(type.getMaxBlocks() != 0 && !isBlockCountOk()) {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_BLOCKS", p, blockCounts.values().stream().reduce(Integer::sum).orElse(0), type.getMaxBlocks());
|
||||||
|
}
|
||||||
|
if(!isLimitedBlocksOK()) {
|
||||||
|
type.getLimits().forEach((strings, integer) -> {
|
||||||
|
for (String string : strings) {
|
||||||
|
Material mat = Material.matchMaterial(string);
|
||||||
|
if(mat != null && blockCounts.getOrDefault(mat, 0) > integer) {
|
||||||
|
if(integer == 0) {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_FORBIDDEN_BLOCK", p, mat.name());
|
||||||
|
} else {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_TOO_MANY_BLOCK", p, mat.name(), blockCounts.getOrDefault(mat, 0), integer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
dispenserItems.entrySet().stream().filter(blockVector3IntegerEntry -> blockVector3IntegerEntry.getValue() > type.getMaxDispenserItems()).forEach(blockVector3IntegerEntry -> {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_TOO_MANY_DISPENSER_ITEMS", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3IntegerEntry.getKey()),
|
||||||
|
blockVector3IntegerEntry.getKey().getBlockX(),
|
||||||
|
blockVector3IntegerEntry.getKey().getBlockY(),
|
||||||
|
blockVector3IntegerEntry.getKey().getBlockZ(),
|
||||||
|
blockVector3IntegerEntry.getValue(),
|
||||||
|
type.getMaxDispenserItems());
|
||||||
|
});
|
||||||
|
records.forEach(blockVector3 -> {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_RECORD", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ());
|
||||||
|
});
|
||||||
|
forbiddenItems.forEach((blockVector3, materials) -> {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_FORBIDDEN_ITEM", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ(), setToString(materials));
|
||||||
|
});
|
||||||
|
forbiddenNbt.forEach((blockVector3, materials) -> {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_FORBIDDEN_ITEM_NBT", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ(), setToString(materials));
|
||||||
|
});
|
||||||
|
defunctNbt.forEach(blockVector3 -> {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DEFUNCT_NBT", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
|
||||||
|
});
|
||||||
|
if(type.isAfterDeadline()) {
|
||||||
|
SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_AFTER_DEADLINE", p, type.getDeadline());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ClickEvent tpCommandTo(BlockPos pos) {
|
||||||
|
return new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + pos.getBlockX() + " " + pos.getBlockY() + " " + pos.getBlockZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String setToString(Collection<Material> set) {
|
||||||
|
return set.stream().map(material -> material.getKey().getKey()).reduce((s, s2) -> s + "§7, §c" + s2).orElse("");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
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.schematicsystem.autocheck;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Can be removed with 1.12 support removal
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
@ToString
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class BlockPos {
|
||||||
|
private int x;
|
||||||
|
private int y;
|
||||||
|
private int z;
|
||||||
|
|
||||||
|
public int getBlockX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBlockY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBlockZ() {
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
}
|
@ -19,18 +19,23 @@
|
|||||||
|
|
||||||
package de.steamwar.schematicsystem.commands;
|
package de.steamwar.schematicsystem.commands;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
import de.steamwar.core.Core;
|
import de.steamwar.core.Core;
|
||||||
import de.steamwar.inventory.*;
|
import de.steamwar.inventory.*;
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
import de.steamwar.schematicsystem.SafeSchematicNode;
|
import de.steamwar.schematicsystem.SafeSchematicNode;
|
||||||
import de.steamwar.schematicsystem.SchematicSystem;
|
import de.steamwar.schematicsystem.SchematicSystem;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.AutoChecker;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.sql.*;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static de.steamwar.schematicsystem.commands.SchematicCommandUtils.*;
|
import static de.steamwar.schematicsystem.commands.SchematicCommandUtils.*;
|
||||||
|
|
||||||
@ -199,17 +204,17 @@ public class GUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void changeType(Player p, SchematicNode schem){
|
static void changeType(Player p, SchematicNode schem){
|
||||||
List<SWListInv.SWListEntry<SchematicType>> types = new LinkedList<>();
|
Clipboard clipboard = null;
|
||||||
for(SchematicType type : SchematicType.values()){
|
try {
|
||||||
if(!type.isAssignable())
|
clipboard = new SchematicData(schem).load();
|
||||||
continue;
|
} catch (IOException ignored) { }
|
||||||
|
|
||||||
SWItem item = new SWItem(SWItem.getMaterial(type.getMaterial()), type.name());
|
Clipboard finalClipboard = clipboard;
|
||||||
if(type.fightType())
|
List<SWListInv.SWListEntry<SchematicType>> types = SchematicType.values().parallelStream()
|
||||||
item.setEnchanted(true);
|
.filter(SchematicType::isAssignable)
|
||||||
|
.filter(type -> finalClipboard == null || CheckSchemType.get(type) == null || AutoChecker.sizeCheck(finalClipboard, CheckSchemType.get(type)).fastOk())
|
||||||
types.add(new SWListInv.SWListEntry<>(item, type));
|
.map(type -> new SWListInv.SWListEntry<>(new SWItem(SWItem.getMaterial(type.getMaterial()), type.name(), Collections.emptyList(), type.fightType(), null), type))
|
||||||
}
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
SWListInv<SchematicType> inv = new SWListInv<>(p, SchematicSystem.MESSAGE.parse("GUI_CHANGE_TYPE", p), types, (clickType, schematicType) -> {
|
SWListInv<SchematicType> inv = new SWListInv<>(p, SchematicSystem.MESSAGE.parse("GUI_CHANGE_TYPE", p), types, (clickType, schematicType) -> {
|
||||||
p.closeInventory();
|
p.closeInventory();
|
||||||
|
@ -19,12 +19,25 @@
|
|||||||
|
|
||||||
package de.steamwar.schematicsystem.commands;
|
package de.steamwar.schematicsystem.commands;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.*;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
|
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
|
||||||
|
import com.sk89q.worldedit.function.operation.Operations;
|
||||||
|
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||||
import de.steamwar.command.*;
|
import de.steamwar.command.*;
|
||||||
|
import de.steamwar.core.Core;
|
||||||
|
import de.steamwar.core.VersionDependent;
|
||||||
import de.steamwar.inventory.SWAnvilInv;
|
import de.steamwar.inventory.SWAnvilInv;
|
||||||
import de.steamwar.inventory.SchematicSelector;
|
import de.steamwar.inventory.SchematicSelector;
|
||||||
import de.steamwar.providers.BauServerInfo;
|
import de.steamwar.providers.BauServerInfo;
|
||||||
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
import de.steamwar.schematicsystem.SafeSchematicNode;
|
import de.steamwar.schematicsystem.SafeSchematicNode;
|
||||||
import de.steamwar.schematicsystem.SchematicSystem;
|
import de.steamwar.schematicsystem.SchematicSystem;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.AutoChecker;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.AutoCheckerResult;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.sql.*;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
@ -35,6 +48,7 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
@ -378,14 +392,24 @@ public class SchematicCommand extends SWCommand {
|
|||||||
SteamwarUser user = getUser(player);
|
SteamwarUser user = getUser(player);
|
||||||
TextComponent base = new TextComponent();
|
TextComponent base = new TextComponent();
|
||||||
|
|
||||||
SchematicType.values().forEach(type -> {
|
Clipboard clipboard = null;
|
||||||
if (!type.isAssignable()) return;
|
try {
|
||||||
|
clipboard = new SchematicData(node).load();
|
||||||
|
} catch (IOException ignored) { }
|
||||||
|
|
||||||
|
Clipboard finalClipboard = clipboard;
|
||||||
|
|
||||||
|
String breadcrumb = node.generateBreadcrumbs(user);
|
||||||
|
|
||||||
|
SchematicType.values().parallelStream()
|
||||||
|
.filter(SchematicType::isAssignable)
|
||||||
|
.filter(type -> finalClipboard == null || CheckSchemType.get(type) == null || AutoChecker.sizeCheck(finalClipboard, CheckSchemType.get(type)).fastOk())
|
||||||
|
.forEachOrdered(type -> {
|
||||||
TextComponent component = new TextComponent(type.name() + " ");
|
TextComponent component = new TextComponent(type.name() + " ");
|
||||||
component.setColor(ChatColor.GRAY);
|
component.setColor(ChatColor.GRAY);
|
||||||
component.setBold(true);
|
component.setBold(true);
|
||||||
component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(SchematicSystem.MESSAGE.parse("COMMAND_CHANGE_TYPE_SELECT", player))));
|
component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(SchematicSystem.MESSAGE.parse("COMMAND_CHANGE_TYPE_SELECT", player))));
|
||||||
component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + node.generateBreadcrumbs(user) + " " + type.name()));
|
component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + breadcrumb + " " + type.name()));
|
||||||
base.addExtra(component);
|
base.addExtra(component);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -547,6 +571,74 @@ public class SchematicCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Register("check")
|
||||||
|
public void checkCommand(Player player, @Validator("isOwnerSchematicValidator") SchematicNode node, CheckSchemType type) {
|
||||||
|
try {
|
||||||
|
check(player, new SchematicData(node).load(), type, node.getName(), false);
|
||||||
|
} catch (IOException e) {
|
||||||
|
SchematicSystem.MESSAGE.send("UTIL_LOAD_ERROR", player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Register(value = {"check", "clipboard"})
|
||||||
|
public void checkClipboardCommand(Player player, @ErrorMessage("UTIL_CHECK_TYPE_NOT_FOUND") CheckSchemType type) {
|
||||||
|
try {
|
||||||
|
check(player, WorldEdit.getInstance().getSessionManager().get(new BukkitPlayer(player)).getClipboard().getClipboard(), type, "clipboard", false);
|
||||||
|
} catch (EmptyClipboardException e) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_CHECK_CLIPBOARD_EMPTY", player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Register(value = {"check", "selection"})
|
||||||
|
public void checkSelectionCommand(Player player, @ErrorMessage("UTIL_CHECK_TYPE_NOT_FOUND") CheckSchemType type) {
|
||||||
|
try {
|
||||||
|
Clipboard clipboard = new BlockArrayClipboard(WorldEdit.getInstance().getSessionManager().get(new BukkitPlayer(player)).getSelection(new BukkitWorld(player.getWorld())));
|
||||||
|
EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(player.getWorld()), -1);
|
||||||
|
|
||||||
|
Operations.complete(new ForwardExtentCopy(editSession, clipboard.getRegion(), clipboard, clipboard.getMinimumPoint()));
|
||||||
|
|
||||||
|
check(player, clipboard, type, "selection", false);
|
||||||
|
} catch (IncompleteRegionException e) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_CHECK_SELECTION_INCOMPLETE", player);
|
||||||
|
} catch (WorldEditException e) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_SAVE_ERROR", player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Register("fix")
|
||||||
|
public void fixSchematicCommand(Player player, @ErrorMessage("UTIL_CHECK_TYPE_NOT_FOUND") CheckSchemType type) {
|
||||||
|
if(Core.getVersion() < 15) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_FIX_WRONG_VERSION", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Clipboard clipboard;
|
||||||
|
try {
|
||||||
|
clipboard = WorldEdit.getInstance().getSessionManager().get(new BukkitPlayer(player)).getClipboard().getClipboard();
|
||||||
|
} catch (EmptyClipboardException e) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_CHECK_CLIPBOARD_EMPTY", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AutoCheckerResult result = AutoChecker.check(clipboard, type);
|
||||||
|
if(result.isOk()) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_FIX_OK", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
clipboard = impl.fixClipboard(clipboard, result, type);
|
||||||
|
WorldEdit.getInstance().getSessionManager().get(new BukkitPlayer(player)).setClipboard(new ClipboardHolder(clipboard));
|
||||||
|
AutoCheckerResult after = AutoChecker.check(clipboard, type);
|
||||||
|
if(after.isOk()) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_FIX_DONE", player);
|
||||||
|
} else {
|
||||||
|
after.sendErrorMessage(player, SchematicSystem.MESSAGE.parse("COMMAND_FIX_MANUAL", player));
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_FIX_COULD_NOT_FIX", player);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
SchematicSystem.MESSAGE.send("COMMAND_FIX_ERROR", player);
|
||||||
|
SchematicSystem.getInstance().getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Register(value = "page", noTabComplete = true)
|
@Register(value = "page", noTabComplete = true)
|
||||||
public void pageCommand(Player player, int page) {
|
public void pageCommand(Player player, int page) {
|
||||||
cachedSchemList(player, page);
|
cachedSchemList(player, page);
|
||||||
@ -673,6 +765,21 @@ public class SchematicCommand extends SWCommand {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ClassMapper(value = CheckSchemType.class, local = true)
|
||||||
|
public TypeMapper<CheckSchemType> checkSchemTypeTypeMapper() {
|
||||||
|
return new TypeMapper<CheckSchemType>() {
|
||||||
|
@Override
|
||||||
|
public Collection<String> tabCompletes(CommandSender commandSender, String[] strings, String s) {
|
||||||
|
return SchematicType.values().stream().filter(type -> CheckSchemType.get(type) != null).map(SchematicType::name).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CheckSchemType map(CommandSender commandSender, String[] previousArguments, String s) {
|
||||||
|
return SchematicType.values().stream().filter(type -> type.name().equalsIgnoreCase(s)).map(CheckSchemType::get).findAny().orElse(null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Mapper(value = "searchMapper", local = true)
|
@Mapper(value = "searchMapper", local = true)
|
||||||
public TypeMapper<String> searchTypeMapper() {
|
public TypeMapper<String> searchTypeMapper() {
|
||||||
return new TypeMapper<String>() {
|
return new TypeMapper<String>() {
|
||||||
@ -783,4 +890,10 @@ public class SchematicCommand extends SWCommand {
|
|||||||
AUSFAHREN,
|
AUSFAHREN,
|
||||||
NORMAL
|
NORMAL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final ISchematicCommand impl = VersionDependent.getVersionImpl(SchematicSystem.getInstance());
|
||||||
|
|
||||||
|
public static interface ISchematicCommand {
|
||||||
|
Clipboard fixClipboard(Clipboard clipboard, AutoCheckerResult result, CheckSchemType type) throws Exception;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,8 @@ public class SchematicCommandHelp {
|
|||||||
"HELP_VIEW_4",
|
"HELP_VIEW_4",
|
||||||
"HELP_VIEW_5",
|
"HELP_VIEW_5",
|
||||||
"HELP_VIEW_6",
|
"HELP_VIEW_6",
|
||||||
"HELP_VIEW_7"
|
"HELP_VIEW_7",
|
||||||
|
"HELP_VIEW_8"
|
||||||
}),
|
}),
|
||||||
BEARBEITUNG("HELP_EDIT", "HELP_EDIT_HOVER", new String[]{
|
BEARBEITUNG("HELP_EDIT", "HELP_EDIT_HOVER", new String[]{
|
||||||
"HELP_EDIT_1",
|
"HELP_EDIT_1",
|
||||||
@ -66,7 +67,8 @@ public class SchematicCommandHelp {
|
|||||||
"HELP_EDIT_5",
|
"HELP_EDIT_5",
|
||||||
"HELP_EDIT_6",
|
"HELP_EDIT_6",
|
||||||
"HELP_EDIT_7",
|
"HELP_EDIT_7",
|
||||||
"HELP_EDIT_8"
|
"HELP_EDIT_8",
|
||||||
|
"HELP_EDIT_9"
|
||||||
}),
|
}),
|
||||||
MEMBER("HELP_SHARE", "HELP_SHARE_HOVER", new String[]{
|
MEMBER("HELP_SHARE", "HELP_SHARE_HOVER", new String[]{
|
||||||
"HELP_SHARE_1",
|
"HELP_SHARE_1",
|
||||||
|
@ -19,14 +19,16 @@
|
|||||||
|
|
||||||
package de.steamwar.schematicsystem.commands;
|
package de.steamwar.schematicsystem.commands;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.inventory.SWInventory;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import de.steamwar.network.NetworkSender;
|
import de.steamwar.network.NetworkSender;
|
||||||
import de.steamwar.network.packets.client.PrepareSchemPacket;
|
import de.steamwar.network.packets.client.PrepareSchemPacket;
|
||||||
import de.steamwar.providers.BauServerInfo;
|
import de.steamwar.providers.BauServerInfo;
|
||||||
import de.steamwar.schematicsystem.AutoCheckResult;
|
|
||||||
import de.steamwar.schematicsystem.CheckSchemType;
|
import de.steamwar.schematicsystem.CheckSchemType;
|
||||||
import de.steamwar.schematicsystem.SchematicSystem;
|
import de.steamwar.schematicsystem.SchematicSystem;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.AutoChecker;
|
||||||
|
import de.steamwar.schematicsystem.autocheck.AutoCheckerResult;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.sql.*;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
@ -40,6 +42,7 @@ import net.md_5.bungee.api.chat.TextComponent;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.IntFunction;
|
import java.util.function.IntFunction;
|
||||||
import java.util.function.UnaryOperator;
|
import java.util.function.UnaryOperator;
|
||||||
@ -302,6 +305,15 @@ public class SchematicCommandUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void check(Player player, Clipboard clipboard, CheckSchemType type, String schemName, boolean gui) {
|
||||||
|
AutoCheckerResult result = AutoChecker.check(clipboard, type);
|
||||||
|
if(!result.isOk()) {
|
||||||
|
result.sendErrorMessage(player, schemName);
|
||||||
|
} else {
|
||||||
|
SchematicSystem.MESSAGE.send("UTIL_CHECK_SUCCESS", player, schemName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static SchematicNode mkdirs(String[] layers, SteamwarUser user, int minus) {
|
public static SchematicNode mkdirs(String[] layers, SteamwarUser user, int minus) {
|
||||||
SchematicNode currentNode = null;
|
SchematicNode currentNode = null;
|
||||||
for (int i = 0; i < layers.length - minus; i++) {
|
for (int i = 0; i < layers.length - minus; i++) {
|
||||||
@ -430,16 +442,17 @@ public class SchematicCommandUtils {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoCheckResult result = checkSchemType.autoCheck(node);
|
AutoCheckerResult result = null;
|
||||||
Map<String, Object[]> errors = result.errors();
|
try {
|
||||||
for (Map.Entry<String, Object[]> warning : result.warnings().entrySet()) {
|
result = AutoChecker.check(new SchematicData(node).load(), checkSchemType);
|
||||||
SchematicSystem.MESSAGE.sendPrefixless(warning.getKey(), player, warning.getValue());
|
} catch (IOException e) {
|
||||||
|
SchematicSystem.MESSAGE.send("UTIL_LOAD_ERROR", player);
|
||||||
|
SchematicSystem.getInstance().getLogger().throwing(SchematicCommandUtils.class.getName(), "changeType", e);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
for (Map.Entry<String, Object[]> error : errors.entrySet()) {
|
if (!result.isOk()) {
|
||||||
SchematicSystem.MESSAGE.sendPrefixless(error.getKey(), player, error.getValue());
|
|
||||||
}
|
|
||||||
if (!errors.isEmpty()) {
|
|
||||||
SchematicSystem.MESSAGE.send("UTIL_TYPE_ERROR", player);
|
SchematicSystem.MESSAGE.send("UTIL_TYPE_ERROR", player);
|
||||||
|
result.sendErrorMessage(player, node.getName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,6 @@ mainClassName = ''
|
|||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
jcenter()
|
|
||||||
|
|
||||||
maven {
|
maven {
|
||||||
url = uri("https://repo.codemc.io/repository/maven-snapshots/")
|
url = uri("https://repo.codemc.io/repository/maven-snapshots/")
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren