From 4bdcd9992b731ee85f3faa9a088907a3b08650be Mon Sep 17 00:00:00 2001
From: Michael Smith
Date: Fri, 25 Mar 2022 23:48:40 -0700
Subject: [PATCH 001/112] Fix repository URL
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 7d02c5f..1f0d47c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
vault-repo
- http://nexus.hc.to/content/repositories/pub_releases
+ https://nexus.hc.to/content/repositories/pub_releases
From 12a2d4eb71220798149eab8afdcf172ad7c411e8 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Fri, 24 Mar 2023 15:45:15 -0400
Subject: [PATCH 002/112] Merged temp-legacy's versioning with legacy's
This is now a major version ahead of SGR's legacy.
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 2e1bead..fe13bae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.9.4.3-SNAPSHOT
+ 0.11.5.1-SNAPSHOT
@@ -151,4 +151,4 @@
-
\ No newline at end of file
+
From 1f4aeefad171f7d6cdd181815feef61c4d04d095 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 20:47:31 +0100
Subject: [PATCH 003/112] Bumps version and removes Jenkinsfile
Bumps version to 0.11.5.0-SNAPSHOT for consistency
---
Jenkinsfile | 33 ---------------------------------
pom.xml | 2 +-
2 files changed, 1 insertion(+), 34 deletions(-)
delete mode 100644 Jenkinsfile
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index 2e16cba..0000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,33 +0,0 @@
-pipeline {
- agent any
- tools {
- jdk 'JDK17'
- }
- stages {
- stage('Build') {
- steps {
- echo 'Building...'
- sh 'mvn clean & mvn validate & mvn compile'
- }
- }
- stage('Test') {
- steps {
- echo 'Testing...'
- sh 'mvn test'
- }
- }
- stage('Verify') {
- steps {
- echo 'Verifying...'
- sh 'mvn verify -Dmaven.test.skip=true'
- }
- }
- stage('Deploy') {
- steps {
- echo 'Deploying...'
- sh 'mvn deploy -Dmaven.install.skip=true -Dmaven.test.skip=true'
- archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
- }
- }
- }
-}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 2e1bead..391efae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.9.4.3-SNAPSHOT
+ 0.11.5.0-SNAPSHOT
From b63bd19db09571e2799aaaf540dd5a2724a53f77 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 20:56:34 +0100
Subject: [PATCH 004/112] Sets the Spigot API version to 1.16
---
src/main/resources/plugin.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 283fe85..cfb33f2 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -5,7 +5,7 @@ description: Stargate mod for Bukkit Revived
author: EpicKnarvik97
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]
website: https://git.knarcraft.net/EpicKnarvik97/Stargate
-api-version: 1.18
+api-version: 1.16
softdepend: [ Vault, dynmap ]
commands:
stargate:
From 5a2766c4c6d57cb99e00a213f7a895eb1673837f Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 20:58:18 +0100
Subject: [PATCH 005/112] Updates website URL
---
src/main/resources/plugin.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index cfb33f2..1e31f2d 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -4,7 +4,7 @@ version: '${project.version}'
description: Stargate mod for Bukkit Revived
author: EpicKnarvik97
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]
-website: https://git.knarcraft.net/EpicKnarvik97/Stargate
+website: https://github.com/stargate-rewritten/Stargate-Bukkit/tree/temp-legacy
api-version: 1.16
softdepend: [ Vault, dynmap ]
commands:
From 36f09d5b292925b168e13b4649ff80d9f987860e Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 21:29:13 +0100
Subject: [PATCH 006/112] Updates website URL to a shortcut
---
src/main/resources/plugin.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 1e31f2d..ae8bd28 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -4,7 +4,7 @@ version: '${project.version}'
description: Stargate mod for Bukkit Revived
author: EpicKnarvik97
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]
-website: https://github.com/stargate-rewritten/Stargate-Bukkit/tree/temp-legacy
+website: https://sgrewritten.org/legacygit
api-version: 1.16
softdepend: [ Vault, dynmap ]
commands:
From 79bf2975130e81c159eaef3342df16b11aeaa23c Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 21:47:41 +0100
Subject: [PATCH 007/112] Updates some dependencies
---
pom.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/pom.xml b/pom.xml
index 664cb6b..f4fe2a5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,7 +55,7 @@
org.spigotmc
spigot-api
- 1.19.3-R0.1-SNAPSHOT
+ 1.19.4-R0.1-SNAPSHOT
provided
@@ -67,7 +67,7 @@
org.junit.jupiter
junit-jupiter-api
- 5.9.0
+ 5.9.2
test
@@ -79,7 +79,7 @@
org.jetbrains
annotations
- 23.0.0
+ 24.0.1
provided
@@ -97,7 +97,7 @@
net.knarcraft
knarlib
- 1.0-SNAPSHOT
+ 1.1
compile
From 06271a356ec7cfc39f49a35b4e8d015b66ef4099 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 21:57:06 +0100
Subject: [PATCH 008/112] Updates Vault repository
---
pom.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/pom.xml b/pom.xml
index f4fe2a5..9409e53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,8 +28,8 @@
https://hub.spigotmc.org/nexus/content/groups/public/
- vault-repo
- https://nexus.hc.to/content/repositories/pub_releases
+ jitpack.io
+ https://jitpack.io
dynmap
@@ -59,7 +59,7 @@
provided
- net.milkbowl.vault
+ com.github.MilkBowl
VaultAPI
1.7
provided
From f8cddea1884f4f147e730fc5e4c92cdc76a1b141 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 22:48:37 +0100
Subject: [PATCH 009/112] Adds one missing legacy config conversion
---
src/main/resources/config-migrations.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/resources/config-migrations.txt b/src/main/resources/config-migrations.txt
index cb2628f..cad71cb 100644
--- a/src/main/resources/config-migrations.txt
+++ b/src/main/resources/config-migrations.txt
@@ -2,6 +2,7 @@ lang=language
defaultNetwork=defaultGateNetwork
use-mysql=
ignoreEntrance=
+enableEconomy=economy.useEconomy
portal-save-location=folders.portalFolder
portal-folder=folders.portalFolder
gate-folder=folders.gateFolder
From 454bac6f14763b0ca87f043aeaed2852d0d9603d Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 23:44:17 +0100
Subject: [PATCH 010/112] Implements support for character tags
---
.../portal/property/PortalStructure.java | 2 +-
.../stargate/portal/property/gate/Gate.java | 46 ++++++++++++++++---
.../portal/property/gate/GateHandler.java | 38 ++++++++++-----
.../stargate/utility/GateReader.java | 45 +++++++++++++-----
4 files changed, 100 insertions(+), 31 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java
index c5c2986..2f324d0 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java
@@ -73,7 +73,7 @@ public class PortalStructure {
return true;
}
for (RelativeBlockVector control : gate.getLayout().getControls()) {
- verified = verified && portal.getBlockAt(control).getBlock().getType().equals(gate.getControlBlock());
+ verified = verified && gate.isValidControlBlock(portal.getBlockAt(control).getBlock().getType());
}
this.verified = verified;
return verified;
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
index bfde5e4..0ba8b49 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
@@ -4,6 +4,7 @@ import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.container.BlockLocation;
import net.knarcraft.stargate.container.RelativeBlockVector;
import org.bukkit.Material;
+import org.bukkit.Tag;
import java.io.BufferedWriter;
import java.io.FileWriter;
@@ -21,6 +22,7 @@ public class Gate {
private final String filename;
private final GateLayout layout;
private final Map characterMaterialMap;
+ private final Map> characterTagMap;
//Gate materials
private final Material portalOpenBlock;
private final Material portalClosedBlock;
@@ -37,6 +39,7 @@ public class Gate {
* @param filename The name of the gate file, including extension
* @param layout The gate layout defined in the gate file
* @param characterMaterialMap The material types the different layout characters represent
+ * @param characterTagMap The material tag types the different layout characters represent
* @param portalOpenBlock The material to set the opening to when the portal is open
* @param portalClosedBlock The material to set the opening to when the portal is closed
* @param portalButton The material to use for the portal button
@@ -45,7 +48,8 @@ public class Gate {
* @param destroyCost The cost of destroying a portal with this gate layout (-1 to disable)
* @param toOwner Whether any payment should go to the owner of the gate, as opposed to just disappearing
*/
- public Gate(String filename, GateLayout layout, Map characterMaterialMap, Material portalOpenBlock,
+ public Gate(String filename, GateLayout layout, Map characterMaterialMap,
+ Map> characterTagMap, Material portalOpenBlock,
Material portalClosedBlock, Material portalButton, int useCost, int createCost, int destroyCost,
boolean toOwner) {
this.filename = filename;
@@ -58,6 +62,7 @@ public class Gate {
this.createCost = createCost;
this.destroyCost = destroyCost;
this.toOwner = toOwner;
+ this.characterTagMap = characterTagMap;
}
/**
@@ -78,6 +83,25 @@ public class Gate {
return new HashMap<>(characterMaterialMap);
}
+ /**
+ * Checks whether the given material is valid for control blocks
+ *
+ * @param material The material to check
+ * @return True if the material is valid for control blocks
+ */
+ public boolean isValidControlBlock(Material material) {
+ return (getControlBlock() != null) ? getControlBlock().equals(material) : getControlBlockTag().isTagged(material);
+ }
+
+ /**
+ * Gets the material tag used for this gate's control blocks
+ *
+ * @return The material tag type used for control blocks
+ */
+ public Tag getControlBlockTag() {
+ return characterTagMap.get(GateHandler.getControlBlockCharacter());
+ }
+
/**
* Gets the material type used for this gate's control blocks
*
@@ -195,15 +219,29 @@ public class Gate {
*/
private boolean verifyGateBorderMatches(BlockLocation topLeft, double yaw) {
Map characterMaterialMap = new HashMap<>(this.characterMaterialMap);
+ Map> characterTagMap = new HashMap<>(this.characterTagMap);
for (RelativeBlockVector borderVector : layout.getBorder()) {
int rowIndex = borderVector.getRight();
int lineIndex = borderVector.getDown();
Character key = layout.getLayout()[lineIndex][rowIndex];
Material materialInLayout = characterMaterialMap.get(key);
+ Tag tagInLayout = characterTagMap.get(key);
Material materialAtLocation = topLeft.getRelativeLocation(borderVector, yaw).getType();
- if (materialInLayout == null) {
+ if (materialInLayout != null) {
+ if (materialAtLocation != materialInLayout) {
+ Stargate.debug("Gate::Matches", String.format("Block Type Mismatch: %s != %s",
+ materialAtLocation, materialInLayout));
+ return false;
+ }
+ } else if (tagInLayout != null) {
+ if (!tagInLayout.isTagged(materialAtLocation)) {
+ Stargate.debug("Gate::Matches", String.format("Block Type Mismatch: %s != %s",
+ materialAtLocation, tagInLayout));
+ return false;
+ }
+ } else {
/* This generally should not happen with proper checking, but just in case a material character is not
* recognized, but still allowed in previous checks, verify the gate as long as all such instances of
* the character correspond to the same material in the physical gate. All subsequent gates will also
@@ -211,10 +249,6 @@ public class Gate {
characterMaterialMap.put(key, materialAtLocation);
Stargate.debug("Gate::Matches", String.format("Missing layout material in %s. Using %s from the" +
" physical portal.", getFilename(), materialAtLocation));
- } else if (materialAtLocation != materialInLayout) {
- Stargate.debug("Gate::Matches", String.format("Block Type Mismatch: %s != %s",
- materialAtLocation, materialInLayout));
- return false;
}
}
return true;
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
index 9558175..ba3ddbf 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
@@ -4,6 +4,7 @@ import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.utility.GateReader;
import net.knarcraft.stargate.utility.MaterialHelper;
import org.bukkit.Material;
+import org.bukkit.Tag;
import org.bukkit.block.Block;
import java.io.File;
@@ -34,8 +35,9 @@ public class GateHandler {
private static final Material defaultPortalBlockClosed = Material.AIR;
private static final Material defaultButton = Material.STONE_BUTTON;
- private static final HashMap gates = new HashMap<>();
- private static final HashMap> controlBlocks = new HashMap<>();
+ private static final Map gates = new HashMap<>();
+ private static final Map> controlBlocks = new HashMap<>();
+ private static final Map> controlBlockTags = new HashMap<>();
private GateHandler() {
@@ -86,13 +88,22 @@ public class GateHandler {
private static void registerGate(Gate gate) {
gates.put(gate.getFilename(), gate);
- Material blockID = gate.getControlBlock();
-
- if (!controlBlocks.containsKey(blockID)) {
- controlBlocks.put(blockID, new ArrayList<>());
+ Material blockId = gate.getControlBlock();
+ if (blockId != null) {
+ if (!controlBlocks.containsKey(blockId)) {
+ controlBlocks.put(blockId, new ArrayList<>());
+ } else {
+ controlBlocks.get(blockId).add(gate);
+ }
+ return;
}
- controlBlocks.get(blockID).add(gate);
+ Tag materialTag = gate.getControlBlockTag();
+ if (!controlBlockTags.containsKey(materialTag.getKey().toString())) {
+ controlBlockTags.put(materialTag.getKey().toString(), new ArrayList<>());
+ } else {
+ controlBlockTags.get(materialTag.getKey().toString()).add(gate);
+ }
}
/**
@@ -121,6 +132,7 @@ public class GateHandler {
private static Gate loadGate(String fileName, String parentFolder, Scanner scanner) {
List> design = new ArrayList<>();
Map characterMaterialMap = new HashMap<>();
+ Map> characterTagMap = new HashMap<>();
Map config = new HashMap<>();
Set frameTypes = new HashSet<>();
@@ -130,14 +142,14 @@ public class GateHandler {
characterMaterialMap.put(ANYTHING, Material.AIR);
//Read the file into appropriate lists and maps
- int columns = readGateFile(scanner, characterMaterialMap, fileName, design, frameTypes, config);
+ int columns = readGateFile(scanner, characterMaterialMap, characterTagMap, fileName, design, frameTypes, config);
if (columns < 0) {
return null;
}
Character[][] layout = generateLayoutMatrix(design, columns);
//Create and validate the new gate
- Gate gate = createGate(config, fileName, layout, characterMaterialMap);
+ Gate gate = createGate(config, fileName, layout, characterMaterialMap, characterTagMap);
if (gate == null) {
return null;
}
@@ -154,10 +166,12 @@ public class GateHandler {
* @param fileName The name of the saved gate config file
* @param layout The layout matrix of the new gate
* @param characterMaterialMap A map between layout characters and the material to use
+ * @param materialTagMap A map between layout characters and the material tags to use
* @return A new gate, or null if the config is invalid
*/
private static Gate createGate(Map config, String fileName, Character[][] layout,
- Map characterMaterialMap) {
+ Map characterMaterialMap,
+ Map> materialTagMap) {
//Read relevant material types
Material portalOpenBlock = readGateConfig(config, fileName, "portal-open", defaultPortalBlockOpen);
Material portalClosedBlock = readGateConfig(config, fileName, "portal-closed", defaultPortalBlockClosed);
@@ -171,8 +185,8 @@ public class GateHandler {
Stargate.getEconomyConfig().sendPaymentToOwner());
//Create the new gate
- Gate gate = new Gate(fileName, new GateLayout(layout), characterMaterialMap, portalOpenBlock, portalClosedBlock,
- portalButton, useCost, createCost, destroyCost, toOwner);
+ Gate gate = new Gate(fileName, new GateLayout(layout), characterMaterialMap, materialTagMap, portalOpenBlock,
+ portalClosedBlock, portalButton, useCost, createCost, destroyCost, toOwner);
if (!validateGate(gate, fileName)) {
return null;
diff --git a/src/main/java/net/knarcraft/stargate/utility/GateReader.java b/src/main/java/net/knarcraft/stargate/utility/GateReader.java
index 0334019..ed2120f 100644
--- a/src/main/java/net/knarcraft/stargate/utility/GateReader.java
+++ b/src/main/java/net/knarcraft/stargate/utility/GateReader.java
@@ -1,7 +1,10 @@
package net.knarcraft.stargate.utility;
import net.knarcraft.stargate.Stargate;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
+import org.bukkit.Tag;
import java.util.ArrayList;
import java.util.List;
@@ -23,13 +26,15 @@ public final class GateReader {
*
* @param scanner The scanner to read from
* @param characterMaterialMap The map of characters to store valid symbols in
+ * @param materialTagMap The map of characters to store valid tag symbols in
* @param fileName The filename of the loaded gate config file
* @param design The list to store the loaded design/layout to
* @param frameTypes The set to store frame/border materials to
* @param config The map of config values to store to
* @return The column count/width of the loaded gate
*/
- public static int readGateFile(Scanner scanner, Map characterMaterialMap, String fileName,
+ public static int readGateFile(Scanner scanner, Map characterMaterialMap,
+ Map> materialTagMap, String fileName,
List> design, Set frameTypes, Map config) {
boolean designing = false;
int columns = 0;
@@ -39,14 +44,14 @@ public final class GateReader {
if (designing) {
//If we have reached the gate's layout/design, read it
- columns = readGateDesignLine(line, columns, characterMaterialMap, fileName, design);
+ columns = readGateDesignLine(line, columns, characterMaterialMap, materialTagMap, fileName, design);
if (columns < 0) {
return -1;
}
} else {
if (!line.isEmpty() && !line.startsWith("#")) {
//Read a normal config value
- readGateConfigValue(line, characterMaterialMap, frameTypes, config);
+ readGateConfigValue(line, characterMaterialMap, materialTagMap, frameTypes, config);
} else if ((line.isEmpty()) || (!line.contains("=") && !line.startsWith("#"))) {
//An empty line marks the start of the gate's layout/design
designing = true;
@@ -73,11 +78,13 @@ public final class GateReader {
* @param line The line to read
* @param maxColumns The current max columns value of the design
* @param characterMaterialMap The map between characters and the corresponding materials to use
+ * @param materialTagMap The map between characters and the corresponding material tags to use
* @param fileName The filename of the loaded gate config file
* @param design The two-dimensional list to store the loaded design to
* @return The new max columns value of the design
*/
private static int readGateDesignLine(String line, int maxColumns, Map characterMaterialMap,
+ Map> materialTagMap,
String fileName, List> design) {
List row = new ArrayList<>();
@@ -88,7 +95,7 @@ public final class GateReader {
for (Character symbol : line.toCharArray()) {
//Refuse read gate designs with unknown characters
- if (symbol.equals('?') || (!characterMaterialMap.containsKey(symbol))) {
+ if (symbol.equals('?') || (!characterMaterialMap.containsKey(symbol) && !materialTagMap.containsKey(symbol))) {
Stargate.logSevere(String.format("Could not load Gate %s - Unknown symbol '%s' in diagram", fileName,
symbol));
return -1;
@@ -107,12 +114,14 @@ public final class GateReader {
*
* @param line The line to read
* @param characterMaterialMap The character to material map to store to
+ * @param materialTagMap The character to material tag map to store to
* @param frameTypes The set to store gate frame/border types to
* @param config The config value map to store to
* @throws Exception If an invalid material is encountered
*/
private static void readGateConfigValue(String line, Map characterMaterialMap,
- Set frameTypes, Map config) throws Exception {
+ Map> materialTagMap, Set frameTypes,
+ Map config) throws Exception {
String[] split = line.split("=");
String key = split[0].trim();
String value = split[1].trim();
@@ -120,14 +129,26 @@ public final class GateReader {
if (key.length() == 1) {
//Read a gate frame material
Character symbol = key.charAt(0);
- Material material = Material.getMaterial(value);
- if (material == null) {
- throw new Exception("Invalid material in line: " + line);
+
+ if (value.startsWith("#")) {
+ String tagString = value.replaceFirst("#", "");
+ Tag tag = Bukkit.getTag(Tag.REGISTRY_BLOCKS, NamespacedKey.minecraft(tagString.toLowerCase()),
+ Material.class);
+ if (tag != null) {
+ materialTagMap.put(symbol, tag);
+ return;
+ }
+ } else {
+ Material material = Material.getMaterial(value);
+ if (material != null) {
+ //Register the map between the read symbol and the corresponding material
+ characterMaterialMap.put(symbol, material);
+ //Save the material as one of the frame materials used for this kind of gate
+ frameTypes.add(material);
+ return;
+ }
}
- //Register the map between the read symbol and the corresponding material
- characterMaterialMap.put(symbol, material);
- //Save the material as one of the frame materials used for this kind of gate
- frameTypes.add(material);
+ throw new Exception("Invalid material in line: " + line);
} else {
//Read a normal config value
config.put(key, value);
From 10a16000c65c558d039671a30476ddb43e2ea9cd Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 23:46:21 +0100
Subject: [PATCH 011/112] Removes unused frameTypes variable
---
.../stargate/portal/property/gate/GateHandler.java | 5 +----
.../net/knarcraft/stargate/utility/GateReader.java | 11 +++--------
2 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
index ba3ddbf..438346e 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
@@ -11,11 +11,9 @@ import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
-import java.util.Set;
import static net.knarcraft.stargate.utility.GateReader.generateLayoutMatrix;
import static net.knarcraft.stargate.utility.GateReader.readGateConfig;
@@ -134,7 +132,6 @@ public class GateHandler {
Map characterMaterialMap = new HashMap<>();
Map> characterTagMap = new HashMap<>();
Map config = new HashMap<>();
- Set frameTypes = new HashSet<>();
//Initialize character to material map
characterMaterialMap.put(ENTRANCE, Material.AIR);
@@ -142,7 +139,7 @@ public class GateHandler {
characterMaterialMap.put(ANYTHING, Material.AIR);
//Read the file into appropriate lists and maps
- int columns = readGateFile(scanner, characterMaterialMap, characterTagMap, fileName, design, frameTypes, config);
+ int columns = readGateFile(scanner, characterMaterialMap, characterTagMap, fileName, design, config);
if (columns < 0) {
return null;
}
diff --git a/src/main/java/net/knarcraft/stargate/utility/GateReader.java b/src/main/java/net/knarcraft/stargate/utility/GateReader.java
index ed2120f..de5901f 100644
--- a/src/main/java/net/knarcraft/stargate/utility/GateReader.java
+++ b/src/main/java/net/knarcraft/stargate/utility/GateReader.java
@@ -10,7 +10,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
-import java.util.Set;
/**
* Helper class for reading gate files
@@ -29,13 +28,12 @@ public final class GateReader {
* @param materialTagMap The map of characters to store valid tag symbols in
* @param fileName The filename of the loaded gate config file
* @param design The list to store the loaded design/layout to
- * @param frameTypes The set to store frame/border materials to
* @param config The map of config values to store to
* @return The column count/width of the loaded gate
*/
public static int readGateFile(Scanner scanner, Map characterMaterialMap,
Map> materialTagMap, String fileName,
- List> design, Set frameTypes, Map config) {
+ List> design, Map config) {
boolean designing = false;
int columns = 0;
try {
@@ -51,7 +49,7 @@ public final class GateReader {
} else {
if (!line.isEmpty() && !line.startsWith("#")) {
//Read a normal config value
- readGateConfigValue(line, characterMaterialMap, materialTagMap, frameTypes, config);
+ readGateConfigValue(line, characterMaterialMap, materialTagMap, config);
} else if ((line.isEmpty()) || (!line.contains("=") && !line.startsWith("#"))) {
//An empty line marks the start of the gate's layout/design
designing = true;
@@ -115,12 +113,11 @@ public final class GateReader {
* @param line The line to read
* @param characterMaterialMap The character to material map to store to
* @param materialTagMap The character to material tag map to store to
- * @param frameTypes The set to store gate frame/border types to
* @param config The config value map to store to
* @throws Exception If an invalid material is encountered
*/
private static void readGateConfigValue(String line, Map characterMaterialMap,
- Map> materialTagMap, Set frameTypes,
+ Map> materialTagMap,
Map config) throws Exception {
String[] split = line.split("=");
String key = split[0].trim();
@@ -143,8 +140,6 @@ public final class GateReader {
if (material != null) {
//Register the map between the read symbol and the corresponding material
characterMaterialMap.put(symbol, material);
- //Save the material as one of the frame materials used for this kind of gate
- frameTypes.add(material);
return;
}
}
From 91d855312dd08cc49a7bfa778af83480b74dba3d Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 24 Mar 2023 23:52:18 +0100
Subject: [PATCH 012/112] Changes the E flag to a V flag for rewrite
consistency
---
README.md | 2 +-
.../net/knarcraft/stargate/portal/property/PortalOption.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 5d4f412..b99aa73 100644
--- a/README.md
+++ b/README.md
@@ -142,7 +142,7 @@ section). See the Custom Gate Layout section to learn how to add custom gates.
player enters. (Implicitly always on)
- 'U' is for a gate connecting to another through bungee (Implicitly always on)
- 'I' is for a silent gate, which does not output anything to the chat while teleporting. Increases immersion
- - 'E' is for a gate without a sign. Only for fixed stargates
+ - 'V' is for invisible gates, i.e. a gate without a sign. Only for fixed stargates
The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'. The
&\[0-9a-f] color codes are not counted in the character limit, thus allowing a 13-character name with an additional 2
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java
index 9b4cce3..ffc02b6 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java
@@ -58,7 +58,7 @@ public enum PortalOption {
/**
* This option causes a fixed portal's sign to be removed after creation
*/
- NO_SIGN('e', "stargate.option.nosign", 22);
+ NO_SIGN('v', "stargate.option.nosign", 22);
private final char characterRepresentation;
private final String permissionString;
From c1720e05a0329e5ff0f69b59cd0c6231ed448f91 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 25 Mar 2023 01:54:43 +0100
Subject: [PATCH 013/112] Adds a wool gate amongst other things
Adds the wool gate type from legacy
Adds some missing material tag-related code
Updates the URL for update checking
---
.../java/net/knarcraft/stargate/Stargate.java | 2 +-
.../stargate/portal/property/gate/Gate.java | 44 ++++++++++++-------
.../portal/property/gate/GateHandler.java | 33 +++++++++-----
src/main/resources/gates/wool.gate | 12 +++++
4 files changed, 65 insertions(+), 26 deletions(-)
create mode 100644 src/main/resources/gates/wool.gate
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 2cb40b1..7e8f62c 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -365,7 +365,7 @@ public class Stargate extends JavaPlugin {
this.registerCommands();
//Check for any available updates
- UpdateChecker.checkForUpdate(this, "https://api.spigotmc.org/legacy/update.php?resource=97784",
+ UpdateChecker.checkForUpdate(this, "https://api.spigotmc.org/legacy/update.php?resource=87978",
Stargate::getPluginVersion, Stargate::setUpdateAvailable);
}
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
index 0ba8b49..563a93f 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
@@ -301,7 +301,7 @@ public class Gate {
saveEconomyValues(bufferedWriter);
//Store material types to use for frame blocks
- saveFrameBlockTypes(bufferedWriter);
+ saveFrameBlockType(bufferedWriter);
bufferedWriter.newLine();
@@ -342,24 +342,38 @@ public class Gate {
* @param bufferedWriter The buffered writer to write to
* @throws IOException If unable to write to the buffered writer
*/
- private void saveFrameBlockTypes(BufferedWriter bufferedWriter) throws IOException {
- for (Map.Entry entry : characterMaterialMap.entrySet()) {
- Character type = entry.getKey();
- Material value = entry.getValue();
+ private void saveFrameBlockType(BufferedWriter bufferedWriter) throws IOException {
+ for (Map.Entry entry : this.characterMaterialMap.entrySet()) {
+ Character key = entry.getKey();
//Skip characters not part of the frame
- if (type.equals(GateHandler.getAnythingCharacter()) ||
- type.equals(GateHandler.getEntranceCharacter()) ||
- type.equals(GateHandler.getExitCharacter())) {
+ if (key.equals(GateHandler.getAnythingCharacter()) ||
+ key.equals(GateHandler.getEntranceCharacter()) ||
+ key.equals(GateHandler.getExitCharacter())) {
continue;
}
-
- bufferedWriter.append(type);
- bufferedWriter.append('=');
- if (value != null) {
- bufferedWriter.append(value.toString());
- }
- bufferedWriter.newLine();
+ saveFrameBlockType(key, entry.getValue().toString(), bufferedWriter);
}
+ for (Map.Entry> entry : this.characterTagMap.entrySet()) {
+ saveFrameBlockType(entry.getKey(), "#" + entry.getValue().getKey().toString().replaceFirst(
+ "minecraft:", ""), bufferedWriter);
+ }
+ }
+
+ /**
+ * Saves a type of block used for the gate frame/border using a buffered writer
+ *
+ * @param key The character key to store
+ * @param value The string value to store
+ * @param bufferedWriter The buffered writer to write to
+ * @throws IOException If unable to write to the buffered writer
+ */
+ private void saveFrameBlockType(Character key, String value, BufferedWriter bufferedWriter) throws IOException {
+ bufferedWriter.append(key.toString());
+ bufferedWriter.append('=');
+ if (value != null) {
+ bufferedWriter.append(value);
+ }
+ bufferedWriter.newLine();
}
/**
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
index 438346e..aca723a 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
@@ -3,7 +3,9 @@ package net.knarcraft.stargate.portal.property.gate;
import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.utility.GateReader;
import net.knarcraft.stargate.utility.MaterialHelper;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
import org.bukkit.Tag;
import org.bukkit.block.Block;
@@ -90,18 +92,16 @@ public class GateHandler {
if (blockId != null) {
if (!controlBlocks.containsKey(blockId)) {
controlBlocks.put(blockId, new ArrayList<>());
- } else {
- controlBlocks.get(blockId).add(gate);
}
+ controlBlocks.get(blockId).add(gate);
return;
}
Tag materialTag = gate.getControlBlockTag();
if (!controlBlockTags.containsKey(materialTag.getKey().toString())) {
controlBlockTags.put(materialTag.getKey().toString(), new ArrayList<>());
- } else {
- controlBlockTags.get(materialTag.getKey().toString()).add(gate);
}
+ controlBlockTags.get(materialTag.getKey().toString()).add(gate);
}
/**
@@ -274,6 +274,7 @@ public class GateHandler {
loadGateFromJar("watergate.gate", gateFolder);
loadGateFromJar("endgate.gate", gateFolder);
loadGateFromJar("squarenetherglowstonegate.gate", gateFolder);
+ loadGateFromJar("wool.gate", gateFolder);
}
/**
@@ -318,14 +319,25 @@ public class GateHandler {
* @return A list of gates using the given material for control block
*/
public static Gate[] getGatesByControlBlock(Material type) {
- Gate[] result = new Gate[0];
- List lookup = controlBlocks.get(type);
-
- if (lookup != null) {
- result = lookup.toArray(result);
+ List result = new ArrayList<>();
+ List fromId = controlBlocks.get(type);
+ List fromTag = null;
+ for (String tagString : controlBlockTags.keySet()) {
+ Tag tag = Bukkit.getTag(Tag.REGISTRY_BLOCKS, NamespacedKey.minecraft(tagString.replaceFirst(
+ "minecraft:", "")), Material.class);
+ if (tag != null && tag.isTagged(type)) {
+ fromTag = controlBlockTags.get(tag.getKey().toString());
+ }
}
- return result;
+ if (fromId != null) {
+ result.addAll(fromId);
+ }
+ if (fromTag != null) {
+ result.addAll(fromTag);
+ }
+
+ return result.toArray(new Gate[0]);
}
/**
@@ -353,6 +365,7 @@ public class GateHandler {
public static void clearGates() {
gates.clear();
controlBlocks.clear();
+ controlBlockTags.clear();
}
}
diff --git a/src/main/resources/gates/wool.gate b/src/main/resources/gates/wool.gate
new file mode 100644
index 0000000..c7d53e1
--- /dev/null
+++ b/src/main/resources/gates/wool.gate
@@ -0,0 +1,12 @@
+portal-open=WATER
+portal-closed=AIR
+button=STONE_BUTTON
+toowner=false
+X=#WOOL
+-=#WOOL
+
+XXXXX
+X...X
+-...-
+X.*.X
+XXXXX
\ No newline at end of file
From 472aeda2f84498bd585994a0014d50ffe398db42 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 25 Mar 2023 02:18:05 +0100
Subject: [PATCH 014/112] Implements BStats statistics
---
pom.xml | 6 +++
.../java/net/knarcraft/stargate/Stargate.java | 3 ++
.../stargate/utility/BStatsHelper.java | 54 +++++++++++++++++++
3 files changed, 63 insertions(+)
create mode 100644 src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java
diff --git a/pom.xml b/pom.xml
index 9409e53..a5f163d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,6 +100,12 @@
1.1
compile
+
+ org.bstats
+ bstats-bukkit
+ 3.0.1
+ compile
+
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 7e8f62c..53ca704 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -23,6 +23,7 @@ import net.knarcraft.stargate.portal.PortalRegistry;
import net.knarcraft.stargate.thread.BlockChangeThread;
import net.knarcraft.stargate.thread.ChunkUnloadThread;
import net.knarcraft.stargate.thread.StarGateThread;
+import net.knarcraft.stargate.utility.BStatsHelper;
import org.bukkit.Server;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration;
@@ -367,6 +368,8 @@ public class Stargate extends JavaPlugin {
//Check for any available updates
UpdateChecker.checkForUpdate(this, "https://api.spigotmc.org/legacy/update.php?resource=87978",
Stargate::getPluginVersion, Stargate::setUpdateAvailable);
+
+ BStatsHelper.initialize(this);
}
/**
diff --git a/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java b/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java
new file mode 100644
index 0000000..1372507
--- /dev/null
+++ b/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java
@@ -0,0 +1,54 @@
+package net.knarcraft.stargate.utility;
+
+import net.knarcraft.stargate.Stargate;
+import net.knarcraft.stargate.config.ConfigOption;
+import net.knarcraft.stargate.portal.PortalHandler;
+import net.knarcraft.stargate.portal.property.gate.GateHandler;
+import org.bstats.bukkit.Metrics;
+import org.bstats.charts.SimplePie;
+import org.bstats.charts.SingleLineChart;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A helper for dealing with BStats
+ */
+public final class BStatsHelper {
+
+ private static boolean hasBeenInitialized = false;
+
+ private BStatsHelper() {
+
+ }
+
+ /**
+ * Initializes BStats
+ *
+ * @param plugin The plugin to initialize BStats for
+ */
+ public static void initialize(JavaPlugin plugin) {
+ if (hasBeenInitialized) {
+ throw new IllegalArgumentException("BStats initialized twice");
+ } else {
+ hasBeenInitialized = true;
+ }
+
+ int pluginId = 10451;
+ Metrics metrics = new Metrics(plugin, pluginId);
+
+ Map configValues = Stargate.getStargateConfig().getConfigOptions();
+ Map> portalNetworks = PortalHandler.getAllPortalNetworks();
+ int totalPortals = 0;
+ for (List portals : portalNetworks.values()) {
+ totalPortals += portals.size();
+ }
+
+ metrics.addCustomChart(new SimplePie("language", () -> (String) configValues.get(ConfigOption.LANGUAGE)));
+ metrics.addCustomChart(new SimplePie("gateformats", () -> String.valueOf(GateHandler.getGateCount())));
+ int finalTotalPortals = totalPortals;
+ metrics.addCustomChart(new SingleLineChart("gatesv3", () -> finalTotalPortals));
+ }
+
+}
From a20a1c2f008120a2494bd5e72c298ec4b135db42 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 25 Mar 2023 02:18:28 +0100
Subject: [PATCH 015/112] Renames the I-flag to the Q-flag
---
README.md | 2 +-
.../net/knarcraft/stargate/portal/property/PortalOption.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index b99aa73..9dce552 100644
--- a/README.md
+++ b/README.md
@@ -141,7 +141,7 @@ section). See the Custom Gate Layout section to learn how to add custom gates.
- 'R' is for random gates. These follow standard permissions of gates, but have a random exit location every time a
player enters. (Implicitly always on)
- 'U' is for a gate connecting to another through bungee (Implicitly always on)
- - 'I' is for a silent gate, which does not output anything to the chat while teleporting. Increases immersion
+ - 'Q' is for a quiet gate, which does not output anything to the chat while teleporting. Increases immersion
- 'V' is for invisible gates, i.e. a gate without a sign. Only for fixed stargates
The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'. The
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java
index ffc02b6..f7ba015 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java
@@ -53,7 +53,7 @@ public enum PortalOption {
/**
* This option allows a portal which does not display a teleportation message, for better immersion
*/
- SILENT('i', "stargate.option.silent", 21),
+ SILENT('q', "stargate.option.silent", 21),
/**
* This option causes a fixed portal's sign to be removed after creation
From 3834ef04d444d38f59f88a6df64fb14dfa274970 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:45:55 -0400
Subject: [PATCH 016/112] Updated the readme to reflect the merger.
---
README.md | 563 ++++++++++++++++++++++++++++++------------------------
1 file changed, 310 insertions(+), 253 deletions(-)
diff --git a/README.md b/README.md
index 9dce552..c7b8b32 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,20 @@
-# Description
-Create gates that allow for instant-teleportation between large distances. Gates can be always-open or triggered; they
-can share a network or be split into clusters; they can be hidden on a network or accessible to everybody.
+> **Documentation may be found** [here](https://sgrewritten.org/legacywiki)
+> **Support is available via** [discord](https://discord.gg/mTaHuK6BVa)**.**
+
+> **THIS IS A LEGACY-BASED BRANCH: IT IS SUPPORTED, BUT NOT ACTIVELY UPDATED**
+> This branch expands upon Drakia's original 2013 codebase, with fixes as needed.
+> In the near future, this branch will be superseded by [SGR](https://github.com/stargate-rewritten/Stargate-Bukkit) (a complete rewrite).
+
+# Description
+The Original, and still the best, MineCraft transportation solution!
Intuitively and organically facilitates instant transportation across large distances!
+Highly capable, simple to use, with robust network capabilities and extensive customisability!
+
- **Player permissions** -- let players build their own networks.
- **Vault economy support** -- can add costs for create, destroy and use.
-- **Ability to create custom gate configurations**. Four different default gate configurations are available.
+- **Ability to create custom gate configurations**. -- Four different default gate configurations are available.
+- **Ability to include #Tags in gate designs**. (Ability to include material lists as valid options within a format)
- **Message customization**
- **Multiple built-in languages** (de, en, es, fr, hu, it, ja, nb-no, nl, nn-no, pt-br, ru, zh_cn)
- **Teleport across worlds or servers** (BungeeCord supported)
@@ -18,38 +27,43 @@ can share a network or be split into clusters; they can be hidden on a network o
- **Color customization** -- Stargate signs can be colored in many ways. Colors can be set globally, or on a per sign
type basis
- **RGB and dye support** -- Signs can use RGB colors (using hex codes) as their main and highlighting colors, and can
- also be dyed on a per-sign basis
+ also be dyed on a per-sign basis.
## Background
-
-This was originally TheDgtl's Bukkit port of the Stargate plugin for hMod by Dinnerbone. This is a fork
-of [PseudoKnight's fork](https://github.com/PseudoKnight/Stargate-Bukkit). This fork's main purpose is to create a clean
-version of Stargate compliant with Spigot 1.17, even if it means changing the entire project's previous structure.
+- This plugin was originally TheDgtl's Bukkit port of the Stargate plugin for hMod by Dinnerbone.
+- After this plugin was dropped by TheDgtl, PseudoKnight began maintaining it for modern versions of Spigot (adding support for UUIDs & Material Strings).
+- EpicKnarvik97 forked that version to clean up the code, added leash support, and improved vehicle support.
+- LockedCraft and LittleBigBug also forked that version to add underwater and tag support, as well as a few bug fixes.
+- This version is a combination of all the forks above, maintained by the Stargate Rewritten project.
+- This branch is currently in a maintenance-only mode; a total rewrite is forthcoming.
## License
+Stargate is licensed under the GNU Lesser General Public License Version 3.0.
This includes every source and resource
+file; see the LICENSE file for more information.
-Stargate is licensed under the GNU Lesser General Public License Version 3.0. This includes every source and resource
-file. See the HEADER file for a more detailed license description.
## Migration
+This plugin should be fully compatible all known versions StarGate forks, with the following exceptions:
+- Any version from outside of the bukkit ecosystem
+- Any version of SGR (version numbers 1.0.0.0+)
+- Any configurations with outdated material names (i.e. numIDs)
-This plugin should be compatible with configurations from the Stargate plugin all the way back. The nethergate.gate
-file, the endgate.gate file and the watergate.gate file will be overwritten if they exist. Take a backup of the files
-and overwrite the files after the first startup if you want to keep your custom gates.
+**Note that this plugin's default gate files** __**AND ANY PRESENT CUSTOM .GATEs**__ **will be overwritten by the import!**
+If you wish to keep any such files, take a backup of your "gates" folder!
-If you have legacy gate files using the old numeric material ids, you need to change them to the new format manually.
-Use F3 + H to see material ids. Use them exactly as written after "minecraft:". The configuration will be updated to a
-more easily readable format, but the old configuration will be saved in case you want to change back right away.
+Legacy gate files filled with outdated material IDs will need to be manually updated.
+A list of old materials and their conversions may be found [here](https://github.com/CryptoMorin/XSeries/blob/master/src/main/java/com/cryptomorin/xseries/XMaterial.java).
+A list of modern, valid, material names may be found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
-Permissions have had a few changes, so you should check the permissions section for any differences since you set up
-permissions.
+
+Permissions have had a few changes, so you should check the permissions section for any differences since you set up permissions.
Payment to owner using Economy, through Vault, is only possible if the portal owner in the portal database is defined by
a UUID, and not a username. A player name will be upgraded to a UUID when the player with the given name joins the
server.
-# Permissions
+# Permissions
```
stargate.use -- Allow use of all Stargates linking to any world in any network (Override ALL network/world permissions. Set to false to use network/world specific permissions)
stargate.world -- Allow use of Stargates linking to any world
@@ -78,7 +92,7 @@ stargate.create -- Allow creating Stargates on any network (Override all create
stargate.create.gate -- Allow creation using any gate layout
stargate.create.gate.{gatefile} -- Allow creation using only {gatefile} gates
-stargate.destroy -- Allow destruction of Stargates on any network (Orderride all destroy permissions)
+stargate.destroy -- Allow destruction of Stargates on any network (Overrides all destroy permissions)
stargate.destroy.personal -- Allow destruction of Stargates owned by the player only
stargate.destroy.network -- Allow destruction of Stargates on any network
stargate.destroy.network.{networkname} -- Allow destruction of Stargates on network {networkname}. Set to false to disallow destruction of {networkname}
@@ -90,15 +104,13 @@ stargate.free -- Allow free use/creation/destruction of Stargates
stargate.admin -- Allow all admin features (Hidden/Private bypass, BungeeCord, Reload, Config)
stargate.admin.private -- Allow use of Private gates not owned by user
- stargate.admin.hidden -- Allow access to Hidden gates not ownerd by user
+ stargate.admin.hidden -- Allow access to Hidden gates not owned by the user
stargate.admin.bungee -- Allow the creation of BungeeCord stargates (U option)
stargate.admin.reload -- Allow use of the reload command
stargate.admin.config -- Allows the player to change config values from the chat
stargate.admin.dye -- Allows this player to change the dye of any stargate's sign
```
-
## Default Permissions
-
```
stargate.use -- Everyone
stargate.create -- Op
@@ -108,82 +120,81 @@ stargate.free -- Op
stargate.admin -- Op
```
+
# Instructions
-
## Building a gate:
-
-There are currently three default gate configurations. They all use the same structure as a standard nether portal. One
-gate is using obsidian blocks, one is using end bricks and the last uses sea lanterns. Only the sea lantern one can be
-used underwater. You must put a sign on one of the blocks in the middle of the layout to activate the portal (see next
-section). See the Custom Gate Layout section to learn how to add custom gates.
-
+This a default gate configuration. See the Custom Gate Layout section for more options, and how to redesign this.
```
OO
- O O - These are Obsidian blocks, End bricks or Sea Lanterns. You need 10.
- O O - Place a sign on either of these two middle blocks.
+ O O - These are Obsidian blocks (use Sea Lanterns if underwater). You need 10.
+ ■ ■ - Place a sign on either of these two blocks.
O O
OO
```
### Sign Layout:
-- Line 1: Gate Name (Max 13 characters)
-- Line 2: Destination Name \[Optional] (Max 13 characters, used for fixed-gates only)
-- Line 3: Network name \[Optional] (Max 13 characters)
-- Line 4: Options \[Optional] :
- - 'A' for always-on fixed gate
- - 'H' for hidden networked gate
- - 'P' for a private gate
- - 'F' for a free gate
- - 'B' is for a backwards facing gate (You will exit the back)
- - 'S' is for showing an always-on gate in the network list
- - 'N' is for hiding the network name
- - 'R' is for random gates. These follow standard permissions of gates, but have a random exit location every time a
- player enters. (Implicitly always on)
- - 'U' is for a gate connecting to another through bungee (Implicitly always on)
- - 'Q' is for a quiet gate, which does not output anything to the chat while teleporting. Increases immersion
- - 'V' is for invisible gates, i.e. a gate without a sign. Only for fixed stargates
+- Line 1: Gate Name (Max 12 characters)
+- Line 2: Destination Name [Optional] (Max 12 characters, used for fixed-gates only)
+- Line 3: Network name [Optional] (Max 12 characters)
+- Line 4: Options [Optional] :
+ - `A` is for an **A**lways-on fixed gate
+ - `H` is for a **H**idden networked gate
+ - `P` is for a **P**rivate gate
+ - `F` is for a **F**ree gate
+ - `B` is for a **B**ackwards facing gate (which exit you at the back)
+ - `S` is for **S**howing an always-on gate in the network list
+ - `N` is for a **N**o network gate (the network name is hidden from the sign)
+ - `R` is for a **R**andom gate (implicitly always on; sends players to a random exit)
+ - `U` is for a b**U**ngee gate (connecting to another servers via bungeecord)
+ - `Q` is for a **Q**uiet gate (it will not output anything to chat when teleporting)
+ - `V` is for an in**V**isible gate (it will appear without a sign)
-The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'. The
-&\[0-9a-f] color codes are not counted in the character limit, thus allowing a 13-character name with an additional 2
-characters used for the color code.
+
+The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'.
#### Gate networks:
-
-- Gates are all part of a network, by default this is "central".
-- You can specify (and create) your own network on the third line of the sign when making a new gate.
-- Gates on one network will not see gates on the second network, and vice versa.
-- Gates on different worlds, but in the same network, will see each other.
-- If the gate is a bungee gate, the network name should be the name of the server as displayed when typing /servers
+ - Gates are all part of a network, by default this is "central".
+ - You can specify (and create) your own network on the third line of the sign when making a new gate.
+ - Gates on one network will not see gates on the second network, and vice versa.
+ - Gates on different worlds, but in the same network, will see each other.
+ - Notwithstanding the above, the network for bUngee gates will always be name of its destination /server
#### Fixed gates:
-
-- Fixed gates go to only one set destination.
-- Fixed gates can be linked to other fixed gates, or normal gates. A normal gate cannot open a portal to a fixed gate,
- however.
-- To create a fixed gate, specify a destination on the second line of the stargate sign.
-- Set the 4th line of the stargate sign to "A" to enable an always-open fixed gate.
-- A bungee gate is always automatically a fixed gate
-
+ - Fixed gates go to only one set destination.
+ - Fixed gates can be linked to other fixed gates, or normal gates. A normal gate cannot open a portal to a fixed gate however.
+ - To create a fixed gate, specify a destination on the second line of the stargate sign.
+ - Set the 4th line of the stargate sign to `A` to enable an always-open fixed gate.
+ - Gates with the U or R flags are fixed gates by definition.
+
#### Hidden Gates:
+ - Hidden gates are like normal gates, but only show on the destination list of other gates under certain conditions.
+ - A hidden gate is only visible to the creator of the gate or somebody with the stargate.hidden permission.
+ - Set the 4th line of the stargate sign to `H` to make it a hidden gate.
+
+ #### Force Shown Gates:
+ - Gates with the `A`, `R`, or `U` gates do not show up on networks by default.
+ - To force such gates to show up on network lists, add the `S` flag to the sign's 4th line.
-- Hidden gates are like normal gates, but only show on the destination list of other gates under certain conditions.
-- A hidden gate is only visible to the creator of the gate, or somebody with the stargate.hidden permission.
-- Set the 4th line of the stargate sign to 'H' to make it a hidden gate.
+#### Random Gates:
+ - Random gates are similar to Always-On gates, but do not have a fixed exit;
+ - They instead randomly select an exit from the list of gates on their network.
+ - Marking a gate as 'R' will automatically make that gate always-on.
+ - 'R' gates ignore any gate with the 'R', 'A', and/or 'S' flag(s) when choosing their exit.
## Using a gate:
+ - Right click the sign to choose a destination (not needed for Fixed gates, undefined gates).
+ - Right click the activator to open up a portal.
+ - Step through.
+
+## Custom Gate Layouts
-- Right-click the sign to choose a destination.
-- Right-click the button to open up a portal.
-- Step through.
+You may create as many gate formats as you wish through the use of .gate files within your `gates` folder.
-# Custom Gate Layout
+The .gate file follows a specific format, with config lines at the top, and the gate layout/design below it.
+For example, take the default nether.gate file shown below:
-You can create as many gate formats as you want, the gate layouts are stored in `plugins/Stargate/gates/`.
-The .gate file must be laid out a specific way, the first lines will be config information, and after a blank line you
-will lay out the gate format. Here is the default nethergate.gate file:
-
-```
+```properties
portal-open=NETHER_PORTAL
portal-closed=AIR
button=STONE_BUTTON
@@ -201,34 +212,20 @@ X*.X
XX
```
-The keys `portal-open` and `portal-closed` are used to define the material in the gate when it is open or closed. The
-material for `portal-closed` can be most things, including solid blocks. Some materials may act weirdly though. The
-material for `portal-open` can be any block the player can partially enter, even things like `GLOW_LICHEN`.
-`NETHER_PORTAL`, `END_GATEWAY` and `END_PORTAL` all work.
+### Keys
+#### Materials
+> Note that MATERIAL NAMES (such as `OBSIDIAN`) can be found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
+As of version 0.10.7.0, TAGS (such as `#WOOL`) can be found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Tag.html).
-The `usecost`, `createcost` and `destroycost` keys can be used to set an economy price for gates of this type, different
-from the cost defined in the config. With economy enabled, all gates without these values set will use the values from
-the config. If you want to have different costs for different portals, you must create different gate types and set
-different costs for each one. The `toowner` key can be used to set whether funds withdrawn for using portals with this
-gate type should go to the portal's owner.
-The key `button` is used to define the type of button that is generated for this gate. It can be a button (of any type),
-a type of wall coral (dead or alive), a type of shulker box or a chest.
+- `portal-open` and `portal-closed` are used to specify the [materials](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html) the portal's iris will use when active/inactive respectively.
+ - Note that portal-open should be a *traversable* material, such as those listed [here](https://sgrewritten.org/traversables).
+- Notwithstanding `#`, any single character may be used to represent any material (for example, `X` as a representation of `OBSIDIAN`).
+- `-` is a special character: it represents the material to be used for behind your portal's control blocks (activator + sign).
+- `button` is used to define what is used for the gate's *activator*. It may be any type of button, wall coral, or container.
-`X` and `-` are used to define block types for the layout (Any single-character can be used, such as `#`).
-In the gate format, you can see we use `X` to show where obsidian must be, `-` where the controls (Button/sign) are.
-
-For more complex gate designs, it is possible to add more materials. If you add something like a=GLOWSTONE, `a` can then
-be used in the gate layout, just as `X` is used. See the `squarenetherglowstonegate.gate` file for an example.
-
-You will also notice a `*` in the gate layout, this is the "exit point" of the gate, the block at which the player will
-teleport in front of.
-
-## Buttons
-
-The actual buttons cannot be used underwater, but all the other items in the button list can be.
- The entire list of button types is as follows: (Click to expand)
+ The full list of valid activator types may be found below: (Click to expand)
```
STONE_BUTTON
@@ -273,35 +270,104 @@ DEAD_BUBBLE_CORAL_WALL_FAN
DEAD_FIRE_CORAL_WALL_FAN
DEAD_HORN_CORAL_WALL_FAN
```
-
-## Underwater Portals
-
-There is a default gate type for underwater gates. There are no real restrictions on underwater gate materials, except
-normal buttons cannot be used since they'd fall off. Using wall coral fans work much better, though `CHEST` and
-`SHULKER_BOX` works too.
-
-Using `AIR` for a closed underwater gate looks weird, so `WATER` might be better. If using `AIR` for the closed gate,
-you need to make sure it actually contains air when creating it. For partially submerged portals, like ones used for
-boat teleportation, you need to keep water away from the portal entrance/opening until it's been created.
-
-## Economy Support:
-
-The latest version of Stargate has support for Vault. Gate creation, destruction and use can all have different costs
-associated with them. You can also define per-gate layout costs. The default cost is assigned in the config.yml file,
-while the per-gate costs re defined in the .gate files. To define a certain cost to a gate just add these lines to your
-.gate file:
+#### Economy
+> These values require `useEconomy` to be true.
+- `useCost` defines the cost players are charged when using an existing portal.
+- `createCost` defines the cost players are charged when constructing a new portal.
+- `destroyCost` defines the cost players are charged when breaking an existing portal.
+- `toOwner` specifies the money's destination: if true, it will go to the player who made (owns) the gate; if false, the money will be deleted.
+### Structure
+#### Standard Custom Gates
+##### Basic formatting:
+Following a blank line after your keys section, you may specify your gate layout:
Simply lay out the portal as it will appear in your world, with every character representing a block.
+```properties
+X=OBSIDIAN
+-=OBSIDIAN
+ XX
+X..X
+-..-
+X*.X
+ XX
```
- createCost: 5 -- Will cost 5 currency to create
- destroyCost: 5 -- Will clost 5 currency to destroy (negative to get back the spent money)
- useCost: 5 -- Will cost 5 currency to use the stargate
- toOwner: true -- Will send any fees to the gate's owner
+This example is a standard nether portal.
+
+Any single character symbol (except for `#`) may represent any material
+In this case, `X` and `-` point to OBSIDIAN.
+
`-` is a special material character that specifies where the control blocks will be placed (i.e. sign & button).
In this case, it is also `OBSIDIAN`.
+
+Other special characters include the following:
+- Spaces/blank characters (` `) will not be checked, and as such, represent any block.
+- Periods (`.`) represent the portal's *iris* (i.e. the part that opens and closes)
+- An asterix (`*`) represents the portals's "exit point" (i.e. the block the player will teleport in front of).
+
+##### Underwater Portals
+Gates may be constructed underwater in much the same manner as they may be constructed above the surface.
+There are, however, a few considerations for underwater portals:
+```properties
+portal-open=KELP_PLANT
+portal-closed=WATER
+button=BRAIN_CORAL_WALL_FAN
+toowner=false
+X=SEA_LANTERN
+-=SEA_LANTERN
+
+ XX
+X..X
+-..-
+X*.X
+ XX
```
+- Buttons can not be waterlogged, and as such, are not ideal: wall coral fans are an ideal substitute.
+ - Containers (such as `CHEST` and `SHULKER_BOX`) are also valid alternatives.
+- `AIR` is generally a poor `portal-closed` material for underwater portals, since such portals are difficult to construct and are visually problematic.
+ - `WATER` and other underwater [traversables](https://sgrewritten.org/traversables) work much better.
+
+##### Advanced format
+Gates are not limited to the shape of a standard nether portal -- they can be thousands of blocks big!
+In this case, a simple 5x5 square has been used as a gate.
+
+Gates are also not limited to [materials](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html) (such as `OBSIDIAN`); they may also use [tags](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Tag.html)) (such as `#WOOL`).
+Note that all tags must be prefaced with a hashtag (`#`), as in `#WOOL`.
+
+
+```properties
+portal-open=WATER
+portal-closed=AIR
+X=#WOOL
+-=#WOOL
+
+XXXXX
+X...X
+-...-
+X.*.X
+XXXXX
+```
+Any block that is included within a given tag may be used to construct the portal.
+
+
+Furthermore, it is important to note that gates may have multiple materials in their frame, as shown below:
+```properties
+portal-open=NETHER_PORTAL
+portal-closed=AIR
+button=OAK_BUTTON
+toowner=false
+X=OBSIDIAN
+-=GLOWSTONE
+A=GLOWSTONE
+
+ XAX
+X...X
+-...-
+X.*.X
+ XAX
+```
+
+
# Configuration
-
```
language - The language to use (Included languages: en, de, es, fr, hu, it, ja, nb-no, nl, nn-no, pt-br, ru, zh_cn)
adminUpdateAlert - Whether to alert admins about an available update when joining the server
@@ -347,15 +413,14 @@ advanced:
```
# Message Customization
+It is possible to customize all the messages Stargate displays, including the \[Stargate] prefix.
You may find these
+strings in `plugins/Stargate/lang/chosenLanguage.txt`.
-It is possible to customize all the messages Stargate displays, including the \[Stargate] prefix. You can find the
-strings in plugins/Stargate/lang/chosenLanguage.txt.
+If a string is removed, or left blank, it will default to the default english string.
There are some special cases
+Please note that %variableName% should be kept, as it will be replaced with a relevant value.
-If a string is removed, or left blank, it will default to the default english string. There are some special cases
-regarding messages. When you see %variableName%, you need to keep this part in your string, as it will be replaced with
-relevant values.
-
-The full list of strings is as follows:
+
+ The full list of strings may be found below: (Click to expand)
```
prefix=[Stargate]
@@ -402,213 +467,205 @@ portalInfoDestination=Destination: %destination%
portalInfoNetwork=Network: %network%
portalInfoServer=Server: %server%
```
+
+
+> **PLEASE NOTE**: This method of localisation is slated to change in the upcoming rewrite!
If stargate does not currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+#### [Version 0.11.5.1] UNIFIED LEGACY FORK
+- Merged the fork into the [SG Rewritten Project](https://sgrewritten.org)
+- *This fork is now the maintained legacy branch of the Stargate Rewritten Project*.
+ - This plugin will be superseded in the near future by Stargate Rewritten,
a collaborative effort to wholly rewrite and reimagine Drakia's code base.
+- Changed the `E` flag to `V`, to improve consistency for the rewrite.
+- Reworked the readme and changed some shortcuts
-#### \[Version 0.9.4.2] EpicKnarvik97 fork
+#### [Version 0.10.X.X] LCLO fork
+- Reimplemented/merged the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-Bukkit/tree/legacy), notably:
+ - Added material #tag support
+ - Expanded legacy migration support
+ - Changed MSV to 1.16
+ - Added a new default gate file
+ - Added bstats
+> **NOTE: The LCLO fork has its own changelog, found [here](https://github.com/stargate-rewritten/Stargate-Bukkit/blob/legacy/README.md#changes)!**
+For brevity, the full list has been excluded from the below.
+In general, it is safe to assume **FULL LCLO PARITY** as of this version.
-- Avoids a NullPointerException if Dynmap is present, but isn't properly loaded.
-- Avoids some potential NullPointerExceptions related to Dynmap integration
-- Fixes end portals hijacking BungeeCord teleportation
-- Fixes a problem where a player might not be properly teleported from an end portal Stargate in the end to the
- over-world.
+#### [Version 0.9.4.2] EpicKnarvik97 fork
+- Prevents improperly loaded dependencies from causing problems with SG.
+- Improved Dynmap integration and associated bug fixes.
+- Fixes for some issues surrounding end portals.
#### \[Version 0.9.4.1] EpicKnarvik97 fork
-
-- Reverts to Spigot API 1.18
-- Adds Dynmap integration
+- Adds integration with [Dynmap](https://www.spigotmc.org/resources/dynmap%C2%AE.274/)
#### \[Version 0.9.4.0] EpicKnarvik97 fork
-- Updates Stargate to 1.19
+- Minecraft version 1.19 support.
#### \[Version 0.9.3.7] EpicKnarvik97 fork
-- Adds the Japanese language file provided by spigot user furplag
+- Added a Japanese localisation courtesy of `furplag`.
+*For more info translation status, please see [this](sgrewritten.org/translate)*.
#### \[Version 0.9.3.6] EpicKnarvik97 fork
-- Adds the simplified Chinese language file provided by spigot user YKDZ
+- Added a Chinese (simplified) localisation courtesy of `YKDZ`.
+*For more info translation status, please see [this](sgrewritten.org/translate)*.
#### \[Version 0.9.3.5] EpicKnarvik97 fork
-- Fixes the wait for player delay being too low by default
-- Performs some minor code optimizations and restructuring
+- Fixed an issue that could result in invisible players following teleportation.
+- Made some minor optimisations and code refactors.
#### \[Version 0.9.3.4] EpicKnarvik97 fork
-- Includes passengers of passengers when teleporting entities
-- Fixes a bug which caused Stargate to use more CPU for no reason
-- Teleports boats/minecarts like other vehicles unless *enableCraftBookRemoveOnEjectFix* is enabled
-- Adds the *waitForPlayerAfterTeleportDelay* config option which allows changing the delay between vehicle teleportation
- and the player being teleported to the vehicle
-- Makes boats keep their wood type even when re-created
+- Entities will now teleport with any passengers they may have.
+- Significantly optimised the plugin's CPU usage.
+- Added an alternative transportation method to resolve a CraftBook incompatibility, and an associated config toggle (`enableCraftBookRemoveOnEjectFix`).
+- Added a config option (`waitForPlayerAfterTeleportDelay`) to allow users to specify the delay between vehicle teleportation and player teleportation.
#### \[Version 0.9.3.3] EpicKnarvik97 fork
-
-- Prevents Zombified Piglins from randomly spawning at Stargates
+- Prevents Zombified Piglins from spawning at stargates with `nether-portal` irises.
#### \[Version 0.9.3.2] EpicKnarvik97 fork
-- Adds a config option to set the exit velocity of any players exiting a stargate
-- Adjusts vehicle teleportation a bit to prevent passengers' exit rotation from being wrong
-- Improves the checking for buggy double-clicks on non-button blocks
+- The velocity multiplier applied to users exiting stargates may now be modified through a config option.
+- Fixes an issue where players could exit stargates with improper head rotation.
+- Fixes an issue where, in certain circumstances, double-clicks on frame (non-activator) blocks could activate a gate.
#### \[Version 0.9.3.1] EpicKnarvik97 fork
-- Ignores the type of air when checking if a stargate is valid
+- Fixed an issue wherein one would be unable to create a stargate due to the presence of nonstandard air.
#### \[Version 0.9.3.0] EpicKnarvik97 fork
-- Adds support for RGB colors (use hex color codes)
-- Adds support for dyed and glowing signs
-- Adds support for specifying sign colors per sign type
-- Adds a tab-completable config sub-command for easily changing per-sign colors
-- Allows a per-sign color to be set as the inverse of the default color of the given type
+- Adds full support for the new sign colour features:
+ - Sign colours may now be specified through the use of RGB colour codes.
+ - Signs may now be dyed and/or glow-inked
+ - Colours may now be specified per sign type.
+- Adds the "sg config" command to allow users to easily change a given sign's RGB colours.
+ - One new option for this is "inverse", which inverts the default colour for a specific sign.
#### \[Version 0.9.2.5] EpicKnarvik97 fork
-- Updates Java version to JDK 17
-- Updates Spigot API version to 1.18
+- Updated plugin to use Java 17
+- Adds support for MineCraft version 1.18
#### \[Version 0.9.2.4] EpicKnarvik97 fork
-- Adds update checking, which will display a notice in the console when updates are available
-- Adds an alert about an available update when an admin joins the server
-- Adds the adminUpdateAlert config option to allow the admin notices to be turned off
+- Adds update checker, which will (optionally) display a notice in console and admins whenever a new SG update is available.
+- Adds a config toggle (`adminUpdateAlert`) to disable the above.
#### \[Version 0.9.2.3] EpicKnarvik97 fork
-- Fixes a typo which caused both colors to change into the highlightSignColor
+- Fixes an issue that resulted in `highlightSignColor` being used for all colours.
#### \[Version 0.9.2.2] EpicKnarvik97 fork
-- Prevents teleportation of a player holding creatures on a leash when handleLeashedCreatures is disabled, to prevent
- players accidentally losing the creatures during teleportation
-- Fixes a potential exception when a gate's open-block or closed-block is set to a material which isn't a block
-- Fixes a potential exception when a portal without a sign has an invalid gate type
-- Prevents loading of gate files using non-blocks as part of the border
-- Prevents a player smuggling another player through a restricted stargate by sitting on a creature held in a lead by
- the first player
+- Fixed an issue wherein`handleLeashedCreatures` could cause accidental creature losses when disabled.
+- Prevented several potential crashes relating to invalid block and gate types.
+- Fixed an issue wherein a players could smuggle each other through Private stargates.
#### \[Version 0.9.2.1] EpicKnarvik97 fork
-- Makes sure to only reload whatever is necessary when config values are changed using commands, instead of reloading
- the entire config file every time
-- Protects portals from block placement when protectEntrance is enabled
+- Improves the efficiency and stability of the reload command.
+- Adds a toggle (`protectEntrance`) to extend portal protection to the iris.
#### \[Version 0.9.2.0] EpicKnarvik97 fork
- Increases max length of names and networks to 13 characters
-- Excludes color codes from the counted character length to allow a colored, 13-character name
-- Makes portal names and networks case- and color-agnostic to prevent some confusion caused by typos or sloppy
- configuration
-- Makes the free gate color configurable, and renames freeGatesGreen to freeGatesColored
+- Excludes color codes from the counted character length to allow coloured names with up to 13 characters.
+- Fixes an issue wherein typos or mistaken capitalisation could result in the creation of duplicated portals.
+- Makes the free gate color configurable, and renames the `freeGatesGreen` toggle to `freeGatesColored`.
#### \[Version 0.9.1.2] EpicKnarvik97 fork
-- Allows a sneaking player to see information about a silent stargate with no sign
+- Players may now see information about stargates (especially V gates) by sneaking and right-clicking.
#### \[Version 0.9.1.1] EpicKnarvik97 fork
-- Makes sure to translate the `&` character to fix a bug causing portal signs to not be colored on some servers
+- Fixed a bug where sign colouring failed due to improper translation of the `&` symbol.
#### \[Version 0.9.1.0] EpicKnarvik97 fork
-- Rewrites config loading as a part of the changes required to implement config commands
-- This update adds commands to change all config values from the chat or the console, complete with tab completion
-- Adds a new permission "stargate.admin.config" which is required to edit config values from the chat
+- Refactors the configuration loading systems as to facilitate the below:
+- Added the `sg config` command, to allow for all config values to be changed in-game by users with permission.
+ - The relevant permission is `stargate.admin.config`.
#### \[Version 0.9.0.7] EpicKnarvik97 fork
-- Stops registering the sign as a lookup block for stargates without a sign
-- Only removes a stargate's button if it's actually a button-compatible block
-- Only displays portal info if not placing a block
+- Fixes an issue involving sign registration for V gates.
+- Prevents a situation that may result in an invalid button state.
+- Tweaks when portal information is displayed to prevent an inconvenient conflict with block placement.
#### \[Version 0.9.0.6] EpicKnarvik97 fork
-- Makes containers no longer open when used as buttons
-- Validates and updates stargate buttons when the plugin is loaded or reloaded
-- Adds an option to make a stargate silent (no text in chat when teleporting) for better immersion on RP servers
-- Makes buttons update and/or remove themselves when their location or material changes
-- Adds another default gate to show that it's possible to use any number of materials for a stargate's border
-- Adds an option for stargates without a sign. Right-clicking such a stargate will display gate information
-- Fixes a bug causing signs to be re-drawn after they're broken
-- Makes buttons and signs be replaced by water instead of air when underwater
-- Makes portal info shown when right-clicking a stargate fully customizable
+- Prevents containers used as buttons from displaying the opening animation.
+- Improved load-time gate and button validation.
+- Adds the `Q` flag (suppresses chat messages related to portal use -- perfect for RP servers!).
+- Prevents a bug where buttons could incorrect overwrite materials.
+- Adds an additional default gate as to explain multi-material stargates.
+- Adds the `V` flag (hides the stargate's sign -- right-clicking will display the relevant information in chat).
+ - This is presented as an alternative for the `B` flag.
+- Fixes a bug where, in certain circumstances, signs could become unbreakable.
+- Improves how waterlogging is handled.
+- Right-clicking a stargate's frame will now display information in chat.
#### \[Version 0.9.0.5] EpicKnarvik97 fork
-- Adds an option to stargate functionality to disable all teleportation of creatures
-- Adds an option to stargate functionality to disable all teleportation of empty minecarts
-- Adds an option to stargate functionality to disable teleportation of creatures if no player is present in the vehicle
-- Prevents a player in a vehicle from teleporting without the vehicle if vehicle teleportation is disabled
-- Prevents an infinite number of teleportation messages if vehicle teleportation is detected but denied
+- Adds configuration toggles for:
+ - Whether or not living non-player entities may be teleported.
+ - Whether or not vehicles may teleport without a player riding them.
+ - Whether or not vehicles may teleport living non-player entities if accompanied by a player rider.
+- Fixes a bug that could result in unauthorised teleportation.
+- Fixes a bug that, in certain circumstances, could result in chat spam.
#### \[Version 0.9.0.4] EpicKnarvik97 fork
-- Adds teleportation of leashed creatures. By default, any creature connected to a player by a lead will be teleported
- with the player through stargates, even if the player is in a vehicle. This behavior can be disabled in the config
- file.
+- Leashed entities will now teleport with their associated player, even when that player is in a vehicle!
+- Added a configuration toggle for this feature.
#### \[Version 0.9.0.3] EpicKnarvik97 fork
-- Adds a missing error message when a player in a vehicle cannot pay the teleportation fee
-- Adds UUID migration to automatically update player names to UUID when possible
+- An error message has been clarified as to better account for vehicles.
+- Players with legacy string IDs will now be automatically converted to modern UUIDs upon joining.
#### \[Version 0.9.0.2] EpicKnarvik97 fork
-- Fixes a bug causing Stargates using NETHER_PORTAL blocks to generate nether portals in the nether.
+- Fixes a bug that could result in unwanted portals to generate in the nether.
#### \[Version 0.9.0.1] EpicKnarvik97 fork
-- Adds the highlightSignColor option and renames the signColor option to mainSignColor
-- Fixes some inconsistencies in sign coloring by using the highlight color for all markings
-- Fixes the order in which configs are loaded to prevent an exception
-- Adds migrations for the config change
+- Added coloured highlight patterns to signs: `highlightSignColor` has been added, and `signColor` has been renamed to `mainSignColor`.
+- Addressed some inconsistencies in sign coloring by using the highlight color for all markings
+- Fixed some issues pertaining to configuration handling and management.
#### \[Version 0.9.0.0] EpicKnarvik97 fork
-- Changes entire path structure to a more modern and maven-compliant one
-- Changes package structure to net.knarcraft.stargate.*
-- Moves language files into the resources folder
-- Fixes some bugs caused by language files not being read as UTF-8
-- Adds JavaDoc to a lot of the code
-- Adds Norwegian translation for both Norwegian languages
-- Adds missing dependency information to plugin.yml
-- Uses text from the language files in more places
-- Changes how backup language works, causing english strings to be shown if not available from the chosen language
-- Removes some pre-UUID code
-- Adds underwater portals
-- Makes it easier to add more default gates
-- Adds a new default gate which can be used underwater
-- Adds more items usable as buttons (corals, chest, shulker-box), which allows underwater portals
-- Splits a lot of the code into smaller objects
-- Moves duplicated code into helper classes
-- Re-implements vehicle teleportation
-- Makes boat teleportation work as expected, including being able to teleport with two passengers. This allows players
- to use boats to transport creatures through portals and to other areas, or even worlds
-- Makes it possible to teleport a player riding a living entity (a pig, a horse, a donkey, a zombie horse, a skeleton
- horse or a strider). It does not work for entities the player cannot control, such as llamas.
-- Makes both nether portals and end gateways work properly without causing mayhem
-- Replaces the modX and modZ stuff with yaw calculation to make it easier to understand
-- Comments all the code
-- Extracts portal options and portal-related locations to try and reduce size
-- Rewrites tons of code to make it more readable and manageable
-- Implements proper snowman snow blocking, and removes the "temporary" ignoreEntrances option
-- Adds a default gate using end stone bricks and end gateway for more default diversity
-- Makes portals using end portal blocks work as expected
-- Adds missing permissions to the readme
-- Adds missing permissions to plugin.yml and simplifies permission checks by specifying default values for child
- permissions
-- Renames stargate.reload to stargate.admin.reload to maintain consistency
-- Marks stargates which cannot be loaded because of the gate layout not having been loaded
-- Uses white for the "-" characters on the side of each stargate name when drawing signs to increase readability
-- Uses white to mark the selected destination when cycling through stargate destinations
+- Significantly refactored the legacy codebase for readability and quality.
+ - Added developer documentation.
+- Changed the package to net.knarcraft.stargate.*
+- Improved localisations and their handling.
+ - Added several new translations.
+- Fixed some encoding problems.
+- Added some missing dependencies, updated the project's plugin file.
+- Made underwater portals practical by reworking activator materials and adding support for waterlogging.
+- Updated the vehicle teleportation code to work in modern versions of the game, and addressed CVE-2021-43819.
+- Updated boat teleportation to account for multi-passenger vehicles.
+- Added support for passengers and leashed entities.
+- Fixed some issues surrounding block states and data (notably, nether portals and end gateways).
+- Overhauled the plugin's handling of movement.
+- Slightly improved the plugin's flatfile storage structure.
+- Improved portal protection, implemented many associated "TODOs"
+- Adds another default gate to illustrate multi-type designs.
+- Significantly improved the plugin's documentation via README
+- Properly implemented a load of missing permissions -- especially including handling of child nodes.
+- Renamed the stargate.reload node to stargate.admin.reload as to improve consistency
+- Improves the stability of Stargate's load-time portal handling.
+- Highlights destination selector brackets on signs ("-") as to improve readability.
- Uses dark red to mark portals which are inactive (missing destination or invalid gate type)
-- Re-draws signs on startup in case they change
-- Fixes some bugs preventing changing the portal-open block on the fly
-- Adds a translate-able string for when the plugin has been reloaded
+- Adds provisions to re-draw incorrect signs.
+- Fixed a load of other miscellaneous bugs.
#### \[Version 0.8.0.3] PseudoKnight fork
From 24890a4b5ded33d52f3dbbd0b8b4c774ae4273e2 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:48:50 -0400
Subject: [PATCH 017/112] Fixed a text oversight.
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c7b8b32..7f4cf1a 100644
--- a/README.md
+++ b/README.md
@@ -126,7 +126,7 @@ stargate.admin -- Op
This a default gate configuration. See the Custom Gate Layout section for more options, and how to redesign this.
```
OO
- O O - These are Obsidian blocks (use Sea Lanterns if underwater). You need 10.
+ O O - These are Obsidian blocks (End Bricks and Sea Lanterns also work). You need 10.
■ ■ - Place a sign on either of these two blocks.
O O
OO
From 77fec1d5de3fb187a1024751db529036f028c98b Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:51:09 -0400
Subject: [PATCH 018/112] Fixed a mismatch re the increased character limit.
---
README.md | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 7f4cf1a..9e17fb8 100644
--- a/README.md
+++ b/README.md
@@ -134,9 +134,9 @@ This a default gate configuration. See the Custom Gate Layout section for more o
### Sign Layout:
-- Line 1: Gate Name (Max 12 characters)
-- Line 2: Destination Name [Optional] (Max 12 characters, used for fixed-gates only)
-- Line 3: Network name [Optional] (Max 12 characters)
+- Line 1: Gate Name (Max 13 characters)
+- Line 2: Destination Name [Optional] (Max 13 characters, used for fixed-gates only)
+- Line 3: Network name [Optional] (Max 13 characters)
- Line 4: Options [Optional] :
- `A` is for an **A**lways-on fixed gate
- `H` is for a **H**idden networked gate
@@ -151,7 +151,8 @@ This a default gate configuration. See the Custom Gate Layout section for more o
- `V` is for an in**V**isible gate (it will appear without a sign)
-The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'.
+The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'.
+Note that colour characters (if enabled) are not counted towards the character limit.
#### Gate networks:
- Gates are all part of a network, by default this is "central".
From 7e46fa413efa036d2741956728232d2ebae5602b Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 25 Mar 2023 02:57:23 +0100
Subject: [PATCH 019/112] Relocates BStats, but KnarLib is not properly shaded
---
pom.xml | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/pom.xml b/pom.xml
index a5f163d..6d00576 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,16 +40,6 @@
https://repo.papermc.io/repository/maven-public/
-
-
- knarcraft-repo
- https://git.knarcraft.net/api/packages/EpicKnarvik97/maven
-
-
- knarcraft-repo
- https://git.knarcraft.net/api/packages/EpicKnarvik97/maven
-
-
@@ -122,7 +112,21 @@
org.apache.maven.plugins
maven-shade-plugin
- 3.2.4
+ 3.4.1
+
+ false
+
+
+ org.bstats:*
+
+
+
+
+ org.bstats
+ net.knarcraft.stargate
+
+
+
package
From e6c92f93229f7cc5022646d197c8d4b0a695af3d Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Sat, 25 Mar 2023 17:02:55 -0400
Subject: [PATCH 020/112] Fixed maven shade to handle bstats and knarlib.
---
pom.xml | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/pom.xml b/pom.xml
index 6d00576..4869d0c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -113,19 +113,15 @@
org.apache.maven.plugins
maven-shade-plugin
3.4.1
+
false
org.bstats:*
+ net.knarcraft:knarlib
-
-
- org.bstats
- net.knarcraft.stargate
-
-
@@ -134,7 +130,16 @@
shade
- false
+
+
+ org.bstats
+ net.knarcraft.stargate.metrics
+
+
+ net.knarcraft
+ net.knarcraft
+
+
net.knarcraft:knarlib
From 421e0b17e23374b2f733e4e44774d622083aa327 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 11:06:52 +0000
Subject: [PATCH 021/112] Updates the resource id for the update checker
This change makes the update checker look at https://www.spigotmc.org/resources/stargate.109355/ for updates, instead of the legacy with incorrect version numbering: https://www.spigotmc.org/resources/stargate-old.87978/
---
src/main/java/net/knarcraft/stargate/Stargate.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 53ca704..3fea320 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -366,7 +366,7 @@ public class Stargate extends JavaPlugin {
this.registerCommands();
//Check for any available updates
- UpdateChecker.checkForUpdate(this, "https://api.spigotmc.org/legacy/update.php?resource=87978",
+ UpdateChecker.checkForUpdate(this, "https://api.spigotmc.org/legacy/update.php?resource=109355",
Stargate::getPluginVersion, Stargate::setUpdateAvailable);
BStatsHelper.initialize(this);
From 2074904aef54392b86735fa10d1acce3c3997538 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 18:34:37 +0200
Subject: [PATCH 022/112] Improves configuration comments
---
README.md | 292 ++++++++++++++++++++--------------
src/main/resources/config.yml | 268 +++++++++++++++++++++----------
2 files changed, 364 insertions(+), 196 deletions(-)
diff --git a/README.md b/README.md
index 9e17fb8..1c2db98 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,16 @@
-
> **Documentation may be found** [here](https://sgrewritten.org/legacywiki)
> **Support is available via** [discord](https://discord.gg/mTaHuK6BVa)**.**
> **THIS IS A LEGACY-BASED BRANCH: IT IS SUPPORTED, BUT NOT ACTIVELY UPDATED**
> This branch expands upon Drakia's original 2013 codebase, with fixes as needed.
-> In the near future, this branch will be superseded by [SGR](https://github.com/stargate-rewritten/Stargate-Bukkit) (a complete rewrite).
+> In the near future, this branch will be superseded by [SGR](https://github.com/stargate-rewritten/Stargate-Bukkit) (a
+> complete rewrite).
# Description
-The Original, and still the best, MineCraft transportation solution!
Intuitively and organically facilitates instant transportation across large distances!
-Highly capable, simple to use, with robust network capabilities and extensive customisability!
+The Original, and still the best, MineCraft transportation solution!
Intuitively and organically facilitates instant
+transportation across large distances!
+Highly capable, simple to use, with robust network capabilities and extensive customisability!
- **Player permissions** -- let players build their own networks.
- **Vault economy support** -- can add costs for create, destroy and use.
@@ -30,40 +31,49 @@ Highly capable, simple to use, with robust network capabilities and extensive cu
also be dyed on a per-sign basis.
## Background
+
- This plugin was originally TheDgtl's Bukkit port of the Stargate plugin for hMod by Dinnerbone.
-- After this plugin was dropped by TheDgtl, PseudoKnight began maintaining it for modern versions of Spigot (adding support for UUIDs & Material Strings).
+- After this plugin was dropped by TheDgtl, PseudoKnight began maintaining it for modern versions of Spigot (adding
+ support for UUIDs & Material Strings).
- EpicKnarvik97 forked that version to clean up the code, added leash support, and improved vehicle support.
- LockedCraft and LittleBigBug also forked that version to add underwater and tag support, as well as a few bug fixes.
- This version is a combination of all the forks above, maintained by the Stargate Rewritten project.
- This branch is currently in a maintenance-only mode; a total rewrite is forthcoming.
## License
-Stargate is licensed under the GNU Lesser General Public License Version 3.0.
This includes every source and resource
+
+Stargate is licensed under the GNU Lesser General Public License Version 3.0.
This includes every source and
+resource
file; see the LICENSE file for more information.
-
## Migration
+
This plugin should be fully compatible all known versions StarGate forks, with the following exceptions:
+
- Any version from outside of the bukkit ecosystem
- Any version of SGR (version numbers 1.0.0.0+)
- Any configurations with outdated material names (i.e. numIDs)
-**Note that this plugin's default gate files** __**AND ANY PRESENT CUSTOM .GATEs**__ **will be overwritten by the import!**
+**Note that this plugin's default gate files** __**AND ANY PRESENT CUSTOM .GATEs**__ **will be overwritten by the
+import!**
If you wish to keep any such files, take a backup of your "gates" folder!
Legacy gate files filled with outdated material IDs will need to be manually updated.
-A list of old materials and their conversions may be found [here](https://github.com/CryptoMorin/XSeries/blob/master/src/main/java/com/cryptomorin/xseries/XMaterial.java).
-A list of modern, valid, material names may be found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
+A list of old materials and their conversions may be
+found [here](https://github.com/CryptoMorin/XSeries/blob/master/src/main/java/com/cryptomorin/xseries/XMaterial.java)
+.
+A list of modern, valid, material names may be
+found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
-
-Permissions have had a few changes, so you should check the permissions section for any differences since you set up permissions.
+Permissions have had a few changes, so you should check the permissions section for any differences since you set up
+permissions.
Payment to owner using Economy, through Vault, is only possible if the portal owner in the portal database is defined by
a UUID, and not a username. A player name will be upgraded to a UUID when the player with the given name joins the
server.
-
# Permissions
+
```
stargate.use -- Allow use of all Stargates linking to any world in any network (Override ALL network/world permissions. Set to false to use network/world specific permissions)
stargate.world -- Allow use of Stargates linking to any world
@@ -110,7 +120,9 @@ stargate.admin -- Allow all admin features (Hidden/Private bypass, BungeeCord, R
stargate.admin.config -- Allows the player to change config values from the chat
stargate.admin.dye -- Allows this player to change the dye of any stargate's sign
```
+
## Default Permissions
+
```
stargate.use -- Everyone
stargate.create -- Op
@@ -120,10 +132,12 @@ stargate.free -- Op
stargate.admin -- Op
```
-
# Instructions
+
## Building a gate:
+
This a default gate configuration. See the Custom Gate Layout section for more options, and how to redesign this.
+
```
OO
O O - These are Obsidian blocks (End Bricks and Sea Lanterns also work). You need 10.
@@ -138,56 +152,62 @@ This a default gate configuration. See the Custom Gate Layout section for more o
- Line 2: Destination Name [Optional] (Max 13 characters, used for fixed-gates only)
- Line 3: Network name [Optional] (Max 13 characters)
- Line 4: Options [Optional] :
- - `A` is for an **A**lways-on fixed gate
- - `H` is for a **H**idden networked gate
- - `P` is for a **P**rivate gate
- - `F` is for a **F**ree gate
- - `B` is for a **B**ackwards facing gate (which exit you at the back)
- - `S` is for **S**howing an always-on gate in the network list
- - `N` is for a **N**o network gate (the network name is hidden from the sign)
- - `R` is for a **R**andom gate (implicitly always on; sends players to a random exit)
- - `U` is for a b**U**ngee gate (connecting to another servers via bungeecord)
- - `Q` is for a **Q**uiet gate (it will not output anything to chat when teleporting)
- - `V` is for an in**V**isible gate (it will appear without a sign)
-
+ - `A` is for an **A**lways-on fixed gate
+ - `H` is for a **H**idden networked gate
+ - `P` is for a **P**rivate gate
+ - `F` is for a **F**ree gate
+ - `B` is for a **B**ackwards facing gate (which exit you at the back)
+ - `S` is for **S**howing an always-on gate in the network list
+ - `N` is for a **N**o network gate (the network name is hidden from the sign)
+ - `R` is for a **R**andom gate (implicitly always on; sends players to a random exit)
+ - `U` is for a b**U**ngee gate (connecting to another servers via bungeecord)
+ - `Q` is for a **Q**uiet gate (it will not output anything to chat when teleporting)
+ - `V` is for an in**V**isible gate (it will appear without a sign)
The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'.
Note that colour characters (if enabled) are not counted towards the character limit.
#### Gate networks:
- - Gates are all part of a network, by default this is "central".
- - You can specify (and create) your own network on the third line of the sign when making a new gate.
- - Gates on one network will not see gates on the second network, and vice versa.
- - Gates on different worlds, but in the same network, will see each other.
- - Notwithstanding the above, the network for bUngee gates will always be name of its destination /server
+
+- Gates are all part of a network, by default this is "central".
+- You can specify (and create) your own network on the third line of the sign when making a new gate.
+- Gates on one network will not see gates on the second network, and vice versa.
+- Gates on different worlds, but in the same network, will see each other.
+- Notwithstanding the above, the network for bUngee gates will always be name of its destination /server
#### Fixed gates:
- - Fixed gates go to only one set destination.
- - Fixed gates can be linked to other fixed gates, or normal gates. A normal gate cannot open a portal to a fixed gate however.
- - To create a fixed gate, specify a destination on the second line of the stargate sign.
- - Set the 4th line of the stargate sign to `A` to enable an always-open fixed gate.
- - Gates with the U or R flags are fixed gates by definition.
-
+
+- Fixed gates go to only one set destination.
+- Fixed gates can be linked to other fixed gates, or normal gates. A normal gate cannot open a portal to a fixed gate
+ however.
+- To create a fixed gate, specify a destination on the second line of the stargate sign.
+- Set the 4th line of the stargate sign to `A` to enable an always-open fixed gate.
+- Gates with the U or R flags are fixed gates by definition.
+
#### Hidden Gates:
- - Hidden gates are like normal gates, but only show on the destination list of other gates under certain conditions.
- - A hidden gate is only visible to the creator of the gate or somebody with the stargate.hidden permission.
- - Set the 4th line of the stargate sign to `H` to make it a hidden gate.
-
- #### Force Shown Gates:
- - Gates with the `A`, `R`, or `U` gates do not show up on networks by default.
- - To force such gates to show up on network lists, add the `S` flag to the sign's 4th line.
+
+- Hidden gates are like normal gates, but only show on the destination list of other gates under certain conditions.
+- A hidden gate is only visible to the creator of the gate or somebody with the stargate.hidden permission.
+- Set the 4th line of the stargate sign to `H` to make it a hidden gate.
+
+#### Force Shown Gates:
+
+- Gates with the `A`, `R`, or `U` gates do not show up on networks by default.
+- To force such gates to show up on network lists, add the `S` flag to the sign's 4th line.
#### Random Gates:
- - Random gates are similar to Always-On gates, but do not have a fixed exit;
- - They instead randomly select an exit from the list of gates on their network.
- - Marking a gate as 'R' will automatically make that gate always-on.
- - 'R' gates ignore any gate with the 'R', 'A', and/or 'S' flag(s) when choosing their exit.
+
+- Random gates are similar to Always-On gates, but do not have a fixed exit;
+ - They instead randomly select an exit from the list of gates on their network.
+- Marking a gate as 'R' will automatically make that gate always-on.
+- 'R' gates ignore any gate with the 'R', 'A', and/or 'S' flag(s) when choosing their exit.
## Using a gate:
- - Right click the sign to choose a destination (not needed for Fixed gates, undefined gates).
- - Right click the activator to open up a portal.
- - Step through.
-
+
+- Right click the sign to choose a destination (not needed for Fixed gates, undefined gates).
+- Right click the activator to open up a portal.
+- Step through.
+
## Custom Gate Layouts
You may create as many gate formats as you wish through the use of .gate files within your `gates` folder.
@@ -195,7 +215,7 @@ You may create as many gate formats as you wish through the use of .gate files w
The .gate file follows a specific format, with config lines at the top, and the gate layout/design below it.
For example, take the default nether.gate file shown below:
-```properties
+```
portal-open=NETHER_PORTAL
portal-closed=AIR
button=STONE_BUTTON
@@ -205,25 +225,33 @@ destroycost=0
toowner=false
X=OBSIDIAN
-=OBSIDIAN
-
- XX
+XX
X..X
-..-
X*.X
- XX
+XX
```
### Keys
+
#### Materials
-> Note that MATERIAL NAMES (such as `OBSIDIAN`) can be found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
-As of version 0.10.7.0, TAGS (such as `#WOOL`) can be found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Tag.html).
+> Note that MATERIAL NAMES (such as `OBSIDIAN`) can be
+> found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
+> As of version 0.10.7.0, TAGS (such as `#WOOL`) can be
+> found [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Tag.html).
-- `portal-open` and `portal-closed` are used to specify the [materials](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html) the portal's iris will use when active/inactive respectively.
- - Note that portal-open should be a *traversable* material, such as those listed [here](https://sgrewritten.org/traversables).
-- Notwithstanding `#`, any single character may be used to represent any material (for example, `X` as a representation of `OBSIDIAN`).
-- `-` is a special character: it represents the material to be used for behind your portal's control blocks (activator + sign).
-- `button` is used to define what is used for the gate's *activator*. It may be any type of button, wall coral, or container.
+- `portal-open` and `portal-closed` are used to specify
+ the [materials](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html) the portal's iris will use when
+ active/inactive respectively.
+ - Note that portal-open should be a *traversable* material, such as those
+ listed [here](https://sgrewritten.org/traversables).
+- Notwithstanding `#`, any single character may be used to represent any material (for example, `X` as a representation
+ of `OBSIDIAN`).
+- `-` is a special character: it represents the material to be used for behind your portal's control blocks (activator +
+ sign).
+- `button` is used to define what is used for the gate's *activator*. It may be any type of button, wall coral, or
+ container.
The full list of valid activator types may be found below: (Click to expand)
@@ -271,42 +299,56 @@ DEAD_BUBBLE_CORAL_WALL_FAN
DEAD_FIRE_CORAL_WALL_FAN
DEAD_HORN_CORAL_WALL_FAN
```
+
#### Economy
+
> These values require `useEconomy` to be true.
+
- `useCost` defines the cost players are charged when using an existing portal.
- `createCost` defines the cost players are charged when constructing a new portal.
- `destroyCost` defines the cost players are charged when breaking an existing portal.
-- `toOwner` specifies the money's destination: if true, it will go to the player who made (owns) the gate; if false, the money will be deleted.
+- `toOwner` specifies the money's destination: if true, it will go to the player who made (owns) the gate; if false, the
+ money will be deleted.
+
### Structure
+
#### Standard Custom Gates
+
##### Basic formatting:
-Following a blank line after your keys section, you may specify your gate layout:
Simply lay out the portal as it will appear in your world, with every character representing a block.
-```properties
+
+Following a blank line after your keys section, you may specify your gate layout:
Simply lay out the portal as it
+will appear in your world, with every character representing a block.
+
+```
X=OBSIDIAN
-=OBSIDIAN
-
- XX
+XX
X..X
-..-
X*.X
- XX
+XX
```
+
This example is a standard nether portal.
Any single character symbol (except for `#`) may represent any material
In this case, `X` and `-` point to OBSIDIAN.
-
`-` is a special material character that specifies where the control blocks will be placed (i.e. sign & button).
In this case, it is also `OBSIDIAN`.
+
`-` is a special material character that specifies where the control blocks will be placed (i.e. sign & button)
+.
In this case, it is also `OBSIDIAN`.
Other special characters include the following:
+
- Spaces/blank characters (` `) will not be checked, and as such, represent any block.
- Periods (`.`) represent the portal's *iris* (i.e. the part that opens and closes)
- An asterix (`*`) represents the portals's "exit point" (i.e. the block the player will teleport in front of).
##### Underwater Portals
+
Gates may be constructed underwater in much the same manner as they may be constructed above the surface.
There are, however, a few considerations for underwater portals:
+
```properties
portal-open=KELP_PLANT
portal-closed=WATER
@@ -314,43 +356,46 @@ button=BRAIN_CORAL_WALL_FAN
toowner=false
X=SEA_LANTERN
-=SEA_LANTERN
-
- XX
+XX
X..X
-..-
X*.X
- XX
+XX
```
+
- Buttons can not be waterlogged, and as such, are not ideal: wall coral fans are an ideal substitute.
- - Containers (such as `CHEST` and `SHULKER_BOX`) are also valid alternatives.
-- `AIR` is generally a poor `portal-closed` material for underwater portals, since such portals are difficult to construct and are visually problematic.
- - `WATER` and other underwater [traversables](https://sgrewritten.org/traversables) work much better.
-
+ - Containers (such as `CHEST` and `SHULKER_BOX`) are also valid alternatives.
+- `AIR` is generally a poor `portal-closed` material for underwater portals, since such portals are difficult to
+ construct and are visually problematic.
+ - `WATER` and other underwater [traversables](https://sgrewritten.org/traversables) work much better.
+
##### Advanced format
+
Gates are not limited to the shape of a standard nether portal -- they can be thousands of blocks big!
In this case, a simple 5x5 square has been used as a gate.
-Gates are also not limited to [materials](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html) (such as `OBSIDIAN`); they may also use [tags](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Tag.html)) (such as `#WOOL`).
+Gates are also not limited to [materials](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html) (such
+as `OBSIDIAN`); they may also use [tags](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Tag.html)) (such
+as `#WOOL`).
Note that all tags must be prefaced with a hashtag (`#`), as in `#WOOL`.
-
```properties
portal-open=WATER
portal-closed=AIR
X=#WOOL
-=#WOOL
-
XXXXX
X...X
-...-
X.*.X
XXXXX
```
+
Any block that is included within a given tag may be used to construct the portal.
-
Furthermore, it is important to note that gates may have multiple materials in their frame, as shown below:
-```properties
+
+```
portal-open=NETHER_PORTAL
portal-closed=AIR
button=OAK_BUTTON
@@ -358,17 +403,15 @@ toowner=false
X=OBSIDIAN
-=GLOWSTONE
A=GLOWSTONE
-
- XAX
+XAX
X...X
-...-
X.*.X
- XAX
+XAX
```
-
-
# Configuration
+
```
language - The language to use (Included languages: en, de, es, fr, hu, it, ja, nb-no, nl, nn-no, pt-br, ru, zh_cn)
adminUpdateAlert - Whether to alert admins about an available update when joining the server
@@ -414,6 +457,7 @@ advanced:
```
# Message Customization
+
It is possible to customize all the messages Stargate displays, including the \[Stargate] prefix.
You may find these
strings in `plugins/Stargate/lang/chosenLanguage.txt`.
@@ -468,35 +512,46 @@ portalInfoDestination=Destination: %destination%
portalInfoNetwork=Network: %network%
portalInfoServer=Server: %server%
```
+
-> **PLEASE NOTE**: This method of localisation is slated to change in the upcoming rewrite!
If stargate does not currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
+> **PLEASE NOTE**: This method of localisation is slated to change in the upcoming rewrite!
If stargate does not
+> currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+
#### [Version 0.11.5.1] UNIFIED LEGACY FORK
+
- Merged the fork into the [SG Rewritten Project](https://sgrewritten.org)
- *This fork is now the maintained legacy branch of the Stargate Rewritten Project*.
- - This plugin will be superseded in the near future by Stargate Rewritten,
a collaborative effort to wholly rewrite and reimagine Drakia's code base.
+ - This plugin will be superseded in the near future by Stargate Rewritten,
a collaborative effort to wholly
+ rewrite and reimagine Drakia's code base.
- Changed the `E` flag to `V`, to improve consistency for the rewrite.
- Reworked the readme and changed some shortcuts
#### [Version 0.10.X.X] LCLO fork
-- Reimplemented/merged the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-Bukkit/tree/legacy), notably:
- - Added material #tag support
- - Expanded legacy migration support
- - Changed MSV to 1.16
- - Added a new default gate file
- - Added bstats
-> **NOTE: The LCLO fork has its own changelog, found [here](https://github.com/stargate-rewritten/Stargate-Bukkit/blob/legacy/README.md#changes)!**
-For brevity, the full list has been excluded from the below.
-In general, it is safe to assume **FULL LCLO PARITY** as of this version.
+
+- Reimplemented/merged the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-Bukkit/tree/legacy),
+ notably:
+ - Added material #tag support
+ - Expanded legacy migration support
+ - Changed MSV to 1.16
+ - Added a new default gate file
+ - Added bstats
+
+> **NOTE: The LCLO fork has its own changelog,
+found [here](https://github.com/stargate-rewritten/Stargate-Bukkit/blob/legacy/README.md#changes)!**
+> For brevity, the full list has been excluded from the below.
+> In general, it is safe to assume **FULL LCLO PARITY** as of this version.
#### [Version 0.9.4.2] EpicKnarvik97 fork
+
- Prevents improperly loaded dependencies from causing problems with SG.
- Improved Dynmap integration and associated bug fixes.
- Fixes for some issues surrounding end portals.
#### \[Version 0.9.4.1] EpicKnarvik97 fork
+
- Adds integration with [Dynmap](https://www.spigotmc.org/resources/dynmap%C2%AE.274/)
#### \[Version 0.9.4.0] EpicKnarvik97 fork
@@ -506,12 +561,12 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
#### \[Version 0.9.3.7] EpicKnarvik97 fork
- Added a Japanese localisation courtesy of `furplag`.
-*For more info translation status, please see [this](sgrewritten.org/translate)*.
+ *For more info translation status, please see [this](https://sgrewritten.org/translate)*.
#### \[Version 0.9.3.6] EpicKnarvik97 fork
- Added a Chinese (simplified) localisation courtesy of `YKDZ`.
-*For more info translation status, please see [this](sgrewritten.org/translate)*.
+ *For more info translation status, please see [this](https://sgrewritten.org/translate)*.
#### \[Version 0.9.3.5] EpicKnarvik97 fork
@@ -522,10 +577,13 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
- Entities will now teleport with any passengers they may have.
- Significantly optimised the plugin's CPU usage.
-- Added an alternative transportation method to resolve a CraftBook incompatibility, and an associated config toggle (`enableCraftBookRemoveOnEjectFix`).
-- Added a config option (`waitForPlayerAfterTeleportDelay`) to allow users to specify the delay between vehicle teleportation and player teleportation.
+- Added an alternative transportation method to resolve a CraftBook incompatibility, and an associated config
+ toggle (`enableCraftBookRemoveOnEjectFix`).
+- Added a config option (`waitForPlayerAfterTeleportDelay`) to allow users to specify the delay between vehicle
+ teleportation and player teleportation.
#### \[Version 0.9.3.3] EpicKnarvik97 fork
+
- Prevents Zombified Piglins from spawning at stargates with `nether-portal` irises.
#### \[Version 0.9.3.2] EpicKnarvik97 fork
@@ -541,11 +599,11 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
#### \[Version 0.9.3.0] EpicKnarvik97 fork
- Adds full support for the new sign colour features:
- - Sign colours may now be specified through the use of RGB colour codes.
- - Signs may now be dyed and/or glow-inked
- - Colours may now be specified per sign type.
+ - Sign colours may now be specified through the use of RGB colour codes.
+ - Signs may now be dyed and/or glow-inked
+ - Colours may now be specified per sign type.
- Adds the "sg config" command to allow users to easily change a given sign's RGB colours.
- - One new option for this is "inverse", which inverts the default colour for a specific sign.
+ - One new option for this is "inverse", which inverts the default colour for a specific sign.
#### \[Version 0.9.2.5] EpicKnarvik97 fork
@@ -554,7 +612,8 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
#### \[Version 0.9.2.4] EpicKnarvik97 fork
-- Adds update checker, which will (optionally) display a notice in console and admins whenever a new SG update is available.
+- Adds update checker, which will (optionally) display a notice in console and admins whenever a new SG update is
+ available.
- Adds a config toggle (`adminUpdateAlert`) to disable the above.
#### \[Version 0.9.2.3] EpicKnarvik97 fork
@@ -591,7 +650,7 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
- Refactors the configuration loading systems as to facilitate the below:
- Added the `sg config` command, to allow for all config values to be changed in-game by users with permission.
- - The relevant permission is `stargate.admin.config`.
+ - The relevant permission is `stargate.admin.config`.
#### \[Version 0.9.0.7] EpicKnarvik97 fork
@@ -607,7 +666,7 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
- Prevents a bug where buttons could incorrect overwrite materials.
- Adds an additional default gate as to explain multi-material stargates.
- Adds the `V` flag (hides the stargate's sign -- right-clicking will display the relevant information in chat).
- - This is presented as an alternative for the `B` flag.
+ - This is presented as an alternative for the `B` flag.
- Fixes a bug where, in certain circumstances, signs could become unbreakable.
- Improves how waterlogging is handled.
- Right-clicking a stargate's frame will now display information in chat.
@@ -615,9 +674,9 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
#### \[Version 0.9.0.5] EpicKnarvik97 fork
- Adds configuration toggles for:
- - Whether or not living non-player entities may be teleported.
- - Whether or not vehicles may teleport without a player riding them.
- - Whether or not vehicles may teleport living non-player entities if accompanied by a player rider.
+ - Whether or not living non-player entities may be teleported.
+ - Whether or not vehicles may teleport without a player riding them.
+ - Whether or not vehicles may teleport living non-player entities if accompanied by a player rider.
- Fixes a bug that could result in unauthorised teleportation.
- Fixes a bug that, in certain circumstances, could result in chat spam.
@@ -637,21 +696,22 @@ In general, it is safe to assume **FULL LCLO PARITY** as of this version.
#### \[Version 0.9.0.1] EpicKnarvik97 fork
-- Added coloured highlight patterns to signs: `highlightSignColor` has been added, and `signColor` has been renamed to `mainSignColor`.
+- Added coloured highlight patterns to signs: `highlightSignColor` has been added, and `signColor` has been renamed
+ to `mainSignColor`.
- Addressed some inconsistencies in sign coloring by using the highlight color for all markings
- Fixed some issues pertaining to configuration handling and management.
#### \[Version 0.9.0.0] EpicKnarvik97 fork
- Significantly refactored the legacy codebase for readability and quality.
- - Added developer documentation.
+ - Added developer documentation.
- Changed the package to net.knarcraft.stargate.*
- Improved localisations and their handling.
- - Added several new translations.
+ - Added several new translations.
- Fixed some encoding problems.
- Added some missing dependencies, updated the project's plugin file.
- Made underwater portals practical by reworking activator materials and adding support for waterlogging.
-- Updated the vehicle teleportation code to work in modern versions of the game, and addressed CVE-2021-43819.
+- Updated the vehicle teleportation code to work in modern versions of the game, and addressed CVE-2021-43819.
- Updated boat teleportation to account for multi-passenger vehicles.
- Added support for passengers and leashed entities.
- Fixed some issues surrounding block states and data (notably, nether portals and end gateways).
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index b8d6dbc..a84b5ce 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,31 +1,171 @@
-# stargate Configuration File
-# Main stargate config
+# Version: ${project.version}
+# +--------------▄▄▄-- ‚——. -▄--▄-▄--▄-▄-▄▄▄▄▄---------------------------------------------------+ #
+# | █▄▄▀ (“‡‡”) █▄▄▀ █▄▄▀ █ █ Support available at: sgrewritten.org/discord | #
+# | █▄▄█ \__/ █ █ █ █ █ █ ‚-. | #
+# | —————————————————————————————————————————————————— ((_)) —————————————————— | #
+# | ‘-’ | #
+# | .|'''.| |''||''| | '||''|. ..|'''.| | |''||''| '||''''| | #
+# | ||.. ' || ||| || || .|' ' ||| || || . | #
+# | ''|||. || | || ||''|' || .... | || || ||''| | #
+# | . '|| || .''''|. || |. '|. || ;’ |. || || | #
+# | '....|' .||. .|. .||. .||. '|' ''|...'| .|. .||. .||. .||.....| | #
+# +----------------------------------------------------------------------------------------------+ #
+# | UNIFIED LEGACY BRANCH | #
+# +----------------------------------------------+-----------------------------------------------+ #
+# | Documentation: sgrewritten.org/legacywiki | Bug Reports: sgrewritten.org/report | #
+# +----------------------------------------------+-----------------------------------------------+ #
-# language - The language file to load for messages (de,en,es,fr,hu,it,ja,nb-no,nl,nn-no,pt-br,ru,zh_cn)
+# +----------------------------------------------------------------------------------------------+ #
+# | General Preferences | #
+# +----------------------------------------------------------------------------------------------+ #
+
+# What language will stargate use when communicating with your users?
+# Supported values: [de, en, es, fr, hu, it, ja, nb-no, nl, nn-no, pt-br, ru, zh-cn]
+#
+# If SG isn't yet available in your language, please consider adding a translation:
+# https://sgrewritten.org/translate
+# For more information on language codes, see ISO 639-1: https://git.io/JcwaI
language: en
-# adminUpdateAlert - Whether to alert admins about new plugin updates
+
+# Would you like to us to notify admin users when new StarGate updates are available?
adminUpdateAlert: true
-folders:
- # portalFolder - The folder for storing portals
- portalFolder: plugins/Stargate/portals/
- # gateFolder - The folder for storing gate layouts
- gateFolder: plugins/Stargate/gates/
+
+# +----------------------------------------------------------------------------------------------+ #
+# | Compatibility | #
+# +----------------------------------------------------------------------------------------------+ #
+dynmap:
+ # Should StarGate enable integration with Dynmap? This will show StarGates on your map.
+ enableDynmap: true
+
+ # Should StarGate icons be hidden by default? (must users manually enable their checkbox?)
+ dynmapIconsHiddenByDefault: true
+
gates:
- # maxGatesEachNetwork - The maximum number of gates allowed on a network - 0 for unlimited
+ functionality:
+ # Should an alternative (and less effective) teleportation script be used to teleport vehicles?
+ # This will fix an incompatibility with CraftBook, but will cause vehicles' data to be wiped on teleportation.
+ enableCraftBookRemoveOnEjectFix: false
+
+ # +----------------------------------------------------------------------------------------------+ #
+ # | Gate Behaviour | #
+ # +----------------------------------------------------------------------------------------------+ #
+
+ # Are you connected to a BungeeCord-compatible proxy?
+ # Set this value to true if you intend on building gates with the 'u' flag.
+ enableBungee: false
+
+ # Will vehicles and their passengers be able to travel through StarGate portals?
+ # [minecarts, boats, & saddled mobs = vehicles | players & mobs = passengers]
+ handleVehicles: true
+
+ # Should vehicles without any passengers be allowed to go through a StarGate?
+ handleEmptyVehicles: true
+
+ # Should StarGate teleport creatures through portals?
+ # For example, if a player and a mob are in a boat, should the teleportation be allowed?
+ handleCreatureTransportation: true
+
+ # If handleCreatureTransportation is true, must the player be present?
+ # I.e., can a mob in a vehicle go through a gate on its own?
+ handleNonPlayerVehicles: true
+
+ # Should StarGate also handle creatures attached to a player via a lead?
+ handleLeashedCreatures: true
+
+ # What is the maximum number of gates a single network may contain? (0 for unlimited)
maxGatesEachNetwork: 0
- # defaultGateNetwork - The default gate network
+
+ # What network will be used when none has been specified? (Max length 12 characters)
+ #
+ # Note that this primarily applies to users with the stargate.create.network node.
+ # Generally, that node is given to staff (we recommend stargate.create.personal for users).
defaultGateNetwork: central
- # exitVelocity - The velocity to give players exiting stargates, relative to the entry velocity
+
+
+ # At what speed should players be sent out of portals?
+ # When exiting a gate, players retain their original movement velocity, multiplied by this value.
exitVelocity: 0.1
+
+ integrity:
+
+ # Can StarGates be broken via an explosion?
+ # [tnt, creepers, etc.]
+ destroyedByExplosion: false
+
+ # Will the server re-verify all existing portals on startup?
+ #
+ # This checks that the expected gates are both present and using a valid layout.
+ # Designed to catch .gate file modifications, world changes, and terrain regeneration.
+ #
+ # …««»»… If you set this to true, you should also set protectEntrance (below) to true!
+ # “NOTE” Otherwise, disallowed players, block updates, and snowmen can invalidate your portals!
+ verifyPortals: false
+
+ # Should the portal verification process account for 𝑡𝑟𝑎𝑣𝑒𝑟𝑠𝑎𝑏𝑙𝑒 (open/closed) materials?
+ # i.e. will a gate still validate if its portal-open material isn't present?
+ #
+ # This is more resource intensive, and should really only be used if verifyPortals is true.
+ # Or if using an easily destroyable open/closed material.
+ protectEntrance: false
+
+# +----------------------------------------------------------------------------------------------+ #
+# | Economy | #
+# +----------------------------------------------------------------------------------------------+ #
+economy:
+ # Will StarGate interact with your server's economy?
+ #
+ # …««»»… For these features, StarGate depends on the Vault plugin.
+ # “NOTE” https://www.spigotmc.org/resources/vault.34315/
+ useEconomy: false
+
+ # How much will be deducted from players' accounts when creating a new gate?
+ createCost: 0
+
+ # How much will be deducted from players' accounts when destroying an existing gate?
+ destroyCost: 0
+
+ # How much will be deducted from players' accounts when using a stargate to teleport?
+ # This does not apply to stargates with the 'f' flag.
+ useCost: 0
+
+ # Will fees collected for ‘usecost’ be paid to whomever created (owns) the applicable stargate?
+ # If false, collected funds will be deleted.
+ toOwner: false
+
+ # Will ‘createcost’ still be charged if the new gate's destination is a gate with the 'f' flag?
+ # Note that this only applies to fixed gates.
+ chargeFreeDestination: true
+
+ # +----------------------------------------------------------------------------------------------+ #
+ # | Aesthetic Tweaks | #
+ # +----------------------------------------------------------------------------------------------+ #
+
+ # When scrolling through a networked portal's destination list, should SG color free gates?
+ freeGatesColored: false
+
+ # If freeGatesColored is true, which color should SG use?
+ #
+ # All color names should follow this format:
+ # https://hub.spigotmc.org/javadocs/spigot/org/bukkit/ChatColor.html
+ freeGatesColor: DARK_GREEN
+
cosmetic:
- # rememberDestination - Whether to remember the cursor location between uses
+ # Will the destination a networked portal last connected to be listed first in its scroll menu?
rememberDestination: false
- # sortNetworkDestinations - Whether to sort network lists alphabetically
+
+ # For networked gates, are destinations listed alphabetically instead of chronologically?
+ # (This applies to all non-fixed and non-random gates).
sortNetworkDestinations: false
- # mainSignColor - The color used for drawing signs (Default: BLACK).
+
+ # What color will StarGate use for the text on gate signs?
+ # Note that players can override this with DYE and/or GLOW_INK_SAC
mainSignColor: BLACK
- # highlightSignColor - The color used for sign markings (Default: WHITE)
+
+ # What color will StarGate use to accent the above text?
highlightSignColor: WHITE
+
+ # Text and highlight colors can be modified on a per-sign basis (below).
+ # Format: 'SIGN_TYPE:mainSignColor,highlightSignColor'
perSignColors:
- 'ACACIA:default,default'
- 'BIRCH:default,default'
@@ -35,73 +175,41 @@ gates:
- 'OAK:default,default'
- 'SPRUCE:inverted,inverted'
- 'WARPED:inverted,inverted'
- integrity:
- # destroyedByExplosion - Whether to destroy gates with explosions (Creeper, TNT, etc.)
- destroyedByExplosion: false
- # verifyPortals - Whether all the non-sign blocks are checked to match the gate layout when a stargate is loaded.
- verifyPortals: false
- # protectEntrance - Whether to protect gate entrance material (More resource intensive. Only enable if using
- # destroyable open/closed material)
- protectEntrance: false
- functionality:
- enableBungee: false
- # handleVehicles - Whether to allow vehicles through gates. This overrides other vehicle settings
- handleVehicles: true
- # handleEmptyVehicles - Whether to allow empty vehicles through gates (chest/hopper/tnt/furnace minecarts included)
- handleEmptyVehicles: true
- # handleCreatureTransportation - Whether to allow players to transport creatures by sending vehicles (minecarts,
- # boats) through gates
- handleCreatureTransportation: true
- # handleNonPlayerVehicles - Whether to allow vehicles with a passenger which is not a player through gates.
- # handleCreatureTransportation must be enabled
- handleNonPlayerVehicles: true
- # handleLeashedCreatures - Whether to allow creatures lead by a player to teleport with the player
- handleLeashedCreatures: true
- # enableCraftBookRemoveOnEjectFix - Whether to enable a fix that causes loss of NBT data, but allows vehicle
- # teleportation to work when CraftBook's remove minecart/boat on eject setting is enabled
- enableCraftBookRemoveOnEjectFix: false
-# ######################## #
-# stargate economy options #
-# ######################## #
-economy:
- # useEconomy - Whether to use an economy plugin
- useEconomy: false
- # createCost - The cost to create a gate
- createCost: 0
- # destroyCost - The cost to destroy a gate
- destroyCost: 0
- # useCost - The cost to use a gate
- useCost: 0
- # toOwner - Whether the charge for using a gate goes to the gate's owner
- toOwner: false
- # chargeFreeDestination - Whether a gate whose destination is a free gate is still charged
- chargeFreeDestination: true
- # freeGatesColored - Whether a free gate in the destination list is marked with a color
- freeGatesColored: false
- # freeGatesColor - The color to use for marking free gates
- freeGatesColor: DARK_GREEN
+# +----------------------------------------------------------------------------------------------+ #
+# | Technical | #
+# +----------------------------------------------------------------------------------------------+ #
-# ############# #
-# Debug options #
-# ############# #
+# | [ Storage ] | #
+# |__ These settings are provided to customise how SG stores its data. __| #
+folders:
+ # Currently, all valid gates, their details, and their owners, are stored in a flatfile database
+ # Where should that flatfile be stored?
+ #
+ # This option is provided as a patch to allow data to be imported from some older forks.
+ portalFolder: plugins/Stargate/portals/
+
+ # Currently, on startup, a folder is checked for gate layouts stored as ‘.gate’ files.
+ # Where is that folder?
+ #
+ # This option is provided as a patch to allow data to be imported from some older forks.
+ gateFolder: plugins/Stargate/gates/
+
+# | [ Debug ] | #
+# |__ These settings are provided to help developers diagnose issues with this plugin. __| #
debugging:
- # debug - Debug -- Only enable if you have issues, massive console output
+ # Should SG spam console with A LOT of technical information?
+ # This includes checks, events, etc.
debug: false
- # permissionDebug - This will output any and all Permissions checks to console, used for permissions debugging
- # (Requires debug: true)
+
+ # Should SG spam console with A LOT of permission-based information?
+ # This visualises how stargate determines what players can do.
+ #
+ # Note that (regardless of this setting), permdebug is always hidden when ‘debug’ is false.
permissionDebug: false
-advanced:
- # waitForPlayerAfterTeleportDelay - The amount of ticks to wait before adding a player as passenger of a vehicle.
- # On slow servers, a value of 6 is required to avoid client glitches after teleporting on a vehicle.
- waitForPlayerAfterTeleportDelay: 6
-# ############## #
-# Dynmap options #
-# ############## #
-dynmap:
- # enableDynmap - Whether to display Stargates in Dynmap's map
- enableDynmap: true
- # dynmapIconsHiddenByDefault - Whether to hide the set of Stargate icons by default, requiring users to
- # manually enable them with a checkbox.
- dynmapIconsHiddenByDefault: true
\ No newline at end of file
+advanced:
+ # How long should SG wait before returning players to their vehicles after teleportation?
+ # This is done to prevent possible visual bugs; slower servers need larger values.
+ # In most cases, a value of 6 should be fine.
+ waitForPlayerAfterTeleportDelay: 6
\ No newline at end of file
From b0b31e04fc488fc91a1d15c9a90ef63b0fc76d81 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Wed, 19 Apr 2023 12:40:22 -0400
Subject: [PATCH 023/112] Removed some potentially confusing abbreviations
---
src/main/resources/config.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index a84b5ce..caeac8f 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -51,7 +51,7 @@ gates:
# +----------------------------------------------------------------------------------------------+ #
# Are you connected to a BungeeCord-compatible proxy?
- # Set this value to true if you intend on building gates with the 'u' flag.
+ # Set this value to true if you intend on building gates with the bUngee flag.
enableBungee: false
# Will vehicles and their passengers be able to travel through StarGate portals?
@@ -101,7 +101,7 @@ gates:
# “NOTE” Otherwise, disallowed players, block updates, and snowmen can invalidate your portals!
verifyPortals: false
- # Should the portal verification process account for 𝑡𝑟𝑎𝑣𝑒𝑟𝑠𝑎𝑏𝑙𝑒 (open/closed) materials?
+ # Should the portal verification process account for iris (open/closed) materials?
# i.e. will a gate still validate if its portal-open material isn't present?
#
# This is more resource intensive, and should really only be used if verifyPortals is true.
@@ -125,14 +125,14 @@ economy:
destroyCost: 0
# How much will be deducted from players' accounts when using a stargate to teleport?
- # This does not apply to stargates with the 'f' flag.
+ # This does not apply to stargates with the Free flag.
useCost: 0
# Will fees collected for ‘usecost’ be paid to whomever created (owns) the applicable stargate?
# If false, collected funds will be deleted.
toOwner: false
- # Will ‘createcost’ still be charged if the new gate's destination is a gate with the 'f' flag?
+ # Will ‘createcost’ still be charged if the new gate's destination is a gate with the Free flag?
# Note that this only applies to fixed gates.
chargeFreeDestination: true
From 6737a4f789be87a5843d40a4cb6d21b4a7649125 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 19:00:02 +0200
Subject: [PATCH 024/112] Adds the missing taxAccounts option
---
README.md | 36 +++++++++----------
pom.xml | 2 +-
.../stargate/config/ConfigOption.java | 5 +++
.../stargate/config/EconomyConfig.java | 9 +++++
.../stargate/config/StargateConfig.java | 3 +-
.../stargate/utility/EconomyHelper.java | 32 ++++++++++++++++-
src/main/resources/config-migrations.txt | 3 +-
7 files changed, 68 insertions(+), 22 deletions(-)
diff --git a/README.md b/README.md
index 1c2db98..f1b0258 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@ file; see the LICENSE file for more information.
This plugin should be fully compatible all known versions StarGate forks, with the following exceptions:
-- Any version from outside of the bukkit ecosystem
+- Any version from outside the bukkit ecosystem
- Any version of SGR (version numbers 1.0.0.0+)
- Any configurations with outdated material names (i.e. numIDs)
@@ -173,12 +173,12 @@ Note that colour characters (if enabled) are not counted towards the character l
- You can specify (and create) your own network on the third line of the sign when making a new gate.
- Gates on one network will not see gates on the second network, and vice versa.
- Gates on different worlds, but in the same network, will see each other.
-- Notwithstanding the above, the network for bUngee gates will always be name of its destination /server
+- Notwithstanding the above, the network for BungeeCord gates will always be the name of its destination /server
#### Fixed gates:
- Fixed gates go to only one set destination.
-- Fixed gates can be linked to other fixed gates, or normal gates. A normal gate cannot open a portal to a fixed gate
+- Fixed gates can be linked to other fixed gates, or normal gates. A normal gate cannot open a portal to a fixed gate,
however.
- To create a fixed gate, specify a destination on the second line of the stargate sign.
- Set the 4th line of the stargate sign to `A` to enable an always-open fixed gate.
@@ -204,8 +204,8 @@ Note that colour characters (if enabled) are not counted towards the character l
## Using a gate:
-- Right click the sign to choose a destination (not needed for Fixed gates, undefined gates).
-- Right click the activator to open up a portal.
+- Right-click the sign to choose a destination (not needed for Fixed gates, undefined gates).
+- Right-click the activator to open up a portal.
- Step through.
## Custom Gate Layouts
@@ -225,11 +225,11 @@ destroycost=0
toowner=false
X=OBSIDIAN
-=OBSIDIAN
-XX
+ XX
X..X
-..-
X*.X
-XX
+ XX
```
### Keys
@@ -324,11 +324,11 @@ will appear in your world, with every character representing a block.
```
X=OBSIDIAN
-=OBSIDIAN
-XX
+ XX
X..X
-..-
X*.X
-XX
+ XX
```
This example is a standard nether portal.
@@ -349,18 +349,18 @@ Other special characters include the following:
Gates may be constructed underwater in much the same manner as they may be constructed above the surface.
There are, however, a few considerations for underwater portals:
-```properties
+```
portal-open=KELP_PLANT
portal-closed=WATER
button=BRAIN_CORAL_WALL_FAN
toowner=false
X=SEA_LANTERN
-=SEA_LANTERN
-XX
+ XX
X..X
-..-
X*.X
-XX
+ XX
```
- Buttons can not be waterlogged, and as such, are not ideal: wall coral fans are an ideal substitute.
@@ -379,7 +379,7 @@ as `OBSIDIAN`); they may also use [tags](https://hub.spigotmc.org/javadocs/spigo
as `#WOOL`).
Note that all tags must be prefaced with a hashtag (`#`), as in `#WOOL`.
-```properties
+```
portal-open=WATER
portal-closed=AIR
X=#WOOL
@@ -403,11 +403,11 @@ toowner=false
X=OBSIDIAN
-=GLOWSTONE
A=GLOWSTONE
-XAX
+ XAX
X...X
-...-
X.*.X
-XAX
+ XAX
```
# Configuration
@@ -674,9 +674,9 @@ found [here](https://github.com/stargate-rewritten/Stargate-Bukkit/blob/legacy/R
#### \[Version 0.9.0.5] EpicKnarvik97 fork
- Adds configuration toggles for:
- - Whether or not living non-player entities may be teleported.
- - Whether or not vehicles may teleport without a player riding them.
- - Whether or not vehicles may teleport living non-player entities if accompanied by a player rider.
+ - Whether living non-player entities may be teleported.
+ - Whether vehicles may teleport without a player riding them.
+ - Whether vehicles may teleport living non-player entities if accompanied by a player rider.
- Fixes a bug that could result in unauthorised teleportation.
- Fixes a bug that, in certain circumstances, could result in chat spam.
diff --git a/pom.xml b/pom.xml
index 4869d0c..de1c04b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -113,7 +113,7 @@
org.apache.maven.plugins
maven-shade-plugin
3.4.1
-
+
false
diff --git a/src/main/java/net/knarcraft/stargate/config/ConfigOption.java b/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
index e12ea59..1747bae 100644
--- a/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
+++ b/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
@@ -150,6 +150,11 @@ public enum ConfigOption {
CHARGE_FREE_DESTINATION("economy.chargeFreeDestination",
"Whether to require payment if the destination is free, but the entrance stargate is not", true),
+ /**
+ * The account to transfer all paid fees to
+ */
+ TAX_ACCOUNT("economy.taxAccount", "The UUID of the account all fees are paid to (except for money to the Stargate owner)", ""),
+
/**
* Whether to mark free gates with a different color
*/
diff --git a/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java b/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java
index 1b8400c..b3b5d34 100644
--- a/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java
@@ -132,6 +132,15 @@ public final class EconomyConfig {
return (Integer) configOptions.get(ConfigOption.DESTROY_COST);
}
+ /**
+ * Gets the account all taxes are paid to
+ *
+ * @return The account all taxes are paid to
+ */
+ public String getTaxAccount() {
+ return (String) configOptions.get(ConfigOption.TAX_ACCOUNT);
+ }
+
/**
* Checks whether the given player can afford the given fee
*
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index f03b852..99b0096 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -364,7 +364,8 @@ public final class StargateConfig {
FileConfiguration newConfig = Stargate.getInstance().getConfig();
boolean isMigrating = false;
- if (newConfig.getString("lang") != null || newConfig.getString("economy.freeGatesGreen") != null) {
+ if (newConfig.getString("lang") != null || newConfig.getString("economy.freeGatesGreen") != null ||
+ newConfig.getString("economy.taxAccount") == null) {
migrateConfig(newConfig);
isMigrating = true;
}
diff --git a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java
index 6c58e52..4c725ae 100644
--- a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java
@@ -7,6 +7,7 @@ import net.knarcraft.stargate.portal.Portal;
import net.knarcraft.stargate.portal.property.PortalOwner;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
+import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.UUID;
@@ -186,6 +187,28 @@ public final class EconomyHelper {
return true;
}
+ /**
+ * Transfers the given fees to the tax account
+ *
+ * @param economy The economy to use
+ * @param cost The cost to transfer
+ */
+ @SuppressWarnings("deprecation")
+ private static void transferFees(Economy economy, int cost) {
+ String accountName = Stargate.getEconomyConfig().getTaxAccount();
+ if (accountName == null || accountName.isEmpty()) {
+ return;
+ }
+
+ try {
+ UUID accountId = UUID.fromString(accountName);
+ OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(accountId);
+ economy.depositPlayer(offlinePlayer, cost);
+ } catch (IllegalArgumentException exception) {
+ economy.depositPlayer(accountName, cost);
+ }
+ }
+
/**
* Charges the player for an action, if required
*
@@ -198,7 +221,14 @@ public final class EconomyHelper {
return true;
}
//Charge player
- return chargePlayer(player, cost);
+ boolean charged = chargePlayer(player, cost);
+
+ // Transfer the charged amount to the tax account
+ if (charged) {
+ transferFees(Stargate.getEconomyConfig().getEconomy(), cost);
+ }
+
+ return charged;
}
/**
diff --git a/src/main/resources/config-migrations.txt b/src/main/resources/config-migrations.txt
index cad71cb..b898212 100644
--- a/src/main/resources/config-migrations.txt
+++ b/src/main/resources/config-migrations.txt
@@ -46,5 +46,6 @@ portal-open=
portal-closed=
cost-type=
cost-to-activate=
-taxaccount=taxAccount
+taxAccount=economy.taxAccount
+taxaccount=economy.taxAccount
usevault=
\ No newline at end of file
From c3752db99bb21f2ed1b5bc0b5fac82d8add2ecd8 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 20:03:23 +0200
Subject: [PATCH 025/112] Adds a custom configuration to retain comments
---
.../java/net/knarcraft/stargate/Stargate.java | 35 +++-
.../stargate/command/CommandConfig.java | 4 +-
.../stargate/config/StargateConfig.java | 2 +-
.../config/StargateYamlConfiguration.java | 155 ++++++++++++++++++
src/main/resources/config-migrations.txt | 4 +-
5 files changed, 193 insertions(+), 7 deletions(-)
create mode 100644 src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 3fea320..d1d44f5 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -7,6 +7,7 @@ import net.knarcraft.stargate.config.EconomyConfig;
import net.knarcraft.stargate.config.MessageSender;
import net.knarcraft.stargate.config.StargateConfig;
import net.knarcraft.stargate.config.StargateGateConfig;
+import net.knarcraft.stargate.config.StargateYamlConfiguration;
import net.knarcraft.stargate.container.BlockChangeRequest;
import net.knarcraft.stargate.container.ChunkUnloadRequest;
import net.knarcraft.stargate.listener.BlockEventListener;
@@ -26,6 +27,7 @@ import net.knarcraft.stargate.thread.StarGateThread;
import net.knarcraft.stargate.utility.BStatsHelper;
import org.bukkit.Server;
import org.bukkit.command.PluginCommand;
+import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
@@ -34,6 +36,7 @@ import org.bukkit.plugin.java.JavaPluginLoader;
import org.bukkit.scheduler.BukkitScheduler;
import java.io.File;
+import java.io.IOException;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
@@ -70,6 +73,7 @@ along with this program. If not, see .
@SuppressWarnings("unused")
public class Stargate extends JavaPlugin {
+ private static File configFile;
private static final Queue blockChangeRequestQueue = new LinkedList<>();
private static final Queue chunkUnloadQueue = new PriorityQueue<>();
@@ -79,6 +83,7 @@ public class Stargate extends JavaPlugin {
private static PluginManager pluginManager;
private static StargateConfig stargateConfig;
private static String updateAvailable = null;
+ private FileConfiguration configuration;
/**
* Empty constructor necessary for Spigot
@@ -330,6 +335,26 @@ public class Stargate extends JavaPlugin {
return stargateConfig.getEconomyConfig();
}
+ /**
+ * Gets the raw configuration
+ *
+ * @return The raw configuration
+ */
+ public FileConfiguration getConfiguration() {
+ return this.configuration;
+ }
+
+ @Override
+ public void reloadConfig() {
+ super.reloadConfig();
+ this.configuration = new StargateYamlConfiguration();
+ try {
+ configuration.load(configFile);
+ } catch (IOException | InvalidConfigurationException e) {
+ Stargate.logSevere(e.getMessage());
+ }
+ }
+
@Override
public void onDisable() {
PortalHandler.closeAllPortals();
@@ -340,11 +365,17 @@ public class Stargate extends JavaPlugin {
@Override
public void onEnable() {
+ configFile = new File(this.getDataFolder(), "config.yml");
PluginDescriptionFile pluginDescriptionFile = this.getDescription();
pluginManager = getServer().getPluginManager();
- FileConfiguration newConfig = this.getConfig();
+ configuration = new StargateYamlConfiguration();
+ try {
+ configuration.load(configFile);
+ } catch (IOException | InvalidConfigurationException e) {
+ Stargate.logSevere(e.getMessage());
+ }
this.saveDefaultConfig();
- newConfig.options().copyDefaults(true);
+ configuration.options().copyDefaults(true);
logger = Logger.getLogger("Minecraft");
Server server = getServer();
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandConfig.java b/src/main/java/net/knarcraft/stargate/command/CommandConfig.java
index 6374518..2ae0691 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandConfig.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandConfig.java
@@ -66,7 +66,7 @@ public class CommandConfig implements CommandExecutor {
* @param value The new value of the config option
*/
private void updateConfigValue(ConfigOption selectedOption, CommandSender commandSender, String value) {
- FileConfiguration configuration = Stargate.getInstance().getConfig();
+ FileConfiguration configuration = Stargate.getInstance().getConfiguration();
//Validate any sign colors
if (ConfigTag.COLOR.isTagged(selectedOption)) {
@@ -162,7 +162,7 @@ public class CommandConfig implements CommandExecutor {
* @param arguments The arguments for the new config option
*/
private void updateListConfigValue(ConfigOption selectedOption, CommandSender commandSender, String[] arguments) {
- FileConfiguration configuration = Stargate.getInstance().getConfig();
+ FileConfiguration configuration = Stargate.getInstance().getConfiguration();
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
if (arguments.length < 4) {
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 99b0096..ea8598d 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -361,7 +361,7 @@ public final class StargateConfig {
*/
public void loadConfig() {
Stargate.getInstance().reloadConfig();
- FileConfiguration newConfig = Stargate.getInstance().getConfig();
+ FileConfiguration newConfig = Stargate.getInstance().getConfiguration();
boolean isMigrating = false;
if (newConfig.getString("lang") != null || newConfig.getString("economy.freeGatesGreen") != null ||
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
new file mode 100644
index 0000000..2b5f751
--- /dev/null
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -0,0 +1,155 @@
+package net.knarcraft.stargate.config;
+
+import org.bukkit.configuration.InvalidConfigurationException;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A YAML configuration which keeps all comments
+ *
+ * @author Thorin
+ */
+public class StargateYamlConfiguration extends YamlConfiguration {
+
+ static public final String END_OF_COMMENT = "_endOfComment_";
+ static public final String START_OF_COMMENT = "comment_";
+
+ @Override
+ public @NotNull String saveToString() {
+ return this.convertYAMLMappingsToComments(super.saveToString());
+ }
+
+ @Override
+ public void loadFromString(@NotNull String contents) throws InvalidConfigurationException {
+ super.loadFromString(this.convertCommentsToYAMLMappings(contents));
+ }
+
+ /**
+ * Reads a file with comments, and recreates them into yaml mappings
+ *
+ * A mapping follows this format: comment_{CommentNumber}: "The comment"
+ * This needs to be done as comments otherwise get removed using
+ * the {@link FileConfiguration#save(File)} method. The config
+ * needs to be saved if a config value has changed.
+ */
+ private String convertCommentsToYAMLMappings(String configString) {
+ StringBuilder yamlBuilder = new StringBuilder();
+ List currentComment = new ArrayList<>();
+ int commentId = 0;
+
+ for (String line : configString.split("\n")) {
+ if (line.trim().startsWith("#")) {
+ //Temporarily store the comment line
+ currentComment.add(line.trim().replaceFirst("#", ""));
+ } else {
+ //Write the full formatted comment to the StringBuilder
+ if (!currentComment.isEmpty()) {
+ int indentation = getIndentation(line);
+ generateCommentYAML(yamlBuilder, currentComment, commentId++, indentation);
+ currentComment = new ArrayList<>();
+ }
+ //Add the non-comment line assuming it isn't empty
+ if (!line.trim().isEmpty()) {
+ yamlBuilder.append(line).append("\n");
+ }
+ }
+ }
+ return yamlBuilder.toString();
+ }
+
+ /**
+ * Generates a YAML-compatible string for one comment block
+ *
+ * @param yamlBuilder The string builder to add the generated YAML to
+ * @param commentLines The lines of the comment to convert into YAML
+ * @param commentId The unique id of the comment
+ * @param indentation The indentation to add to every line
+ */
+ private void generateCommentYAML(StringBuilder yamlBuilder, List commentLines, int commentId, int indentation) {
+ String subIndentation = this.addIndentation(indentation + 2);
+ //Add the comment start marker
+ yamlBuilder.append(this.addIndentation(indentation)).append(START_OF_COMMENT).append(commentId).append(": |\n");
+ for (String commentLine : commentLines) {
+ //Add each comment line with the proper indentation
+ yamlBuilder.append(subIndentation).append(commentLine).append("\n");
+ }
+ //Add the comment end marker
+ yamlBuilder.append(subIndentation).append(subIndentation).append(END_OF_COMMENT).append("\n");
+ }
+
+ /**
+ * Converts the internal YAML mapping format to a readable config file
+ *
+ * The internal YAML structure is converted to a string with the same format as a standard configuration file.
+ * The internal structure has comments in the format: START_OF_COMMENT + id + multi-line YAML string +
+ * END_OF_COMMENT.
+ *
+ * @param yamlString A string using the YAML format
+ * @return The corresponding comment string
+ */
+ private String convertYAMLMappingsToComments(String yamlString) {
+ StringBuilder finalText = new StringBuilder();
+ boolean isReadingCommentBlock = false;
+ int commentIndentation = 0;
+ for (String line : yamlString.split("\n")) {
+ String possibleComment = line.trim();
+
+ if (isReadingCommentBlock && line.contains(END_OF_COMMENT)) {
+ //Skip the line signifying the end of a comment
+ isReadingCommentBlock = false;
+ } else if (possibleComment.startsWith(START_OF_COMMENT)) {
+ //Skip the comment start line, and start comment parsing
+ isReadingCommentBlock = true;
+ //Get the indentation to use for the comment block
+ commentIndentation = getIndentation(line);
+ //Add an empty line before every comment block
+ finalText.append("\n");
+ } else if (line.isEmpty() && !isReadingCommentBlock) {
+ //Output the empty line as-is, as it's not part of a comment
+ finalText.append("\n");
+ } else if (isReadingCommentBlock) {
+ //Output the comment with correct indentation
+ finalText.append(addIndentation(commentIndentation)).append("# ").append(possibleComment).append("\n");
+ } else {
+ //Output the configuration key
+ finalText.append(line).append("\n");
+ }
+ }
+ return finalText.toString().trim();
+ }
+
+ /**
+ * Gets a string containing the given indentation
+ *
+ * @param indentationSpaces The number spaces to use for indentation
+ * @return A string containing the number of spaces specified
+ */
+ private String addIndentation(int indentationSpaces) {
+ return " ".repeat(Math.max(0, indentationSpaces));
+ }
+
+
+ /**
+ * Gets the indentation (number of spaces) of the given line
+ *
+ * @param line The line to get indentation of
+ * @return The number of spaces in the line's indentation
+ */
+ private int getIndentation(String line) {
+ int spacesFound = 0;
+ for (char aCharacter : line.toCharArray()) {
+ if (aCharacter == ' ') {
+ spacesFound++;
+ } else {
+ break;
+ }
+ }
+ return spacesFound;
+ }
+
+}
diff --git a/src/main/resources/config-migrations.txt b/src/main/resources/config-migrations.txt
index b898212..43893cd 100644
--- a/src/main/resources/config-migrations.txt
+++ b/src/main/resources/config-migrations.txt
@@ -1,5 +1,5 @@
lang=language
-defaultNetwork=defaultGateNetwork
+defaultNetwork=gates.defaultGateNetwork
use-mysql=
ignoreEntrance=
enableEconomy=economy.useEconomy
@@ -17,7 +17,7 @@ sortLists=gates.cosmetic.sortNetworkDestinations
protectEntrance=gates.integrity.protectEntrance
enableBungee=gates.functionality.enableBungee
verifyPortals=gates.integrity.verifyPortals
-signColor=gates.cosmetic.signColor
+signColor=gates.cosmetic.mainSignColor
gates.cosmetic.signColor=gates.cosmetic.mainSignColor
debug=debugging.debug
permdebug=debugging.permissionDebug
From 032a4df4d770505c64ad54233348eec1ceb8b26a Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 20:51:35 +0200
Subject: [PATCH 026/112] Overrides saving
---
src/main/java/net/knarcraft/stargate/Stargate.java | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index d1d44f5..e4ef6c1 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -355,6 +355,16 @@ public class Stargate extends JavaPlugin {
}
}
+ @Override
+ public void saveConfig() {
+ super.saveConfig();
+ try {
+ configuration.save(configFile);
+ } catch (IOException e) {
+ logSevere(e.getMessage());
+ }
+ }
+
@Override
public void onDisable() {
PortalHandler.closeAllPortals();
From 24b62ec74919b2382d1d94194785e9f77355a7e2 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 22:17:29 +0200
Subject: [PATCH 027/112] Attempts to properly comment migrated config values
Note that for some reason, YamlConfiguration cannot load the output created by StargateYamlConfiguration causing a major crash
---
.../java/net/knarcraft/stargate/Stargate.java | 28 +++++++++-----
.../stargate/config/StargateConfig.java | 37 +++++++++++++++----
.../config/StargateYamlConfiguration.java | 6 +++
3 files changed, 54 insertions(+), 17 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index e4ef6c1..0102695 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -25,6 +25,7 @@ import net.knarcraft.stargate.thread.BlockChangeThread;
import net.knarcraft.stargate.thread.ChunkUnloadThread;
import net.knarcraft.stargate.thread.StarGateThread;
import net.knarcraft.stargate.utility.BStatsHelper;
+import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.InvalidConfigurationException;
@@ -73,7 +74,7 @@ along with this program. If not, see .
@SuppressWarnings("unused")
public class Stargate extends JavaPlugin {
- private static File configFile;
+ private static final String configFileName = "config.yml";
private static final Queue blockChangeRequestQueue = new LinkedList<>();
private static final Queue chunkUnloadQueue = new PriorityQueue<>();
@@ -247,7 +248,14 @@ public class Stargate extends JavaPlugin {
* @param message The message to log
*/
private static void log(Level severity, String message) {
- logger.log(severity, getBackupString("prefix") + message);
+ if (logger == null) {
+ logger = Bukkit.getLogger();
+ }
+ if (getInstance() == null) {
+ logger.log(severity, "[Stargate]: " + message);
+ } else {
+ logger.log(severity, getBackupString("prefix") + message);
+ }
}
/**
@@ -349,9 +357,9 @@ public class Stargate extends JavaPlugin {
super.reloadConfig();
this.configuration = new StargateYamlConfiguration();
try {
- configuration.load(configFile);
+ configuration.load(new File(getDataFolder(), configFileName));
} catch (IOException | InvalidConfigurationException e) {
- Stargate.logSevere(e.getMessage());
+ e.printStackTrace();
}
}
@@ -359,9 +367,9 @@ public class Stargate extends JavaPlugin {
public void saveConfig() {
super.saveConfig();
try {
- configuration.save(configFile);
+ configuration.save(new File(getDataFolder(), configFileName));
} catch (IOException e) {
- logSevere(e.getMessage());
+ e.printStackTrace();
}
}
@@ -375,16 +383,16 @@ public class Stargate extends JavaPlugin {
@Override
public void onEnable() {
- configFile = new File(this.getDataFolder(), "config.yml");
+ this.saveDefaultConfig();
+ this.getConfig();
PluginDescriptionFile pluginDescriptionFile = this.getDescription();
pluginManager = getServer().getPluginManager();
configuration = new StargateYamlConfiguration();
try {
- configuration.load(configFile);
+ configuration.load(new File(getDataFolder(), configFileName));
} catch (IOException | InvalidConfigurationException e) {
- Stargate.logSevere(e.getMessage());
+ getLogger().log(Level.SEVERE, e.getMessage());
}
- this.saveDefaultConfig();
configuration.options().copyDefaults(true);
logger = Logger.getLogger("Minecraft");
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index ea8598d..a7aecf4 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -15,6 +15,7 @@ import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.messaging.Messenger;
import org.dynmap.DynmapAPI;
@@ -434,18 +435,25 @@ public final class StargateConfig {
/**
* Changes all configuration values from the old name to the new name
*
- * @param newConfig The config to read from and write to
+ * @param currentConfiguration The current config to back up
*/
- private void migrateConfig(FileConfiguration newConfig) {
+ private void migrateConfig(FileConfiguration currentConfiguration) {
//Save the old config just in case something goes wrong
try {
- newConfig.save(dataFolderPath + "/config.yml.old");
+ currentConfiguration.save(new File(dataFolderPath, "config.yml.old"));
} catch (IOException e) {
Stargate.debug("Stargate::migrateConfig", "Unable to save old backup and do migration");
e.printStackTrace();
return;
}
+ //Load old and new configuration
+ Stargate.getInstance().reloadConfig();
+ FileConfiguration oldConfiguration = Stargate.getInstance().getConfig();
+ YamlConfiguration newConfiguration = StargateYamlConfiguration.loadConfiguration(
+ FileHelper.getBufferedReaderFromInputStream(
+ FileHelper.getInputStreamForInternalFile("/config.yml")));
+
//Read all available config migrations
Map migrationFields;
try {
@@ -460,15 +468,30 @@ public final class StargateConfig {
//Replace old config names with the new ones
for (String key : migrationFields.keySet()) {
- if (newConfig.contains(key)) {
+ if (oldConfiguration.contains(key)) {
String newPath = migrationFields.get(key);
- Object oldValue = newConfig.get(key);
+ Object oldValue = oldConfiguration.get(key);
if (!newPath.trim().isEmpty()) {
- newConfig.set(newPath, oldValue);
+ oldConfiguration.set(newPath, oldValue);
}
- newConfig.set(key, null);
+ oldConfiguration.set(key, null);
}
}
+
+ // Copy all keys to the new config
+ for (String key : oldConfiguration.getKeys(true)) {
+ Stargate.logInfo("Setting " + key + " to " + oldConfiguration.get(key));
+ newConfiguration.set(key, oldConfiguration.get(key));
+ }
+
+ try {
+ newConfiguration.save(new File(dataFolderPath, "config.yml"));
+ } catch (IOException e) {
+ Stargate.debug("Stargate::migrateConfig", "Unable to save migrated config");
+ e.printStackTrace();
+ }
+
+ Stargate.getInstance().reloadConfig();
}
/**
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 2b5f751..4326f81 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -19,6 +19,12 @@ public class StargateYamlConfiguration extends YamlConfiguration {
static public final String END_OF_COMMENT = "_endOfComment_";
static public final String START_OF_COMMENT = "comment_";
+ @Override
+ @SuppressWarnings("deprecation")
+ protected @NotNull String buildHeader() {
+ return "";
+ }
+
@Override
public @NotNull String saveToString() {
return this.convertYAMLMappingsToComments(super.saveToString());
From aa480faef29be5e65cfd8a250653cf8304493e62 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 19 Apr 2023 23:13:02 +0200
Subject: [PATCH 028/112] Improves behavior if the config cannot be loaded
---
.../net/knarcraft/stargate/config/StargateConfig.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index a7aecf4..97b6d81 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -399,7 +399,13 @@ public final class StargateConfig {
//Get important folders from the config
portalFolder = (String) configOptions.get(ConfigOption.PORTAL_FOLDER);
+ if (portalFolder.isEmpty()) {
+ portalFolder = dataFolderPath + "/portals/";
+ }
gateFolder = (String) configOptions.get(ConfigOption.GATE_FOLDER);
+ if (gateFolder.isEmpty()) {
+ gateFolder = dataFolderPath + "/gates/";
+ }
//If users have an outdated config, assume they also need to update their default gates
if (isMigrating) {
@@ -480,7 +486,7 @@ public final class StargateConfig {
// Copy all keys to the new config
for (String key : oldConfiguration.getKeys(true)) {
- Stargate.logInfo("Setting " + key + " to " + oldConfiguration.get(key));
+ Stargate.debug("Stargate::migrateConfig", "Setting " + key + " to " + oldConfiguration.get(key));
newConfiguration.set(key, oldConfiguration.get(key));
}
From 9d981f2cc610e7cb284f095a73d53025ac1ef672 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Thu, 20 Apr 2023 16:02:57 +0200
Subject: [PATCH 029/112] Fixes a crash caused by StargateYamlConfiguration
---
.../java/net/knarcraft/stargate/Stargate.java | 12 ++--
.../stargate/config/StargateConfig.java | 44 ++++++++++---
.../stargate/config/StargateGateConfig.java | 6 +-
.../config/StargateYamlConfiguration.java | 5 +-
.../stargate/portal/property/gate/Gate.java | 4 +-
.../portal/property/gate/GateHandler.java | 2 +-
src/main/resources/config.yml | 61 +++++++++++--------
7 files changed, 88 insertions(+), 46 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 0102695..8e1c68b 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -207,7 +207,7 @@ public class Stargate extends JavaPlugin {
* @param message A message describing what happened
*/
public static void debug(String route, String message) {
- if (stargateConfig == null || stargateConfig.isDebuggingEnabled()) {
+ if (stargateConfig == null || !stargateConfig.isLoaded() || stargateConfig.isDebuggingEnabled()) {
logger.info("[Stargate::" + route + "] " + message);
} else {
logger.log(Level.FINEST, "[Stargate::" + route + "] " + message);
@@ -357,7 +357,7 @@ public class Stargate extends JavaPlugin {
super.reloadConfig();
this.configuration = new StargateYamlConfiguration();
try {
- configuration.load(new File(getDataFolder(), configFileName));
+ this.configuration.load(new File(getDataFolder(), configFileName));
} catch (IOException | InvalidConfigurationException e) {
e.printStackTrace();
}
@@ -367,7 +367,7 @@ public class Stargate extends JavaPlugin {
public void saveConfig() {
super.saveConfig();
try {
- configuration.save(new File(getDataFolder(), configFileName));
+ this.configuration.save(new File(getDataFolder(), configFileName));
} catch (IOException e) {
e.printStackTrace();
}
@@ -387,13 +387,13 @@ public class Stargate extends JavaPlugin {
this.getConfig();
PluginDescriptionFile pluginDescriptionFile = this.getDescription();
pluginManager = getServer().getPluginManager();
- configuration = new StargateYamlConfiguration();
+ this.configuration = new StargateYamlConfiguration();
try {
- configuration.load(new File(getDataFolder(), configFileName));
+ this.configuration.load(new File(getDataFolder(), configFileName));
} catch (IOException | InvalidConfigurationException e) {
getLogger().log(Level.SEVERE, e.getMessage());
}
- configuration.options().copyDefaults(true);
+ this.configuration.options().copyDefaults(true);
logger = Logger.getLogger("Minecraft");
Server server = getServer();
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 97b6d81..8d574bb 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -14,6 +14,7 @@ import net.knarcraft.stargate.utility.PortalFileHelper;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.MemorySection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.messaging.Messenger;
@@ -48,6 +49,7 @@ public final class StargateConfig {
private String gateFolder;
private String portalFolder;
private String languageName = "en";
+ private boolean isLoaded = false;
private final Map configOptions;
@@ -109,6 +111,17 @@ public final class StargateConfig {
DynmapManager.initialize(dynmapAPI);
DynmapManager.addAllPortalMarkers();
}
+
+ this.isLoaded = true;
+ }
+
+ /**
+ * Gets whether this configuration has been fully loaded
+ *
+ * @return True if fully loaded
+ */
+ public boolean isLoaded() {
+ return this.isLoaded;
}
/**
@@ -365,10 +378,11 @@ public final class StargateConfig {
FileConfiguration newConfig = Stargate.getInstance().getConfiguration();
boolean isMigrating = false;
- if (newConfig.getString("lang") != null || newConfig.getString("economy.freeGatesGreen") != null ||
- newConfig.getString("economy.taxAccount") == null) {
+ if (newConfig.getString("lang") != null || newConfig.getString("economy.taxAccount") == null) {
migrateConfig(newConfig);
isMigrating = true;
+ Stargate.getInstance().reloadConfig();
+ newConfig = Stargate.getInstance().getConfiguration();
}
//Copy missing default values if any values are missing
@@ -409,6 +423,7 @@ public final class StargateConfig {
//If users have an outdated config, assume they also need to update their default gates
if (isMigrating) {
+ this.createMissingFolders();
GateHandler.writeDefaultGatesToFolder(gateFolder);
}
@@ -486,6 +501,9 @@ public final class StargateConfig {
// Copy all keys to the new config
for (String key : oldConfiguration.getKeys(true)) {
+ if (oldConfiguration.get(key) instanceof MemorySection) {
+ continue;
+ }
Stargate.debug("Stargate::migrateConfig", "Setting " + key + " to " + oldConfiguration.get(key));
newConfiguration.set(key, oldConfiguration.get(key));
}
@@ -527,12 +545,8 @@ public final class StargateConfig {
* Creates missing folders
*/
private void createMissingFolders() {
- File newPortalDir = new File(portalFolder);
- if (!newPortalDir.exists()) {
- if (!newPortalDir.mkdirs()) {
- logger.severe("Unable to create portal directory");
- }
- }
+ createMissingFolder(new File(gateFolder), "Unable to create gate directory");
+ createMissingFolder(new File(portalFolder), "Unable to create portal directory");
File newFile = new File(portalFolder, Stargate.getInstance().getServer().getWorlds().get(0).getName() +
".db");
if (!newFile.exists() && !newFile.getParentFile().exists()) {
@@ -542,6 +556,20 @@ public final class StargateConfig {
}
}
+ /**
+ * Creates the given folder if it's missing
+ *
+ * @param folder The folder to create
+ * @param errorMessage The error message to display if unable to create the folder
+ */
+ private void createMissingFolder(File folder, String errorMessage) {
+ if (!folder.exists()) {
+ if (!folder.mkdirs()) {
+ logger.severe(errorMessage);
+ }
+ }
+ }
+
/**
* Gets the folder all portals are stored in
*
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java
index f1dc7ca..f97cd16 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java
@@ -313,14 +313,16 @@ public final class StargateGateConfig {
try {
PortalSignDrawer.setMainColor(ChatColor.of(mainSignColor.toUpperCase()));
} catch (IllegalArgumentException | NullPointerException exception) {
- Stargate.logWarning("You have specified an invalid main sign color in your config.yml. Defaulting to BLACK");
+ Stargate.logWarning("You have specified an invalid main sign color in your config.yml (" + mainSignColor +
+ "). Defaulting to BLACK");
PortalSignDrawer.setMainColor(ChatColor.BLACK);
}
try {
PortalSignDrawer.setHighlightColor(ChatColor.of(highlightSignColor.toUpperCase()));
} catch (IllegalArgumentException | NullPointerException exception) {
- Stargate.logWarning("You have specified an invalid highlighting sign color in your config.yml. Defaulting to WHITE");
+ Stargate.logWarning("You have specified an invalid highlighting sign color in your config.yml (" +
+ highlightSignColor + "). Defaulting to WHITE");
PortalSignDrawer.setHighlightColor(ChatColor.WHITE);
}
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 4326f81..7a92966 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -16,6 +16,7 @@ import java.util.List;
*/
public class StargateYamlConfiguration extends YamlConfiguration {
+ public static final String START_OF_COMMENT_LINE = "[HASHTAG]";
static public final String END_OF_COMMENT = "_endOfComment_";
static public final String START_OF_COMMENT = "comment_";
@@ -51,7 +52,8 @@ public class StargateYamlConfiguration extends YamlConfiguration {
for (String line : configString.split("\n")) {
if (line.trim().startsWith("#")) {
//Temporarily store the comment line
- currentComment.add(line.trim().replaceFirst("#", ""));
+ currentComment.add(line.trim().replaceFirst(line.trim().startsWith("# ") ? "# " : "{2}#",
+ START_OF_COMMENT_LINE));
} else {
//Write the full formatted comment to the StringBuilder
if (!currentComment.isEmpty()) {
@@ -119,6 +121,7 @@ public class StargateYamlConfiguration extends YamlConfiguration {
//Output the empty line as-is, as it's not part of a comment
finalText.append("\n");
} else if (isReadingCommentBlock) {
+ possibleComment = possibleComment.replace(START_OF_COMMENT_LINE, "");
//Output the comment with correct indentation
finalText.append(addIndentation(commentIndentation)).append("# ").append(possibleComment).append("\n");
} else {
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
index 563a93f..52e34e4 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
@@ -7,6 +7,7 @@ import org.bukkit.Material;
import org.bukkit.Tag;
import java.io.BufferedWriter;
+import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
@@ -290,7 +291,7 @@ public class Gate {
*/
public void save(String gateFolder) {
try {
- BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(gateFolder + filename));
+ BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File(gateFolder, filename)));
//Save main material names
writeConfig(bufferedWriter, "portal-open", portalOpenBlock.name());
@@ -311,6 +312,7 @@ public class Gate {
bufferedWriter.close();
} catch (IOException ex) {
Stargate.logSevere(String.format("Could not save Gate %s - %s", filename, ex.getMessage()));
+ ex.printStackTrace();
}
}
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
index aca723a..197fe6b 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java
@@ -152,7 +152,7 @@ public class GateHandler {
}
//Update gate file in case the format has changed between versions
- gate.save(parentFolder + "/");
+ gate.save(parentFolder);
return gate;
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index caeac8f..008f456 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,4 +1,4 @@
-# Version: ${project.version}
+# Version: ${project.version}
# +--------------▄▄▄-- ‚——. -▄--▄-▄--▄-▄-▄▄▄▄▄---------------------------------------------------+ #
# | █▄▄▀ (“‡‡”) █▄▄▀ █▄▄▀ █ █ Support available at: sgrewritten.org/discord | #
# | █▄▄█ \__/ █ █ █ █ █ █ ‚-. | #
@@ -107,6 +107,33 @@ gates:
# This is more resource intensive, and should really only be used if verifyPortals is true.
# Or if using an easily destroyable open/closed material.
protectEntrance: false
+
+ cosmetic:
+ # Will the destination a networked portal last connected to be listed first in its scroll menu?
+ rememberDestination: false
+
+ # For networked gates, are destinations listed alphabetically instead of chronologically?
+ # (This applies to all non-fixed and non-random gates).
+ sortNetworkDestinations: false
+
+ # What color will StarGate use for the text on gate signs?
+ # Note that players can override this with DYE and/or GLOW_INK_SAC
+ mainSignColor: BLACK
+
+ # What color will StarGate use to accent the above text?
+ highlightSignColor: WHITE
+
+ # Text and highlight colors can be modified on a per-sign basis (below).
+ # Format: 'SIGN_TYPE:mainSignColor,highlightSignColor'
+ perSignColors:
+ - 'ACACIA:default,default'
+ - 'BIRCH:default,default'
+ - 'CRIMSON:inverted,inverted'
+ - 'DARK_OAK:inverted,inverted'
+ - 'JUNGLE:default,default'
+ - 'OAK:default,default'
+ - 'SPRUCE:inverted,inverted'
+ - 'WARPED:inverted,inverted'
# +----------------------------------------------------------------------------------------------+ #
# | Economy | #
@@ -149,32 +176,12 @@ economy:
# https://hub.spigotmc.org/javadocs/spigot/org/bukkit/ChatColor.html
freeGatesColor: DARK_GREEN
- cosmetic:
- # Will the destination a networked portal last connected to be listed first in its scroll menu?
- rememberDestination: false
-
- # For networked gates, are destinations listed alphabetically instead of chronologically?
- # (This applies to all non-fixed and non-random gates).
- sortNetworkDestinations: false
-
- # What color will StarGate use for the text on gate signs?
- # Note that players can override this with DYE and/or GLOW_INK_SAC
- mainSignColor: BLACK
-
- # What color will StarGate use to accent the above text?
- highlightSignColor: WHITE
-
- # Text and highlight colors can be modified on a per-sign basis (below).
- # Format: 'SIGN_TYPE:mainSignColor,highlightSignColor'
- perSignColors:
- - 'ACACIA:default,default'
- - 'BIRCH:default,default'
- - 'CRIMSON:inverted,inverted'
- - 'DARK_OAK:inverted,inverted'
- - 'JUNGLE:default,default'
- - 'OAK:default,default'
- - 'SPRUCE:inverted,inverted'
- - 'WARPED:inverted,inverted'
+ # Does your server have a tax account (closed economy)?
+ # If so, please provide the name of your tax account (collected money will be sent to it).
+ # If not, leave this section blank (collected money will be deleted).
+ #
+ # Note that useCost money is excluded from this system when toOwner is true.
+ taxAccount: ''
# +----------------------------------------------------------------------------------------------+ #
# | Technical | #
From 486149fa01c4583e78359575b7fef27a666a1ccc Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Thu, 20 Apr 2023 18:44:46 +0200
Subject: [PATCH 030/112] Improves performance of StargateYamlConfiguration a
bit
---
.../config/StargateYamlConfiguration.java | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 7a92966..6ebd9bd 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -28,11 +28,13 @@ public class StargateYamlConfiguration extends YamlConfiguration {
@Override
public @NotNull String saveToString() {
+ // Convert YAML comments to normal comments
return this.convertYAMLMappingsToComments(super.saveToString());
}
@Override
public void loadFromString(@NotNull String contents) throws InvalidConfigurationException {
+ // Convert normal comments to YAML comments to prevent them from disappearing
super.loadFromString(this.convertCommentsToYAMLMappings(contents));
}
@@ -50,19 +52,23 @@ public class StargateYamlConfiguration extends YamlConfiguration {
int commentId = 0;
for (String line : configString.split("\n")) {
- if (line.trim().startsWith("#")) {
+ String trimmed = line.trim();
+ if (trimmed.startsWith("#")) {
//Temporarily store the comment line
- currentComment.add(line.trim().replaceFirst(line.trim().startsWith("# ") ? "# " : "{2}#",
- START_OF_COMMENT_LINE));
+ if (trimmed.startsWith("# ")) {
+ currentComment.add(trimmed.replaceFirst("# ", START_OF_COMMENT_LINE));
+ } else {
+ currentComment.add(trimmed.replaceFirst("#", START_OF_COMMENT_LINE));
+ }
} else {
//Write the full formatted comment to the StringBuilder
if (!currentComment.isEmpty()) {
int indentation = getIndentation(line);
generateCommentYAML(yamlBuilder, currentComment, commentId++, indentation);
- currentComment = new ArrayList<>();
+ currentComment.clear();
}
//Add the non-comment line assuming it isn't empty
- if (!line.trim().isEmpty()) {
+ if (!trimmed.isEmpty()) {
yamlBuilder.append(line).append("\n");
}
}
From 50015c29122fec9553385cc6efe2950e459cd848 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 12:53:43 +0200
Subject: [PATCH 031/112] Adds graceful shutdown for CraftBukkit #286
---
.../java/net/knarcraft/stargate/Stargate.java | 23 ++++++++++++++-----
.../stargate/config/LanguageLoader.java | 4 ++--
.../stargate/config/StargateConfig.java | 6 ++---
3 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 8e1c68b..11c52df 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -207,7 +207,7 @@ public class Stargate extends JavaPlugin {
* @param message A message describing what happened
*/
public static void debug(String route, String message) {
- if (stargateConfig == null || !stargateConfig.isLoaded() || stargateConfig.isDebuggingEnabled()) {
+ if (stargateConfig == null || stargateConfig.isNotLoaded() || stargateConfig.isDebuggingEnabled()) {
logger.info("[Stargate::" + route + "] " + message);
} else {
logger.log(Level.FINEST, "[Stargate::" + route + "] " + message);
@@ -220,7 +220,7 @@ public class Stargate extends JavaPlugin {
* @param message The message to log
*/
public static void logInfo(String message) {
- logger.info(getBackupString("prefix") + message);
+ log(Level.INFO, message);
}
/**
@@ -251,7 +251,7 @@ public class Stargate extends JavaPlugin {
if (logger == null) {
logger = Bukkit.getLogger();
}
- if (getInstance() == null) {
+ if (getInstance() == null || stargateConfig == null || stargateConfig.isNotLoaded()) {
logger.log(severity, "[Stargate]: " + message);
} else {
logger.log(severity, getBackupString("prefix") + message);
@@ -377,7 +377,9 @@ public class Stargate extends JavaPlugin {
public void onDisable() {
PortalHandler.closeAllPortals();
PortalRegistry.clearPortals();
- stargateConfig.clearManagedWorlds();
+ if (stargateConfig != null) {
+ stargateConfig.clearManagedWorlds();
+ }
getServer().getScheduler().cancelTasks(this);
}
@@ -399,8 +401,17 @@ public class Stargate extends JavaPlugin {
Server server = getServer();
stargate = this;
- stargateConfig = new StargateConfig(logger);
- stargateConfig.finishSetup();
+ try {
+ stargateConfig = new StargateConfig(logger);
+ stargateConfig.finishSetup();
+ } catch (NoClassDefFoundError exception) {
+ logSevere("Could not properly load. Class not found: " +
+ exception.getMessage() + "\nThis is probably because you are using CraftBukkit, or other outdated" +
+ "Minecraft server software. Minecraft server software based on Spigot or Paper is required. Paper" +
+ " is recommended, and can be downloaded at: https://papermc.io/downloads/paper");
+ this.onDisable();
+ return;
+ }
pluginVersion = pluginDescriptionFile.getVersion();
diff --git a/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java b/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
index 0383794..ade33a0 100644
--- a/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
+++ b/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
@@ -45,7 +45,7 @@ public final class LanguageLoader {
loadedBackupStrings = load("en", inputStream);
} else {
loadedBackupStrings = null;
- Stargate.getConsoleLogger().severe("[stargate] Error loading backup language. " +
+ Stargate.logSevere("Error loading backup language. " +
"There may be missing text in-game");
}
}
@@ -226,7 +226,7 @@ public final class LanguageLoader {
strings = FileHelper.readKeyValuePairs(bufferedReader, "=", ColorConversion.NORMAL);
} catch (Exception e) {
if (Stargate.getStargateConfig().isDebuggingEnabled()) {
- Stargate.getConsoleLogger().info("[Stargate] Unable to load language " + lang);
+ Stargate.logInfo("Unable to load language " + lang);
}
return null;
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 8d574bb..bb27d21 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -118,10 +118,10 @@ public final class StargateConfig {
/**
* Gets whether this configuration has been fully loaded
*
- * @return True if fully loaded
+ * @return True if not fully loaded
*/
- public boolean isLoaded() {
- return this.isLoaded;
+ public boolean isNotLoaded() {
+ return !this.isLoaded;
}
/**
From 45f3bcc4156c9422389f62988ad1a43b3133a250 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 13:41:42 +0200
Subject: [PATCH 032/112] Improves logging a bit
---
src/main/java/net/knarcraft/stargate/Stargate.java | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 11c52df..f13d21f 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -251,11 +251,7 @@ public class Stargate extends JavaPlugin {
if (logger == null) {
logger = Bukkit.getLogger();
}
- if (getInstance() == null || stargateConfig == null || stargateConfig.isNotLoaded()) {
- logger.log(severity, "[Stargate]: " + message);
- } else {
- logger.log(severity, getBackupString("prefix") + message);
- }
+ logger.log(severity, message);
}
/**
@@ -385,6 +381,8 @@ public class Stargate extends JavaPlugin {
@Override
public void onEnable() {
+ stargate = this;
+ logger = getLogger();
this.saveDefaultConfig();
this.getConfig();
PluginDescriptionFile pluginDescriptionFile = this.getDescription();
@@ -397,9 +395,7 @@ public class Stargate extends JavaPlugin {
}
this.configuration.options().copyDefaults(true);
- logger = Logger.getLogger("Minecraft");
Server server = getServer();
- stargate = this;
try {
stargateConfig = new StargateConfig(logger);
From fab067c94b9c537d99ccb8655395f217074a3dcf Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 13:56:18 +0200
Subject: [PATCH 033/112] Fixes #287
---
.../net/knarcraft/stargate/config/StargateConfig.java | 9 +++++----
.../stargate/config/StargateYamlConfiguration.java | 8 +++++++-
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index bb27d21..208e58a 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -463,7 +463,7 @@ public final class StargateConfig {
try {
currentConfiguration.save(new File(dataFolderPath, "config.yml.old"));
} catch (IOException e) {
- Stargate.debug("Stargate::migrateConfig", "Unable to save old backup and do migration");
+ Stargate.debug("StargateConfig::migrateConfig", "Unable to save old backup and do migration");
e.printStackTrace();
return;
}
@@ -482,7 +482,7 @@ public final class StargateConfig {
FileHelper.getInputStreamForInternalFile("/config-migrations.txt")), "=",
ColorConversion.NORMAL);
} catch (IOException e) {
- Stargate.debug("Stargate::migrateConfig", "Unable to load config migration file");
+ Stargate.debug("StargateConfig::migrateConfig", "Unable to load config migration file");
e.printStackTrace();
return;
}
@@ -504,14 +504,15 @@ public final class StargateConfig {
if (oldConfiguration.get(key) instanceof MemorySection) {
continue;
}
- Stargate.debug("Stargate::migrateConfig", "Setting " + key + " to " + oldConfiguration.get(key));
+ Stargate.debug("StargateConfig::migrateConfig", "Setting " + key + " to " +
+ oldConfiguration.get(key));
newConfiguration.set(key, oldConfiguration.get(key));
}
try {
newConfiguration.save(new File(dataFolderPath, "config.yml"));
} catch (IOException e) {
- Stargate.debug("Stargate::migrateConfig", "Unable to save migrated config");
+ Stargate.debug("StargateConfig::migrateConfig", "Unable to save migrated config");
e.printStackTrace();
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 6ebd9bd..400f5e2 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -50,10 +50,15 @@ public class StargateYamlConfiguration extends YamlConfiguration {
StringBuilder yamlBuilder = new StringBuilder();
List currentComment = new ArrayList<>();
int commentId = 0;
+ int previousIndentation = 0;
for (String line : configString.split("\n")) {
String trimmed = line.trim();
if (trimmed.startsWith("#")) {
+ // Store the indentation of the block
+ if (currentComment.isEmpty()) {
+ previousIndentation = getIndentation(line);
+ }
//Temporarily store the comment line
if (trimmed.startsWith("# ")) {
currentComment.add(trimmed.replaceFirst("# ", START_OF_COMMENT_LINE));
@@ -63,9 +68,10 @@ public class StargateYamlConfiguration extends YamlConfiguration {
} else {
//Write the full formatted comment to the StringBuilder
if (!currentComment.isEmpty()) {
- int indentation = getIndentation(line);
+ int indentation = trimmed.isEmpty() ? previousIndentation : getIndentation(line);
generateCommentYAML(yamlBuilder, currentComment, commentId++, indentation);
currentComment.clear();
+ previousIndentation = 0;
}
//Add the non-comment line assuming it isn't empty
if (!trimmed.isEmpty()) {
From 05fadfa55856bb4a286f08d307fcd7e9e682257e Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 14:03:33 +0200
Subject: [PATCH 034/112] Removes stack trace printing
---
src/main/java/net/knarcraft/stargate/Stargate.java | 4 ++--
.../knarcraft/stargate/config/LanguageLoader.java | 4 ++--
.../knarcraft/stargate/config/StargateConfig.java | 5 +----
.../stargate/portal/property/gate/Gate.java | 5 ++---
.../knarcraft/stargate/utility/BungeeHelper.java | 13 +++++--------
.../stargate/utility/PortalFileHelper.java | 7 +++----
6 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index f13d21f..8dd8709 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -355,7 +355,7 @@ public class Stargate extends JavaPlugin {
try {
this.configuration.load(new File(getDataFolder(), configFileName));
} catch (IOException | InvalidConfigurationException e) {
- e.printStackTrace();
+ logSevere("Unable to load the configuration! Message: " + e.getMessage());
}
}
@@ -365,7 +365,7 @@ public class Stargate extends JavaPlugin {
try {
this.configuration.save(new File(getDataFolder(), configFileName));
} catch (IOException e) {
- e.printStackTrace();
+ logSevere("Unable to save the configuration! Message: " + e.getMessage());
}
}
diff --git a/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java b/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
index ade33a0..bd8a335 100644
--- a/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
+++ b/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
@@ -120,8 +120,8 @@ public final class LanguageLoader {
try {
readChangedLanguageStrings(inputStream, language, currentLanguageValues);
- } catch (IOException ex) {
- ex.printStackTrace();
+ } catch (IOException exception) {
+ Stargate.logSevere("Unable to read language strings! Message: " + exception.getMessage());
}
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 208e58a..fefaf62 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -464,7 +464,6 @@ public final class StargateConfig {
currentConfiguration.save(new File(dataFolderPath, "config.yml.old"));
} catch (IOException e) {
Stargate.debug("StargateConfig::migrateConfig", "Unable to save old backup and do migration");
- e.printStackTrace();
return;
}
@@ -483,7 +482,6 @@ public final class StargateConfig {
ColorConversion.NORMAL);
} catch (IOException e) {
Stargate.debug("StargateConfig::migrateConfig", "Unable to load config migration file");
- e.printStackTrace();
return;
}
@@ -511,9 +509,8 @@ public final class StargateConfig {
try {
newConfiguration.save(new File(dataFolderPath, "config.yml"));
- } catch (IOException e) {
+ } catch (IOException exception) {
Stargate.debug("StargateConfig::migrateConfig", "Unable to save migrated config");
- e.printStackTrace();
}
Stargate.getInstance().reloadConfig();
diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
index 52e34e4..d488ca2 100644
--- a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
+++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java
@@ -310,9 +310,8 @@ public class Gate {
layout.saveLayout(bufferedWriter);
bufferedWriter.close();
- } catch (IOException ex) {
- Stargate.logSevere(String.format("Could not save Gate %s - %s", filename, ex.getMessage()));
- ex.printStackTrace();
+ } catch (IOException exception) {
+ Stargate.logSevere(String.format("Could not save Gate %s - %s", filename, exception.getMessage()));
}
}
diff --git a/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java b/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java
index 677e80f..b59bde2 100644
--- a/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java
@@ -82,8 +82,7 @@ public final class BungeeHelper {
//Send the plugin message
player.sendPluginMessage(Stargate.getInstance(), bungeeChannel, byteArrayOutputStream.toByteArray());
} catch (IOException ex) {
- Stargate.logSevere("Error sending BungeeCord teleport packet");
- ex.printStackTrace();
+ Stargate.logSevere("Error sending BungeeCord teleport packet! Message: " + ex.getMessage());
return false;
}
return true;
@@ -107,9 +106,8 @@ public final class BungeeHelper {
//Send the plugin message
player.sendPluginMessage(Stargate.getInstance(), bungeeChannel, byteArrayOutputStream.toByteArray());
- } catch (IOException ex) {
- Stargate.logSevere("Error sending BungeeCord connect packet");
- ex.printStackTrace();
+ } catch (IOException exception) {
+ Stargate.logSevere("Error sending BungeeCord connect packet! Message: " + exception.getMessage());
return false;
}
return true;
@@ -137,9 +135,8 @@ public final class BungeeHelper {
data = new byte[dataLength];
//Read the message to the prepared array
dataInputStream.readFully(data);
- } catch (IOException ex) {
- Stargate.logSevere("Error receiving BungeeCord message");
- ex.printStackTrace();
+ } catch (IOException exception) {
+ Stargate.logSevere("Error receiving BungeeCord message. Message: " + exception.getMessage());
return null;
}
return new String(data);
diff --git a/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java b/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java
index 74741fc..6ba84e7 100644
--- a/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java
@@ -170,10 +170,9 @@ public final class PortalFileHelper {
"Starting post loading tasks", world));
doPostLoadTasks(world, needsToSaveDatabase);
return true;
- } catch (Exception e) {
- Stargate.logSevere(String.format("Exception while reading stargates from %s: %d", database.getName(),
- lineIndex));
- e.printStackTrace();
+ } catch (Exception exception) {
+ Stargate.logSevere(String.format("Exception while reading stargates from %s: %d! Message: %s",
+ database.getName(), lineIndex, exception.getMessage()));
}
return false;
}
From e07adacf733049d851073f2c8aa37b91b1e6fd52 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 14:53:23 +0200
Subject: [PATCH 035/112] Reduces the complexity of
convertYAMLMappingsToComments
---
.../stargate/config/StargateConfig.java | 10 +-
.../config/StargateYamlConfiguration.java | 107 ++++++++++++------
2 files changed, 79 insertions(+), 38 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index fefaf62..dce9109 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -459,11 +459,13 @@ public final class StargateConfig {
* @param currentConfiguration The current config to back up
*/
private void migrateConfig(FileConfiguration currentConfiguration) {
+ String debugPath = "StargateConfig::migrateConfig";
+
//Save the old config just in case something goes wrong
try {
currentConfiguration.save(new File(dataFolderPath, "config.yml.old"));
} catch (IOException e) {
- Stargate.debug("StargateConfig::migrateConfig", "Unable to save old backup and do migration");
+ Stargate.debug(debugPath, "Unable to save old backup and do migration");
return;
}
@@ -481,7 +483,7 @@ public final class StargateConfig {
FileHelper.getInputStreamForInternalFile("/config-migrations.txt")), "=",
ColorConversion.NORMAL);
} catch (IOException e) {
- Stargate.debug("StargateConfig::migrateConfig", "Unable to load config migration file");
+ Stargate.debug(debugPath, "Unable to load config migration file");
return;
}
@@ -502,7 +504,7 @@ public final class StargateConfig {
if (oldConfiguration.get(key) instanceof MemorySection) {
continue;
}
- Stargate.debug("StargateConfig::migrateConfig", "Setting " + key + " to " +
+ Stargate.debug(debugPath, "Setting " + key + " to " +
oldConfiguration.get(key));
newConfiguration.set(key, oldConfiguration.get(key));
}
@@ -510,7 +512,7 @@ public final class StargateConfig {
try {
newConfiguration.save(new File(dataFolderPath, "config.yml"));
} catch (IOException exception) {
- Stargate.debug("StargateConfig::migrateConfig", "Unable to save migrated config");
+ Stargate.debug(debugPath, "Unable to save migrated config");
}
Stargate.getInstance().reloadConfig();
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 400f5e2..9e7bfd0 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -60,28 +60,54 @@ public class StargateYamlConfiguration extends YamlConfiguration {
previousIndentation = getIndentation(line);
}
//Temporarily store the comment line
- if (trimmed.startsWith("# ")) {
- currentComment.add(trimmed.replaceFirst("# ", START_OF_COMMENT_LINE));
- } else {
- currentComment.add(trimmed.replaceFirst("#", START_OF_COMMENT_LINE));
- }
+ addComment(currentComment, trimmed);
} else {
- //Write the full formatted comment to the StringBuilder
- if (!currentComment.isEmpty()) {
- int indentation = trimmed.isEmpty() ? previousIndentation : getIndentation(line);
- generateCommentYAML(yamlBuilder, currentComment, commentId++, indentation);
- currentComment.clear();
- previousIndentation = 0;
- }
- //Add the non-comment line assuming it isn't empty
- if (!trimmed.isEmpty()) {
- yamlBuilder.append(line).append("\n");
- }
+ addYamlString(yamlBuilder, currentComment, line, previousIndentation, commentId);
+ commentId++;
+ previousIndentation = 0;
}
}
return yamlBuilder.toString();
}
+ /**
+ * Adds a YAML string to the given string builder
+ *
+ * @param yamlBuilder The string builder used for building YAML
+ * @param currentComment The comment to add as a YAML string
+ * @param line The current line
+ * @param previousIndentation The indentation of the current block comment
+ * @param commentId The id of the comment
+ */
+ private void addYamlString(StringBuilder yamlBuilder, List currentComment, String line,
+ int previousIndentation, int commentId) {
+ String trimmed = line.trim();
+ //Write the full formatted comment to the StringBuilder
+ if (!currentComment.isEmpty()) {
+ int indentation = trimmed.isEmpty() ? previousIndentation : getIndentation(line);
+ generateCommentYAML(yamlBuilder, currentComment, commentId, indentation);
+ currentComment.clear();
+ }
+ //Add the non-comment line assuming it isn't empty
+ if (!trimmed.isEmpty()) {
+ yamlBuilder.append(line).append("\n");
+ }
+ }
+
+ /**
+ * Adds the given comment to the given list
+ *
+ * @param commentParts The list to add to
+ * @param comment The comment to add
+ */
+ private void addComment(List commentParts, String comment) {
+ if (comment.startsWith("# ")) {
+ commentParts.add(comment.replaceFirst("# ", START_OF_COMMENT_LINE));
+ } else {
+ commentParts.add(comment.replaceFirst("#", START_OF_COMMENT_LINE));
+ }
+ }
+
/**
* Generates a YAML-compatible string for one comment block
*
@@ -114,36 +140,49 @@ public class StargateYamlConfiguration extends YamlConfiguration {
*/
private String convertYAMLMappingsToComments(String yamlString) {
StringBuilder finalText = new StringBuilder();
- boolean isReadingCommentBlock = false;
- int commentIndentation = 0;
- for (String line : yamlString.split("\n")) {
+
+ String[] lines = yamlString.split("\n");
+ for (int currentIndex = 0; currentIndex < lines.length; currentIndex++) {
+ String line = lines[currentIndex];
String possibleComment = line.trim();
- if (isReadingCommentBlock && line.contains(END_OF_COMMENT)) {
- //Skip the line signifying the end of a comment
- isReadingCommentBlock = false;
- } else if (possibleComment.startsWith(START_OF_COMMENT)) {
- //Skip the comment start line, and start comment parsing
- isReadingCommentBlock = true;
- //Get the indentation to use for the comment block
- commentIndentation = getIndentation(line);
+ if (possibleComment.startsWith(START_OF_COMMENT)) {
//Add an empty line before every comment block
finalText.append("\n");
- } else if (line.isEmpty() && !isReadingCommentBlock) {
- //Output the empty line as-is, as it's not part of a comment
- finalText.append("\n");
- } else if (isReadingCommentBlock) {
- possibleComment = possibleComment.replace(START_OF_COMMENT_LINE, "");
- //Output the comment with correct indentation
- finalText.append(addIndentation(commentIndentation)).append("# ").append(possibleComment).append("\n");
+ currentIndex = readComment(finalText, lines, currentIndex + 1, getIndentation(line));
} else {
//Output the configuration key
finalText.append(line).append("\n");
}
}
+
return finalText.toString().trim();
}
+ /**
+ * Fully reads a comment
+ *
+ * @param builder The string builder to write to
+ * @param lines The lines to read from
+ * @param startIndex The index to start reading from
+ * @param commentIndentation The indentation of the read comment
+ * @return The index containing the next non-comment line
+ */
+ private int readComment(StringBuilder builder, String[] lines, int startIndex, int commentIndentation) {
+ for (int currentIndex = startIndex; currentIndex < lines.length; currentIndex++) {
+ String line = lines[currentIndex];
+ String possibleComment = line.trim();
+ if (!line.contains(END_OF_COMMENT)) {
+ possibleComment = possibleComment.replace(START_OF_COMMENT_LINE, "");
+ builder.append(addIndentation(commentIndentation)).append("# ").append(possibleComment).append("\n");
+ } else {
+ return currentIndex;
+ }
+ }
+
+ return startIndex;
+ }
+
/**
* Gets a string containing the given indentation
*
From 9a215a7c119238f68a9847bcc05ba55152d88e43 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 15:10:20 +0200
Subject: [PATCH 036/112] Attempts to make SonarCloud happier
---
src/main/java/net/knarcraft/stargate/Stargate.java | 12 ++++++------
.../knarcraft/stargate/config/StargateConfig.java | 12 ++++--------
.../stargate/config/StargateYamlConfiguration.java | 6 +++++-
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 8dd8709..1b208ba 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -74,7 +74,7 @@ along with this program. If not, see .
@SuppressWarnings("unused")
public class Stargate extends JavaPlugin {
- private static final String configFileName = "config.yml";
+ private static final String CONFIG_FILE_NAME = "config.yml";
private static final Queue blockChangeRequestQueue = new LinkedList<>();
private static final Queue chunkUnloadQueue = new PriorityQueue<>();
@@ -353,7 +353,7 @@ public class Stargate extends JavaPlugin {
super.reloadConfig();
this.configuration = new StargateYamlConfiguration();
try {
- this.configuration.load(new File(getDataFolder(), configFileName));
+ this.configuration.load(new File(getDataFolder(), CONFIG_FILE_NAME));
} catch (IOException | InvalidConfigurationException e) {
logSevere("Unable to load the configuration! Message: " + e.getMessage());
}
@@ -363,7 +363,7 @@ public class Stargate extends JavaPlugin {
public void saveConfig() {
super.saveConfig();
try {
- this.configuration.save(new File(getDataFolder(), configFileName));
+ this.configuration.save(new File(getDataFolder(), CONFIG_FILE_NAME));
} catch (IOException e) {
logSevere("Unable to save the configuration! Message: " + e.getMessage());
}
@@ -381,15 +381,15 @@ public class Stargate extends JavaPlugin {
@Override
public void onEnable() {
- stargate = this;
- logger = getLogger();
+ Stargate.stargate = this;
+ Stargate.logger = getLogger();
this.saveDefaultConfig();
this.getConfig();
PluginDescriptionFile pluginDescriptionFile = this.getDescription();
pluginManager = getServer().getPluginManager();
this.configuration = new StargateYamlConfiguration();
try {
- this.configuration.load(new File(getDataFolder(), configFileName));
+ this.configuration.load(new File(getDataFolder(), CONFIG_FILE_NAME));
} catch (IOException | InvalidConfigurationException e) {
getLogger().log(Level.SEVERE, e.getMessage());
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index dce9109..5569e4d 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -549,10 +549,8 @@ public final class StargateConfig {
createMissingFolder(new File(portalFolder), "Unable to create portal directory");
File newFile = new File(portalFolder, Stargate.getInstance().getServer().getWorlds().get(0).getName() +
".db");
- if (!newFile.exists() && !newFile.getParentFile().exists()) {
- if (!newFile.getParentFile().mkdirs()) {
- logger.severe("Unable to create portal database folder: " + newFile.getParentFile().getPath());
- }
+ if (!newFile.exists() && !newFile.getParentFile().exists() && !newFile.getParentFile().mkdirs()) {
+ logger.severe("Unable to create portal database folder: " + newFile.getParentFile().getPath());
}
}
@@ -563,10 +561,8 @@ public final class StargateConfig {
* @param errorMessage The error message to display if unable to create the folder
*/
private void createMissingFolder(File folder, String errorMessage) {
- if (!folder.exists()) {
- if (!folder.mkdirs()) {
- logger.severe(errorMessage);
- }
+ if (!folder.exists() && !folder.mkdirs()) {
+ logger.severe(errorMessage);
}
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 9e7bfd0..085c3b2 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -10,7 +10,11 @@ import java.util.ArrayList;
import java.util.List;
/**
- * A YAML configuration which keeps all comments
+ * A YAML configuration which retains all comments
+ *
+ * This configuration converts all comments to YAML values when loaded, which all start with comment_. When saved,
+ * those YAML values are converted to normal text comments. This ensures that the comments aren't removed by the
+ * YamlConfiguration during its parsing.
*
* @author Thorin
*/
From 53126beba3ae288e9067acbb0d88db693571934d Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 16:15:03 +0200
Subject: [PATCH 037/112] Adds author to StargateYamlConfiguration
---
.../net/knarcraft/stargate/config/StargateYamlConfiguration.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
index 085c3b2..84b73b7 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateYamlConfiguration.java
@@ -16,6 +16,7 @@ import java.util.List;
* those YAML values are converted to normal text comments. This ensures that the comments aren't removed by the
* YamlConfiguration during its parsing.
*
+ * @author Kristian Knarvik
* @author Thorin
*/
public class StargateYamlConfiguration extends YamlConfiguration {
From 30a5efdadf134fed4112663165915cef321760c0 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Fri, 21 Apr 2023 10:17:08 -0400
Subject: [PATCH 038/112] Bumped version, added changelog, fixed readme .
---
README.md | 15 ++++++++++-----
pom.xml | 2 +-
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index f1b0258..ce364bf 100644
--- a/README.md
+++ b/README.md
@@ -519,8 +519,13 @@ portalInfoServer=Server: %server%
> currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+#### \[Version 0.11.5.2] Unified Legacy Fork
+- Improved handling of incompatible server environments (i.e. CraftBukkit)
+- Significantly improved an internal system responsible for yaml migrations.
+- Imported the LCLO fork's configuration comments.
+- Fixed a problem that caused the update checker to produce false positives.
-#### [Version 0.11.5.1] UNIFIED LEGACY FORK
+#### \[Version 0.11.5.1] UNIFIED LEGACY FORK
- Merged the fork into the [SG Rewritten Project](https://sgrewritten.org)
- *This fork is now the maintained legacy branch of the Stargate Rewritten Project*.
@@ -529,9 +534,9 @@ portalInfoServer=Server: %server%
- Changed the `E` flag to `V`, to improve consistency for the rewrite.
- Reworked the readme and changed some shortcuts
-#### [Version 0.10.X.X] LCLO fork
+#### \[Version 0.10.X.X] LCLO fork
-- Reimplemented/merged the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-Bukkit/tree/legacy),
+- Reimplemented/merged the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-ESR/tree/ESR-1.13.2-1.16.5),
notably:
- Added material #tag support
- Expanded legacy migration support
@@ -540,11 +545,11 @@ portalInfoServer=Server: %server%
- Added bstats
> **NOTE: The LCLO fork has its own changelog,
-found [here](https://github.com/stargate-rewritten/Stargate-Bukkit/blob/legacy/README.md#changes)!**
+found [here](https://github.com/stargate-rewritten/Stargate-ESR#version-01081-lclo-fork)!**
> For brevity, the full list has been excluded from the below.
> In general, it is safe to assume **FULL LCLO PARITY** as of this version.
-#### [Version 0.9.4.2] EpicKnarvik97 fork
+#### \[Version 0.9.4.2] EpicKnarvik97 fork
- Prevents improperly loaded dependencies from causing problems with SG.
- Improved Dynmap integration and associated bug fixes.
diff --git a/pom.xml b/pom.xml
index de1c04b..4dc1b40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.11.5.1-SNAPSHOT
+ 0.11.5.2
From b3428877bac26a26c5d3842e66dba6ea04a4d98e Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Fri, 21 Apr 2023 11:49:27 -0400
Subject: [PATCH 039/112] Cleaned up Config & Updated Changelog
---
README.md | 1 +
src/main/resources/config.yml | 34 +++++++++++++++++-----------------
2 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/README.md b/README.md
index ce364bf..56af49a 100644
--- a/README.md
+++ b/README.md
@@ -524,6 +524,7 @@ portalInfoServer=Server: %server%
- Significantly improved an internal system responsible for yaml migrations.
- Imported the LCLO fork's configuration comments.
- Fixed a problem that caused the update checker to produce false positives.
+- Added support for Tax Accounts (part of Towny Closed Economies)
#### \[Version 0.11.5.1] UNIFIED LEGACY FORK
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 008f456..8d6cc08 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -107,7 +107,10 @@ gates:
# This is more resource intensive, and should really only be used if verifyPortals is true.
# Or if using an easily destroyable open/closed material.
protectEntrance: false
-
+
+ # +----------------------------------------------------------------------------------------------+ #
+ # | Aesthetic Tweaks | #
+ # +----------------------------------------------------------------------------------------------+ #
cosmetic:
# Will the destination a networked portal last connected to be listed first in its scroll menu?
rememberDestination: false
@@ -135,10 +138,20 @@ gates:
- 'SPRUCE:inverted,inverted'
- 'WARPED:inverted,inverted'
-# +----------------------------------------------------------------------------------------------+ #
-# | Economy | #
-# +----------------------------------------------------------------------------------------------+ #
economy:
+ # When scrolling through a networked portal's destination list, should SG color free gates?
+ freeGatesColored: false
+
+ # If freeGatesColored is true, which color should SG use?
+ #
+ # All color names should follow this format:
+ # https://hub.spigotmc.org/javadocs/spigot/org/bukkit/ChatColor.html
+ freeGatesColor: DARK_GREEN
+
+ # +----------------------------------------------------------------------------------------------+ #
+ # | Economy | #
+ # +----------------------------------------------------------------------------------------------+ #
+
# Will StarGate interact with your server's economy?
#
# …««»»… For these features, StarGate depends on the Vault plugin.
@@ -163,19 +176,6 @@ economy:
# Note that this only applies to fixed gates.
chargeFreeDestination: true
- # +----------------------------------------------------------------------------------------------+ #
- # | Aesthetic Tweaks | #
- # +----------------------------------------------------------------------------------------------+ #
-
- # When scrolling through a networked portal's destination list, should SG color free gates?
- freeGatesColored: false
-
- # If freeGatesColored is true, which color should SG use?
- #
- # All color names should follow this format:
- # https://hub.spigotmc.org/javadocs/spigot/org/bukkit/ChatColor.html
- freeGatesColor: DARK_GREEN
-
# Does your server have a tax account (closed economy)?
# If so, please provide the name of your tax account (collected money will be sent to it).
# If not, leave this section blank (collected money will be deleted).
From cbc9e85314299b1063b45762bef70b1bf7e95c6d Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 21 Apr 2023 17:56:10 +0200
Subject: [PATCH 040/112] Fixes some formatting again
---
README.md | 5 ++++-
src/main/resources/config.yml | 3 +--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 56af49a..5ea54f6 100644
--- a/README.md
+++ b/README.md
@@ -519,7 +519,9 @@ portalInfoServer=Server: %server%
> currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+
#### \[Version 0.11.5.2] Unified Legacy Fork
+
- Improved handling of incompatible server environments (i.e. CraftBukkit)
- Significantly improved an internal system responsible for yaml migrations.
- Imported the LCLO fork's configuration comments.
@@ -537,7 +539,8 @@ portalInfoServer=Server: %server%
#### \[Version 0.10.X.X] LCLO fork
-- Reimplemented/merged the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-ESR/tree/ESR-1.13.2-1.16.5),
+- Reimplemented/merged
+ the [LCLO fork ecosystem](https://github.com/stargate-rewritten/Stargate-ESR/tree/ESR-1.13.2-1.16.5),
notably:
- Added material #tag support
- Expanded legacy migration support
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 8d6cc08..41180c5 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -81,7 +81,6 @@ gates:
# Generally, that node is given to staff (we recommend stargate.create.personal for users).
defaultGateNetwork: central
-
# At what speed should players be sent out of portals?
# When exiting a gate, players retain their original movement velocity, multiplied by this value.
exitVelocity: 0.1
@@ -107,7 +106,7 @@ gates:
# This is more resource intensive, and should really only be used if verifyPortals is true.
# Or if using an easily destroyable open/closed material.
protectEntrance: false
-
+
# +----------------------------------------------------------------------------------------------+ #
# | Aesthetic Tweaks | #
# +----------------------------------------------------------------------------------------------+ #
From 0d073a7dad88401569cd2315206439856a0495c4 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sun, 21 May 2023 10:58:42 +0200
Subject: [PATCH 041/112] Fixes #291
---
src/main/java/net/knarcraft/stargate/config/StargateConfig.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 5569e4d..2616be9 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -100,8 +100,8 @@ public final class StargateConfig {
languageLoader.debug();
}
- this.createMissingFolders();
this.loadGates();
+ this.createMissingFolders();
this.loadAllPortals();
//Set up vault economy if vault has been loaded
From 6f88eecb419266d41e3382b2dd9664dcb2a3d106 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Sun, 21 May 2023 08:21:33 -0400
Subject: [PATCH 042/112] Update changelog and bumps version.
(Preparing for minor release)
---
README.md | 3 +++
pom.xml | 2 +-
src/main/resources/plugin.yml | 2 +-
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 5ea54f6..0899f1b 100644
--- a/README.md
+++ b/README.md
@@ -520,6 +520,9 @@ portalInfoServer=Server: %server%
# Changes
+#### \[Version 0.11.5.3] Unified Legacy Fork
+- Hotfix for an issue wherein the gate folder failed to populate on fresh installs.
+
#### \[Version 0.11.5.2] Unified Legacy Fork
- Improved handling of incompatible server environments (i.e. CraftBukkit)
diff --git a/pom.xml b/pom.xml
index 4dc1b40..faa60f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.11.5.2
+ 0.11.5.3
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index ae8bd28..b5053dd 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,7 +1,7 @@
name: Stargate
main: net.knarcraft.stargate.Stargate
version: '${project.version}'
-description: Stargate mod for Bukkit Revived
+description: The original, and still the best, MineCraft transportation solution (Legacy Version)
author: EpicKnarvik97
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]
website: https://sgrewritten.org/legacygit
From 9d48374d28172470ec0e4d63ba02ef7224636cb5 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 31 May 2023 17:13:13 +0200
Subject: [PATCH 043/112] Possibly fixes #296
---
.../java/net/knarcraft/stargate/portal/PortalHandler.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java
index 44ffb81..4ecdc5a 100644
--- a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java
+++ b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java
@@ -172,6 +172,11 @@ public class PortalHandler {
portalLocation.setButtonVector(controlVector);
}
}
+
+ //If our gate has been found, look no further
+ if (gate != null) {
+ break;
+ }
}
return gate;
From 732cabd040759b00e1e797e42a0da4953f92b714 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Thu, 1 Jun 2023 19:24:20 -0400
Subject: [PATCH 044/112] Update readme for release bump
---
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 0899f1b..cbae225 100644
--- a/README.md
+++ b/README.md
@@ -520,6 +520,10 @@ portalInfoServer=Server: %server%
# Changes
+#### \[Version 0.11.5.4] Unified Legacy Fork
+- Fix for a problem which could cause activators to generate at invalid locations.
+- Minor documentation clarification.
+
#### \[Version 0.11.5.3] Unified Legacy Fork
- Hotfix for an issue wherein the gate folder failed to populate on fresh installs.
@@ -1330,4 +1334,4 @@ found [here](https://github.com/stargate-rewritten/Stargate-ESR#version-01081-lc
- Changed package to net.TheDgtl.*
- Everything now uses Blox instead of Block objects
-- Started on vehicle code, but it's still buggy
\ No newline at end of file
+- Started on vehicle code, but it's still buggy
From 22f4cb78f61f116962f5505c21be469f295a30ca Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Thu, 1 Jun 2023 19:24:37 -0400
Subject: [PATCH 045/112] Bumped Version
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index faa60f5..5a48643 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.11.5.3
+ 0.11.5.4
@@ -166,4 +166,4 @@
-
\ No newline at end of file
+
From 1c06cf21889808f6238a9a2db0e4995e91919d90 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 7 Jun 2023 18:35:22 +0200
Subject: [PATCH 046/112] Updates depreciated sign API calls
---
README.md | 2 ++
pom.xml | 2 +-
.../java/net/knarcraft/stargate/container/SignData.java | 3 ++-
.../net/knarcraft/stargate/portal/PortalHandler.java | 2 +-
.../net/knarcraft/stargate/portal/PortalSignDrawer.java | 9 +++++----
5 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index cbae225..a306860 100644
--- a/README.md
+++ b/README.md
@@ -521,10 +521,12 @@ portalInfoServer=Server: %server%
# Changes
#### \[Version 0.11.5.4] Unified Legacy Fork
+
- Fix for a problem which could cause activators to generate at invalid locations.
- Minor documentation clarification.
#### \[Version 0.11.5.3] Unified Legacy Fork
+
- Hotfix for an issue wherein the gate folder failed to populate on fresh installs.
#### \[Version 0.11.5.2] Unified Legacy Fork
diff --git a/pom.xml b/pom.xml
index 5a48643..b09658f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
org.spigotmc
spigot-api
- 1.19.4-R0.1-SNAPSHOT
+ 1.20-R0.1-SNAPSHOT
provided
diff --git a/src/main/java/net/knarcraft/stargate/container/SignData.java b/src/main/java/net/knarcraft/stargate/container/SignData.java
index 1b4bd31..f806ba4 100644
--- a/src/main/java/net/knarcraft/stargate/container/SignData.java
+++ b/src/main/java/net/knarcraft/stargate/container/SignData.java
@@ -4,6 +4,7 @@ import net.knarcraft.knarlib.util.ColorHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.block.Sign;
+import org.bukkit.block.sign.Side;
/**
* A class that keeps track of the sign colors for a given sign
@@ -26,7 +27,7 @@ public class SignData {
this.sign = sign;
this.mainSignColor = mainSignColor;
this.highlightSignColor = highlightSignColor;
- this.dyedColor = sign.getColor();
+ this.dyedColor = sign.getSide(Side.FRONT).getColor();
}
/**
diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java
index 4ecdc5a..3ce9b56 100644
--- a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java
+++ b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java
@@ -172,7 +172,7 @@ public class PortalHandler {
portalLocation.setButtonVector(controlVector);
}
}
-
+
//If our gate has been found, look no further
if (gate != null) {
break;
diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java
index 3dabc9e..3357daa 100644
--- a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java
+++ b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java
@@ -11,6 +11,7 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
+import org.bukkit.block.sign.Side;
import java.util.Map;
@@ -175,7 +176,7 @@ public class PortalSignDrawer {
*/
private void clearSign(Sign sign) {
for (int index = 0; index <= 3; index++) {
- sign.setLine(index, "");
+ sign.getSide(Side.FRONT).setLine(index, "");
}
}
@@ -188,7 +189,7 @@ public class PortalSignDrawer {
return;
}
clearSign(sign);
- sign.setLine(0, translateAllColorCodes(portal.getName()));
+ sign.getSide(Side.FRONT).setLine(0, translateAllColorCodes(portal.getName()));
sign.update();
}
@@ -256,7 +257,7 @@ public class PortalSignDrawer {
*/
public void setLine(SignData signData, int index, String text) {
ChatColor mainColor = signData.getMainSignColor();
- signData.getSign().setLine(index, mainColor + text);
+ signData.getSign().getSide(Side.FRONT).setLine(index, mainColor + text);
}
/**
@@ -357,7 +358,7 @@ public class PortalSignDrawer {
if (!(blockState instanceof Sign sign)) {
return;
}
- sign.setLine(3, errorColor + Stargate.getString("signInvalidGate"));
+ sign.getSide(Side.FRONT).setLine(3, errorColor + Stargate.getString("signInvalidGate"));
sign.update();
Stargate.logInfo(String.format("Gate layout on line %d does not exist [%s]", lineIndex, gateName));
From 27fba221d63f1e2431e9919efaae6b785b571ded Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Wed, 7 Jun 2023 22:25:41 +0200
Subject: [PATCH 047/112] Adds per-sign color settings for the new signs
---
src/main/java/net/knarcraft/stargate/config/ConfigOption.java | 3 ++-
src/main/resources/config.yml | 2 ++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/ConfigOption.java b/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
index 1747bae..e6879e5 100644
--- a/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
+++ b/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
@@ -55,7 +55,8 @@ public enum ConfigOption {
*/
PER_SIGN_COLORS("gates.cosmetic.perSignColors", "The per-sign color specification", new String[]{
"'ACACIA:default,default'", "'BIRCH:default,default'", "'CRIMSON:inverted,inverted'", "'DARK_OAK:inverted,inverted'",
- "'JUNGLE:default,default'", "'OAK:default,default'", "'SPRUCE:inverted,inverted'", "'WARPED:inverted,inverted'"}),
+ "'JUNGLE:default,default'", "'OAK:default,default'", "'SPRUCE:inverted,inverted'", "'WARPED:inverted,inverted'",
+ "'BAMBOO:default,default'", "'CHERRY:default,default'"}),
/**
* Whether to destroy portals when any blocks are broken by explosions
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 41180c5..eeaf860 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -136,6 +136,8 @@ gates:
- 'OAK:default,default'
- 'SPRUCE:inverted,inverted'
- 'WARPED:inverted,inverted'
+ - 'BAMBOO:default,default'
+ - 'CHERRY:default,default'
economy:
# When scrolling through a networked portal's destination list, should SG color free gates?
From ef2238a5352740cd525ecd320c8da829a7d69899 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Wed, 7 Jun 2023 16:56:12 -0400
Subject: [PATCH 048/112] Update README.md
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index a306860..c11ebcb 100644
--- a/README.md
+++ b/README.md
@@ -267,6 +267,8 @@ DARK_OAK_BUTTON
CRIMSON_BUTTON
WARPED_BUTTON
POLISHED_BLACKSTONE_BUTTON
+BAMBOO_BUTTON
+CHERRY_BUTTON
CHEST
TRAPPED_CHEST
@@ -524,6 +526,7 @@ portalInfoServer=Server: %server%
- Fix for a problem which could cause activators to generate at invalid locations.
- Minor documentation clarification.
+- Added support for MineCraft version 1.20
#### \[Version 0.11.5.3] Unified Legacy Fork
From 6b6e9d007eee868f59b997f9e9d4a5cff4c1fea6 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 17 Jun 2023 14:37:05 +0200
Subject: [PATCH 049/112] Fixes compatibility for pre-1.20 spigot
---
.../stargate/container/SignData.java | 4 +-
.../stargate/portal/PortalSignDrawer.java | 10 +--
.../stargate/utility/SignHelper.java | 67 +++++++++++++++++++
3 files changed, 74 insertions(+), 7 deletions(-)
create mode 100644 src/main/java/net/knarcraft/stargate/utility/SignHelper.java
diff --git a/src/main/java/net/knarcraft/stargate/container/SignData.java b/src/main/java/net/knarcraft/stargate/container/SignData.java
index f806ba4..ccb25fb 100644
--- a/src/main/java/net/knarcraft/stargate/container/SignData.java
+++ b/src/main/java/net/knarcraft/stargate/container/SignData.java
@@ -1,10 +1,10 @@
package net.knarcraft.stargate.container;
import net.knarcraft.knarlib.util.ColorHelper;
+import net.knarcraft.stargate.utility.SignHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.block.Sign;
-import org.bukkit.block.sign.Side;
/**
* A class that keeps track of the sign colors for a given sign
@@ -27,7 +27,7 @@ public class SignData {
this.sign = sign;
this.mainSignColor = mainSignColor;
this.highlightSignColor = highlightSignColor;
- this.dyedColor = sign.getSide(Side.FRONT).getColor();
+ this.dyedColor = SignHelper.getDye(sign);
}
/**
diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java
index 3357daa..00f8c25 100644
--- a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java
+++ b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java
@@ -6,12 +6,12 @@ import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.container.SignData;
import net.knarcraft.stargate.portal.property.PortalLocation;
import net.knarcraft.stargate.utility.PermissionHelper;
+import net.knarcraft.stargate.utility.SignHelper;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
-import org.bukkit.block.sign.Side;
import java.util.Map;
@@ -176,7 +176,7 @@ public class PortalSignDrawer {
*/
private void clearSign(Sign sign) {
for (int index = 0; index <= 3; index++) {
- sign.getSide(Side.FRONT).setLine(index, "");
+ SignHelper.setSignLine(sign, index, "");
}
}
@@ -189,7 +189,7 @@ public class PortalSignDrawer {
return;
}
clearSign(sign);
- sign.getSide(Side.FRONT).setLine(0, translateAllColorCodes(portal.getName()));
+ SignHelper.setSignLine(sign, 0, translateAllColorCodes(portal.getName()));
sign.update();
}
@@ -257,7 +257,7 @@ public class PortalSignDrawer {
*/
public void setLine(SignData signData, int index, String text) {
ChatColor mainColor = signData.getMainSignColor();
- signData.getSign().getSide(Side.FRONT).setLine(index, mainColor + text);
+ SignHelper.setSignLine(signData.getSign(), index, mainColor + text);
}
/**
@@ -358,7 +358,7 @@ public class PortalSignDrawer {
if (!(blockState instanceof Sign sign)) {
return;
}
- sign.getSide(Side.FRONT).setLine(3, errorColor + Stargate.getString("signInvalidGate"));
+ SignHelper.setSignLine(sign, 3, errorColor + Stargate.getString("signInvalidGate"));
sign.update();
Stargate.logInfo(String.format("Gate layout on line %d does not exist [%s]", lineIndex, gateName));
diff --git a/src/main/java/net/knarcraft/stargate/utility/SignHelper.java b/src/main/java/net/knarcraft/stargate/utility/SignHelper.java
new file mode 100644
index 0000000..af6f790
--- /dev/null
+++ b/src/main/java/net/knarcraft/stargate/utility/SignHelper.java
@@ -0,0 +1,67 @@
+package net.knarcraft.stargate.utility;
+
+import org.bukkit.DyeColor;
+import org.bukkit.block.Sign;
+import org.bukkit.block.sign.Side;
+
+/**
+ * A helper class for dealing with signs
+ */
+public final class SignHelper {
+
+ private static final boolean HAS_SIGN_SIDES = hasSignSides();
+
+ private SignHelper() {
+
+ }
+
+ /**
+ * Gets the dye color of the given sign
+ *
+ * @param sign The sign to check
+ * @return The dye currently applied to the sign
+ */
+ public static DyeColor getDye(Sign sign) {
+ if (HAS_SIGN_SIDES) {
+ return sign.getSide(Side.FRONT).getColor();
+ } else {
+ // Note: This is depreciated, but is currently necessary for pre-1.19.4 support
+ //noinspection deprecation
+ return sign.getColor();
+ }
+ }
+
+ /**
+ * Sets the text of a line on a sign
+ *
+ * @param sign The sign to set text for
+ * @param line The line to set
+ * @param text The text to set
+ */
+ public static void setSignLine(Sign sign, int line, String text) {
+ if (HAS_SIGN_SIDES) {
+ sign.getSide(Side.FRONT).setLine(line, text);
+ } else {
+ // Note: This is depreciated, but is currently necessary for pre-1.19.4 support
+ //noinspection deprecation
+ sign.setLine(line, text);
+ }
+ }
+
+ /**
+ * Checks whether the running version differentiates between the front or back of a sign
+ *
+ * @return True if the server supports sign side differentiation
+ */
+ private static boolean hasSignSides() {
+ try {
+ Class.forName("Side");
+ Class> aClass = Class.forName("org.bukkit.block.Sign");
+ aClass.getMethod("getSide", Side.class);
+ return true;
+ } catch (ClassNotFoundException | NoSuchMethodException ignored) {
+ return false;
+ }
+ }
+
+}
From 3e8bfbe5f606f71e73be3efde5842cc639e75b96 Mon Sep 17 00:00:00 2001
From: Thorinwasher
Date: Sat, 17 Jun 2023 15:26:49 +0200
Subject: [PATCH 050/112] Bumped version
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b09658f..c347cb4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.11.5.4
+ 0.11.5.5
From 902fc0aa4e6f4701d1fed9cb432cf4f2e7384005 Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Sat, 17 Jun 2023 09:28:12 -0400
Subject: [PATCH 051/112] Updated readme to prep for minor release.
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index c11ebcb..08ba4c0 100644
--- a/README.md
+++ b/README.md
@@ -521,6 +521,8 @@ portalInfoServer=Server: %server%
> currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+#### \[Version 0.11.5.5] Unified Legacy Fork
+- Hotfix for a compatibility issue preventing the plugin from working on most pre-1.20 server jars.
#### \[Version 0.11.5.4] Unified Legacy Fork
From 3fcae6ca459ba021ce9c1ee07dd5a432dfef6a89 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Tue, 27 Jun 2023 13:47:35 +0200
Subject: [PATCH 052/112] Tries to fix a stack trace when Dynmap fails to
disable itself
---
.../net/knarcraft/stargate/config/DynmapManager.java | 3 ++-
.../net/knarcraft/stargate/config/StargateConfig.java | 9 +++++++--
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/DynmapManager.java b/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
index 5eaa0c9..c6cd645 100644
--- a/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
+++ b/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
@@ -27,8 +27,9 @@ public final class DynmapManager {
* Initializes the dynmap manager
*
* @param dynmapAPI A reference
+ * @throws NullPointerException If dynmap has an invalid state
*/
- public static void initialize(DynmapAPI dynmapAPI) {
+ public static void initialize(DynmapAPI dynmapAPI) throws NullPointerException {
if (dynmapAPI == null || dynmapAPI.getMarkerAPI() == null) {
markerSet = null;
portalIcon = null;
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 2616be9..98f2f34 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -108,8 +108,13 @@ public final class StargateConfig {
setupVaultEconomy();
DynmapAPI dynmapAPI = (DynmapAPI) Bukkit.getPluginManager().getPlugin("dynmap");
if (dynmapAPI != null) {
- DynmapManager.initialize(dynmapAPI);
- DynmapManager.addAllPortalMarkers();
+ try {
+ DynmapManager.initialize(dynmapAPI);
+ DynmapManager.addAllPortalMarkers();
+ } catch (NullPointerException exception) {
+ logger.warning("Dynmap started in an invalid state. Check your log/console for dynmap-related " +
+ "problems. Dynmap integration cannot be initialized.");
+ }
}
this.isLoaded = true;
From e85f133bc2c876369e6dab21b29130ae740d349e Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Fri, 11 Aug 2023 14:42:37 +0200
Subject: [PATCH 053/112] Uses depositPlayer for negative economy transactions
---
.../java/net/knarcraft/stargate/utility/EconomyHelper.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java
index 4c725ae..3bdccb1 100644
--- a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java
@@ -182,7 +182,11 @@ public final class EconomyHelper {
if (!economy.has(player, amount)) {
return false;
}
- economy.withdrawPlayer(player, amount);
+ if (amount > 0) {
+ economy.withdrawPlayer(player, amount);
+ } else {
+ economy.depositPlayer(player, -amount);
+ }
}
return true;
}
From 30cba7051ca70a2181c36bec9563342dd62f6d7c Mon Sep 17 00:00:00 2001
From: furplag
Date: Thu, 28 Dec 2023 13:18:04 +0900
Subject: [PATCH 054/112] Update DirectionHelper.java
fix exception occur when invalid yaw ( negative value ) given .
---
.../java/net/knarcraft/stargate/utility/DirectionHelper.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java b/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java
index c42fe6d..82adf9f 100644
--- a/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java
@@ -113,6 +113,9 @@ public final class DirectionHelper {
* @return A normal vector
*/
public static Vector getCoordinateVectorFromRelativeVector(double right, double down, double out, double yaw) {
+ //Make sure the yaw is between 0 and 360
+ yaw = normalizeYaw(yaw);
+
if (yaw == 0) {
//South
return new Vector(right, -down, out);
From 44aadcd225eb77bc094a5d292f1248f6d912edd3 Mon Sep 17 00:00:00 2001
From: Thorinwasher
Date: Thu, 28 Dec 2023 17:25:13 +0100
Subject: [PATCH 055/112] Implement the debug command
---
.gitignore | 2 ++
.../stargate/command/CommandDebug.java | 25 +++++++++++++++++++
.../stargate/command/CommandStarGate.java | 8 ++++++
3 files changed, 35 insertions(+)
create mode 100644 src/main/java/net/knarcraft/stargate/command/CommandDebug.java
diff --git a/.gitignore b/.gitignore
index 96ef862..997d420 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
target/
.idea/
+*.secret
+*.db
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandDebug.java b/src/main/java/net/knarcraft/stargate/command/CommandDebug.java
new file mode 100644
index 0000000..a529976
--- /dev/null
+++ b/src/main/java/net/knarcraft/stargate/command/CommandDebug.java
@@ -0,0 +1,25 @@
+package net.knarcraft.stargate.command;
+
+import net.md_5.bungee.api.ChatColor;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+
+public class CommandDebug implements CommandExecutor {
+ private final Plugin plugin;
+
+ public CommandDebug(Plugin stargate){
+ this.plugin = stargate;
+ }
+ @Override
+ public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) {
+ ChatColor textColor = ChatColor.GOLD;
+ ChatColor highlightColor = ChatColor.GREEN;
+ commandSender.sendMessage(textColor + "Stargate version " + highlightColor + plugin.getDescription().getVersion()
+ + textColor + "running on " + highlightColor + Bukkit.getServer().getVersion());
+ return true;
+ }
+}
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java b/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
index 2185b54..4593184 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
@@ -5,6 +5,7 @@ import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
@@ -16,6 +17,11 @@ import java.util.Arrays;
* the plugin itself, not commands for functions of the plugin.
*/
public class CommandStarGate implements CommandExecutor {
+ private final Plugin stargate;
+
+ public CommandStarGate(Plugin stargate) {
+ this.stargate = stargate;
+ }
@Override
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
@@ -28,6 +34,8 @@ public class CommandStarGate implements CommandExecutor {
} else if (args[0].equalsIgnoreCase("config")) {
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
return new CommandConfig().onCommand(commandSender, command, s, subArgs);
+ } else if (args[0].equalsIgnoreCase("debug")) {
+ return new CommandDebug(this.stargate).onCommand(commandSender, command, s, args);
}
return false;
} else {
From f37a196dd9f5e1d59989c3ad1a4eab1bb07ff121 Mon Sep 17 00:00:00 2001
From: Thorinwasher
Date: Thu, 28 Dec 2023 17:28:59 +0100
Subject: [PATCH 056/112] sg debug -> sg
---
.../stargate/command/CommandDebug.java | 25 -------------------
.../stargate/command/CommandStarGate.java | 7 +++---
2 files changed, 3 insertions(+), 29 deletions(-)
delete mode 100644 src/main/java/net/knarcraft/stargate/command/CommandDebug.java
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandDebug.java b/src/main/java/net/knarcraft/stargate/command/CommandDebug.java
deleted file mode 100644
index a529976..0000000
--- a/src/main/java/net/knarcraft/stargate/command/CommandDebug.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.knarcraft.stargate.command;
-
-import net.md_5.bungee.api.ChatColor;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.plugin.Plugin;
-import org.jetbrains.annotations.NotNull;
-
-public class CommandDebug implements CommandExecutor {
- private final Plugin plugin;
-
- public CommandDebug(Plugin stargate){
- this.plugin = stargate;
- }
- @Override
- public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) {
- ChatColor textColor = ChatColor.GOLD;
- ChatColor highlightColor = ChatColor.GREEN;
- commandSender.sendMessage(textColor + "Stargate version " + highlightColor + plugin.getDescription().getVersion()
- + textColor + "running on " + highlightColor + Bukkit.getServer().getVersion());
- return true;
- }
-}
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java b/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
index 4593184..b35cb4a 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
@@ -2,6 +2,7 @@ package net.knarcraft.stargate.command;
import net.knarcraft.stargate.Stargate;
import net.md_5.bungee.api.ChatColor;
+import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -34,13 +35,11 @@ public class CommandStarGate implements CommandExecutor {
} else if (args[0].equalsIgnoreCase("config")) {
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
return new CommandConfig().onCommand(commandSender, command, s, subArgs);
- } else if (args[0].equalsIgnoreCase("debug")) {
- return new CommandDebug(this.stargate).onCommand(commandSender, command, s, args);
}
return false;
} else {
- commandSender.sendMessage(ChatColor.GOLD + "Stargate version " +
- ChatColor.GREEN + Stargate.getPluginVersion());
+ commandSender.sendMessage(ChatColor.GREEN + "Stargate version " + ChatColor.GOLD + stargate.getDescription().getVersion()
+ + ChatColor.GREEN + " running on " + ChatColor.GOLD + Bukkit.getServer().getVersion());
return true;
}
}
From f657816533dc904006a7b784e792a25ebad2ca0f Mon Sep 17 00:00:00 2001
From: Thorinwasher
Date: Fri, 29 Dec 2023 12:43:58 +0100
Subject: [PATCH 057/112] Modify the about command
---
pom.xml | 26 +++++++++++++++-
.../java/net/knarcraft/stargate/Stargate.java | 2 +-
.../stargate/command/CommandAbout.java | 18 ++++++++---
.../stargate/utility/FileHelper.java | 30 +++++++++++++++++++
src/main/resources/messages/about.md | 6 ++++
5 files changed, 76 insertions(+), 6 deletions(-)
create mode 100644 src/main/java/net/knarcraft/stargate/utility/FileHelper.java
create mode 100644 src/main/resources/messages/about.md
diff --git a/pom.xml b/pom.xml
index c347cb4..103b255 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
net.knarcraft
Stargate
- 0.11.5.5
+ 0.11.5.6
@@ -39,6 +39,10 @@
papermc
https://repo.papermc.io/repository/maven-public/
+
+ minebench-repo
+ https://repo.minebench.de/
+
@@ -96,6 +100,18 @@
3.0.1
compile
+
+ net.kyori
+ adventure-platform-bukkit
+ 4.3.2
+ compile
+
+
+ de.themoep
+ minedown
+ 1.7.1-SNAPSHOT
+ compile
+
@@ -120,6 +136,7 @@
org.bstats:*
net.knarcraft:knarlib
+ de.themoep:minedown
@@ -139,6 +156,13 @@
net.knarcraft
net.knarcraft
+
+ net.kyori
+
+
+ de.themoep.minedown
+ net.knarcraft.stargate.minedown
+
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 1b208ba..3293978 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -460,7 +460,7 @@ public class Stargate extends JavaPlugin {
private void registerCommands() {
PluginCommand stargateCommand = this.getCommand("stargate");
if (stargateCommand != null) {
- stargateCommand.setExecutor(new CommandStarGate());
+ stargateCommand.setExecutor(new CommandStarGate(this));
stargateCommand.setTabCompleter(new StarGateTabCompleter());
}
}
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandAbout.java b/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
index f0acd50..8e0be5a 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
@@ -1,12 +1,18 @@
package net.knarcraft.stargate.command;
+import de.themoep.minedown.MineDown;
import net.knarcraft.stargate.Stargate;
+import net.knarcraft.stargate.utility.FileHelper;
import net.md_5.bungee.api.ChatColor;
+import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
+import java.io.IOException;
+import java.io.InputStream;
+
/**
* This command represents the plugin's about command
*/
@@ -18,10 +24,14 @@ public class CommandAbout implements CommandExecutor {
ChatColor textColor = ChatColor.GOLD;
ChatColor highlightColor = ChatColor.GREEN;
- commandSender.sendMessage(textColor + "Stargate Plugin originally created by " + highlightColor +
- "Drakia" + textColor + ", and revived by " + highlightColor + "EpicKnarvik97");
- commandSender.sendMessage(textColor + "Go to " + highlightColor +
- "https://git.knarcraft.net/EpicKnarvik97/Stargate " + textColor + "for the official repository");
+
+ try(InputStream inputStream = Stargate.class.getResourceAsStream("/messages/about.md")){
+ String aboutMessageString = FileHelper.readStreamToString(inputStream);
+ BaseComponent[] component = MineDown.parse(aboutMessageString);
+ commandSender.spigot().sendMessage(component);
+ } catch (IOException ioException){
+ commandSender.sendMessage("Internal error");
+ }
String author = Stargate.getStargateConfig().getLanguageLoader().getString("author");
if (!author.isEmpty()) {
commandSender.sendMessage(textColor + "Language created by " + highlightColor + author);
diff --git a/src/main/java/net/knarcraft/stargate/utility/FileHelper.java b/src/main/java/net/knarcraft/stargate/utility/FileHelper.java
new file mode 100644
index 0000000..172ba41
--- /dev/null
+++ b/src/main/java/net/knarcraft/stargate/utility/FileHelper.java
@@ -0,0 +1,30 @@
+package net.knarcraft.stargate.utility;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+public class FileHelper {
+
+ /**
+ * Converts the stream directly into a string, includes the newline character
+ *
+ * @param stream The stream to read from
+ * @return A String of the file read
+ * @throws IOException If unable to read the stream
+ */
+ public static String readStreamToString(InputStream stream) throws IOException {
+ InputStreamReader inputStreamReader = new InputStreamReader(stream, StandardCharsets.UTF_8);
+ BufferedReader reader = new BufferedReader(inputStreamReader);
+ String line = reader.readLine();
+ StringBuilder lines = new StringBuilder();
+ while (line != null) {
+ lines.append(line).append("\n");
+ line = reader.readLine();
+ }
+ return lines.toString();
+ }
+}
diff --git a/src/main/resources/messages/about.md b/src/main/resources/messages/about.md
new file mode 100644
index 0000000..9a5ece7
--- /dev/null
+++ b/src/main/resources/messages/about.md
@@ -0,0 +1,6 @@
+Stargate Unified Legacy v. @version@ (maintained by [sgrewritten.org](https://sgrewritten.org)).
+A Hmod transportation concept by [Dinnerbone](https://github.com/Dinnerbone) and [Sturmeh](https://github.com/Sturmeh). Ported to bukkit by Drakia(https://github.com/DrakiaXYZ).
+Revived by [EpicKnarvik97](https://sgrewritten.org/knarvik), now incorporating features from all other Stargate forks.
+
+For more information, visit [sgrewritten.org/legacy](https://sgrewritten.org/legacy)
+For current versions, visit [sgrewritten.org/download](https://sgrewritten.org/download)
\ No newline at end of file
From e20ddb52ef7dbc9125762274529d27d0c94cd955 Mon Sep 17 00:00:00 2001
From: Thorinwasher
Date: Fri, 29 Dec 2023 16:55:41 +0100
Subject: [PATCH 058/112] Update about.md
---
src/main/resources/messages/about.md | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/main/resources/messages/about.md b/src/main/resources/messages/about.md
index 9a5ece7..dd3d6de 100644
--- a/src/main/resources/messages/about.md
+++ b/src/main/resources/messages/about.md
@@ -1,6 +1,7 @@
-Stargate Unified Legacy v. @version@ (maintained by [sgrewritten.org](https://sgrewritten.org)).
-A Hmod transportation concept by [Dinnerbone](https://github.com/Dinnerbone) and [Sturmeh](https://github.com/Sturmeh). Ported to bukkit by Drakia(https://github.com/DrakiaXYZ).
-Revived by [EpicKnarvik97](https://sgrewritten.org/knarvik), now incorporating features from all other Stargate forks.
+&green&Stargate Unified Legacy v. &gold&@version@ &green&(maintained by&gold& [sgrewritten.org](https://sgrewritten.org)&green&).
+A Hmod transportation concept by&gold& [Dinnerbone](https://github.com/Dinnerbone)&green& and&gold& [Sturmeh](https://github.com/Sturmeh).
+&green&Ported to bukkit by&gold& [Drakia](https://github.com/DrakiaXYZ).&green& Revived by&gold& [EpicKnarvik97](https://sgrewritten.org/knarvik),
+&green&now incorporating features from all other Stargate forks.
-For more information, visit [sgrewritten.org/legacy](https://sgrewritten.org/legacy)
-For current versions, visit [sgrewritten.org/download](https://sgrewritten.org/download)
\ No newline at end of file
+For more information, visit&gold& [sgrewritten.org/legacy](https://sgrewritten.org/legacy)
+&green&For current versions, visit&gold& [sgrewritten.org/download](https://sgrewritten.org/download)
\ No newline at end of file
From 8d6b233a8ff1048f46e846ebd6cddfe1701c571a Mon Sep 17 00:00:00 2001
From: Pheotis <49039536+Pheotis@users.noreply.github.com>
Date: Sun, 7 Jan 2024 12:13:39 -0500
Subject: [PATCH 059/112] Preparing for legacy release.
---
.gitignore | 1 +
LICENSE | 674 -----------------------------------------------------
README.md | 8 +-
3 files changed, 8 insertions(+), 675 deletions(-)
delete mode 100644 LICENSE
diff --git a/.gitignore b/.gitignore
index 997d420..05f576c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ target/
.idea/
*.secret
*.db
+nbactions.xml
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 3d90694..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
\ No newline at end of file
diff --git a/README.md b/README.md
index 08ba4c0..cceeb4a 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
> **Documentation may be found** [here](https://sgrewritten.org/legacywiki)
-> **Support is available via** [discord](https://discord.gg/mTaHuK6BVa)**.**
+> **Support is available via** [discord](https://sgrewritten.org/discord)**.**
> **THIS IS A LEGACY-BASED BRANCH: IT IS SUPPORTED, BUT NOT ACTIVELY UPDATED**
> This branch expands upon Drakia's original 2013 codebase, with fixes as needed.
@@ -521,6 +521,12 @@ portalInfoServer=Server: %server%
> currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+#### \[Version 0.11.5.6] Unified Legacy Fork
+- Fixed a potential stack trace experienced when disabling Dynmap
+- Fixed some problems related to negative economy transactions.
+- Fixed an exception occuring when negative yaw values are encountered.
+- Updated the about command and added a debug command.
+
#### \[Version 0.11.5.5] Unified Legacy Fork
- Hotfix for a compatibility issue preventing the plugin from working on most pre-1.20 server jars.
From d975666154bdc14acf3df81dbded54581d0ee8ed Mon Sep 17 00:00:00 2001
From: Thorinwasher
Date: Sun, 7 Jan 2024 18:36:54 +0100
Subject: [PATCH 060/112] Fix failed tests
---
.gitignore | 1 +
src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java | 1 +
2 files changed, 2 insertions(+)
diff --git a/.gitignore b/.gitignore
index 05f576c..90b6399 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ target/
*.secret
*.db
nbactions.xml
+stargate.iml
diff --git a/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java b/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java
index c8bf07c..58bb24a 100644
--- a/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java
+++ b/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java
@@ -26,6 +26,7 @@ public class GateLayoutTest {
public static void setUp() {
ServerMock server = MockBukkit.mock();
server.addWorld(new WorldMock(Material.DIRT, 5));
+ System.setProperty("bstats.relocatecheck", "false");
MockBukkit.load(Stargate.class);
layout = GateHandler.getGateByName("nethergate.gate").getLayout();
}
From a4d4864bdd1e7d02c76e8f4293e17076063b835d Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 20 Jan 2024 16:11:07 +0100
Subject: [PATCH 061/112] Checks markerAPIInitialized during dynmap
initialization
---
src/main/java/net/knarcraft/stargate/config/DynmapManager.java | 2 +-
src/main/java/net/knarcraft/stargate/config/StargateConfig.java | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/config/DynmapManager.java b/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
index c6cd645..497ea84 100644
--- a/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
+++ b/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
@@ -30,7 +30,7 @@ public final class DynmapManager {
* @throws NullPointerException If dynmap has an invalid state
*/
public static void initialize(DynmapAPI dynmapAPI) throws NullPointerException {
- if (dynmapAPI == null || dynmapAPI.getMarkerAPI() == null) {
+ if (dynmapAPI == null || !dynmapAPI.markerAPIInitialized() || dynmapAPI.getMarkerAPI() == null) {
markerSet = null;
portalIcon = null;
} else {
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 98f2f34..8ad737a 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -106,6 +106,8 @@ public final class StargateConfig {
//Set up vault economy if vault has been loaded
setupVaultEconomy();
+
+ //Set up dynmap
DynmapAPI dynmapAPI = (DynmapAPI) Bukkit.getPluginManager().getPlugin("dynmap");
if (dynmapAPI != null) {
try {
From c560063c063c9dcf4bfae09959dae4f92b1865cd Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 17 Feb 2024 18:22:27 +0100
Subject: [PATCH 062/112] Fixes incorrect formatting and unused imports
---
README.md | 3 +++
.../net/knarcraft/stargate/command/CommandAbout.java | 4 ++--
.../net/knarcraft/stargate/command/CommandStarGate.java | 1 -
.../net/knarcraft/stargate/config/StargateConfig.java | 2 +-
.../java/net/knarcraft/stargate/utility/FileHelper.java | 1 -
src/main/resources/messages/about.md | 9 ++++++---
6 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index cceeb4a..83139b0 100644
--- a/README.md
+++ b/README.md
@@ -521,13 +521,16 @@ portalInfoServer=Server: %server%
> currently support your language, please submit a translation [here](https://sgrewritten.org/translate)!
# Changes
+
#### \[Version 0.11.5.6] Unified Legacy Fork
+
- Fixed a potential stack trace experienced when disabling Dynmap
- Fixed some problems related to negative economy transactions.
- Fixed an exception occuring when negative yaw values are encountered.
- Updated the about command and added a debug command.
#### \[Version 0.11.5.5] Unified Legacy Fork
+
- Hotfix for a compatibility issue preventing the plugin from working on most pre-1.20 server jars.
#### \[Version 0.11.5.4] Unified Legacy Fork
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandAbout.java b/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
index 8e0be5a..51a6725 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
@@ -25,11 +25,11 @@ public class CommandAbout implements CommandExecutor {
ChatColor textColor = ChatColor.GOLD;
ChatColor highlightColor = ChatColor.GREEN;
- try(InputStream inputStream = Stargate.class.getResourceAsStream("/messages/about.md")){
+ try (InputStream inputStream = Stargate.class.getResourceAsStream("/messages/about.md")) {
String aboutMessageString = FileHelper.readStreamToString(inputStream);
BaseComponent[] component = MineDown.parse(aboutMessageString);
commandSender.spigot().sendMessage(component);
- } catch (IOException ioException){
+ } catch (IOException ioException) {
commandSender.sendMessage("Internal error");
}
String author = Stargate.getStargateConfig().getLanguageLoader().getString("author");
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java b/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
index b35cb4a..5a67be4 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandStarGate.java
@@ -1,6 +1,5 @@
package net.knarcraft.stargate.command;
-import net.knarcraft.stargate.Stargate;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 8ad737a..768277e 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -106,7 +106,7 @@ public final class StargateConfig {
//Set up vault economy if vault has been loaded
setupVaultEconomy();
-
+
//Set up dynmap
DynmapAPI dynmapAPI = (DynmapAPI) Bukkit.getPluginManager().getPlugin("dynmap");
if (dynmapAPI != null) {
diff --git a/src/main/java/net/knarcraft/stargate/utility/FileHelper.java b/src/main/java/net/knarcraft/stargate/utility/FileHelper.java
index 172ba41..be88ef3 100644
--- a/src/main/java/net/knarcraft/stargate/utility/FileHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/FileHelper.java
@@ -4,7 +4,6 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class FileHelper {
diff --git a/src/main/resources/messages/about.md b/src/main/resources/messages/about.md
index dd3d6de..a6202ed 100644
--- a/src/main/resources/messages/about.md
+++ b/src/main/resources/messages/about.md
@@ -1,6 +1,9 @@
-&green&Stargate Unified Legacy v. &gold&@version@ &green&(maintained by&gold& [sgrewritten.org](https://sgrewritten.org)&green&).
-A Hmod transportation concept by&gold& [Dinnerbone](https://github.com/Dinnerbone)&green& and&gold& [Sturmeh](https://github.com/Sturmeh).
-&green&Ported to bukkit by&gold& [Drakia](https://github.com/DrakiaXYZ).&green& Revived by&gold& [EpicKnarvik97](https://sgrewritten.org/knarvik),
+&green&Stargate Unified Legacy v. &gold&@version@ &green&(maintained by&gold& [sgrewritten.org](https://sgrewritten.org)
+&green&).
+A Hmod transportation concept by&gold& [Dinnerbone](https://github.com/Dinnerbone)&green&
+and&gold& [Sturmeh](https://github.com/Sturmeh).
+&green&Ported to bukkit by&gold& [Drakia](https://github.com/DrakiaXYZ).&green& Revived
+by&gold& [EpicKnarvik97](https://sgrewritten.org/knarvik),
&green&now incorporating features from all other Stargate forks.
For more information, visit&gold& [sgrewritten.org/legacy](https://sgrewritten.org/legacy)
From 9154074a18ce1365b9a2fb72ef12624a1a3d066a Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Sat, 17 Feb 2024 18:26:26 +0100
Subject: [PATCH 063/112] Removes a TODO that's already completed
---
src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java b/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java
index 97d7868..e3d7747 100644
--- a/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java
+++ b/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java
@@ -41,7 +41,6 @@ public final class TeleportHelper {
return false;
}
}
- //TODO: Improve this to account for any players sitting on any of the lead creatures
//If it's enabled, there is no problem
if (Stargate.getGateConfig().handleLeashedCreatures()) {
From 894a692e7be5903b87e95811e3b53b85fc2198b7 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Mon, 19 Feb 2024 22:22:09 +0100
Subject: [PATCH 064/112] Fix #334
---
src/main/java/net/knarcraft/stargate/utility/GateReader.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/knarcraft/stargate/utility/GateReader.java b/src/main/java/net/knarcraft/stargate/utility/GateReader.java
index de5901f..4903fd0 100644
--- a/src/main/java/net/knarcraft/stargate/utility/GateReader.java
+++ b/src/main/java/net/knarcraft/stargate/utility/GateReader.java
@@ -136,7 +136,7 @@ public final class GateReader {
return;
}
} else {
- Material material = Material.getMaterial(value);
+ Material material = Material.matchMaterial(value);
if (material != null) {
//Register the map between the read symbol and the corresponding material
characterMaterialMap.put(symbol, material);
@@ -183,7 +183,7 @@ public final class GateReader {
public static Material readGateConfig(Map config, String fileName, String key,
Material defaultMaterial) {
if (config.containsKey(key)) {
- Material material = Material.getMaterial(config.get(key));
+ Material material = Material.matchMaterial(config.get(key));
if (material != null) {
return material;
} else {
From b4a6ce1a77dcd92db81c18741249fb56d9be87c5 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97
Date: Tue, 20 Feb 2024 12:43:01 +0100
Subject: [PATCH 065/112] Adds nullability annotations among other things
Adds nullability annotations for all methods
Fixes some nullability problems and inconsistencies
Gets rid of RelativeBlockVector's inner class
Changes RelativeBlockVector to a record
Simplifies FromTheEndTeleportation's storage, and makes it into a minimal record
Removes the putStringInList method
Gets rid of some primitive list usage
Fixes some incorrect method accessibility
Removes some redundancy in PortalOption
---
README.md | 4 +-
.../java/net/knarcraft/stargate/Stargate.java | 52 +++++++----
.../stargate/command/CommandAbout.java | 8 +-
.../stargate/command/CommandConfig.java | 52 +++++++----
.../stargate/command/ConfigTabCompleter.java | 26 +++---
.../command/StarGateTabCompleter.java | 8 +-
.../stargate/config/ConfigOption.java | 17 ++--
.../knarcraft/stargate/config/ConfigTag.java | 43 ++++++----
.../stargate/config/DynmapManager.java | 19 ++--
.../stargate/config/EconomyConfig.java | 16 ++--
.../stargate/config/LanguageLoader.java | 30 ++++---
.../stargate/config/MessageSender.java | 9 +-
.../stargate/config/StargateConfig.java | 31 +++++--
.../stargate/config/StargateGateConfig.java | 13 +--
.../config/StargateYamlConfiguration.java | 33 ++++---
.../container/BlockChangeRequest.java | 7 +-
.../stargate/container/BlockLocation.java | 26 ++++--
.../container/ChunkUnloadRequest.java | 5 +-
.../container/FromTheEndTeleportation.java | 54 ++----------
.../container/RelativeBlockVector.java | 86 +++++++++----------
.../stargate/container/SignData.java | 6 +-
.../stargate/event/StargateAccessEvent.java | 3 +-
.../stargate/event/StargateActivateEvent.java | 10 ++-
.../stargate/event/StargateCloseEvent.java | 3 +-
.../stargate/event/StargateCreateEvent.java | 8 +-
.../event/StargateDeactivateEvent.java | 3 +-
.../stargate/event/StargateDestroyEvent.java | 7 +-
.../event/StargateEntityPortalEvent.java | 9 +-
.../stargate/event/StargateEvent.java | 4 +-
.../stargate/event/StargateOpenEvent.java | 4 +-
.../stargate/event/StargatePlayerEvent.java | 5 +-
.../event/StargatePlayerPortalEvent.java | 8 +-
.../stargate/event/StargateTeleportEvent.java | 2 +
.../stargate/listener/BlockEventListener.java | 23 ++---
.../listener/EntityEventListener.java | 5 +-
.../listener/EntitySpawnListener.java | 12 +--
.../listener/PlayerEventListener.java | 47 ++++++----
.../listener/PluginEventListener.java | 16 ++--
.../listener/PortalEventListener.java | 67 ++++++++-------
.../listener/TeleportEventListener.java | 3 +-
.../listener/VehicleEventListener.java | 11 ++-
.../stargate/listener/WorldEventListener.java | 5 +-
.../net/knarcraft/stargate/portal/Portal.java | 34 ++++++--
.../stargate/portal/PortalActivator.java | 23 +++--
.../stargate/portal/PortalCreator.java | 23 +++--
.../stargate/portal/PortalHandler.java | 66 +++++++++-----
.../stargate/portal/PortalOpener.java | 11 ++-
.../stargate/portal/PortalRegistry.java | 25 ++++--
.../stargate/portal/PortalSignDrawer.java | 57 +++++++-----
.../portal/property/PortalLocation.java | 22 ++++-
.../portal/property/PortalOption.java | 29 ++++---
.../portal/property/PortalOptions.java | 3 +-
.../stargate/portal/property/PortalOwner.java | 15 ++--
.../portal/property/PortalStructure.java | 13 ++-
.../stargate/portal/property/gate/Gate.java | 53 ++++++++----
.../portal/property/gate/GateHandler.java | 42 ++++++---
.../portal/property/gate/GateLayout.java | 26 ++++--
.../portal/teleporter/EntityTeleporter.java | 5 +-
.../portal/teleporter/PlayerTeleporter.java | 6 +-
.../portal/teleporter/Teleporter.java | 50 ++++++-----
.../portal/teleporter/VehicleTeleporter.java | 16 ++--
.../stargate/thread/BlockChangeThread.java | 5 +-
.../stargate/utility/BStatsHelper.java | 3 +-
.../stargate/utility/BungeeHelper.java | 25 ++++--
.../stargate/utility/DirectionHelper.java | 19 ++--
.../stargate/utility/EconomyHelper.java | 35 ++++----
.../stargate/utility/EntityHelper.java | 5 +-
.../stargate/utility/FileHelper.java | 11 ++-
.../stargate/utility/GateReader.java | 41 ++++-----
.../stargate/utility/MaterialHelper.java | 7 +-
.../stargate/utility/PermissionHelper.java | 58 ++++++++-----
.../stargate/utility/PortalFileHelper.java | 74 ++++++++++------
.../stargate/utility/SignHelper.java | 7 +-
.../stargate/utility/TeleportHelper.java | 27 +++---
.../stargate/utility/UUIDMigrationHelper.java | 8 +-
.../stargate/RelativeBlockVectorTest.java | 6 +-
.../container/RelativeBlockVectorTest.java | 6 +-
.../stargate/portal/GateLayoutTest.java | 8 +-
78 files changed, 1025 insertions(+), 639 deletions(-)
diff --git a/README.md b/README.md
index 83139b0..8692f37 100644
--- a/README.md
+++ b/README.md
@@ -541,7 +541,7 @@ portalInfoServer=Server: %server%
#### \[Version 0.11.5.3] Unified Legacy Fork
-- Hotfix for an issue wherein the gate folder failed to populate on fresh installs.
+- Hotfix for an issue wherein the gate folder failed to populate on fresh installations.
#### \[Version 0.11.5.2] Unified Legacy Fork
@@ -757,7 +757,7 @@ found [here](https://github.com/stargate-rewritten/Stargate-ESR#version-01081-lc
- Improves the stability of Stargate's load-time portal handling.
- Highlights destination selector brackets on signs ("-") as to improve readability.
- Uses dark red to mark portals which are inactive (missing destination or invalid gate type)
-- Adds provisions to re-draw incorrect signs.
+- Adds provision to re-draw incorrect signs.
- Fixed a load of other miscellaneous bugs.
#### \[Version 0.8.0.3] PseudoKnight fork
diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java
index 3293978..2cebbb3 100644
--- a/src/main/java/net/knarcraft/stargate/Stargate.java
+++ b/src/main/java/net/knarcraft/stargate/Stargate.java
@@ -35,6 +35,8 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.java.JavaPluginLoader;
import org.bukkit.scheduler.BukkitScheduler;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
@@ -112,7 +114,7 @@ public class Stargate extends JavaPlugin {
*
* @param version The version of the new update available
*/
- public static void setUpdateAvailable(String version) {
+ public static void setUpdateAvailable(@NotNull String version) {
updateAvailable = version;
}
@@ -121,6 +123,7 @@ public class Stargate extends JavaPlugin {
*
* @return The version number if an update is available. Null otherwise
*/
+ @Nullable
public static String getUpdateAvailable() {
return updateAvailable;
}
@@ -130,6 +133,7 @@ public class Stargate extends JavaPlugin {
*
* @return An instance of this plugin, or null if not instantiated
*/
+ @NotNull
public static Stargate getInstance() {
return stargate;
}
@@ -139,7 +143,7 @@ public class Stargate extends JavaPlugin {
*
* @param request The request to add
*/
- public static void addBlockChangeRequest(BlockChangeRequest request) {
+ public static void addBlockChangeRequest(@Nullable BlockChangeRequest request) {
if (request != null) {
blockChangeRequestQueue.add(request);
}
@@ -150,6 +154,7 @@ public class Stargate extends JavaPlugin {
*
* @return A block change request queue
*/
+ @NotNull
public static Queue getBlockChangeRequestQueue() {
return blockChangeRequestQueue;
}
@@ -159,6 +164,7 @@ public class Stargate extends JavaPlugin {
*
* @return The sender for sending messages to players
*/
+ @NotNull
public static MessageSender getMessageSender() {
return stargateConfig.getMessageSender();
}
@@ -168,6 +174,7 @@ public class Stargate extends JavaPlugin {
*
* @return The object containing gate configuration values
*/
+ @NotNull
public static StargateGateConfig getGateConfig() {
return stargateConfig.getStargateGateConfig();
}
@@ -177,6 +184,7 @@ public class Stargate extends JavaPlugin {
*
* @return This plugin's version
*/
+ @NotNull
public static String getPluginVersion() {
return pluginVersion;
}
@@ -186,6 +194,7 @@ public class Stargate extends JavaPlugin {
*
* @return The logger
*/
+ @NotNull
public static Logger getConsoleLogger() {
return logger;
}
@@ -206,7 +215,7 @@ public class Stargate extends JavaPlugin {
* @param route The class name/route where something happened
* @param message A message describing what happened
*/
- public static void debug(String route, String message) {
+ public static void debug(@NotNull String route, @NotNull String message) {
if (stargateConfig == null || stargateConfig.isNotLoaded() || stargateConfig.isDebuggingEnabled()) {
logger.info("[Stargate::" + route + "] " + message);
} else {
@@ -219,7 +228,7 @@ public class Stargate extends JavaPlugin {
*
* @param message The message to log
*/
- public static void logInfo(String message) {
+ public static void logInfo(@NotNull String message) {
log(Level.INFO, message);
}
@@ -228,7 +237,7 @@ public class Stargate extends JavaPlugin {
*
* @param message The message to log
*/
- public static void logSevere(String message) {
+ public static void logSevere(@NotNull String message) {
log(Level.SEVERE, message);
}
@@ -237,7 +246,7 @@ public class Stargate extends JavaPlugin {
*
* @param message The message to log
*/
- public static void logWarning(String message) {
+ public static void logWarning(@NotNull String message) {
log(Level.WARNING, message);
}
@@ -247,7 +256,7 @@ public class Stargate extends JavaPlugin {
* @param severity The severity of the event triggering the message
* @param message The message to log
*/
- private static void log(Level severity, String message) {
+ private static void log(@NotNull Level severity, @NotNull String message) {
if (logger == null) {
logger = Bukkit.getLogger();
}
@@ -261,6 +270,7 @@ public class Stargate extends JavaPlugin {
*
* @return The folder for storing the portal database
*/
+ @NotNull
public static String getPortalFolder() {
return stargateConfig.getPortalFolder();
}
@@ -272,6 +282,7 @@ public class Stargate extends JavaPlugin {
*
* @return The folder storing gate files
*/
+ @NotNull
public static String getGateFolder() {
return stargateConfig.getGateFolder();
}
@@ -281,6 +292,7 @@ public class Stargate extends JavaPlugin {
*
* @return The default network
*/
+ @NotNull
public static String getDefaultNetwork() {
return stargateConfig.getStargateGateConfig().getDefaultPortalNetwork();
}
@@ -293,7 +305,7 @@ public class Stargate extends JavaPlugin {
* @param name The name/key of the string to get
* @return The full translated string
*/
- public static String getString(String name) {
+ public static @NotNull String getString(@NotNull String name) {
return stargateConfig.getLanguageLoader().getString(name);
}
@@ -305,7 +317,7 @@ public class Stargate extends JavaPlugin {
* @param name The name/key of the string to get
* @return The full string in the backup language (English)
*/
- public static String getBackupString(String name) {
+ public static @NotNull String getBackupString(@NotNull String name) {
return stargateConfig.getLanguageLoader().getBackupString(name);
}
@@ -317,7 +329,8 @@ public class Stargate extends JavaPlugin {
* @param value The replacement value
* @return The input string with the search replaced with value
*/
- public static String replaceVars(String input, String search, String value) {
+ @NotNull
+ public static String replacePlaceholders(@NotNull String input, @NotNull String search, @NotNull String value) {
return input.replace(search, value);
}
@@ -326,6 +339,7 @@ public class Stargate extends JavaPlugin {
*
* @return A plugin manager
*/
+ @NotNull
public static PluginManager getPluginManager() {
return pluginManager;
}
@@ -335,6 +349,7 @@ public class Stargate extends JavaPlugin {
*
* @return The object containing economy config values
*/
+ @NotNull
public static EconomyConfig getEconomyConfig() {
return stargateConfig.getEconomyConfig();
}
@@ -344,6 +359,7 @@ public class Stargate extends JavaPlugin {
*
* @return The raw configuration
*/
+ @NotNull
public FileConfiguration getConfiguration() {
return this.configuration;
}
@@ -354,8 +370,8 @@ public class Stargate extends JavaPlugin {
this.configuration = new StargateYamlConfiguration();
try {
this.configuration.load(new File(getDataFolder(), CONFIG_FILE_NAME));
- } catch (IOException | InvalidConfigurationException e) {
- logSevere("Unable to load the configuration! Message: " + e.getMessage());
+ } catch (IOException | InvalidConfigurationException exception) {
+ logSevere("Unable to load the configuration! Message: " + exception.getMessage());
}
}
@@ -364,8 +380,8 @@ public class Stargate extends JavaPlugin {
super.saveConfig();
try {
this.configuration.save(new File(getDataFolder(), CONFIG_FILE_NAME));
- } catch (IOException e) {
- logSevere("Unable to save the configuration! Message: " + e.getMessage());
+ } catch (IOException exception) {
+ logSevere("Unable to save the configuration! Message: " + exception.getMessage());
}
}
@@ -390,8 +406,8 @@ public class Stargate extends JavaPlugin {
this.configuration = new StargateYamlConfiguration();
try {
this.configuration.load(new File(getDataFolder(), CONFIG_FILE_NAME));
- } catch (IOException | InvalidConfigurationException e) {
- getLogger().log(Level.SEVERE, e.getMessage());
+ } catch (IOException | InvalidConfigurationException exception) {
+ getLogger().log(Level.SEVERE, exception.getMessage());
}
this.configuration.options().copyDefaults(true);
@@ -470,6 +486,7 @@ public class Stargate extends JavaPlugin {
*
* @return The chunk unload queue
*/
+ @NotNull
public static Queue getChunkUnloadQueue() {
return chunkUnloadQueue;
}
@@ -479,7 +496,7 @@ public class Stargate extends JavaPlugin {
*
* @param request The new chunk unload request to add
*/
- public static void addChunkUnloadRequest(ChunkUnloadRequest request) {
+ public static void addChunkUnloadRequest(@NotNull ChunkUnloadRequest request) {
chunkUnloadQueue.removeIf((item) -> item.getChunkToUnload().equals(request.getChunkToUnload()));
chunkUnloadQueue.add(request);
}
@@ -489,6 +506,7 @@ public class Stargate extends JavaPlugin {
*
* @return The stargate configuration
*/
+ @NotNull
public static StargateConfig getStargateConfig() {
return stargateConfig;
}
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandAbout.java b/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
index 51a6725..2ceb5d8 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandAbout.java
@@ -26,9 +26,11 @@ public class CommandAbout implements CommandExecutor {
ChatColor highlightColor = ChatColor.GREEN;
try (InputStream inputStream = Stargate.class.getResourceAsStream("/messages/about.md")) {
- String aboutMessageString = FileHelper.readStreamToString(inputStream);
- BaseComponent[] component = MineDown.parse(aboutMessageString);
- commandSender.spigot().sendMessage(component);
+ if (inputStream != null) {
+ String aboutMessageString = FileHelper.readStreamToString(inputStream);
+ BaseComponent[] component = MineDown.parse(aboutMessageString);
+ commandSender.spigot().sendMessage(component);
+ }
} catch (IOException ioException) {
commandSender.sendMessage("Internal error");
}
diff --git a/src/main/java/net/knarcraft/stargate/command/CommandConfig.java b/src/main/java/net/knarcraft/stargate/command/CommandConfig.java
index 2ae0691..2e61ad8 100644
--- a/src/main/java/net/knarcraft/stargate/command/CommandConfig.java
+++ b/src/main/java/net/knarcraft/stargate/command/CommandConfig.java
@@ -16,6 +16,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -65,7 +66,8 @@ public class CommandConfig implements CommandExecutor {
* @param commandSender The command sender that changed the value
* @param value The new value of the config option
*/
- private void updateConfigValue(ConfigOption selectedOption, CommandSender commandSender, String value) {
+ private void updateConfigValue(@NotNull ConfigOption selectedOption, @NotNull CommandSender commandSender,
+ @NotNull String value) {
FileConfiguration configuration = Stargate.getInstance().getConfiguration();
//Validate any sign colors
@@ -119,7 +121,8 @@ public class CommandConfig implements CommandExecutor {
* @param value The new value of the config option
* @param configuration The configuration file to save to
*/
- private void updateBooleanConfigValue(ConfigOption selectedOption, String value, FileConfiguration configuration) {
+ private void updateBooleanConfigValue(@NotNull ConfigOption selectedOption, @NotNull String value,
+ @NotNull FileConfiguration configuration) {
boolean newValue = Boolean.parseBoolean(value);
if (selectedOption == ConfigOption.ENABLE_BUNGEE && newValue != Stargate.getGateConfig().enableBungee()) {
Stargate.getStargateConfig().startStopBungeeListener(newValue);
@@ -135,7 +138,8 @@ public class CommandConfig implements CommandExecutor {
* @param commandSender The command sender that changed the value
* @param value The new value of the config option
*/
- private void updateStringConfigValue(ConfigOption selectedOption, CommandSender commandSender, String value) {
+ private void updateStringConfigValue(@NotNull ConfigOption selectedOption, @NotNull CommandSender commandSender,
+ @NotNull String value) {
if (selectedOption == ConfigOption.GATE_FOLDER || selectedOption == ConfigOption.PORTAL_FOLDER ||
selectedOption == ConfigOption.DEFAULT_GATE_NETWORK) {
if (value.contains("../") || value.contains("..\\")) {
@@ -161,7 +165,8 @@ public class CommandConfig implements CommandExecutor {
* @param commandSender The command sender that changed the value
* @param arguments The arguments for the new config option
*/
- private void updateListConfigValue(ConfigOption selectedOption, CommandSender commandSender, String[] arguments) {
+ private void updateListConfigValue(@NotNull ConfigOption selectedOption, @NotNull CommandSender commandSender,
+ @NotNull String[] arguments) {
FileConfiguration configuration = Stargate.getInstance().getConfiguration();
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
@@ -190,7 +195,8 @@ public class CommandConfig implements CommandExecutor {
* @param arguments The arguments given by the user
* @return The per-sign color string to update with, or null if the input was invalid
*/
- private String parsePerSignColorInput(CommandSender commandSender, String[] arguments) {
+ @Nullable
+ private String parsePerSignColorInput(@NotNull CommandSender commandSender, @NotNull String[] arguments) {
//Make sure the sign type is an actual sign
if (Material.matchMaterial(arguments[1] + "_SIGN") == null) {
Stargate.getMessageSender().sendErrorMessage(commandSender, "The given sign type is invalid");
@@ -199,7 +205,8 @@ public class CommandConfig implements CommandExecutor {
String colorString = arguments[1] + ":";
//Validate the colors given by the user
- String[] errorMessage = new String[]{"The given main sign color is invalid!", "The given highlight sign color is invalid!"};
+ String[] errorMessage = new String[]{"The given main sign color is invalid!", "The given highlight sign color " +
+ "is invalid!"};
String[] newColors = new String[2];
for (int i = 0; i < 2; i++) {
if (validatePerSignColor(arguments[i + 2])) {
@@ -220,9 +227,11 @@ public class CommandConfig implements CommandExecutor {
* @param colorString The new color string to replace any previous value with
* @param configuration The file configuration to update with the new per-sign colors
*/
- private void updatePerSignColors(String signType, String colorString, FileConfiguration configuration) {
+ private void updatePerSignColors(@NotNull String signType, @NotNull String colorString,
+ @NotNull FileConfiguration configuration) {
List newColorStrings = new ArrayList<>();
- List> oldColors = (List>) Stargate.getStargateConfig().getConfigOptionsReference().get(ConfigOption.PER_SIGN_COLORS);
+ List> oldColors = (List>) Stargate.getStargateConfig().getConfigOptionsReference().get(
+ ConfigOption.PER_SIGN_COLORS);
for (Object object : oldColors) {
newColorStrings.add(String.valueOf(object));
}
@@ -239,7 +248,7 @@ public class CommandConfig implements CommandExecutor {
* @param color The color chosen by the user
* @return True if the given color is valid
*/
- private boolean validatePerSignColor(String color) {
+ private boolean validatePerSignColor(@NotNull String color) {
ChatColor newHighlightColor = parseColor(color);
return newHighlightColor != null || color.equalsIgnoreCase("default") ||
color.equalsIgnoreCase("inverted");
@@ -251,7 +260,7 @@ public class CommandConfig implements CommandExecutor {
* @param selectedOption The config option that was changed
* @param commandSender The command sender that executed the config command
*/
- private void saveAndReload(ConfigOption selectedOption, CommandSender commandSender) {
+ private void saveAndReload(@NotNull ConfigOption selectedOption, @NotNull CommandSender commandSender) {
//Save the config file and reload if necessary
Stargate.getInstance().saveConfig();
@@ -268,7 +277,8 @@ public class CommandConfig implements CommandExecutor {
* @param commandSender The command sender to alert if the color is invalid
* @param value The new option value
*/
- private boolean registerColor(ConfigOption selectedOption, String value, CommandSender commandSender) {
+ private boolean registerColor(@NotNull ConfigOption selectedOption, @NotNull String value,
+ @NotNull CommandSender commandSender) {
ChatColor parsedColor = parseColor(value);
if (parsedColor == null) {
commandSender.sendMessage(ChatColor.RED + "Invalid color given");
@@ -291,7 +301,8 @@ public class CommandConfig implements CommandExecutor {
* @param value The value to parse
* @return The parsed color or null
*/
- private ChatColor parseColor(String value) {
+ @Nullable
+ private ChatColor parseColor(@NotNull String value) {
try {
return ChatColor.of(value.toUpperCase());
} catch (IllegalArgumentException | NullPointerException ignored) {
@@ -307,7 +318,9 @@ public class CommandConfig implements CommandExecutor {
* @param value The value given
* @return An integer, or null if it was invalid
*/
- private Integer getInteger(CommandSender commandSender, ConfigOption selectedOption, String value) {
+ @Nullable
+ private Integer getInteger(@NotNull CommandSender commandSender, @NotNull ConfigOption selectedOption,
+ @NotNull String value) {
try {
int intValue = Integer.parseInt(value);
@@ -331,7 +344,9 @@ public class CommandConfig implements CommandExecutor {
* @param value The value given
* @return A double, or null if it was invalid
*/
- private Double getDouble(CommandSender commandSender, ConfigOption selectedOption, String value) {
+ @Nullable
+ private Double getDouble(@NotNull CommandSender commandSender, @NotNull ConfigOption selectedOption,
+ @NotNull String value) {
try {
double doubleValue = Double.parseDouble(value);
@@ -353,7 +368,7 @@ public class CommandConfig implements CommandExecutor {
* @param commandSender The command sender initiating the reload
* @param configOption The changed config option
*/
- private void reloadIfNecessary(CommandSender commandSender, ConfigOption configOption) {
+ private void reloadIfNecessary(@NotNull CommandSender commandSender, @NotNull ConfigOption configOption) {
if (ConfigTag.requiresFullReload(configOption)) {
//Reload everything
Stargate.getStargateConfig().reload(commandSender);
@@ -391,7 +406,7 @@ public class CommandConfig implements CommandExecutor {
* @param sender The command sender that sent the command
* @param option The config option to print information about
*/
- private void printConfigOptionValue(CommandSender sender, ConfigOption option) {
+ private void printConfigOptionValue(@NotNull CommandSender sender, @NotNull ConfigOption option) {
Object value = Stargate.getStargateConfig().getConfigOptions().get(option);
sender.sendMessage(getOptionDescription(option));
sender.sendMessage(ChatColor.GREEN + "Current value: " + ChatColor.GOLD + value);
@@ -402,7 +417,7 @@ public class CommandConfig implements CommandExecutor {
*
* @param sender The command sender to display the config list to
*/
- private void displayConfigValues(CommandSender sender) {
+ private void displayConfigValues(@NotNull CommandSender sender) {
sender.sendMessage(ChatColor.GREEN + Stargate.getBackupString("prefix") + ChatColor.GOLD +
"Config values:");
for (ConfigOption option : ConfigOption.values()) {
@@ -416,7 +431,8 @@ public class CommandConfig implements CommandExecutor {
* @param option The option to describe
* @return A string describing the config option
*/
- private String getOptionDescription(ConfigOption option) {
+ @NotNull
+ private String getOptionDescription(@NotNull ConfigOption option) {
Object defaultValue = option.getDefaultValue();
String stringValue = String.valueOf(defaultValue);
if (option.getDataType() == OptionDataType.STRING_LIST) {
diff --git a/src/main/java/net/knarcraft/stargate/command/ConfigTabCompleter.java b/src/main/java/net/knarcraft/stargate/command/ConfigTabCompleter.java
index ff09aa9..2ba5613 100644
--- a/src/main/java/net/knarcraft/stargate/command/ConfigTabCompleter.java
+++ b/src/main/java/net/knarcraft/stargate/command/ConfigTabCompleter.java
@@ -61,7 +61,9 @@ public class ConfigTabCompleter implements TabCompleter {
* @param typedText The beginning of the typed text, for filtering matching results
* @return Some or all of the valid values for the option
*/
- private List getPossibleOptionValues(ConfigOption selectedOption, String typedText) {
+ @Nullable
+ private List getPossibleOptionValues(@NotNull ConfigOption selectedOption,
+ @NotNull String typedText) {
switch (selectedOption) {
case LANGUAGE:
//Return available languages
@@ -71,7 +73,7 @@ public class ConfigTabCompleter implements TabCompleter {
case DEFAULT_GATE_NETWORK:
//Just return the default value as most values should be possible
if (typedText.trim().isEmpty()) {
- return putStringInList((String) selectedOption.getDefaultValue());
+ return List.of((String) selectedOption.getDefaultValue());
} else {
return new ArrayList<>();
}
@@ -114,7 +116,9 @@ public class ConfigTabCompleter implements TabCompleter {
* @param args The arguments given by the user
* @return Some or all of the valid values for the option
*/
- private List getPossibleStringListOptionValues(ConfigOption selectedOption, String[] args) {
+ @Nullable
+ private List getPossibleStringListOptionValues(@NotNull ConfigOption selectedOption,
+ @NotNull String[] args) {
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
return getPerSignColorCompletion(args);
} else {
@@ -128,7 +132,8 @@ public class ConfigTabCompleter implements TabCompleter {
* @param args The arguments given by the user
* @return The options to give the user
*/
- private List getPerSignColorCompletion(String[] args) {
+ @NotNull
+ private List getPerSignColorCompletion(@NotNull String[] args) {
if (args.length < 3) {
return filterMatchingStartsWith(signTypes, args[1]);
} else if (args.length < 4) {
@@ -139,18 +144,6 @@ public class ConfigTabCompleter implements TabCompleter {
return new ArrayList<>();
}
- /**
- * Puts a single string value into a string list
- *
- * @param value The string to make into a list
- * @return A list containing the string value
- */
- private List putStringInList(String value) {
- List list = new ArrayList<>();
- list.add(value);
- return list;
- }
-
/**
* Initializes all lists of auto-completable values
*/
@@ -200,6 +193,7 @@ public class ConfigTabCompleter implements TabCompleter {
*
* @return The available chat colors
*/
+ @NotNull
private List getChatColors() {
List chatColors = new ArrayList<>();
char[] colors = new char[]{'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
diff --git a/src/main/java/net/knarcraft/stargate/command/StarGateTabCompleter.java b/src/main/java/net/knarcraft/stargate/command/StarGateTabCompleter.java
index 96ecd3d..25c1d1d 100644
--- a/src/main/java/net/knarcraft/stargate/command/StarGateTabCompleter.java
+++ b/src/main/java/net/knarcraft/stargate/command/StarGateTabCompleter.java
@@ -17,8 +17,9 @@ import java.util.List;
public class StarGateTabCompleter implements TabCompleter {
@Override
- public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command,
- @NotNull String s, @NotNull String[] args) {
+ @Nullable
+ public List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
+ @NotNull String[] args) {
if (args.length == 1) {
List commands = getAvailableCommands(commandSender);
List matchingCommands = new ArrayList<>();
@@ -42,7 +43,8 @@ public class StarGateTabCompleter implements TabCompleter {
* @param commandSender The command sender to get available commands for
* @return The commands available to the command sender
*/
- private List getAvailableCommands(CommandSender commandSender) {
+ @NotNull
+ private List getAvailableCommands(@NotNull CommandSender commandSender) {
List commands = new ArrayList<>();
commands.add("about");
if (!(commandSender instanceof Player player) || player.hasPermission("stargate.admin.reload")) {
diff --git a/src/main/java/net/knarcraft/stargate/config/ConfigOption.java b/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
index e6879e5..5c41c71 100644
--- a/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
+++ b/src/main/java/net/knarcraft/stargate/config/ConfigOption.java
@@ -1,5 +1,8 @@
package net.knarcraft.stargate.config;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
/**
* A ConfigOption represents one of the available config options
*/
@@ -209,7 +212,7 @@ public enum ConfigOption {
* @param description The description of what this config option does
* @param defaultValue The default value of this config option
*/
- ConfigOption(String configNode, String description, Object defaultValue) {
+ ConfigOption(@NotNull String configNode, @NotNull String description, @NotNull Object defaultValue) {
this.configNode = configNode;
this.description = description;
this.defaultValue = defaultValue;
@@ -235,7 +238,7 @@ public enum ConfigOption {
* @param name The name of the config option to get
* @return The corresponding config option, or null if the name is invalid
*/
- public static ConfigOption getByName(String name) {
+ public static @Nullable ConfigOption getByName(@NotNull String name) {
for (ConfigOption option : ConfigOption.values()) {
if (option.getName().equalsIgnoreCase(name)) {
return option;
@@ -249,7 +252,7 @@ public enum ConfigOption {
*
* @return The name of this config option
*/
- public String getName() {
+ public @NotNull String getName() {
if (!this.configNode.contains(".")) {
return this.configNode;
}
@@ -262,7 +265,7 @@ public enum ConfigOption {
*
* @return The data type used
*/
- public OptionDataType getDataType() {
+ public @NotNull OptionDataType getDataType() {
return this.dataType;
}
@@ -271,7 +274,7 @@ public enum ConfigOption {
*
* @return This config option's config node
*/
- public String getConfigNode() {
+ public @NotNull String getConfigNode() {
return this.configNode;
}
@@ -280,7 +283,7 @@ public enum ConfigOption {
*
* @return The description of this config option
*/
- public String getDescription() {
+ public @NotNull String getDescription() {
return this.description;
}
@@ -289,7 +292,7 @@ public enum ConfigOption {
*
* @return This config option's default value
*/
- public Object getDefaultValue() {
+ public @NotNull Object getDefaultValue() {
return this.defaultValue;
}
diff --git a/src/main/java/net/knarcraft/stargate/config/ConfigTag.java b/src/main/java/net/knarcraft/stargate/config/ConfigTag.java
index 024b205..a992d46 100644
--- a/src/main/java/net/knarcraft/stargate/config/ConfigTag.java
+++ b/src/main/java/net/knarcraft/stargate/config/ConfigTag.java
@@ -1,25 +1,38 @@
package net.knarcraft.stargate.config;
-import java.util.Arrays;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Set;
/**
* A config tag groups config values by a property
*/
public enum ConfigTag {
- COLOR(new ConfigOption[]{ConfigOption.FREE_GATES_COLOR, ConfigOption.MAIN_SIGN_COLOR,
- ConfigOption.HIGHLIGHT_SIGN_COLOR, ConfigOption.PER_SIGN_COLORS}),
- FOLDER(new ConfigOption[]{ConfigOption.GATE_FOLDER, ConfigOption.PORTAL_FOLDER}),
- DYNMAP(new ConfigOption[]{ConfigOption.ENABLE_DYNMAP, ConfigOption.DYNMAP_ICONS_DEFAULT_HIDDEN});
+ /**
+ * Color-related configuration options
+ */
+ COLOR(Set.of(ConfigOption.FREE_GATES_COLOR, ConfigOption.MAIN_SIGN_COLOR, ConfigOption.HIGHLIGHT_SIGN_COLOR,
+ ConfigOption.PER_SIGN_COLORS)),
- private final ConfigOption[] taggedOptions;
+ /**
+ * Folder-altering configuration options
+ */
+ FOLDER(Set.of(ConfigOption.GATE_FOLDER, ConfigOption.PORTAL_FOLDER)),
+
+ /**
+ * Dynmap-related configuration options
+ */
+ DYNMAP(Set.of(ConfigOption.ENABLE_DYNMAP, ConfigOption.DYNMAP_ICONS_DEFAULT_HIDDEN));
+
+ private final Set taggedOptions;
/**
* Instantiates a new config tag
*
* @param taggedOptions The config options included in this tag
*/
- ConfigTag(ConfigOption[] taggedOptions) {
+ ConfigTag(@NotNull Set taggedOptions) {
this.taggedOptions = taggedOptions;
}
@@ -29,8 +42,8 @@ public enum ConfigTag {
* @param option The config option to check
* @return True of the config option is tagged
*/
- public boolean isTagged(ConfigOption option) {
- return Arrays.stream(taggedOptions).anyMatch((item) -> item == option);
+ public boolean isTagged(@NotNull ConfigOption option) {
+ return taggedOptions.contains(option);
}
/**
@@ -39,7 +52,7 @@ public enum ConfigTag {
* @param configOption The config option to check
* @return True if changing the config option requires a "reload of colors" to take effect
*/
- public static boolean requiresColorReload(ConfigOption configOption) {
+ public static boolean requiresColorReload(@NotNull ConfigOption configOption) {
return (COLOR.isTagged(configOption) && configOption != ConfigOption.FREE_GATES_COLOR);
}
@@ -49,7 +62,7 @@ public enum ConfigTag {
* @param option The config option to check
* @return True if changing the config option requires a full reload to take effect
*/
- public static boolean requiresFullReload(ConfigOption option) {
+ public static boolean requiresFullReload(@NotNull ConfigOption option) {
return FOLDER.isTagged(option);
}
@@ -59,7 +72,7 @@ public enum ConfigTag {
* @param configOption The config option to check
* @return True if changing the config option requires a reload of all dynmap markers
*/
- public static boolean requiresDynmapReload(ConfigOption configOption) {
+ public static boolean requiresDynmapReload(@NotNull ConfigOption configOption) {
return DYNMAP.isTagged(configOption);
}
@@ -69,7 +82,7 @@ public enum ConfigTag {
* @param option The config option to check
* @return True if changing the config option requires a portal reload to take effect
*/
- public static boolean requiresPortalReload(ConfigOption option) {
+ public static boolean requiresPortalReload(@NotNull ConfigOption option) {
return COLOR.isTagged(option) || FOLDER.isTagged(option) || option == ConfigOption.VERIFY_PORTALS;
}
@@ -79,7 +92,7 @@ public enum ConfigTag {
* @param option The config option to check
* @return True if the language loader requires a reload
*/
- public static boolean requiresLanguageReload(ConfigOption option) {
+ public static boolean requiresLanguageReload(@NotNull ConfigOption option) {
return option == ConfigOption.LANGUAGE;
}
@@ -89,7 +102,7 @@ public enum ConfigTag {
* @param option The config option to check
* @return True if economy requires a reload
*/
- public static boolean requiresEconomyReload(ConfigOption option) {
+ public static boolean requiresEconomyReload(@NotNull ConfigOption option) {
return option == ConfigOption.USE_ECONOMY;
}
diff --git a/src/main/java/net/knarcraft/stargate/config/DynmapManager.java b/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
index 497ea84..67b015f 100644
--- a/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
+++ b/src/main/java/net/knarcraft/stargate/config/DynmapManager.java
@@ -1,6 +1,7 @@
package net.knarcraft.stargate.config;
import net.knarcraft.stargate.Stargate;
+import net.knarcraft.stargate.container.RelativeBlockVector;
import net.knarcraft.stargate.portal.Portal;
import net.knarcraft.stargate.portal.PortalRegistry;
import org.bukkit.Location;
@@ -10,6 +11,8 @@ import org.dynmap.markers.GenericMarker;
import org.dynmap.markers.Marker;
import org.dynmap.markers.MarkerIcon;
import org.dynmap.markers.MarkerSet;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* A manager for dealing with everything Dynmap
@@ -29,7 +32,7 @@ public final class DynmapManager {
* @param dynmapAPI A reference
* @throws NullPointerException If dynmap has an invalid state
*/
- public static void initialize(DynmapAPI dynmapAPI) throws NullPointerException {
+ public static void initialize(@Nullable DynmapAPI dynmapAPI) throws NullPointerException {
if (dynmapAPI == null || !dynmapAPI.markerAPIInitialized() || dynmapAPI.getMarkerAPI() == null) {
markerSet = null;
portalIcon = null;
@@ -67,7 +70,7 @@ public final class DynmapManager {
*
* @param portal The portal to add a marker for
*/
- public static void addPortalMarker(Portal portal) {
+ public static void addPortalMarker(@NotNull Portal portal) {
if (markerSet == null || Stargate.getStargateConfig().isDynmapDisabled()) {
return;
}
@@ -76,7 +79,13 @@ public final class DynmapManager {
return;
}
- Location location = portal.getBlockAt(portal.getGate().getLayout().getExit());
+ Location location;
+ @Nullable RelativeBlockVector exit = portal.getGate().getLayout().getExit();
+ if (exit == null) {
+ location = portal.getTopLeft();
+ } else {
+ location = portal.getBlockAt(exit);
+ }
Marker marker = markerSet.createMarker(getPortalMarkerId(portal), portal.getName(), world.getName(),
location.getX(), location.getY(), location.getZ(), portalIcon, false);
if (marker == null) {
@@ -112,7 +121,7 @@ public final class DynmapManager {
*
* @param portal The portal to remove the marker for
*/
- public static void removePortalMarker(Portal portal) {
+ public static void removePortalMarker(@NotNull Portal portal) {
if (markerSet == null || Stargate.getStargateConfig().isDynmapDisabled()) {
return;
}
@@ -128,7 +137,7 @@ public final class DynmapManager {
* @param portal The portal to get a marker id for
* @return
*/
- private static String getPortalMarkerId(Portal portal) {
+ private static String getPortalMarkerId(@NotNull Portal portal) {
return portal.getNetwork() + "-:-" + portal.getName();
}
diff --git a/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java b/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java
index b3b5d34..5058246 100644
--- a/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/EconomyConfig.java
@@ -11,6 +11,8 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.ServicesManager;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.Map;
@@ -29,7 +31,7 @@ public final class EconomyConfig {
*
* @param configOptions The loaded config options to read
*/
- public EconomyConfig(Map configOptions) {
+ public EconomyConfig(@NotNull Map configOptions) {
this.configOptions = configOptions;
try {
String freeColor = (String) configOptions.get(ConfigOption.FREE_GATES_COLOR);
@@ -62,6 +64,7 @@ public final class EconomyConfig {
*
* @return An economy object, or null if economy is disabled or not initialized
*/
+ @Nullable
public Economy getEconomy() {
return economy;
}
@@ -71,6 +74,7 @@ public final class EconomyConfig {
*
* @return An instance of the Vault plugin, or null if Vault is not loaded
*/
+ @Nullable
public Plugin getVault() {
return vault;
}
@@ -137,6 +141,7 @@ public final class EconomyConfig {
*
* @return The account all taxes are paid to
*/
+ @Nullable
public String getTaxAccount() {
return (String) configOptions.get(ConfigOption.TAX_ACCOUNT);
}
@@ -158,6 +163,7 @@ public final class EconomyConfig {
* @param amount The amount to display
* @return A formatted text string describing the amount
*/
+ @NotNull
public String format(int amount) {
if (isEconomyEnabled()) {
return economy.format(amount);
@@ -172,7 +178,7 @@ public final class EconomyConfig {
* @param pluginManager The plugin manager to get plugins from
* @return True if economy was enabled
*/
- public boolean setupEconomy(PluginManager pluginManager) {
+ public boolean setupEconomy(@NotNull PluginManager pluginManager) {
if (!isEconomyEnabled()) {
return false;
}
@@ -211,7 +217,7 @@ public final class EconomyConfig {
* @param gate The gate type used
* @return The cost of creating the gate
*/
- public int getCreateCost(Player player, Gate gate) {
+ public int getCreateCost(@NotNull Player player, @NotNull Gate gate) {
if (isFree(player, "create")) {
return 0;
} else {
@@ -226,7 +232,7 @@ public final class EconomyConfig {
* @param gate The gate type used
* @return The cost of destroying the gate
*/
- public int getDestroyCost(Player player, Gate gate) {
+ public int getDestroyCost(@NotNull Player player, @NotNull Gate gate) {
if (isFree(player, "destroy")) {
return 0;
} else {
@@ -241,7 +247,7 @@ public final class EconomyConfig {
* @param permissionNode The free.permissionNode necessary to allow free gate {action}
* @return
*/
- private boolean isFree(Player player, String permissionNode) {
+ private boolean isFree(@NotNull Player player, @NotNull String permissionNode) {
return !useEconomy() || PermissionHelper.hasPermission(player, "stargate.free." + permissionNode);
}
diff --git a/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java b/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
index bd8a335..77b3ee3 100644
--- a/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
+++ b/src/main/java/net/knarcraft/stargate/config/LanguageLoader.java
@@ -3,6 +3,8 @@ package net.knarcraft.stargate.config;
import net.knarcraft.knarlib.property.ColorConversion;
import net.knarcraft.knarlib.util.FileHelper;
import net.knarcraft.stargate.Stargate;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -30,7 +32,7 @@ public final class LanguageLoader {
*
* @param languageFolder The folder containing the language files
*/
- public LanguageLoader(String languageFolder) {
+ public LanguageLoader(@NotNull String languageFolder) {
this.languageFolder = languageFolder;
File testFile = new File(languageFolder, "en.txt");
if (!testFile.exists()) {
@@ -65,7 +67,8 @@ public final class LanguageLoader {
* @param name The name/key of the string to display
* @return The string in the user's preferred language
*/
- public String getString(String name) {
+ @NotNull
+ public String getString(@NotNull String name) {
String value = null;
if (loadedStringTranslations != null) {
value = loadedStringTranslations.get(name);
@@ -82,7 +85,8 @@ public final class LanguageLoader {
* @param name The name/key of the string to display
* @return The string in the backup language (English)
*/
- public String getBackupString(String name) {
+ @NotNull
+ public String getBackupString(@NotNull String name) {
String value = null;
if (loadedBackupStrings != null) {
value = loadedBackupStrings.get(name);
@@ -98,7 +102,7 @@ public final class LanguageLoader {
*
* @param chosenLanguage The new plugin language
*/
- public void setChosenLanguage(String chosenLanguage) {
+ public void setChosenLanguage(@NotNull String chosenLanguage) {
this.chosenLanguage = chosenLanguage;
}
@@ -107,7 +111,7 @@ public final class LanguageLoader {
*
* @param language The language to update
*/
- private void updateLanguage(String language) {
+ private void updateLanguage(@NotNull String language) {
Map currentLanguageValues = load(language);
InputStream inputStream = getClass().getResourceAsStream("/lang/" + language + ".txt");
@@ -133,8 +137,8 @@ public final class LanguageLoader {
* @param currentLanguageValues The current values of the loaded/processed language
* @throws IOException if unable to read a language file
*/
- private void readChangedLanguageStrings(InputStream inputStream, String language, Map currentLanguageValues) throws IOException {
+ private void readChangedLanguageStrings(@NotNull InputStream inputStream, @NotNull String language,
+ @Nullable Map currentLanguageValues) throws IOException {
//Get language values
BufferedReader bufferedReader = FileHelper.getBufferedReaderFromInputStream(inputStream);
Map internalLanguageValues = FileHelper.readKeyValuePairs(bufferedReader, "=",
@@ -177,8 +181,8 @@ public final class LanguageLoader {
* @param customLanguageStrings Any custom language strings not recognized
* @throws IOException If unable to write to the language file
*/
- private void updateLanguageFile(String language, Map languageStrings,
- Map customLanguageStrings) throws IOException {
+ private void updateLanguageFile(@NotNull String language, @NotNull Map languageStrings,
+ @Nullable Map customLanguageStrings) throws IOException {
BufferedWriter bufferedWriter = FileHelper.getBufferedWriterFromString(languageFolder + language + ".txt");
//Output normal Language data
@@ -203,7 +207,8 @@ public final class LanguageLoader {
* @param lang The language to load
* @return A mapping between loaded string indexes and the strings to display
*/
- private Map load(String lang) {
+ @Nullable
+ private Map load(@NotNull String lang) {
return load(lang, null);
}
@@ -214,7 +219,8 @@ public final class LanguageLoader {
* @param inputStream An optional input stream to use. Defaults to using a file input stream
* @return A mapping between loaded string indexes and the strings to display
*/
- private Map load(String lang, InputStream inputStream) {
+ @Nullable
+ private Map load(@NotNull String lang, @Nullable InputStream inputStream) {
Map strings;
BufferedReader bufferedReader;
try {
@@ -224,7 +230,7 @@ public final class LanguageLoader {
bufferedReader = FileHelper.getBufferedReaderFromInputStream(inputStream);
}
strings = FileHelper.readKeyValuePairs(bufferedReader, "=", ColorConversion.NORMAL);
- } catch (Exception e) {
+ } catch (Exception exception) {
if (Stargate.getStargateConfig().isDebuggingEnabled()) {
Stargate.logInfo("Unable to load language " + lang);
}
diff --git a/src/main/java/net/knarcraft/stargate/config/MessageSender.java b/src/main/java/net/knarcraft/stargate/config/MessageSender.java
index bfc706a..a021de4 100644
--- a/src/main/java/net/knarcraft/stargate/config/MessageSender.java
+++ b/src/main/java/net/knarcraft/stargate/config/MessageSender.java
@@ -2,6 +2,7 @@ package net.knarcraft.stargate.config;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
/**
* The message sender is responsible sending messages to players with correct coloring and formatting
@@ -15,7 +16,7 @@ public final class MessageSender {
*
* @param languageLoader The language loader to get translated strings from
*/
- public MessageSender(LanguageLoader languageLoader) {
+ public MessageSender(@NotNull LanguageLoader languageLoader) {
this.languageLoader = languageLoader;
}
@@ -25,7 +26,7 @@ public final class MessageSender {
* @param player The player to send the message to
* @param message The message to send
*/
- public void sendErrorMessage(CommandSender player, String message) {
+ public void sendErrorMessage(@NotNull CommandSender player, @NotNull String message) {
sendMessage(player, message, true);
}
@@ -35,7 +36,7 @@ public final class MessageSender {
* @param player The player to send the message to
* @param message The message to send
*/
- public void sendSuccessMessage(CommandSender player, String message) {
+ public void sendSuccessMessage(@NotNull CommandSender player, @NotNull String message) {
sendMessage(player, message, false);
}
@@ -46,7 +47,7 @@ public final class MessageSender {
* @param message The message to send
* @param error Whether the message sent is an error
*/
- private void sendMessage(CommandSender sender, String message, boolean error) {
+ private void sendMessage(@NotNull CommandSender sender, @NotNull String message, boolean error) {
if (message.isEmpty()) {
return;
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
index 768277e..1b9316c 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java
@@ -19,6 +19,7 @@ import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.messaging.Messenger;
import org.dynmap.DynmapAPI;
+import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
@@ -58,7 +59,7 @@ public final class StargateConfig {
*
* @param logger The logger to use for logging errors
*/
- public StargateConfig(Logger logger) {
+ public StargateConfig(@NotNull Logger logger) {
this.logger = logger;
configOptions = new HashMap<>();
@@ -76,6 +77,7 @@ public final class StargateConfig {
*
* @return A reference to the config options map
*/
+ @NotNull
public Map getConfigOptionsReference() {
return configOptions;
}
@@ -136,6 +138,7 @@ public final class StargateConfig {
*
* @return The loaded config options
*/
+ @NotNull
public Map getConfigOptions() {
return new HashMap<>(configOptions);
}
@@ -147,6 +150,7 @@ public final class StargateConfig {
*
* @return The open portals queue
*/
+ @NotNull
public Queue getOpenPortalsQueue() {
return openPortalsQueue;
}
@@ -158,6 +162,7 @@ public final class StargateConfig {
*
* @return The active portals queue
*/
+ @NotNull
public Queue getActivePortalsQueue() {
return activePortalsQueue;
}
@@ -203,6 +208,7 @@ public final class StargateConfig {
*
* @return The object containing economy config values
*/
+ @NotNull
public EconomyConfig getEconomyConfig() {
return this.economyConfig;
}
@@ -212,7 +218,7 @@ public final class StargateConfig {
*
* @param sender The sender of the reload request
*/
- public void reload(CommandSender sender) {
+ public void reload(@NotNull CommandSender sender) {
//Unload all saved data
unload();
@@ -285,6 +291,7 @@ public final class StargateConfig {
*
* @return The managed worlds
*/
+ @NotNull
public Set getManagedWorlds() {
return new HashSet<>(managedWorlds);
}
@@ -294,7 +301,7 @@ public final class StargateConfig {
*
* @param worldName The name of the world to manage
*/
- public void addManagedWorld(String worldName) {
+ public void addManagedWorld(@NotNull String worldName) {
managedWorlds.add(worldName);
}
@@ -303,7 +310,7 @@ public final class StargateConfig {
*
* @param worldName The name of the world to stop managing
*/
- public void removeManagedWorld(String worldName) {
+ public void removeManagedWorld(@NotNull String worldName) {
managedWorlds.remove(worldName);
}
@@ -448,6 +455,7 @@ public final class StargateConfig {
*
* @return Gets the gate config
*/
+ @NotNull
public StargateGateConfig getStargateGateConfig() {
return stargateGateConfig;
}
@@ -465,13 +473,13 @@ public final class StargateConfig {
*
* @param currentConfiguration The current config to back up
*/
- private void migrateConfig(FileConfiguration currentConfiguration) {
+ private void migrateConfig(@NotNull FileConfiguration currentConfiguration) {
String debugPath = "StargateConfig::migrateConfig";
//Save the old config just in case something goes wrong
try {
currentConfiguration.save(new File(dataFolderPath, "config.yml.old"));
- } catch (IOException e) {
+ } catch (IOException exception) {
Stargate.debug(debugPath, "Unable to save old backup and do migration");
return;
}
@@ -489,7 +497,7 @@ public final class StargateConfig {
migrationFields = FileHelper.readKeyValuePairs(FileHelper.getBufferedReaderFromInputStream(
FileHelper.getInputStreamForInternalFile("/config-migrations.txt")), "=",
ColorConversion.NORMAL);
- } catch (IOException e) {
+ } catch (IOException exception) {
Stargate.debug(debugPath, "Unable to load config migration file");
return;
}
@@ -530,9 +538,10 @@ public final class StargateConfig {
*/
private void setupVaultEconomy() {
EconomyConfig economyConfig = getEconomyConfig();
- if (economyConfig.setupEconomy(Stargate.getPluginManager()) && economyConfig.getEconomy() != null) {
+ if (economyConfig.setupEconomy(Stargate.getPluginManager()) && economyConfig.getEconomy() != null &&
+ economyConfig.getVault() != null) {
String vaultVersion = economyConfig.getVault().getDescription().getVersion();
- Stargate.logInfo(Stargate.replaceVars(Stargate.getString("vaultLoaded"), "%version%", vaultVersion));
+ Stargate.logInfo(Stargate.replacePlaceholders(Stargate.getString("vaultLoaded"), "%version%", vaultVersion));
}
}
@@ -578,6 +587,7 @@ public final class StargateConfig {
*
* @return The portal folder
*/
+ @NotNull
public String getPortalFolder() {
return portalFolder;
}
@@ -589,6 +599,7 @@ public final class StargateConfig {
*
* @return The folder storing gate files
*/
+ @NotNull
public String getGateFolder() {
return gateFolder;
}
@@ -598,6 +609,7 @@ public final class StargateConfig {
*
* @return The sender for sending messages to players
*/
+ @NotNull
public MessageSender getMessageSender() {
return messageSender;
}
@@ -607,6 +619,7 @@ public final class StargateConfig {
*
* @return The language loader
*/
+ @NotNull
public LanguageLoader getLanguageLoader() {
return languageLoader;
}
diff --git a/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java
index f97cd16..f3dc071 100644
--- a/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java
+++ b/src/main/java/net/knarcraft/stargate/config/StargateGateConfig.java
@@ -6,6 +6,7 @@ import net.knarcraft.stargate.portal.PortalSignDrawer;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Color;
import org.bukkit.Material;
+import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
@@ -26,7 +27,7 @@ public final class StargateGateConfig {
*
* @param configOptions The loaded config options to use
*/
- public StargateGateConfig(Map configOptions) {
+ public StargateGateConfig(@NotNull Map configOptions) {
this.configOptions = configOptions;
loadGateConfig();
}
@@ -248,8 +249,8 @@ public final class StargateGateConfig {
* @param defaultColors The specified default colors
* @param colorMaps The list of color maps to save the resulting colors to
*/
- private void parsePerSignColors(Object signColorSpecification, ChatColor[] defaultColors,
- List