SteamWar/SpigotCore
Archiviert
13
0

Merge branch 'master' into commonDB

# Conflicts:
#	SpigotCore_Main/src/de/steamwar/core/Core.java
#	SpigotCore_Main/src/de/steamwar/sql/SWException.java
#	SpigotCore_Main/src/de/steamwar/sql/SchematicData.java
#	SpigotCore_Main/src/de/steamwar/sql/SchematicNode.java
Dieser Commit ist enthalten in:
Lixfel 2022-10-29 12:37:36 +02:00
Commit 4548f80843
12 geänderte Dateien mit 171 neuen und 112 gelöschten Zeilen

Datei anzeigen

@ -42,6 +42,7 @@ SCHEM_SELECTOR_SORTING_UPDATE=Last update
SCHEM_SELECTOR_SORTING_DIRECTION=§e{0} §7order SCHEM_SELECTOR_SORTING_DIRECTION=§e{0} §7order
SCHEM_SELECTOR_SORTING_ASC=Ascending SCHEM_SELECTOR_SORTING_ASC=Ascending
SCHEM_SELECTOR_SORTING_DSC=Descending SCHEM_SELECTOR_SORTING_DSC=Descending
SCHEM_SELECTOR_CLICK_BACK=§7Click to go back
SCHEM_SELECTOR_ITEM_NAME=§e{0} SCHEM_SELECTOR_ITEM_NAME=§e{0}
SCHEM_SELECTOR_ITEM_NAME_FILTER=§7{0} SCHEM_SELECTOR_ITEM_NAME_FILTER=§7{0}

Datei anzeigen

@ -42,6 +42,7 @@ SCHEM_SELECTOR_SORTING_UPDATE=Letztes Update
SCHEM_SELECTOR_SORTING_DIRECTION=§7Richtung: §e{0} SCHEM_SELECTOR_SORTING_DIRECTION=§7Richtung: §e{0}
SCHEM_SELECTOR_SORTING_ASC=Aufsteigend SCHEM_SELECTOR_SORTING_ASC=Aufsteigend
SCHEM_SELECTOR_SORTING_DSC=Absteigend SCHEM_SELECTOR_SORTING_DSC=Absteigend
SCHEM_SELECTOR_CLICK_BACK=§7Klicke hier, um zurückzugehen
SCHEM_SELECTOR_CREATE_DIR_TITLE=Ordner erstellen SCHEM_SELECTOR_CREATE_DIR_TITLE=Ordner erstellen

Datei anzeigen

@ -135,8 +135,13 @@ public class Core extends JavaPlugin{
@Override @Override
public void onDisable() { public void onDisable() {
TinyProtocol.instance.close(); TinyProtocol.instance.close();
crashDetector.stop();
errorHandler.unregister(); errorHandler.unregister();
if(crashDetector.onMainThread())
Statement.closeAll(); Statement.closeAll();
} }
private static void setSqlConfig() {
sqlConfig = new File(System.getProperty("user.home"), "MySQL.yml");
standalone = !sqlConfig.exists();
}
} }

Datei anzeigen

