Add SchemEqualityCommand
Dieser Commit ist enthalten in:
Ursprung
e48f05635f
Commit
cbc2f0421b
12
build.gradle
12
build.gradle
@ -38,14 +38,6 @@ sourceSets {
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
name = 'spigotmc-repo'
|
||||
url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/'
|
||||
}
|
||||
maven {
|
||||
name = 'sonatype'
|
||||
url = 'https://oss.sonatype.org/content/groups/public/'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@ -54,8 +46,8 @@ dependencies {
|
||||
annotationProcessor 'org.projectlombok:lombok:1.18.6'
|
||||
testAnnotationProcessor 'org.projectlombok:lombok:1.18.6'
|
||||
|
||||
compileOnly 'org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT'
|
||||
|
||||
compileOnly files("${project.rootDir}/lib/Spigot-1.15.jar")
|
||||
compileOnly files("${project.rootDir}/lib/WorldEdit-1.15.jar")
|
||||
compileOnly files("${project.rootDir}/lib/SpigotCore.jar")
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
package de.steamwar;
|
||||
|
||||
import de.steamwar.command.GamemodeCommand;
|
||||
import de.steamwar.command.SchemEqualityCommand;
|
||||
import de.steamwar.command.SpeedCommand;
|
||||
import de.steamwar.listener.WorldChange;
|
||||
import lombok.Getter;
|
||||
@ -38,6 +39,7 @@ public final class Teamserver extends JavaPlugin {
|
||||
|
||||
new GamemodeCommand();
|
||||
new SpeedCommand();
|
||||
new SchemEqualityCommand();
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(new WorldChange(), this);
|
||||
}
|
||||
|
270
src/de/steamwar/command/SchemEqualityCommand.java
Normale Datei
270
src/de/steamwar/command/SchemEqualityCommand.java
Normale Datei
@ -0,0 +1,270 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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.command;
|
||||
|
||||
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.BlockType;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
import de.steamwar.Teamserver;
|
||||
import de.steamwar.sql.Schematic;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class SchemEqualityCommand extends SWCommand {
|
||||
|
||||
public SchemEqualityCommand() {
|
||||
super("schemcheck", "sc");
|
||||
}
|
||||
|
||||
@Register(help = true)
|
||||
public void genericHelp(Player p, String... args) {
|
||||
p.sendMessage("/schemcheck <Player1> <Schem1> <Player2> <Schem2>");
|
||||
p.sendMessage("/schemcheck <Player1> <Schem1> <Player2>");
|
||||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(Player p, String user1, String schem1, String user2) {
|
||||
SteamwarUser steamwarUser = SteamwarUser.get(p.getUniqueId());
|
||||
if (!steamwarUser.getUserGroup().isAdminGroup()) {
|
||||
p.sendMessage("Keine Berechtigung");
|
||||
return;
|
||||
}
|
||||
|
||||
SteamwarUser steamwarUser1 = SteamwarUser.get(user1);
|
||||
if (steamwarUser1 == null) {
|
||||
try {
|
||||
steamwarUser1 = SteamwarUser.get(UUID.fromString(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser1 == null) {
|
||||
try {
|
||||
steamwarUser1 = SteamwarUser.get(Integer.parseInt(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser1 == null) {
|
||||
p.sendMessage("Unbekannter Spieler");
|
||||
return;
|
||||
}
|
||||
Schematic schematic1 = Schematic.getSchemFromDB(schem1, steamwarUser1.getId());
|
||||
|
||||
SteamwarUser steamwarUser2 = SteamwarUser.get(user2);
|
||||
if (steamwarUser2 == null) {
|
||||
try {
|
||||
steamwarUser2 = SteamwarUser.get(UUID.fromString(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser2 == null) {
|
||||
try {
|
||||
steamwarUser2 = SteamwarUser.get(Integer.parseInt(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser2 == null) {
|
||||
p.sendMessage("Unbekannter Spieler");
|
||||
return;
|
||||
}
|
||||
List<Schematic> schematicList = Schematic.getSchemsAccessibleByUser(steamwarUser2.getId());
|
||||
|
||||
if (schematic1 == null) {
|
||||
p.sendMessage("Fehler beim finden einer der Schematics");
|
||||
return;
|
||||
}
|
||||
if (schematicList.isEmpty()) {
|
||||
p.sendMessage("Der User hat keine Schematics");
|
||||
return;
|
||||
}
|
||||
|
||||
Clipboard clipboard;
|
||||
try {
|
||||
clipboard = schematic1.load();
|
||||
} catch (IOException e) {
|
||||
p.sendMessage("Fehler beim laden");
|
||||
return;
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().runTaskAsynchronously(Teamserver.getInstance(), () -> {
|
||||
List<CheckResult> checkResults = new ArrayList<>();
|
||||
int index = 0;
|
||||
for (Schematic schematic : schematicList) {
|
||||
if (index % 10 == 0) {
|
||||
p.sendMessage(index + "/" + schematicList.size());
|
||||
}
|
||||
index++;
|
||||
try {
|
||||
CheckResult checkResult = check(clipboard, schematic.getSchemName(), schematic.load());
|
||||
if (checkResult == null) {
|
||||
continue;
|
||||
}
|
||||
checkResults.add(checkResult);
|
||||
checkResults.sort(Comparator.comparingInt(value -> value.equalBlock));
|
||||
while (checkResults.size() > 3) {
|
||||
checkResults.remove(0);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Ignored
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < checkResults.size(); i++) {
|
||||
p.sendMessage((checkResults.size() - i) + ". " + checkResults.get(i).name + " - " + checkResults.get(i).equalBlock + "/" + checkResults.get(i).volume);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(Player p, String user1, String schem1, String user2, String schem2) {
|
||||
SteamwarUser steamwarUser = SteamwarUser.get(p.getUniqueId());
|
||||
if (!steamwarUser.getUserGroup().isAdminGroup()) {
|
||||
p.sendMessage("Keine Berechtigung");
|
||||
return;
|
||||
}
|
||||
|
||||
SteamwarUser steamwarUser1 = SteamwarUser.get(user1);
|
||||
if (steamwarUser1 == null) {
|
||||
try {
|
||||
steamwarUser1 = SteamwarUser.get(UUID.fromString(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser1 == null) {
|
||||
try {
|
||||
steamwarUser1 = SteamwarUser.get(Integer.parseInt(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser1 == null) {
|
||||
p.sendMessage("Unbekannter Spieler");
|
||||
return;
|
||||
}
|
||||
Schematic schematic1 = Schematic.getSchemFromDB(schem1, steamwarUser1.getId());
|
||||
|
||||
SteamwarUser steamwarUser2 = SteamwarUser.get(user2);
|
||||
if (steamwarUser2 == null) {
|
||||
try {
|
||||
steamwarUser2 = SteamwarUser.get(UUID.fromString(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser2 == null) {
|
||||
try {
|
||||
steamwarUser2 = SteamwarUser.get(Integer.parseInt(user1));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (steamwarUser2 == null) {
|
||||
p.sendMessage("Unbekannter Spieler");
|
||||
return;
|
||||
}
|
||||
Schematic schematic2 = Schematic.getSchemFromDB(schem2, steamwarUser2.getId());
|
||||
|
||||
if (schematic1 == null || schematic2 == null) {
|
||||
p.sendMessage("Fehler beim finden einer der Schematics");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
Clipboard clipboard1 = schematic1.load();
|
||||
Clipboard clipboard2 = schematic2.load();
|
||||
|
||||
CheckResult checkResult = check(clipboard1, schematic2.getSchemName(), clipboard2);
|
||||
if (checkResult == null) {
|
||||
p.sendMessage("Ungleich");
|
||||
return;
|
||||
}
|
||||
|
||||
p.sendMessage(checkResult.equalBlock + "/" + checkResult.volume);
|
||||
checkResult.blockEqualities.forEach((blockType, atomicInteger) -> {
|
||||
p.sendMessage(blockType.toString() + ": " + atomicInteger.get());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
p.sendMessage("Fehler beim Laden der Schematics");
|
||||
}
|
||||
}
|
||||
|
||||
@AllArgsConstructor
|
||||
private class CheckResult {
|
||||
private String name;
|
||||
private int volume;
|
||||
private int equalBlock;
|
||||
private Map<BlockType, AtomicInteger> blockEqualities;
|
||||
}
|
||||
|
||||
private CheckResult check(Clipboard clipboard1, String name, Clipboard clipboard2) {
|
||||
if (!clipboard1.getDimensions().equals(clipboard2.getDimensions())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BlockVector3 minimum1 = clipboard1.getRegion().getMinimumPoint();
|
||||
BlockVector3 minimum2 = clipboard2.getRegion().getMinimumPoint();
|
||||
|
||||
Map<BlockType, AtomicInteger> blockEqualities = new HashMap<>();
|
||||
int equalBlocks = 0;
|
||||
for (int x = 0; x < clipboard1.getDimensions().getX(); x++) {
|
||||
for (int y = 0; y < clipboard1.getDimensions().getY(); y++) {
|
||||
for (int z = 0; z < clipboard1.getDimensions().getZ(); z++) {
|
||||
BlockVector3 pos1 = minimum1.add(x, y, z);
|
||||
BlockVector3 pos2 = minimum2.add(x, y, z);
|
||||
|
||||
BaseBlock block = clipboard1.getFullBlock(pos1);
|
||||
if (block.equalsFuzzy(clipboard2.getFullBlock(pos2))) {
|
||||
if (block.getBlockType().equals(BlockTypes.END_STONE)) {
|
||||
continue;
|
||||
}
|
||||
if (block.getBlockType().equals(BlockTypes.END_STONE_BRICKS)) {
|
||||
continue;
|
||||
}
|
||||
if (block.getBlockType().equals(BlockTypes.END_STONE_BRICK_SLAB)) {
|
||||
continue;
|
||||
}
|
||||
if (block.getBlockType().equals(BlockTypes.END_STONE_BRICK_STAIRS)) {
|
||||
continue;
|
||||
}
|
||||
if (block.getBlockType().equals(BlockTypes.END_STONE_BRICK_WALL)) {
|
||||
continue;
|
||||
}
|
||||
equalBlocks++;
|
||||
blockEqualities.computeIfAbsent(clipboard1.getFullBlock(pos1).getBlockType(), blockType -> new AtomicInteger()).incrementAndGet();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return new CheckResult(name, clipboard1.getDimensions().getX() * clipboard1.getDimensions().getY() * clipboard1.getDimensions().getZ(), equalBlocks, blockEqualities);
|
||||
}
|
||||
|
||||
}
|
In neuem Issue referenzieren
Einen Benutzer sperren