@ -20,6 +20,7 @@
package de.steamwar.core; package de.steamwar.core;
import de.steamwar.sql.SWException; import de.steamwar.sql.SWException;
import de.steamwar.sql.Statement;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import java.util.Arrays; import java.util.Arrays;
@ -47,7 +48,12 @@ public class CrashDetector {
watchdog.interrupt(); watchdog.interrupt();
} }
public boolean onMainThread() {
return Thread.currentThread() == mainThread;
}
private void run() { private void run() {
SWException.init();
while (run) { while (run) {
long curTime = System.currentTimeMillis(); long curTime = System.currentTimeMillis();
if(curTime - TIMEOUT > lastTick.get()) { if(curTime - TIMEOUT > lastTick.get()) {
@ -58,6 +64,7 @@ public class CrashDetector {
if(Core.getInstance().isEnabled()) { if(Core.getInstance().isEnabled()) {
Core.getInstance().onDisable(); Core.getInstance().onDisable();
} }
Statement.close();
//System.exit(0); Does freeze, potential freezing issues: ConsoleRestoreHook, ApplicationShutdownHooks or DeleteOnExitHook //System.exit(0); Does freeze, potential freezing issues: ConsoleRestoreHook, ApplicationShutdownHooks or DeleteOnExitHook
Runtime.getRuntime().halt(0); Runtime.getRuntime().halt(0);
} }

Datei anzeigen

@ -1,31 +0,0 @@
package de.steamwar.inventory;
public class SWActionBar {
public enum Slot {
ZERO(0),
ONE(1),
TWO(2),
THREE(3),
FOUR(4),
FIVE(5),
SIX(6);
private int index;
Slot(int index) {
this.index = index;
}
int getIndex() {
return index;
}
}
SWItem[] actionBar = new SWItem[7];
public void setItem(Slot slot, SWItem item) {
actionBar[slot.getIndex()] = item;
}
}

Datei anzeigen

@ -1,73 +0,0 @@
package de.steamwar.inventory;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import java.util.List;
public class SWActionListInv<T> extends SWInventory {
private SWListInv.ListCallback<T> callback;
private List<SWListInv.SWListEntry<T>> elements;
private SWActionBar actionBar = null;
private int page;
public SWActionListInv(Player p, String t, List<SWListInv.SWListEntry<T>> l, SWListInv.ListCallback<T> c){
super(p, 54, t);
callback = c;
elements = l;
page = 0;
}
public void setActionBar(SWActionBar actionBar) {
this.actionBar = actionBar;
}
@Override
public void open(){
inventory.clear();
setCallback(-999, (ClickType click) -> player.closeInventory());
if (page != 0) {
setItem(0, SWItem.getDye(10), (byte) 10, "§eSeite zurück", (ClickType click) -> {
page--;
open();
});
} else {
setItem(0, SWItem.getDye(8), (byte) 8, "§7Seite zurück", (ClickType click) -> {});
}
if (page < elements.size() / 45) {
setItem(8, SWItem.getDye(10), (byte) 10, "§eSeite vor", (ClickType click) -> {
page++;
open();
});
} else {
setItem(8, SWItem.getDye(8), (byte) 8, "§7Seite vor", (ClickType click) -> {});
}
if (actionBar != null) {
for (int i = 0; i < 7; i++) {
setItem(i + 1, actionBar.actionBar[i]);
}
}
int ipageLimit = elements.size() - page*45;
if(ipageLimit > 45 && elements.size() > 45){
ipageLimit = 45;
}
int i = page*45;
for(int ipage=0; ipage < ipageLimit; ipage++ ){
SWItem e = elements.get(i).getItem();
final int pos = i;
setItem(ipage + 9, e);
setCallback(ipage, (ClickType click) -> callback.clicked(click, elements.get(pos).getObject()));
i++;
}
super.open();
}
public void setCallback(SWListInv.ListCallback<T> c){
callback = c;
}
}

Datei anzeigen

@ -66,6 +66,10 @@ public class SWAnvilInv {
this.callback = callback; this.callback = callback;
} }
public void addLeftCallback(Runnable callback) {
builder.onLeftInputClick(p -> callback.run());
}
public void addCloseCallback(Runnable callback) { public void addCloseCallback(Runnable callback) {
builder.onClose(p -> callback.run()); builder.onClose(p -> callback.run());
} }

Datei anzeigen

@ -28,6 +28,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
public class SWListInv<T> extends SWInventory { public class SWListInv<T> extends SWInventory {
@ -55,8 +56,10 @@ public class SWListInv<T> extends SWInventory {
public void open(){ public void open(){
opened = true; opened = true;
inventory.clear(); inventory.clear();
callbacks.clear(); callbacks.keySet().stream().filter(i -> i >= 0).collect(Collectors.toList()).forEach(callbacks::remove);
if(!callbacks.containsKey(-999)) {
setCallback(-999, (ClickType click) -> player.closeInventory()); setCallback(-999, (ClickType click) -> player.closeInventory());
}
if (sizeBiggerMax()) { if (sizeBiggerMax()) {
if (page != 0) { if (page != 0) {

Datei anzeigen

@ -25,11 +25,13 @@ import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SchematicType; import de.steamwar.sql.SchematicType;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import lombok.*; import lombok.*;
import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer; import java.util.function.Consumer;
public class SchematicSelector { public class SchematicSelector {
@ -249,9 +251,23 @@ public class SchematicSelector {
return new SWListInv.SWListEntry<>(item, node); return new SWListInv.SWListEntry<>(item, node);
} }
private void addLeftCloseAction(SWAnvilInv inv, Runnable runnable) {
AtomicBoolean wasLeft = new AtomicBoolean(false);
inv.addCloseCallback(() -> {
if(injectable.onAnvilInvCloseAction(this) == SchematicSelectorInjectable.AnvilInvCloseAction.REOPEN && !wasLeft.get()) {
player.closeInventory();
Bukkit.getScheduler().runTaskLater(Core.getInstance(), runnable, 1);
}
});
inv.addLeftCallback(() -> {
wasLeft.set(true);
runnable.run();
});
}
private void createFolderIn(SchematicNode parent) { private void createFolderIn(SchematicNode parent) {
SWAnvilInv inv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_CREATE_DIR_TITLE", player)); SWAnvilInv inv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_CREATE_DIR_TITLE", player));
inv.setItem(Material.CHEST); inv.setItem(Material.CHEST, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false);
inv.setCallback(s -> { inv.setCallback(s -> {
if(!SchematicNode.invalidSchemName(new String[] {s})) { if(!SchematicNode.invalidSchemName(new String[] {s})) {
if(injectable.onFolderCreate(this, s)) { if(injectable.onFolderCreate(this, s)) {
@ -262,6 +278,7 @@ public class SchematicSelector {
} }
player.closeInventory(); player.closeInventory();
}); });
addLeftCloseAction(inv, this::reOpen);
inv.open(); inv.open();
} }
@ -273,11 +290,12 @@ public class SchematicSelector {
openFilter(); openFilter();
} else { } else {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_NAME", player)); SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_NAME", player));
swAnvilInv.setItem(Material.NAME_TAG); swAnvilInv.setItem(Material.NAME_TAG, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false);
swAnvilInv.setCallback(s -> { swAnvilInv.setCallback(s -> {
filter.setName(s); filter.setName(s);
openFilter(); openFilter();
}); });
addLeftCloseAction(swAnvilInv, this::openFilter);
swAnvilInv.open(); swAnvilInv.open();
} }
}; };
@ -293,13 +311,14 @@ public class SchematicSelector {
openFilter(); openFilter();
} else { } else {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_OWNER", player)); SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_OWNER", player));
swAnvilInv.setItem(SWItem.getMaterial("SKULL_ITEM"), (byte) 3); swAnvilInv.setItem(SWItem.getMaterial("SKULL_ITEM"), (byte) 3, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false);
swAnvilInv.setCallback(s -> { swAnvilInv.setCallback(s -> {
if(SteamwarUser.get(s) != null) { if(SteamwarUser.get(s) != null) {
filter.setOwner(SteamwarUser.get(s).getId()); filter.setOwner(SteamwarUser.get(s).getId());
} }
openFilter(); openFilter();
}); });
addLeftCloseAction(swAnvilInv, this::openFilter);
swAnvilInv.open(); swAnvilInv.open();
} }
}; };
@ -387,7 +406,7 @@ public class SchematicSelector {
nodes.removeIf(node -> !node.isDir()); nodes.removeIf(node -> !node.isDir());
} }
if(target.target == Target.SCHEMATIC_TYPE) { if(target.target == Target.SCHEMATIC_TYPE) {
nodes.removeIf(node -> node.isDir() || !node.getSchemtype().equals(target.type)); nodes.removeIf(node -> node.isDir() || !node.getSchemtype().equals(target.type) || node.getRank() > target.rank);
} }
return nodes; return nodes;
} }

Datei anzeigen

@ -45,8 +45,15 @@ public interface SchematicSelectorInjectable {
default void onSelectorOpen(SchematicSelector selector, OpenFrom from) {} default void onSelectorOpen(SchematicSelector selector, OpenFrom from) {}
default AnvilInvCloseAction onAnvilInvCloseAction(SchematicSelector selector) {return AnvilInvCloseAction.CLOSE;}
enum OpenFrom { enum OpenFrom {
FRESH, FRESH,
REOPEN REOPEN
} }
enum AnvilInvCloseAction {
CLOSE,
REOPEN
}
} }

Datei anzeigen

@ -0,0 +1,65 @@
/*
* 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.sql;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.sql.SQLException;
@AllArgsConstructor
public class Replay {
private static final Statement get = new Statement("SELECT Replay FROM Replay WHERE FightID = ?");
private static final Statement insert = new Statement("INSERT INTO Replay (FightID, Replay) VALUES (?, ?)");
public static Replay get(int fightID) {
return get.select(rs -> {
rs.next();
File file;
try {
file = File.createTempFile("replay", "replay");
file.deleteOnExit();
Files.copy(rs.getBinaryStream("Replay"), file.toPath());
} catch (IOException e) {
throw new SQLException(e);
}
return new Replay(fightID, file);
}, fightID);
}
public static void save(int fightID, File file) {
try {
insert.update(fightID, new FileInputStream(file));
} catch (FileNotFoundException e) {
throw new SecurityException("Could not save replay", e);
}
}
private final int fightID;
@Getter
private final File replay;
}

Datei anzeigen

@ -0,0 +1,51 @@
/*
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.sql;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import java.io.File;
public class SWException {
private SWException(){}
private static final String serverVersion = Bukkit.getServer().getVersion();
private static final String cwd = System.getProperty("user.dir");
private static final String server = new File(cwd).getName();
public static void init() {
//force class loading
}
public static void log(String message, String stacktrace){
StringBuilder msgBuilder = new StringBuilder(message).append("\nPlayers: ");
for(Player player : Bukkit.getOnlinePlayers())
msgBuilder.append(player.getName()).append(" ");
msgBuilder.append("\nWorlds: ");
for(World world : Bukkit.getWorlds())
msgBuilder.append(world.getName()).append(" ");
msgBuilder.append("\nServer: ").append(serverVersion);
msgBuilder.append("\nCWD: ").append(cwd);
Provider.impl.logException(server, msgBuilder.toString(), stacktrace);
}
}