Compare commits
	
		
			46 Commits
		
	
	
		
			0.9.3.4
			...
			vertical-s
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2dcf7b7af0 | |||
| af9142bb05 | |||
| 116e816a18 | |||
| 0f0b8b7087 | |||
| e4539c3623 | |||
| e1ca1fe8b0 | |||
| 9ac3c11345 | |||
| 13cdccfc1d | |||
| 6954d46af4 | |||
| a1f25a794e | |||
| 31b3423246 | |||
| a35c07dc9c | |||
| 5aed252181 | |||
| ef97da9177 | |||
| a26cc30092 | |||
| 4fda4c3905 | |||
| 2b23e6fc56 | |||
| c09063c49e | |||
| b5e2565626 | |||
| fbabe7b117 | |||
| 5e456a1326 | |||
| 11d3dc7a92 | |||
| 1c87d803ff | |||
| 2076fda4d1 | |||
| 524130c4e0 | |||
| ce5f3ef52f | |||
| cae34d395b | |||
| 643a48392b | |||
| 92c3eadf8f | |||
| 92f452df00 | |||
| 6eb7649e0d | |||
| 5c2cbaae58 | |||
| 0c69dc8991 | |||
| 68bed24137 | |||
| 5c1f9036c2 | |||
| 8488c5abdb | |||
| e3189e9ab2 | |||
| 8c334ff5f0 | |||
| 4dfce3d325 | |||
| 00462799b9 | |||
| 9e78e32db4 | |||
| 28bb6f2109 | |||
| 61b05bcce9 | |||
| 5f4a90aabb | |||
| a481ccf017 | |||
| 99ee5c6978 | 
							
								
								
									
										19
									
								
								HEADER
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								HEADER
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
Stargate - A portal plugin for Bukkit
 | 
			
		||||
Copyright (C) 2011 Shaun (sturmeh)
 | 
			
		||||
Copyright (C) 2011 Dinnerbone
 | 
			
		||||
Copyright (C) 2011-2013 Steven "Drakia" Scott <Contact@TheDgtl.net>
 | 
			
		||||
Copyright (C) 2015-2020 Michael Smith (PseudoKnight)
 | 
			
		||||
Copyright (C) 2021-2022 Kristian Knarvik (EpicKnarvik97)
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
							
								
								
									
										10
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
pipeline {
 | 
			
		||||
    agent any
 | 
			
		||||
    tools {
 | 
			
		||||
        jdk 'JDK16'
 | 
			
		||||
        jdk 'JDK17'
 | 
			
		||||
    }
 | 
			
		||||
    stages {
 | 
			
		||||
        stage('Build') {
 | 
			
		||||
@@ -16,10 +16,16 @@ pipeline {
 | 
			
		||||
                sh 'mvn test'
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        stage('Verify') {
 | 
			
		||||
            steps {
 | 
			
		||||
                echo 'Verifying...'
 | 
			
		||||
                sh 'mvn verify -Dmaven.test.skip=true'
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        stage('Deploy') {
 | 
			
		||||
             steps {
 | 
			
		||||
                echo 'Deploying...'
 | 
			
		||||
                sh 'mvn verify -Dmaven.test.skip=true'
 | 
			
		||||
                sh 'mvn deploy -Dmaven.install.skip=true -Dmaven.test.skip=true'
 | 
			
		||||
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								README.md
									
									
									
									
									
								
							@@ -7,7 +7,7 @@ can share a network or be split into clusters; they can be hidden on a network o
 | 
			
		||||
- **Vault economy support** -- can add costs for create, destroy and use.
 | 
			
		||||
- **Ability to create custom gate configurations**. Four different default gate configurations are available.
 | 
			
		||||
- **Message customization**
 | 
			
		||||
- **Multiple built-in languages** (de, en, es, fr, hu, it, nb-no, nl, nn-no, pt-br, ru)
 | 
			
		||||
- **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)
 | 
			
		||||
- **Vehicle teleportation** -- teleport minecarts, boats, horses, pigs and striders
 | 
			
		||||
- **Leashed teleportation** -- teleport any creature in a leash with the player
 | 
			
		||||
@@ -26,6 +26,11 @@ This was originally TheDgtl's Bukkit port of the Stargate plugin for hMod by Din
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
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 compatible with configurations from the Stargate plugin all the way back. The nethergate.gate
 | 
			
		||||
@@ -298,7 +303,7 @@ while the per-gate costs re defined in the .gate files. To define a certain cost
 | 
			
		||||
# Configuration
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
language - The language to use (Included languages: en, de, es, fr, hu, it, nb-no, nl, nn-no, pt-br, ru)
 | 
			
		||||
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
 | 
			
		||||
folders:
 | 
			
		||||
  portalFolder - The folder your portal databases are saved in
 | 
			
		||||
@@ -343,7 +348,7 @@ advanced:
 | 
			
		||||
 | 
			
		||||
# Message Customization
 | 
			
		||||
 | 
			
		||||
It is possible to customize all the messages Stargate displays, including the [Stargate] prefix. You can find the
 | 
			
		||||
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
 | 
			
		||||
@@ -400,6 +405,36 @@ portalInfoServer=Server: %server%
 | 
			
		||||
 | 
			
		||||
# Changes
 | 
			
		||||
 | 
			
		||||
#### \[Version 0.9.4.2] EpicKnarvik97 fork
 | 
			
		||||
 | 
			
		||||
- 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.1] EpicKnarvik97 fork
 | 
			
		||||
 | 
			
		||||
- Reverts to Spigot API 1.18
 | 
			
		||||
- Adds Dynmap integration
 | 
			
		||||
 | 
			
		||||
#### \[Version 0.9.4.0] EpicKnarvik97 fork
 | 
			
		||||
 | 
			
		||||
- Updates Stargate to 1.19
 | 
			
		||||
 | 
			
		||||
#### \[Version 0.9.3.7] EpicKnarvik97 fork
 | 
			
		||||
 | 
			
		||||
- Adds the Japanese language file provided by spigot user furplag
 | 
			
		||||
 | 
			
		||||
#### \[Version 0.9.3.6] EpicKnarvik97 fork
 | 
			
		||||
 | 
			
		||||
- Adds the simplified Chinese language file provided by spigot user YKDZ
 | 
			
		||||
 | 
			
		||||
#### \[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
 | 
			
		||||
 | 
			
		||||
#### \[Version 0.9.3.4] EpicKnarvik97 fork
 | 
			
		||||
 | 
			
		||||
- Includes passengers of passengers when teleporting entities
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										96
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								pom.xml
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
    <groupId>net.knarcraft</groupId>
 | 
			
		||||
    <artifactId>Stargate</artifactId>
 | 
			
		||||
    <version>0.9.3.4</version>
 | 
			
		||||
    <version>0.9.4.3-SNAPSHOT</version>
 | 
			
		||||
 | 
			
		||||
    <licenses>
 | 
			
		||||
        <license>
 | 
			
		||||
@@ -15,49 +15,72 @@
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
			
		||||
        <maven.compiler.source>17</maven.compiler.source>
 | 
			
		||||
        <maven.compiler.target>17</maven.compiler.target>
 | 
			
		||||
        <java.version>16</java.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
 | 
			
		||||
    <repositories>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>knarcraft-repo</id>
 | 
			
		||||
            <url>https://git.knarcraft.net/api/packages/EpicKnarvik97/maven</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>spigot-repo</id>
 | 
			
		||||
            <url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>vault-repo</id>
 | 
			
		||||
            <url>http://nexus.hc.to/content/repositories/pub_releases</url>
 | 
			
		||||
            <url>https://nexus.hc.to/content/repositories/pub_releases</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>dynmap</id>
 | 
			
		||||
            <url>https://repo.mikeprimm.com/</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>papermc</id>
 | 
			
		||||
            <url>https://repo.papermc.io/repository/maven-public/</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
    </repositories>
 | 
			
		||||
    <distributionManagement>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>knarcraft-repo</id>
 | 
			
		||||
            <url>https://git.knarcraft.net/api/packages/EpicKnarvik97/maven</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
        <snapshotRepository>
 | 
			
		||||
            <id>knarcraft-repo</id>
 | 
			
		||||
            <url>https://git.knarcraft.net/api/packages/EpicKnarvik97/maven</url>
 | 
			
		||||
        </snapshotRepository>
 | 
			
		||||
    </distributionManagement>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.spigotmc</groupId>
 | 
			
		||||
            <artifactId>spigot-api</artifactId>
 | 
			
		||||
            <version>1.18.1-R0.1-SNAPSHOT</version>
 | 
			
		||||
            <version>1.19.3-R0.1-SNAPSHOT</version>
 | 
			
		||||
            <scope>provided</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>net.milkbowl.vault</groupId>
 | 
			
		||||
            <artifactId>VaultAPI</artifactId>
 | 
			
		||||
            <version>1.7</version>
 | 
			
		||||
            <scope>provided</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.junit.jupiter</groupId>
 | 
			
		||||
            <artifactId>junit-jupiter-api</artifactId>
 | 
			
		||||
            <version>5.8.2</version>
 | 
			
		||||
            <version>5.9.0</version>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.seeseemelk</groupId>
 | 
			
		||||
            <artifactId>MockBukkit-v1.18</artifactId>
 | 
			
		||||
            <version>1.15.5</version>
 | 
			
		||||
            <version>2.85.2</version>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.jetbrains</groupId>
 | 
			
		||||
            <artifactId>annotations</artifactId>
 | 
			
		||||
            <version>22.0.0</version>
 | 
			
		||||
            <scope>compile</scope>
 | 
			
		||||
            <version>23.0.0</version>
 | 
			
		||||
            <scope>provided</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>junit</groupId>
 | 
			
		||||
@@ -65,20 +88,67 @@
 | 
			
		||||
            <version>4.13.2</version>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>us.dynmap</groupId>
 | 
			
		||||
            <artifactId>dynmap-api</artifactId>
 | 
			
		||||
            <version>3.1-beta-2</version>
 | 
			
		||||
            <scope>provided</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>net.knarcraft</groupId>
 | 
			
		||||
            <artifactId>knarlib</artifactId>
 | 
			
		||||
            <version>1.0-SNAPSHOT</version>
 | 
			
		||||
            <scope>compile</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
        <sourceDirectory>src/main/java</sourceDirectory>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
                <version>3.6.1</version>
 | 
			
		||||
                <version>3.8.1</version>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <source>17</source>
 | 
			
		||||
                    <target>17</target>
 | 
			
		||||
                    <source>${java.version}</source>
 | 
			
		||||
                    <target>${java.version}</target>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-shade-plugin</artifactId>
 | 
			
		||||
                <version>3.2.4</version>
 | 
			
		||||
                <executions>
 | 
			
		||||
                    <execution>
 | 
			
		||||
                        <phase>package</phase>
 | 
			
		||||
                        <goals>
 | 
			
		||||
                            <goal>shade</goal>
 | 
			
		||||
                        </goals>
 | 
			
		||||
                        <configuration>
 | 
			
		||||
                            <createDependencyReducedPom>false</createDependencyReducedPom>
 | 
			
		||||
                            <filters>
 | 
			
		||||
                                <filter>
 | 
			
		||||
                                    <artifact>net.knarcraft:knarlib</artifact>
 | 
			
		||||
                                    <includes>
 | 
			
		||||
                                        <include>net/knarcraft/knarlib/**</include>
 | 
			
		||||
                                    </includes>
 | 
			
		||||
                                </filter>
 | 
			
		||||
                                <filter>
 | 
			
		||||
                                    <excludes>
 | 
			
		||||
                                        <exclude>*.MF</exclude>
 | 
			
		||||
                                        <exclude>*.yml</exclude>
 | 
			
		||||
                                    </excludes>
 | 
			
		||||
                                </filter>
 | 
			
		||||
                            </filters>
 | 
			
		||||
                        </configuration>
 | 
			
		||||
                    </execution>
 | 
			
		||||
                </executions>
 | 
			
		||||
            </plugin>
 | 
			
		||||
        </plugins>
 | 
			
		||||
        <resources>
 | 
			
		||||
            <resource>
 | 
			
		||||
                <directory>src/main/resources</directory>
 | 
			
		||||
                <filtering>true</filtering>
 | 
			
		||||
            </resource>
 | 
			
		||||
        </resources>
 | 
			
		||||
    </build>
 | 
			
		||||
</project>
 | 
			
		||||
							
								
								
									
										180
									
								
								src/main/java/net/knarcraft/stargate/SimpleVectorOperation.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								src/main/java/net/knarcraft/stargate/SimpleVectorOperation.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,180 @@
 | 
			
		||||
package net.knarcraft.stargate;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Axis;
 | 
			
		||||
import org.bukkit.block.BlockFace;
 | 
			
		||||
import org.bukkit.util.BlockVector;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A class for performing rotational operations on vectors
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kristian Knarvik
 | 
			
		||||
 */
 | 
			
		||||
@SuppressWarnings("unused")
 | 
			
		||||
public class SimpleVectorOperation {
 | 
			
		||||
 | 
			
		||||
    private static final Map<BlockFace, Double> rotationAngles = new HashMap<>();
 | 
			
		||||
    private static final Map<BlockFace, Vector> rotationAxes = new HashMap<>();
 | 
			
		||||
    private static final Map<BlockFace, Axis> normalAxes = new HashMap<>();
 | 
			
		||||
    private static final BlockFace defaultDirection = BlockFace.SOUTH;
 | 
			
		||||
    private static final Axis defaultVerticalAxis = Axis.Y;
 | 
			
		||||
 | 
			
		||||
    private final Axis normalAxis;
 | 
			
		||||
    private boolean flipZAxis = false;
 | 
			
		||||
    private final BlockFace facing;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Instantiates a vector operation to rotate vectors in the direction of a sign face
 | 
			
		||||
     *
 | 
			
		||||
     * @param signFace <p>The sign face of a gate's sign</p>
 | 
			
		||||
     */
 | 
			
		||||
    public SimpleVectorOperation(BlockFace signFace) {
 | 
			
		||||
        if (normalAxes.isEmpty()) {
 | 
			
		||||
            initializeIrisNormalAxes();
 | 
			
		||||
            initializeOperations();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.facing = signFace;
 | 
			
		||||
        this.normalAxis = normalAxes.get(signFace);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the block face of a sign given upon instantiation
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The block face of a sign given upon instantiation</p>
 | 
			
		||||
     */
 | 
			
		||||
    public BlockFace getFacing() {
 | 
			
		||||
        return facing;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the normal axis orthogonal to the opening plane
 | 
			
		||||
     *
 | 
			
		||||
     * <p>Said another way, get the axis going directly towards or away from a stargate's entrance.</p>
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The normal axis orthogonal to the opening plane</p>
 | 
			
		||||
     */
 | 
			
		||||
    public Axis getNormalAxis() {
 | 
			
		||||
        return normalAxis;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets whether to flip the Z- axis
 | 
			
		||||
     *
 | 
			
		||||
     * @param flipZAxis <p>Whether to flip the z-axis</p>
 | 
			
		||||
     */
 | 
			
		||||
    public void setFlipZAxis(boolean flipZAxis) {
 | 
			
		||||
        this.flipZAxis = flipZAxis;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs an operation from the real space to the vector space
 | 
			
		||||
     *
 | 
			
		||||
     * @param vector <p>The vector to perform the operation on</p>
 | 
			
		||||
     * @return vector <p>A new vector with the operation applied</p>
 | 
			
		||||
     */
 | 
			
		||||
    public Vector performToAbstractSpaceOperation(@NotNull Vector vector) {
 | 
			
		||||
        Vector clone = vector.clone();
 | 
			
		||||
        clone.rotateAroundAxis(rotationAxes.get(facing), rotationAngles.get(facing));
 | 
			
		||||
        if (flipZAxis) {
 | 
			
		||||
            clone.setZ(-clone.getZ());
 | 
			
		||||
        }
 | 
			
		||||
        return clone;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs an operation from the vector space to the real space
 | 
			
		||||
     *
 | 
			
		||||
     * @param vector <p>The vector to perform the inverse operation on</p>
 | 
			
		||||
     * @return vector <p>A new vector with the operation applied</p>
 | 
			
		||||
     */
 | 
			
		||||
    public Vector performToRealSpaceOperation(@NotNull Vector vector) {
 | 
			
		||||
        Vector clone = vector.clone();
 | 
			
		||||
        if (flipZAxis) {
 | 
			
		||||
            clone.setZ(-clone.getZ());
 | 
			
		||||
        }
 | 
			
		||||
        return clone.rotateAroundAxis(rotationAxes.get(facing), -rotationAngles.get(facing));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs an operation from the vector space to the real space
 | 
			
		||||
     *
 | 
			
		||||
     * @param vector <p>The vector to perform the inverse operation on</p>
 | 
			
		||||
     * @return vector <p>A new vector with the operation applied</p>
 | 
			
		||||
     */
 | 
			
		||||
    public BlockVector performToRealSpaceOperation(@NotNull BlockVector vector) {
 | 
			
		||||
        return performToRealSpaceOperation((Vector) vector).toBlockVector();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the operations used for rotating to each block-face
 | 
			
		||||
     */
 | 
			
		||||
    private static void initializeOperations() {
 | 
			
		||||
        Map<Axis, Vector> axisVectors = new HashMap<>();
 | 
			
		||||
        axisVectors.put(Axis.Y, new Vector(0, 1, 0));
 | 
			
		||||
        axisVectors.put(Axis.X, new Vector(1, 0, 0));
 | 
			
		||||
        axisVectors.put(Axis.Z, new Vector(0, 0, 1));
 | 
			
		||||
 | 
			
		||||
        //Use the cross product to find the correct axis
 | 
			
		||||
        for (BlockFace face : normalAxes.keySet()) {
 | 
			
		||||
            Vector crossProduct = face.getDirection().crossProduct(defaultDirection.getDirection());
 | 
			
		||||
            if (face == defaultDirection || face == defaultDirection.getOppositeFace()) {
 | 
			
		||||
                rotationAxes.put(face, axisVectors.get(defaultVerticalAxis));
 | 
			
		||||
            } else if (Math.abs(crossProduct.getZ()) > 0) {
 | 
			
		||||
                rotationAxes.put(face, axisVectors.get(Axis.Z));
 | 
			
		||||
            } else if (Math.abs(crossProduct.getY()) > 0) {
 | 
			
		||||
                rotationAxes.put(face, axisVectors.get(Axis.Y));
 | 
			
		||||
            } else {
 | 
			
		||||
                rotationAxes.put(face, axisVectors.get(Axis.X));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        calculateRotations();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Calculates the required rotations based on the default rotation
 | 
			
		||||
     */
 | 
			
		||||
    private static void calculateRotations() {
 | 
			
		||||
        double halfRotation = Math.PI;
 | 
			
		||||
        double quarterRotation = halfRotation / 2;
 | 
			
		||||
 | 
			
		||||
        Vector defaultDirectionVector = defaultDirection.getDirection();
 | 
			
		||||
        boolean defaultDirectionPositive = defaultDirectionVector.getX() + defaultDirectionVector.getY() +
 | 
			
		||||
                defaultDirectionVector.getZ() > 0;
 | 
			
		||||
 | 
			
		||||
        for (BlockFace blockFace : normalAxes.keySet()) {
 | 
			
		||||
            if (defaultDirection == blockFace) {
 | 
			
		||||
                //The default direction requires no rotation
 | 
			
		||||
                rotationAngles.put(blockFace, 0d);
 | 
			
		||||
            } else if (defaultDirection.getOppositeFace() == blockFace) {
 | 
			
		||||
                //The opposite direction requires a half rotation
 | 
			
		||||
                rotationAngles.put(blockFace, halfRotation);
 | 
			
		||||
            } else {
 | 
			
		||||
                //All the other used directions require a quarter rotation
 | 
			
		||||
                Vector faceDirectionVector = blockFace.getDirection();
 | 
			
		||||
                boolean faceDirectionPositive = faceDirectionVector.getX() + faceDirectionVector.getY() +
 | 
			
		||||
                        faceDirectionVector.getZ() > 0;
 | 
			
		||||
                double rotation = defaultDirectionPositive && faceDirectionPositive ? quarterRotation : -quarterRotation;
 | 
			
		||||
                rotationAngles.put(blockFace, rotation);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the iris normal axes corresponding to each block face
 | 
			
		||||
     */
 | 
			
		||||
    private static void initializeIrisNormalAxes() {
 | 
			
		||||
        normalAxes.put(BlockFace.EAST, Axis.Z);
 | 
			
		||||
        normalAxes.put(BlockFace.WEST, Axis.Z);
 | 
			
		||||
        normalAxes.put(BlockFace.NORTH, Axis.X);
 | 
			
		||||
        normalAxes.put(BlockFace.SOUTH, Axis.X);
 | 
			
		||||
        normalAxes.put(BlockFace.UP, Axis.Y);
 | 
			
		||||
        normalAxes.put(BlockFace.DOWN, Axis.Y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package net.knarcraft.stargate;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.util.UpdateChecker;
 | 
			
		||||
import net.knarcraft.stargate.command.CommandStarGate;
 | 
			
		||||
import net.knarcraft.stargate.command.StarGateTabCompleter;
 | 
			
		||||
import net.knarcraft.stargate.config.EconomyConfig;
 | 
			
		||||
@@ -22,7 +23,6 @@ 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.UpdateChecker;
 | 
			
		||||
import org.bukkit.Server;
 | 
			
		||||
import org.bukkit.command.PluginCommand;
 | 
			
		||||
import org.bukkit.configuration.file.FileConfiguration;
 | 
			
		||||
@@ -39,24 +39,44 @@ import java.util.Queue;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Stargate - A portal plugin for Bukkit
 | 
			
		||||
Copyright (C) 2011 Shaun (sturmeh)
 | 
			
		||||
Copyright (C) 2011 Dinnerbone
 | 
			
		||||
Copyright (C) 2011-2013 Steven "Drakia" Scott <Contact@TheDgtl.net>
 | 
			
		||||
Copyright (C) 2015-2020 Michael Smith (PseudoKnight)
 | 
			
		||||
Copyright (C) 2021-2022 Kristian Knarvik (EpicKnarvik97)
 | 
			
		||||
 | 
			
		||||
The following license notice applies to all source and resource files in the Stargate project:
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The main class of the Stargate plugin
 | 
			
		||||
 */
 | 
			
		||||
@SuppressWarnings("unused")
 | 
			
		||||
public class Stargate extends JavaPlugin {
 | 
			
		||||
 | 
			
		||||
    //Used for changing gate open/closed material.
 | 
			
		||||
    private static final Queue<BlockChangeRequest> blockChangeRequestQueue = new LinkedList<>();
 | 
			
		||||
    private static final Queue<ChunkUnloadRequest> chunkUnloadQueue = new PriorityQueue<>();
 | 
			
		||||
 | 
			
		||||
    private static Logger logger;
 | 
			
		||||
    private static Stargate stargate;
 | 
			
		||||
 | 
			
		||||
    private static String pluginVersion;
 | 
			
		||||
 | 
			
		||||
    private static PluginManager pluginManager;
 | 
			
		||||
    private static StargateConfig stargateConfig;
 | 
			
		||||
 | 
			
		||||
    private static String updateAvailable = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -279,24 +299,6 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
        return stargateConfig.getLanguageLoader().getBackupString(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces a list of variables in a string in the order they are given
 | 
			
		||||
     *
 | 
			
		||||
     * @param input  <p>The input containing the variables</p>
 | 
			
		||||
     * @param search <p>The variables to replace</p>
 | 
			
		||||
     * @param values <p>The replacement values</p>
 | 
			
		||||
     * @return <p>The input string with the search values replaced with the given values</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static String replaceVars(String input, String[] search, String[] values) {
 | 
			
		||||
        if (search.length != values.length) {
 | 
			
		||||
            throw new IllegalArgumentException("The number of search values and replace values do not match.");
 | 
			
		||||
        }
 | 
			
		||||
        for (int i = 0; i < search.length; i++) {
 | 
			
		||||
            input = replaceVars(input, search[i], values[i]);
 | 
			
		||||
        }
 | 
			
		||||
        return input;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces a variable in a string
 | 
			
		||||
     *
 | 
			
		||||
@@ -363,7 +365,8 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
        this.registerCommands();
 | 
			
		||||
 | 
			
		||||
        //Check for any available updates
 | 
			
		||||
        UpdateChecker.checkForUpdate();
 | 
			
		||||
        UpdateChecker.checkForUpdate(this, "https://api.spigotmc.org/legacy/update.php?resource=97784",
 | 
			
		||||
                Stargate::getPluginVersion, Stargate::setUpdateAvailable);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -430,4 +433,5 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
    public static StargateConfig getStargateConfig() {
 | 
			
		||||
        return stargateConfig;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,12 @@ package net.knarcraft.stargate.command;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.config.ConfigOption;
 | 
			
		||||
import net.knarcraft.stargate.config.ConfigTag;
 | 
			
		||||
import net.knarcraft.stargate.config.DynmapManager;
 | 
			
		||||
import net.knarcraft.stargate.config.OptionDataType;
 | 
			
		||||
import net.knarcraft.stargate.portal.Portal;
 | 
			
		||||
import net.knarcraft.stargate.portal.PortalRegistry;
 | 
			
		||||
import net.knarcraft.stargate.portal.PortalSignDrawer;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.apache.commons.lang.StringUtils;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandExecutor;
 | 
			
		||||
@@ -378,6 +378,10 @@ public class CommandConfig implements CommandExecutor {
 | 
			
		||||
                //Load or unload Vault and Economy as necessary
 | 
			
		||||
                Stargate.getStargateConfig().reloadEconomy();
 | 
			
		||||
            }
 | 
			
		||||
            if (ConfigTag.requiresDynmapReload(configOption)) {
 | 
			
		||||
                //Regenerate all Dynmap markers
 | 
			
		||||
                DynmapManager.addAllPortalMarkers();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -416,7 +420,7 @@ public class CommandConfig implements CommandExecutor {
 | 
			
		||||
        Object defaultValue = option.getDefaultValue();
 | 
			
		||||
        String stringValue = String.valueOf(defaultValue);
 | 
			
		||||
        if (option.getDataType() == OptionDataType.STRING_LIST) {
 | 
			
		||||
            stringValue = "[" + StringUtils.join((String[]) defaultValue, ",") + "]";
 | 
			
		||||
            stringValue = "[" + String.join(",", (String[]) defaultValue) + "]";
 | 
			
		||||
        }
 | 
			
		||||
        return ChatColor.GOLD + option.getName() + ChatColor.WHITE + " - " + ChatColor.GREEN + option.getDescription() +
 | 
			
		||||
                ChatColor.DARK_GRAY + " (Default: " + ChatColor.GRAY + stringValue + ChatColor.DARK_GRAY + ")";
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,13 @@ package net.knarcraft.stargate.command;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.apache.commons.lang.ArrayUtils;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandExecutor;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This command represents any command which starts with stargate
 | 
			
		||||
 *
 | 
			
		||||
@@ -25,7 +26,7 @@ public class CommandStarGate implements CommandExecutor {
 | 
			
		||||
            } else if (args[0].equalsIgnoreCase("reload")) {
 | 
			
		||||
                return new CommandReload().onCommand(commandSender, command, s, args);
 | 
			
		||||
            } else if (args[0].equalsIgnoreCase("config")) {
 | 
			
		||||
                String[] subArgs = (String[]) ArrayUtils.remove(args, 0);
 | 
			
		||||
                String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
 | 
			
		||||
                return new CommandConfig().onCommand(commandSender, command, s, subArgs);
 | 
			
		||||
            }
 | 
			
		||||
            return false;
 | 
			
		||||
@@ -35,4 +36,5 @@ public class CommandStarGate implements CommandExecutor {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,8 @@ import org.jetbrains.annotations.Nullable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import static net.knarcraft.knarlib.util.TabCompletionHelper.filterMatchingStartsWith;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This is the completer for stargates config sub-command (/sg config)
 | 
			
		||||
 */
 | 
			
		||||
@@ -48,27 +50,10 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
            for (ConfigOption option : ConfigOption.values()) {
 | 
			
		||||
                configOptionNames.add(option.getName());
 | 
			
		||||
            }
 | 
			
		||||
            return filterMatching(configOptionNames, args[0]);
 | 
			
		||||
            return filterMatchingStartsWith(configOptionNames, args[0]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Find completable strings which match the text typed by the command's sender
 | 
			
		||||
     *
 | 
			
		||||
     * @param values    <p>The values to filter</p>
 | 
			
		||||
     * @param typedText <p>The text the player has started typing</p>
 | 
			
		||||
     * @return <p>The given string values which start with the player's typed text</p>
 | 
			
		||||
     */
 | 
			
		||||
    private List<String> filterMatching(List<String> values, String typedText) {
 | 
			
		||||
        List<String> configValues = new ArrayList<>();
 | 
			
		||||
        for (String value : values) {
 | 
			
		||||
            if (value.toLowerCase().startsWith(typedText.toLowerCase())) {
 | 
			
		||||
                configValues.add(value);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return configValues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get possible values for the selected option
 | 
			
		||||
     *
 | 
			
		||||
@@ -80,7 +65,7 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
        switch (selectedOption) {
 | 
			
		||||
            case LANGUAGE:
 | 
			
		||||
                //Return available languages
 | 
			
		||||
                return filterMatching(languages, typedText);
 | 
			
		||||
                return filterMatchingStartsWith(languages, typedText);
 | 
			
		||||
            case GATE_FOLDER:
 | 
			
		||||
            case PORTAL_FOLDER:
 | 
			
		||||
            case DEFAULT_GATE_NETWORK:
 | 
			
		||||
@@ -94,12 +79,12 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
            case HIGHLIGHT_SIGN_COLOR:
 | 
			
		||||
            case FREE_GATES_COLOR:
 | 
			
		||||
                //Return all colors
 | 
			
		||||
                return filterMatching(chatColors, typedText);
 | 
			
		||||
                return filterMatchingStartsWith(chatColors, typedText);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //If the config value is a boolean, show the two boolean values
 | 
			
		||||
        if (selectedOption.getDataType() == OptionDataType.BOOLEAN) {
 | 
			
		||||
            return filterMatching(booleans, typedText);
 | 
			
		||||
            return filterMatchingStartsWith(booleans, typedText);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //If the config value is an integer, display some valid numbers
 | 
			
		||||
@@ -145,11 +130,11 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
     */
 | 
			
		||||
    private List<String> getPerSignColorCompletion(String[] args) {
 | 
			
		||||
        if (args.length < 3) {
 | 
			
		||||
            return filterMatching(signTypes, args[1]);
 | 
			
		||||
            return filterMatchingStartsWith(signTypes, args[1]);
 | 
			
		||||
        } else if (args.length < 4) {
 | 
			
		||||
            return filterMatching(extendedColors, args[2]);
 | 
			
		||||
            return filterMatchingStartsWith(extendedColors, args[2]);
 | 
			
		||||
        } else if (args.length < 5) {
 | 
			
		||||
            return filterMatching(extendedColors, args[3]);
 | 
			
		||||
            return filterMatchingStartsWith(extendedColors, args[3]);
 | 
			
		||||
        }
 | 
			
		||||
        return new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
@@ -217,22 +202,10 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
     */
 | 
			
		||||
    private List<ChatColor> getChatColors() {
 | 
			
		||||
        List<ChatColor> chatColors = new ArrayList<>();
 | 
			
		||||
        chatColors.add(ChatColor.WHITE);
 | 
			
		||||
        chatColors.add(ChatColor.BLUE);
 | 
			
		||||
        chatColors.add(ChatColor.DARK_BLUE);
 | 
			
		||||
        chatColors.add(ChatColor.DARK_PURPLE);
 | 
			
		||||
        chatColors.add(ChatColor.LIGHT_PURPLE);
 | 
			
		||||
        chatColors.add(ChatColor.GOLD);
 | 
			
		||||
        chatColors.add(ChatColor.GREEN);
 | 
			
		||||
        chatColors.add(ChatColor.BLACK);
 | 
			
		||||
        chatColors.add(ChatColor.DARK_GREEN);
 | 
			
		||||
        chatColors.add(ChatColor.DARK_RED);
 | 
			
		||||
        chatColors.add(ChatColor.RED);
 | 
			
		||||
        chatColors.add(ChatColor.AQUA);
 | 
			
		||||
        chatColors.add(ChatColor.DARK_AQUA);
 | 
			
		||||
        chatColors.add(ChatColor.DARK_GRAY);
 | 
			
		||||
        chatColors.add(ChatColor.GRAY);
 | 
			
		||||
        chatColors.add(ChatColor.YELLOW);
 | 
			
		||||
        char[] colors = new char[]{'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
 | 
			
		||||
        for (char color : colors) {
 | 
			
		||||
            chatColors.add(ChatColor.getByChar(color));
 | 
			
		||||
        }
 | 
			
		||||
        chatColors.add(ChatColor.of("#ed76d9"));
 | 
			
		||||
        chatColors.add(ChatColor.of("#ffecb7"));
 | 
			
		||||
        return chatColors;
 | 
			
		||||
@@ -249,11 +222,13 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
        languages.add("fr");
 | 
			
		||||
        languages.add("hu");
 | 
			
		||||
        languages.add("it");
 | 
			
		||||
        languages.add("ja");
 | 
			
		||||
        languages.add("nb-no");
 | 
			
		||||
        languages.add("nl");
 | 
			
		||||
        languages.add("nn-no");
 | 
			
		||||
        languages.add("pt-br");
 | 
			
		||||
        languages.add("ru");
 | 
			
		||||
        languages.add("zh_cn");
 | 
			
		||||
        //TODO: Generate this list dynamically by listing the language files in the jar and adding the user's custom 
 | 
			
		||||
        // language files
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package net.knarcraft.stargate.command;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.lang.ArrayUtils;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.command.TabCompleter;
 | 
			
		||||
@@ -9,6 +8,7 @@ import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -29,7 +29,7 @@ public class StarGateTabCompleter implements TabCompleter {
 | 
			
		||||
            }
 | 
			
		||||
            return matchingCommands;
 | 
			
		||||
        } else if (args.length > 1 && args[0].equalsIgnoreCase("config")) {
 | 
			
		||||
            String[] subArgs = (String[]) ArrayUtils.remove(args, 0);
 | 
			
		||||
            String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
 | 
			
		||||
            return new ConfigTabCompleter().onTabComplete(commandSender, command, s, subArgs);
 | 
			
		||||
        } else {
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ public enum ConfigOption {
 | 
			
		||||
     */
 | 
			
		||||
    WAIT_FOR_PLAYER_AFTER_TELEPORT_DELAY("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.", 1),
 | 
			
		||||
                    "a value of 6 is required to avoid client glitches after teleporting on a vehicle.", 6),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether to enable economy support for taking payment from players creating/destroying/using stargates
 | 
			
		||||
@@ -178,7 +178,18 @@ public enum ConfigOption {
 | 
			
		||||
    /**
 | 
			
		||||
     * The velocity of players exiting a stargate, relative to the entry velocity
 | 
			
		||||
     */
 | 
			
		||||
    EXIT_VELOCITY("gates.exitVelocity", "The velocity of players exiting stargates, relative to the entry velocity", 0.1D);
 | 
			
		||||
    EXIT_VELOCITY("gates.exitVelocity", "The velocity of players exiting stargates, relative to the entry velocity", 0.1D),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether to enable showing Stargates in Dynmap
 | 
			
		||||
     */
 | 
			
		||||
    ENABLE_DYNMAP("dynmap.enableDynmap", "Whether to display Stargates in Dynmap's map", true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether to hide Dynmap icons by default
 | 
			
		||||
     */
 | 
			
		||||
    DYNMAP_ICONS_DEFAULT_HIDDEN("dynmap.dynmapIconsHiddenByDefault",
 | 
			
		||||
            "Whether to hide Stargate's Dynmap icons by default, requiring the user to enable them.", true);
 | 
			
		||||
 | 
			
		||||
    private final String configNode;
 | 
			
		||||
    private final String description;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,8 @@ 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});
 | 
			
		||||
    FOLDER(new ConfigOption[]{ConfigOption.GATE_FOLDER, ConfigOption.PORTAL_FOLDER}),
 | 
			
		||||
    DYNMAP(new ConfigOption[]{ConfigOption.ENABLE_DYNMAP, ConfigOption.DYNMAP_ICONS_DEFAULT_HIDDEN});
 | 
			
		||||
 | 
			
		||||
    private final ConfigOption[] taggedOptions;
 | 
			
		||||
 | 
			
		||||
@@ -52,6 +53,16 @@ public enum ConfigTag {
 | 
			
		||||
        return FOLDER.isTagged(option);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks whether a given config option requires a re-load of all Dynmap markers
 | 
			
		||||
     *
 | 
			
		||||
     * @param configOption <p>The config option to check</p>
 | 
			
		||||
     * @return <p>True if changing the config option requires a reload of all dynmap markers</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean requiresDynmapReload(ConfigOption configOption) {
 | 
			
		||||
        return DYNMAP.isTagged(configOption);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks whether a given config option requires a portal reload to take effect
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										134
									
								
								src/main/java/net/knarcraft/stargate/config/DynmapManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								src/main/java/net/knarcraft/stargate/config/DynmapManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
			
		||||
package net.knarcraft.stargate.config;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.portal.Portal;
 | 
			
		||||
import net.knarcraft.stargate.portal.PortalRegistry;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
import org.dynmap.DynmapAPI;
 | 
			
		||||
import org.dynmap.markers.GenericMarker;
 | 
			
		||||
import org.dynmap.markers.Marker;
 | 
			
		||||
import org.dynmap.markers.MarkerIcon;
 | 
			
		||||
import org.dynmap.markers.MarkerSet;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A manager for dealing with everything Dynmap
 | 
			
		||||
 */
 | 
			
		||||
public final class DynmapManager {
 | 
			
		||||
 | 
			
		||||
    private static MarkerSet markerSet;
 | 
			
		||||
    private static MarkerIcon portalIcon;
 | 
			
		||||
 | 
			
		||||
    private DynmapManager() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the dynmap manager
 | 
			
		||||
     *
 | 
			
		||||
     * @param dynmapAPI <p>A reference</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static void initialize(DynmapAPI dynmapAPI) {
 | 
			
		||||
        if (dynmapAPI == null || dynmapAPI.getMarkerAPI() == null) {
 | 
			
		||||
            markerSet = null;
 | 
			
		||||
            portalIcon = null;
 | 
			
		||||
        } else {
 | 
			
		||||
            markerSet = dynmapAPI.getMarkerAPI().createMarkerSet("stargate", "Stargate", null, false);
 | 
			
		||||
            if (markerSet != null) {
 | 
			
		||||
                markerSet.setHideByDefault(Stargate.getStargateConfig().hideDynmapIcons());
 | 
			
		||||
            }
 | 
			
		||||
            portalIcon = dynmapAPI.getMarkerAPI().getMarkerIcon("portal");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds all portal markers for all current portals
 | 
			
		||||
     */
 | 
			
		||||
    public static void addAllPortalMarkers() {
 | 
			
		||||
        if (markerSet == null || Stargate.getStargateConfig().isDynmapDisabled()) {
 | 
			
		||||
            //Remove any existing markers if dynmap has been disabled after startup
 | 
			
		||||
            if (markerSet != null) {
 | 
			
		||||
                markerSet.getMarkers().forEach(GenericMarker::deleteMarker);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        markerSet.setHideByDefault(Stargate.getStargateConfig().hideDynmapIcons());
 | 
			
		||||
        //Remove all existing markers for a clean start
 | 
			
		||||
        markerSet.getMarkers().forEach(GenericMarker::deleteMarker);
 | 
			
		||||
 | 
			
		||||
        for (Portal portal : PortalRegistry.getAllPortals()) {
 | 
			
		||||
            addPortalMarker(portal);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds a portal marker for the given portal
 | 
			
		||||
     *
 | 
			
		||||
     * @param portal <p>The portal to add a marker for</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static void addPortalMarker(Portal portal) {
 | 
			
		||||
        if (markerSet == null || Stargate.getStargateConfig().isDynmapDisabled()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        World world = portal.getWorld();
 | 
			
		||||
        if (portal.getOptions().isHidden() || world == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Location location = portal.getBlockAt(portal.getGate().getLayout().getExit());
 | 
			
		||||
        Marker marker = markerSet.createMarker(getPortalMarkerId(portal), portal.getName(), world.getName(),
 | 
			
		||||
                location.getX(), location.getY(), location.getZ(), portalIcon, false);
 | 
			
		||||
        if (marker == null) {
 | 
			
		||||
            Stargate.logWarning(String.format(
 | 
			
		||||
                    """
 | 
			
		||||
                            Unable to create marker for portal
 | 
			
		||||
                            Portal marker id: %s
 | 
			
		||||
                            Portal name: %s
 | 
			
		||||
                            Portal world: %s
 | 
			
		||||
                            Portal location: %s,%s,%s""",
 | 
			
		||||
                    getPortalMarkerId(portal), portal.getName(), world.getName(), location.getX(), location.getY(),
 | 
			
		||||
                    location.getZ()));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        String networkPrompt;
 | 
			
		||||
        if (portal.getOptions().isBungee()) {
 | 
			
		||||
            networkPrompt = "Server";
 | 
			
		||||
        } else {
 | 
			
		||||
            networkPrompt = "Network";
 | 
			
		||||
        }
 | 
			
		||||
        String markerDescription = String.format("<b>Name:</b> %s<br /><b>%s:</b> %s<br /><b>Destination:</b> " +
 | 
			
		||||
                        "%s<br /><b>Owner:</b> %s<br />", portal.getName(), networkPrompt, portal.getNetwork(),
 | 
			
		||||
                portal.getDestinationName(), portal.getOwner().getName());
 | 
			
		||||
        marker.setDescription(markerDescription);
 | 
			
		||||
        marker.setLabel(portal.getName(), true);
 | 
			
		||||
        if (portalIcon != null) {
 | 
			
		||||
            marker.setMarkerIcon(portalIcon);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the portal marker for the given portal
 | 
			
		||||
     *
 | 
			
		||||
     * @param portal <p>The portal to remove the marker for</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static void removePortalMarker(Portal portal) {
 | 
			
		||||
        if (markerSet == null || Stargate.getStargateConfig().isDynmapDisabled()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        Marker marker = markerSet.findMarker(getPortalMarkerId(portal));
 | 
			
		||||
        if (marker != null) {
 | 
			
		||||
            marker.deleteMarker();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the id used for the given portal's marker
 | 
			
		||||
     *
 | 
			
		||||
     * @param portal <p>The portal to get a marker id for</p>
 | 
			
		||||
     * @return <p></p>
 | 
			
		||||
     */
 | 
			
		||||
    private static String getPortalMarkerId(Portal portal) {
 | 
			
		||||
        return portal.getNetwork() + "-:-" + portal.getName();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
package net.knarcraft.stargate.config;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.property.ColorConversion;
 | 
			
		||||
import net.knarcraft.knarlib.util.FileHelper;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.utility.FileHelper;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.BufferedWriter;
 | 
			
		||||
@@ -136,7 +137,8 @@ public final class LanguageLoader {
 | 
			
		||||
            String> currentLanguageValues) throws IOException {
 | 
			
		||||
        //Get language values
 | 
			
		||||
        BufferedReader bufferedReader = FileHelper.getBufferedReaderFromInputStream(inputStream);
 | 
			
		||||
        Map<String, String> internalLanguageValues = FileHelper.readKeyValuePairs(bufferedReader);
 | 
			
		||||
        Map<String, String> internalLanguageValues = FileHelper.readKeyValuePairs(bufferedReader, "=",
 | 
			
		||||
                ColorConversion.NORMAL);
 | 
			
		||||
 | 
			
		||||
        //If currentLanguageValues is null; the chosen language has not been used before
 | 
			
		||||
        if (currentLanguageValues == null) {
 | 
			
		||||
@@ -221,7 +223,7 @@ public final class LanguageLoader {
 | 
			
		||||
            } else {
 | 
			
		||||
                bufferedReader = FileHelper.getBufferedReaderFromInputStream(inputStream);
 | 
			
		||||
            }
 | 
			
		||||
            strings = FileHelper.readKeyValuePairs(bufferedReader);
 | 
			
		||||
            strings = FileHelper.readKeyValuePairs(bufferedReader, "=", ColorConversion.NORMAL);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            if (Stargate.getStargateConfig().isDebuggingEnabled()) {
 | 
			
		||||
                Stargate.getConsoleLogger().info("[Stargate] Unable to load language " + lang);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package net.knarcraft.stargate.config;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.property.ColorConversion;
 | 
			
		||||
import net.knarcraft.knarlib.util.FileHelper;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.container.BlockChangeRequest;
 | 
			
		||||
import net.knarcraft.stargate.listener.BungeeCordListener;
 | 
			
		||||
@@ -8,13 +10,13 @@ import net.knarcraft.stargate.portal.PortalHandler;
 | 
			
		||||
import net.knarcraft.stargate.portal.PortalRegistry;
 | 
			
		||||
import net.knarcraft.stargate.portal.property.gate.GateHandler;
 | 
			
		||||
import net.knarcraft.stargate.thread.BlockChangeThread;
 | 
			
		||||
import net.knarcraft.stargate.utility.FileHelper;
 | 
			
		||||
import net.knarcraft.stargate.utility.PortalFileHelper;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.configuration.file.FileConfiguration;
 | 
			
		||||
import org.bukkit.plugin.messaging.Messenger;
 | 
			
		||||
import org.dynmap.DynmapAPI;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -101,6 +103,11 @@ public final class StargateConfig {
 | 
			
		||||
 | 
			
		||||
        //Set up vault economy if vault has been loaded
 | 
			
		||||
        setupVaultEconomy();
 | 
			
		||||
        DynmapAPI dynmapAPI = (DynmapAPI) Bukkit.getPluginManager().getPlugin("dynmap");
 | 
			
		||||
        if (dynmapAPI != null) {
 | 
			
		||||
            DynmapManager.initialize(dynmapAPI);
 | 
			
		||||
            DynmapManager.addAllPortalMarkers();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -152,6 +159,24 @@ public final class StargateConfig {
 | 
			
		||||
        return (boolean) configOptions.get(ConfigOption.PERMISSION_DEBUG);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets whether Dynmap integration is disabled
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>Whether Dynmap integration is disabled</p>
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isDynmapDisabled() {
 | 
			
		||||
        return !((boolean) configOptions.get(ConfigOption.ENABLE_DYNMAP));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets whether Dynmap icons should be hidden by default
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>Whether Dynmap icons should be hidden by default</p>
 | 
			
		||||
     */
 | 
			
		||||
    public boolean hideDynmapIcons() {
 | 
			
		||||
        return (boolean) configOptions.get(ConfigOption.DYNMAP_ICONS_DEFAULT_HIDDEN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the object containing economy config values
 | 
			
		||||
     *
 | 
			
		||||
@@ -189,6 +214,9 @@ public final class StargateConfig {
 | 
			
		||||
            startStopBungeeListener(stargateGateConfig.enableBungee());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Reload portal markers
 | 
			
		||||
        DynmapManager.addAllPortalMarkers();
 | 
			
		||||
 | 
			
		||||
        messageSender.sendErrorMessage(sender, languageLoader.getString("reloaded"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -421,7 +449,8 @@ public final class StargateConfig {
 | 
			
		||||
        Map<String, String> migrationFields;
 | 
			
		||||
        try {
 | 
			
		||||
            migrationFields = FileHelper.readKeyValuePairs(FileHelper.getBufferedReaderFromInputStream(
 | 
			
		||||
                    FileHelper.getInputStreamForInternalFile("/config-migrations.txt")));
 | 
			
		||||
                            FileHelper.getInputStreamForInternalFile("/config-migrations.txt")), "=",
 | 
			
		||||
                    ColorConversion.NORMAL);
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            Stargate.debug("Stargate::migrateConfig", "Unable to load config migration file");
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
@@ -520,4 +549,5 @@ public final class StargateConfig {
 | 
			
		||||
    public LanguageLoader getLanguageLoader() {
 | 
			
		||||
        return languageLoader;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package net.knarcraft.stargate.config;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.util.ColorHelper;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.portal.PortalSignDrawer;
 | 
			
		||||
import net.knarcraft.stargate.utility.ColorHelper;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.bukkit.Color;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
@@ -16,6 +16,7 @@ import java.util.Map;
 | 
			
		||||
 * The Stargate gate config keeps track of all global config values related to gates
 | 
			
		||||
 */
 | 
			
		||||
public final class StargateGateConfig {
 | 
			
		||||
 | 
			
		||||
    private static final int activeTime = 10;
 | 
			
		||||
    private static final int openTime = 10;
 | 
			
		||||
    private final Map<ConfigOption, Object> configOptions;
 | 
			
		||||
@@ -142,6 +143,9 @@ public final class StargateGateConfig {
 | 
			
		||||
     * @return <p>The delay to use before adding a player as passenger of a teleported vehicle</p>
 | 
			
		||||
     */
 | 
			
		||||
    public int waitForPlayerAfterTeleportDelay() {
 | 
			
		||||
        if ((int) configOptions.get(ConfigOption.WAIT_FOR_PLAYER_AFTER_TELEPORT_DELAY) < 2) {
 | 
			
		||||
            configOptions.put(ConfigOption.WAIT_FOR_PLAYER_AFTER_TELEPORT_DELAY, 6);
 | 
			
		||||
        }
 | 
			
		||||
        return (int) configOptions.get(ConfigOption.WAIT_FOR_PLAYER_AFTER_TELEPORT_DELAY);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -320,4 +324,5 @@ public final class StargateGateConfig {
 | 
			
		||||
            PortalSignDrawer.setHighlightColor(ChatColor.WHITE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package net.knarcraft.stargate.container;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This stores a block location as a vector relative to a position
 | 
			
		||||
 *
 | 
			
		||||
@@ -58,16 +60,20 @@ public class RelativeBlockVector {
 | 
			
		||||
     * @return <p>A new relative block vector with the property altered</p>
 | 
			
		||||
     */
 | 
			
		||||
    public RelativeBlockVector addToVector(Property propertyToAddTo, int valueToAdd) {
 | 
			
		||||
        switch (propertyToAddTo) {
 | 
			
		||||
            case RIGHT:
 | 
			
		||||
                return new RelativeBlockVector(this.right + valueToAdd, this.down, this.out);
 | 
			
		||||
            case DOWN:
 | 
			
		||||
                return new RelativeBlockVector(this.right, this.down + valueToAdd, this.out);
 | 
			
		||||
            case OUT:
 | 
			
		||||
                return new RelativeBlockVector(this.right, this.down, this.out + valueToAdd);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new IllegalArgumentException("Invalid relative block vector property given");
 | 
			
		||||
        return switch (propertyToAddTo) {
 | 
			
		||||
            case RIGHT -> new RelativeBlockVector(this.right + valueToAdd, this.down, this.out);
 | 
			
		||||
            case DOWN -> new RelativeBlockVector(this.right, this.down + valueToAdd, this.out);
 | 
			
		||||
            case OUT -> new RelativeBlockVector(this.right, this.down, this.out + valueToAdd);
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a relative vector in the real space representing this relative block vector
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>A vector representing this relative block vector</p>
 | 
			
		||||
     */
 | 
			
		||||
    public Vector toVector() {
 | 
			
		||||
        return new Vector(this.right, -this.down, this.out);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package net.knarcraft.stargate.container;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.stargate.utility.ColorHelper;
 | 
			
		||||
import net.knarcraft.knarlib.util.ColorHelper;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.bukkit.DyeColor;
 | 
			
		||||
import org.bukkit.block.Sign;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package net.knarcraft.stargate.listener;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.util.UpdateChecker;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.config.MessageSender;
 | 
			
		||||
import net.knarcraft.stargate.container.BlockLocation;
 | 
			
		||||
@@ -13,10 +14,10 @@ import net.knarcraft.stargate.utility.MaterialHelper;
 | 
			
		||||
import net.knarcraft.stargate.utility.PermissionHelper;
 | 
			
		||||
import net.knarcraft.stargate.utility.TeleportHelper;
 | 
			
		||||
import net.knarcraft.stargate.utility.UUIDMigrationHelper;
 | 
			
		||||
import net.knarcraft.stargate.utility.UpdateChecker;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.GameMode;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.block.data.type.WallSign;
 | 
			
		||||
import org.bukkit.entity.AbstractHorse;
 | 
			
		||||
@@ -33,6 +34,7 @@ import org.bukkit.event.player.PlayerJoinEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerMoveEvent;
 | 
			
		||||
import org.bukkit.inventory.EquipmentSlot;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
@@ -103,6 +105,11 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        Portal entrancePortal = PortalHandler.getByEntrance(toLocation);
 | 
			
		||||
        //Check an additional block away in case the portal is a bungee portal using END_PORTAL
 | 
			
		||||
        if (entrancePortal == null) {
 | 
			
		||||
            entrancePortal = PortalHandler.getByAdjacentEntrance(toLocation);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Portal destination = entrancePortal.getPortalActivator().getDestination(player);
 | 
			
		||||
 | 
			
		||||
        Entity playerVehicle = player.getVehicle();
 | 
			
		||||
@@ -131,6 +138,7 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
                horse.setOwner(player);
 | 
			
		||||
            }
 | 
			
		||||
            //Teleport the player's vehicle
 | 
			
		||||
            player.setVelocity(new Vector());
 | 
			
		||||
            new VehicleTeleporter(destination, (Vehicle) playerVehicle).teleportEntity(entrancePortal);
 | 
			
		||||
        } else {
 | 
			
		||||
            //Just teleport the player like normal
 | 
			
		||||
@@ -161,8 +169,13 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
        //Check if the player moved from a portal
 | 
			
		||||
        Portal entrancePortal = PortalHandler.getByEntrance(toLocation);
 | 
			
		||||
        if (entrancePortal == null) {
 | 
			
		||||
            //Check an additional block away for BungeeCord portals using END_PORTAL as its material
 | 
			
		||||
            entrancePortal = PortalHandler.getByAdjacentEntrance(toLocation);
 | 
			
		||||
            if (entrancePortal == null || !entrancePortal.getOptions().isBungee() ||
 | 
			
		||||
                    entrancePortal.getGate().getPortalOpenBlock() != Material.END_PORTAL) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Portal destination = entrancePortal.getPortalActivator().getDestination(player);
 | 
			
		||||
 | 
			
		||||
@@ -228,13 +241,16 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
        EquipmentSlot hand = event.getHand();
 | 
			
		||||
        if (hand != null && (PermissionHelper.hasPermission(player, "stargate.admin.dye") ||
 | 
			
		||||
                portal.isOwner(player))) {
 | 
			
		||||
            String itemName = player.getInventory().getItem(hand).getType().toString();
 | 
			
		||||
            ItemStack item = player.getInventory().getItem(hand);
 | 
			
		||||
            if (item != null) {
 | 
			
		||||
                String itemName = item.getType().toString();
 | 
			
		||||
                if (itemName.endsWith("DYE") || itemName.endsWith("INK_SAC")) {
 | 
			
		||||
                    event.setUseInteractedBlock(Event.Result.ALLOW);
 | 
			
		||||
                    Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), portal::drawSign, 1);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        event.setUseInteractedBlock(Event.Result.DENY);
 | 
			
		||||
        if (leftClick) {
 | 
			
		||||
@@ -323,7 +339,7 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
        } else {
 | 
			
		||||
            //Display information about the portal if it has no sign
 | 
			
		||||
            ItemStack heldItem = player.getInventory().getItem(hand);
 | 
			
		||||
            if (heldItem.getType().isAir() || !heldItem.getType().isBlock()) {
 | 
			
		||||
            if (heldItem != null && (heldItem.getType().isAir() || !heldItem.getType().isBlock())) {
 | 
			
		||||
                displayPortalInfo(block, player);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -49,4 +49,5 @@ public class PluginEventListener implements Listener {
 | 
			
		||||
            Stargate.logInfo("Vault plugin lost.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import net.knarcraft.stargate.portal.Portal;
 | 
			
		||||
import net.knarcraft.stargate.portal.PortalHandler;
 | 
			
		||||
import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter;
 | 
			
		||||
import net.knarcraft.stargate.utility.PermissionHelper;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
@@ -67,14 +68,23 @@ public class PortalEventListener implements Listener {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Stargate.debug("PortalEventListener::onEntityPortalEnter",
 | 
			
		||||
                    "Found player " + player + " entering END_PORTAL " + portal);
 | 
			
		||||
 | 
			
		||||
            //Remove any old player teleportations in case weird things happen
 | 
			
		||||
            playersFromTheEnd.removeIf((teleportation -> teleportation.getPlayer() == player));
 | 
			
		||||
            //Decide if the anything stops the player from teleporting
 | 
			
		||||
            if (PermissionHelper.playerCannotTeleport(portal, portal.getPortalActivator().getDestination(), player, null)) {
 | 
			
		||||
            if (PermissionHelper.playerCannotTeleport(portal, portal.getPortalActivator().getDestination(), player, null) ||
 | 
			
		||||
                    portal.getOptions().isBungee()) {
 | 
			
		||||
                //Teleport the player back to the portal they came in, just in case
 | 
			
		||||
                playersFromTheEnd.add(new FromTheEndTeleportation(player, portal));
 | 
			
		||||
            }
 | 
			
		||||
                Stargate.debug("PortalEventListener::onEntityPortalEnter",
 | 
			
		||||
                        "Sending player back to the entrance");
 | 
			
		||||
            } else {
 | 
			
		||||
                playersFromTheEnd.add(new FromTheEndTeleportation(player, portal.getPortalActivator().getDestination()));
 | 
			
		||||
                Stargate.debug("PortalEventListener::onEntityPortalEnter",
 | 
			
		||||
                        "Sending player to destination");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -95,9 +105,18 @@ public class PortalEventListener implements Listener {
 | 
			
		||||
 | 
			
		||||
        Portal exitPortal = teleportation.getExit();
 | 
			
		||||
        //Overwrite respawn location to respawn in front of the portal
 | 
			
		||||
        event.setRespawnLocation(new PlayerTeleporter(exitPortal, respawningPlayer).getExit());
 | 
			
		||||
        PlayerTeleporter teleporter = new PlayerTeleporter(exitPortal, respawningPlayer);
 | 
			
		||||
        Location respawnLocation = teleporter.getExit();
 | 
			
		||||
        event.setRespawnLocation(respawnLocation);
 | 
			
		||||
        //Try and force the player if for some reason the changing of respawn location isn't properly handled
 | 
			
		||||
        Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () ->
 | 
			
		||||
                respawningPlayer.teleport(respawnLocation), 1);
 | 
			
		||||
 | 
			
		||||
        //Properly close the portal to prevent it from staying in a locked state until it times out
 | 
			
		||||
        exitPortal.getPortalOpener().closePortal(false);
 | 
			
		||||
 | 
			
		||||
        Stargate.debug("PortalEventListener::onRespawn", "Overwriting respawn for " + respawningPlayer +
 | 
			
		||||
                " to " + respawnLocation.getWorld() + ":" + respawnLocation);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,4 +46,5 @@ public class WorldEventListener implements Listener {
 | 
			
		||||
            PortalRegistry.clearPortals(world);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package net.knarcraft.stargate.portal;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.stargate.SimpleVectorOperation;
 | 
			
		||||
import net.knarcraft.stargate.container.BlockLocation;
 | 
			
		||||
import net.knarcraft.stargate.container.RelativeBlockVector;
 | 
			
		||||
import net.knarcraft.stargate.portal.property.PortalLocation;
 | 
			
		||||
@@ -8,6 +9,7 @@ import net.knarcraft.stargate.portal.property.PortalOptions;
 | 
			
		||||
import net.knarcraft.stargate.portal.property.PortalOwner;
 | 
			
		||||
import net.knarcraft.stargate.portal.property.PortalStructure;
 | 
			
		||||
import net.knarcraft.stargate.portal.property.gate.Gate;
 | 
			
		||||
import net.knarcraft.stargate.utility.DirectionHelper;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
@@ -23,6 +25,7 @@ public class Portal {
 | 
			
		||||
    private final String cleanName;
 | 
			
		||||
    private final String network;
 | 
			
		||||
    private final String cleanNetwork;
 | 
			
		||||
    private final SimpleVectorOperation vectorOperation;
 | 
			
		||||
 | 
			
		||||
    private final PortalOwner portalOwner;
 | 
			
		||||
    private boolean isRegistered;
 | 
			
		||||
@@ -59,6 +62,7 @@ public class Portal {
 | 
			
		||||
        this.portalActivator = portalOpener.getPortalActivator();
 | 
			
		||||
        this.cleanName = cleanString(name);
 | 
			
		||||
        this.cleanNetwork = cleanString(network);
 | 
			
		||||
        this.vectorOperation = new SimpleVectorOperation(DirectionHelper.getBlockFaceFromYaw(portalLocation.getYaw()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -294,7 +298,7 @@ public class Portal {
 | 
			
		||||
     * @return <p>The block at the given relative position</p>
 | 
			
		||||
     */
 | 
			
		||||
    public BlockLocation getBlockAt(RelativeBlockVector vector) {
 | 
			
		||||
        return getTopLeft().getRelativeLocation(vector, getYaw());
 | 
			
		||||
        return (BlockLocation) getTopLeft().clone().add(vectorOperation.performToRealSpaceOperation(vector.toVector()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -345,4 +349,5 @@ public class Portal {
 | 
			
		||||
            return cleanNetwork.equalsIgnoreCase(other.cleanNetwork);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -448,4 +448,5 @@ public class PortalHandler {
 | 
			
		||||
        }
 | 
			
		||||
        return input.replaceAll("[|:#]", "").trim();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package net.knarcraft.stargate.portal;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.config.DynmapManager;
 | 
			
		||||
import net.knarcraft.stargate.container.BlockLocation;
 | 
			
		||||
import net.knarcraft.stargate.utility.PortalFileHelper;
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
@@ -224,6 +225,7 @@ public class PortalRegistry {
 | 
			
		||||
 | 
			
		||||
        PortalFileHelper.saveAllPortals(portal.getWorld());
 | 
			
		||||
        portal.setRegistered(false);
 | 
			
		||||
        DynmapManager.removePortalMarker(portal);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -289,6 +291,7 @@ public class PortalRegistry {
 | 
			
		||||
 | 
			
		||||
        allPortals.add(portal);
 | 
			
		||||
        portal.setRegistered(true);
 | 
			
		||||
        DynmapManager.addPortalMarker(portal);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package net.knarcraft.stargate.portal;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.property.ColorConversion;
 | 
			
		||||
import net.knarcraft.knarlib.util.ColorHelper;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.container.SignData;
 | 
			
		||||
import net.knarcraft.stargate.portal.property.PortalLocation;
 | 
			
		||||
@@ -12,8 +14,6 @@ import org.bukkit.block.Sign;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static net.knarcraft.stargate.utility.ColorHelper.translateAllColorCodes;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The portal sign drawer draws the sing of a given portal
 | 
			
		||||
 */
 | 
			
		||||
@@ -393,4 +393,14 @@ public class PortalSignDrawer {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Translates all normal and RGB color codes in the given input
 | 
			
		||||
     *
 | 
			
		||||
     * @param input <p>The input to translate color codes for</p>
 | 
			
		||||
     * @return <p>The input with color codes converted translated from & to §</p>
 | 
			
		||||
     */
 | 
			
		||||
    private String translateAllColorCodes(String input) {
 | 
			
		||||
        return ColorHelper.translateColorCodes(input, ColorConversion.RGB);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,10 @@ public class PlayerTeleporter extends Teleporter {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Calculate the exit velocity of the player
 | 
			
		||||
        Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw());
 | 
			
		||||
        Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity());
 | 
			
		||||
 | 
			
		||||
        //Load chunks to make sure not to teleport to the void
 | 
			
		||||
        loadChunks();
 | 
			
		||||
 | 
			
		||||
@@ -56,7 +60,7 @@ public class PlayerTeleporter extends Teleporter {
 | 
			
		||||
        TeleportHelper.teleportLeashedCreatures(player, origin, portal);
 | 
			
		||||
 | 
			
		||||
        if (player.eject()) {
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, player, origin, portal, exit.getDirection());
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, player, origin, portal, exit.getDirection(), newVelocity);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //If no event is passed in, assume it's a teleport, and act as such
 | 
			
		||||
@@ -68,11 +72,7 @@ public class PlayerTeleporter extends Teleporter {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Set the velocity of the teleported player after the teleportation is finished
 | 
			
		||||
        Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
 | 
			
		||||
            Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw());
 | 
			
		||||
            Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity());
 | 
			
		||||
            player.setVelocity(newVelocity);
 | 
			
		||||
        }, 1);
 | 
			
		||||
        Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> player.setVelocity(newVelocity), 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ import org.bukkit.entity.AbstractHorse;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.event.Event;
 | 
			
		||||
import org.bukkit.scheduler.BukkitScheduler;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -83,7 +84,8 @@ public abstract class Teleporter {
 | 
			
		||||
        loadChunks();
 | 
			
		||||
 | 
			
		||||
        if (teleportedEntity.eject()) {
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, teleportedEntity, origin, portal, exit.getDirection());
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, teleportedEntity, origin, portal, exit.getDirection(),
 | 
			
		||||
                    new Vector());
 | 
			
		||||
        }
 | 
			
		||||
        teleportedEntity.teleport(exit);
 | 
			
		||||
        return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import org.bukkit.entity.Boat;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.entity.LivingEntity;
 | 
			
		||||
import org.bukkit.entity.Vehicle;
 | 
			
		||||
import org.bukkit.event.player.PlayerTeleportEvent;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -57,7 +58,10 @@ public class VehicleTeleporter extends EntityTeleporter {
 | 
			
		||||
        Vector newVelocity = newVelocityDirection.multiply(velocity);
 | 
			
		||||
 | 
			
		||||
        //Call the StargateEntityPortalEvent to allow plugins to change destination
 | 
			
		||||
        triggerPortalEvent(origin, new StargateEntityPortalEvent(teleportingVehicle, origin, portal, exit));
 | 
			
		||||
        exit = triggerPortalEvent(origin, new StargateEntityPortalEvent(teleportingVehicle, origin, portal, exit));
 | 
			
		||||
        if (exit == null) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Teleport the vehicle
 | 
			
		||||
        return teleportVehicle(exit, newVelocity, origin);
 | 
			
		||||
@@ -129,11 +133,18 @@ public class VehicleTeleporter extends EntityTeleporter {
 | 
			
		||||
     */
 | 
			
		||||
    private void teleportVehicle(List<Entity> passengers, Location exit, Vector newVelocity, Portal origin) {
 | 
			
		||||
        if (teleportingVehicle.eject()) {
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, teleportingVehicle, origin, portal, exit.getDirection());
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, teleportingVehicle, origin, portal, exit.getDirection(),
 | 
			
		||||
                    newVelocity);
 | 
			
		||||
        }
 | 
			
		||||
        teleportingVehicle.teleport(exit);
 | 
			
		||||
        Stargate.debug("VehicleTeleporter::teleportVehicle", "Teleporting " + teleportingVehicle +
 | 
			
		||||
                " to final location " + exit + " with direction " + exit.getDirection());
 | 
			
		||||
        teleportingVehicle.teleport(exit, PlayerTeleportEvent.TeleportCause.PLUGIN);
 | 
			
		||||
        scheduler.scheduleSyncDelayedTask(Stargate.getInstance(),
 | 
			
		||||
                () -> teleportingVehicle.setVelocity(newVelocity), 1);
 | 
			
		||||
                () -> {
 | 
			
		||||
                    Stargate.debug("VehicleTeleporter::teleportVehicle", "Setting velocity " + newVelocity +
 | 
			
		||||
                            " for vehicle " + teleportingVehicle);
 | 
			
		||||
                    teleportingVehicle.setVelocity(newVelocity);
 | 
			
		||||
                }, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -158,11 +169,12 @@ public class VehicleTeleporter extends EntityTeleporter {
 | 
			
		||||
        //Spawn a new vehicle
 | 
			
		||||
        Vehicle newVehicle = vehicleWorld.spawn(exit, teleportingVehicle.getClass());
 | 
			
		||||
        if (teleportingVehicle instanceof Boat boat) {
 | 
			
		||||
            ((Boat) newVehicle).setWoodType(boat.getWoodType());
 | 
			
		||||
            ((Boat) newVehicle).setBoatType(boat.getBoatType());
 | 
			
		||||
        }
 | 
			
		||||
        //Remove the old vehicle
 | 
			
		||||
        if (teleportingVehicle.eject()) {
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, newVehicle, origin, portal, exit.getDirection());
 | 
			
		||||
            TeleportHelper.handleEntityPassengers(passengers, newVehicle, origin, portal, exit.getDirection(),
 | 
			
		||||
                    newVelocity);
 | 
			
		||||
        }
 | 
			
		||||
        teleportingVehicle.remove();
 | 
			
		||||
        scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> newVehicle.setVelocity(newVelocity), 1);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,54 +0,0 @@
 | 
			
		||||
package net.knarcraft.stargate.utility;
 | 
			
		||||
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import org.bukkit.Color;
 | 
			
		||||
 | 
			
		||||
import java.util.regex.Matcher;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A helper class for dealing with colors
 | 
			
		||||
 */
 | 
			
		||||
public final class ColorHelper {
 | 
			
		||||
 | 
			
		||||
    private ColorHelper() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Inverts the given color
 | 
			
		||||
     *
 | 
			
		||||
     * @param color <p>The color to invert</p>
 | 
			
		||||
     * @return <p>The inverted color</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static Color invert(Color color) {
 | 
			
		||||
        return color.setRed(255 - color.getRed()).setGreen(255 - color.getGreen()).setBlue(255 - color.getBlue());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the chat color corresponding to the given color
 | 
			
		||||
     *
 | 
			
		||||
     * @param color <p>The color to convert into a chat color</p>
 | 
			
		||||
     * @return <p>The resulting chat color</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static ChatColor fromColor(Color color) {
 | 
			
		||||
        return ChatColor.of(String.format("#%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Translates all found color codes to formatting in a string
 | 
			
		||||
     *
 | 
			
		||||
     * @param message <p>The string to search for color codes</p>
 | 
			
		||||
     * @return <p>The message with color codes translated</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static String translateAllColorCodes(String message) {
 | 
			
		||||
        message = ChatColor.translateAlternateColorCodes('&', message);
 | 
			
		||||
        Pattern pattern = Pattern.compile("(#[a-fA-F0-9]{6})");
 | 
			
		||||
        Matcher matcher = pattern.matcher(message);
 | 
			
		||||
        while (matcher.find()) {
 | 
			
		||||
            message = message.replace(matcher.group(), "" + ChatColor.of(matcher.group()));
 | 
			
		||||
        }
 | 
			
		||||
        return message;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package net.knarcraft.stargate.utility;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.knarlib.formatting.StringFormatter;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.config.EconomyConfig;
 | 
			
		||||
import net.knarcraft.stargate.portal.Portal;
 | 
			
		||||
@@ -78,7 +79,7 @@ public final class EconomyHelper {
 | 
			
		||||
     */
 | 
			
		||||
    public static void sendObtainMessage(String portalName, Player portalOwner, int earnings) {
 | 
			
		||||
        String obtainedMsg = Stargate.getString("ecoObtain");
 | 
			
		||||
        obtainedMsg = replaceVars(obtainedMsg, portalName, earnings);
 | 
			
		||||
        obtainedMsg = replacePlaceholders(obtainedMsg, portalName, earnings);
 | 
			
		||||
        Stargate.getMessageSender().sendSuccessMessage(portalOwner, obtainedMsg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -91,7 +92,7 @@ public final class EconomyHelper {
 | 
			
		||||
     */
 | 
			
		||||
    public static void sendDeductMessage(String portalName, Player player, int cost) {
 | 
			
		||||
        String deductMsg = Stargate.getString("ecoDeduct");
 | 
			
		||||
        deductMsg = replaceVars(deductMsg, portalName, cost);
 | 
			
		||||
        deductMsg = replacePlaceholders(deductMsg, portalName, cost);
 | 
			
		||||
        Stargate.getMessageSender().sendSuccessMessage(player, deductMsg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +105,7 @@ public final class EconomyHelper {
 | 
			
		||||
     */
 | 
			
		||||
    public static void sendInsufficientFundsMessage(String portalName, Player player, int cost) {
 | 
			
		||||
        String inFundMsg = Stargate.getString("ecoInFunds");
 | 
			
		||||
        inFundMsg = replaceVars(inFundMsg, portalName, cost);
 | 
			
		||||
        inFundMsg = replacePlaceholders(inFundMsg, portalName, cost);
 | 
			
		||||
        Stargate.getMessageSender().sendErrorMessage(player, inFundMsg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -117,7 +118,7 @@ public final class EconomyHelper {
 | 
			
		||||
     */
 | 
			
		||||
    public static void sendRefundMessage(String portalName, Player player, int cost) {
 | 
			
		||||
        String refundMsg = Stargate.getString("ecoRefund");
 | 
			
		||||
        refundMsg = replaceVars(refundMsg, portalName, -cost);
 | 
			
		||||
        refundMsg = replacePlaceholders(refundMsg, portalName, -cost);
 | 
			
		||||
        Stargate.getMessageSender().sendSuccessMessage(player, refundMsg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -239,8 +240,8 @@ public final class EconomyHelper {
 | 
			
		||||
     * @param cost       <p>The cost for a given interaction</p>
 | 
			
		||||
     * @return <p>The same string with cost and portal variables replaced</p>
 | 
			
		||||
     */
 | 
			
		||||
    private static String replaceVars(String message, String portalName, int cost) {
 | 
			
		||||
        return Stargate.replaceVars(message, new String[]{"%cost%", "%portal%"},
 | 
			
		||||
    private static String replacePlaceholders(String message, String portalName, int cost) {
 | 
			
		||||
        return StringFormatter.replacePlaceholders(message, new String[]{"%cost%", "%portal%"},
 | 
			
		||||
                new String[]{Stargate.getEconomyConfig().format(cost), portalName});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,127 +0,0 @@
 | 
			
		||||
package net.knarcraft.stargate.utility;
 | 
			
		||||
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.BufferedWriter;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileNotFoundException;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.io.OutputStreamWriter;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper class for reading files
 | 
			
		||||
 */
 | 
			
		||||
public final class FileHelper {
 | 
			
		||||
 | 
			
		||||
    private FileHelper() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets an input stream from a string pointing to an internal file
 | 
			
		||||
     *
 | 
			
		||||
     * <p>This is used for getting an input stream for reading a file contained within the compiled .jar file. The file
 | 
			
		||||
     * should be in the resources directory, and the file path should start with a forward slash ("/") character.</p>
 | 
			
		||||
     *
 | 
			
		||||
     * @param file <p>The file to read</p>
 | 
			
		||||
     * @return <p>An input stream for the file</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static InputStream getInputStreamForInternalFile(String file) {
 | 
			
		||||
        return FileHelper.class.getResourceAsStream(file);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a buffered reader from a string pointing to a file
 | 
			
		||||
     *
 | 
			
		||||
     * @param file <p>The file to read</p>
 | 
			
		||||
     * @return <p>A buffered reader reading the file</p>
 | 
			
		||||
     * @throws FileNotFoundException <p>If the given file does not exist</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static BufferedReader getBufferedReaderFromString(String file) throws FileNotFoundException {
 | 
			
		||||
        FileInputStream fileInputStream = new FileInputStream(file);
 | 
			
		||||
        return getBufferedReaderFromInputStream(fileInputStream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a buffered reader given an input stream
 | 
			
		||||
     *
 | 
			
		||||
     * @param inputStream <p>The input stream to read</p>
 | 
			
		||||
     * @return <p>A buffered reader reading the input stream</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static BufferedReader getBufferedReaderFromInputStream(InputStream inputStream) {
 | 
			
		||||
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
 | 
			
		||||
        return new BufferedReader(inputStreamReader);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a buffered writer from a string pointing to a file
 | 
			
		||||
     *
 | 
			
		||||
     * @param file <p>The file to write to</p>
 | 
			
		||||
     * @return <p>A buffered writer writing to the file</p>
 | 
			
		||||
     * @throws FileNotFoundException <p>If the file does not exist</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static BufferedWriter getBufferedWriterFromString(String file) throws FileNotFoundException {
 | 
			
		||||
        FileOutputStream fileOutputStream = new FileOutputStream(file);
 | 
			
		||||
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
 | 
			
		||||
        return new BufferedWriter(outputStreamWriter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Reads key/value pairs from an input stream
 | 
			
		||||
     *
 | 
			
		||||
     * @param bufferedReader <p>The buffered reader to read</p>
 | 
			
		||||
     * @return <p>A map containing the read pairs</p>
 | 
			
		||||
     * @throws IOException <p>If unable to read from the stream</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static Map<String, String> readKeyValuePairs(BufferedReader bufferedReader) throws IOException {
 | 
			
		||||
        Map<String, String> readPairs = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        String line = bufferedReader.readLine();
 | 
			
		||||
        boolean firstLine = true;
 | 
			
		||||
        while (line != null) {
 | 
			
		||||
            //Strip UTF BOM from the first line
 | 
			
		||||
            if (firstLine) {
 | 
			
		||||
                line = removeUTF8BOM(line);
 | 
			
		||||
                firstLine = false;
 | 
			
		||||
            }
 | 
			
		||||
            //Split at first "="
 | 
			
		||||
            int equalSignIndex = line.indexOf('=');
 | 
			
		||||
            if (equalSignIndex == -1) {
 | 
			
		||||
                line = bufferedReader.readLine();
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //Read the line
 | 
			
		||||
            String key = line.substring(0, equalSignIndex);
 | 
			
		||||
            String value = ChatColor.translateAlternateColorCodes('&', line.substring(equalSignIndex + 1));
 | 
			
		||||
            readPairs.put(key, value);
 | 
			
		||||
 | 
			
		||||
            line = bufferedReader.readLine();
 | 
			
		||||
        }
 | 
			
		||||
        bufferedReader.close();
 | 
			
		||||
 | 
			
		||||
        return readPairs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the UTF-8 Byte Order Mark if present
 | 
			
		||||
     *
 | 
			
		||||
     * @param string <p>The string to remove the BOM from</p>
 | 
			
		||||
     * @return <p>A string guaranteed without a BOM</p>
 | 
			
		||||
     */
 | 
			
		||||
    private static String removeUTF8BOM(String string) {
 | 
			
		||||
        String UTF8_BOM = "\uFEFF";
 | 
			
		||||
        if (string.startsWith(UTF8_BOM)) {
 | 
			
		||||
            string = string.substring(1);
 | 
			
		||||
        }
 | 
			
		||||
        return string;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -4,6 +4,7 @@ import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.portal.Portal;
 | 
			
		||||
import net.knarcraft.stargate.portal.teleporter.EntityTeleporter;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.entity.Creature;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
@@ -78,14 +79,28 @@ public final class TeleportHelper {
 | 
			
		||||
     * @param targetVehicle <p>The entity to add the passenger to</p>
 | 
			
		||||
     * @param passenger     <p>The passenger to teleport and add</p>
 | 
			
		||||
     * @param exitDirection <p>The direction of any passengers exiting the stargate</p>
 | 
			
		||||
     * @param newVelocity   <p>The new velocity of the teleported passenger</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection) {
 | 
			
		||||
        if (!passenger.teleport(targetVehicle.getLocation().clone().setDirection(exitDirection))) {
 | 
			
		||||
            Stargate.debug("handleVehiclePassengers", "Failed to teleport passenger" + passenger);
 | 
			
		||||
    public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection,
 | 
			
		||||
                                               Vector newVelocity) {
 | 
			
		||||
        Location passengerExit = targetVehicle.getLocation().clone().setDirection(exitDirection);
 | 
			
		||||
        if (!passenger.teleport(passengerExit)) {
 | 
			
		||||
            Stargate.debug("TeleportHelper::handleVehiclePassengers", "Failed to teleport passenger" +
 | 
			
		||||
                    passenger);
 | 
			
		||||
        } else {
 | 
			
		||||
            Stargate.debug("TeleportHelper::handleVehiclePassengers", "Teleported " + passenger +
 | 
			
		||||
                    " to " + passengerExit);
 | 
			
		||||
        }
 | 
			
		||||
        if (!targetVehicle.addPassenger(passenger)) {
 | 
			
		||||
            Stargate.debug("handleVehiclePassengers", "Failed to add passenger" + passenger);
 | 
			
		||||
            Stargate.debug("TeleportHelper::handleVehiclePassengers", "Failed to add passenger" +
 | 
			
		||||
                    passenger);
 | 
			
		||||
        } else {
 | 
			
		||||
            Stargate.debug("TeleportHelper::handleVehiclePassengers", "Added passenger " + passenger +
 | 
			
		||||
                    " to " + targetVehicle);
 | 
			
		||||
        }
 | 
			
		||||
        Stargate.debug("VehicleTeleporter::teleportVehicle", "Setting velocity " + newVelocity +
 | 
			
		||||
                " for passenger " + passenger);
 | 
			
		||||
        passenger.setVelocity(newVelocity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -96,9 +111,10 @@ public final class TeleportHelper {
 | 
			
		||||
     * @param origin       <p>The portal the entity teleported from</p>
 | 
			
		||||
     * @param target       <p>The portal the entity is teleporting to</p>
 | 
			
		||||
     * @param exitRotation <p>The rotation of any passengers exiting the stargate</p>
 | 
			
		||||
     * @param newVelocity  <p>The new velocity of the teleported passengers</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static void handleEntityPassengers(List<Entity> passengers, Entity entity, Portal origin, Portal target,
 | 
			
		||||
                                              Vector exitRotation) {
 | 
			
		||||
                                              Vector exitRotation, Vector newVelocity) {
 | 
			
		||||
        for (Entity passenger : passengers) {
 | 
			
		||||
            List<Entity> passengerPassengers = passenger.getPassengers();
 | 
			
		||||
            if (!passengerPassengers.isEmpty()) {
 | 
			
		||||
@@ -107,14 +123,14 @@ public final class TeleportHelper {
 | 
			
		||||
            }
 | 
			
		||||
            if (passenger.eject()) {
 | 
			
		||||
                //Teleport any passengers of the passenger
 | 
			
		||||
                handleEntityPassengers(passengerPassengers, passenger, origin, target, exitRotation);
 | 
			
		||||
                handleEntityPassengers(passengerPassengers, passenger, origin, target, exitRotation, newVelocity);
 | 
			
		||||
            }
 | 
			
		||||
            Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
 | 
			
		||||
                if (passenger instanceof Player player) {
 | 
			
		||||
                    //Teleport any creatures leashed by the player in a 15-block range
 | 
			
		||||
                    teleportLeashedCreatures(player, origin, target);
 | 
			
		||||
                }
 | 
			
		||||
                TeleportHelper.teleportAndAddPassenger(entity, passenger, exitRotation);
 | 
			
		||||
                teleportAndAddPassenger(entity, passenger, exitRotation, newVelocity);
 | 
			
		||||
            }, passenger instanceof Player ? Stargate.getGateConfig().waitForPlayerAfterTeleportDelay() : 0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,87 +0,0 @@
 | 
			
		||||
package net.knarcraft.stargate.utility;
 | 
			
		||||
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import org.bukkit.scheduler.BukkitScheduler;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The update checker is responsible for looking for new updates
 | 
			
		||||
 */
 | 
			
		||||
public final class UpdateChecker {
 | 
			
		||||
 | 
			
		||||
    private final static String APIResourceURL = "https://api.spigotmc.org/legacy/update.php?resource=97784";
 | 
			
		||||
    private final static String updateNotice = "A new update is available: %s (You are still on %s)";
 | 
			
		||||
 | 
			
		||||
    private UpdateChecker() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if there's a new update available, and alerts the user if necessary
 | 
			
		||||
     */
 | 
			
		||||
    public static void checkForUpdate() {
 | 
			
		||||
        BukkitScheduler scheduler = Stargate.getInstance().getServer().getScheduler();
 | 
			
		||||
        scheduler.runTaskAsynchronously(Stargate.getInstance(), UpdateChecker::queryAPI);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Queries the spigot API to check for a newer version, and informs the user
 | 
			
		||||
     */
 | 
			
		||||
    private static void queryAPI() {
 | 
			
		||||
        try {
 | 
			
		||||
            InputStream inputStream = new URL(APIResourceURL).openStream();
 | 
			
		||||
            BufferedReader reader = FileHelper.getBufferedReaderFromInputStream(inputStream);
 | 
			
		||||
            //There should only be one line of output
 | 
			
		||||
            String newVersion = reader.readLine();
 | 
			
		||||
            reader.close();
 | 
			
		||||
 | 
			
		||||
            String oldVersion = Stargate.getPluginVersion();
 | 
			
		||||
            //If there is a newer version, notify the user
 | 
			
		||||
            if (isVersionHigher(oldVersion, newVersion)) {
 | 
			
		||||
                Stargate.getConsoleLogger().log(Level.INFO, Stargate.getBackupString("prefix") +
 | 
			
		||||
                        getUpdateAvailableString(newVersion, oldVersion));
 | 
			
		||||
                Stargate.setUpdateAvailable(newVersion);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            Stargate.debug("UpdateChecker", "Unable to get newest version.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the string to display to a user to alert about a new update
 | 
			
		||||
     *
 | 
			
		||||
     * @param newVersion <p>The new available plugin version</p>
 | 
			
		||||
     * @param oldVersion <p>The old (current) plugin version</p>
 | 
			
		||||
     * @return <p>The string to display</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static String getUpdateAvailableString(String newVersion, String oldVersion) {
 | 
			
		||||
        return String.format(updateNotice, newVersion, oldVersion);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Decides whether one version number is higher than another
 | 
			
		||||
     *
 | 
			
		||||
     * @param oldVersion <p>The old version to check</p>
 | 
			
		||||
     * @param newVersion <p>The new version to check</p>
 | 
			
		||||
     * @return <p>True if the new version is higher than the old one</p>
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isVersionHigher(String oldVersion, String newVersion) {
 | 
			
		||||
        String[] oldVersionParts = oldVersion.split("\\.");
 | 
			
		||||
        String[] newVersionParts = newVersion.split("\\.");
 | 
			
		||||
        int versionLength = Math.max(oldVersionParts.length, newVersionParts.length);
 | 
			
		||||
        for (int i = 0; i < versionLength; i++) {
 | 
			
		||||
            int oldVersionNumber = oldVersionParts.length > i ? Integer.parseInt(oldVersionParts[i]) : 0;
 | 
			
		||||
            int newVersionNumber = newVersionParts.length > i ? Integer.parseInt(newVersionParts[i]) : 0;
 | 
			
		||||
            if (newVersionNumber != oldVersionNumber) {
 | 
			
		||||
                return newVersionNumber > oldVersionNumber;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,8 @@
 | 
			
		||||
lang=language
 | 
			
		||||
defaultNetwork=defaultGateNetwork
 | 
			
		||||
use-mysql=
 | 
			
		||||
ignoreEntrance=
 | 
			
		||||
portal-save-location=folders.portalFolder
 | 
			
		||||
portal-folder=folders.portalFolder
 | 
			
		||||
gate-folder=folders.gateFolder
 | 
			
		||||
default-gate-network=gates.defaultGateNetwork
 | 
			
		||||
@@ -18,11 +22,28 @@ debug=debugging.debug
 | 
			
		||||
permdebug=debugging.permissionDebug
 | 
			
		||||
useiconomy=economy.useEconomy
 | 
			
		||||
useeconomy=economy.useEconomy
 | 
			
		||||
cost-to-use=economy.useCost
 | 
			
		||||
cost-to-create=economy.createCost
 | 
			
		||||
createcost=economy.createCost
 | 
			
		||||
destroycost=economy.destroyCost
 | 
			
		||||
usecost=economy.useCost
 | 
			
		||||
toowner=economy.toOwner
 | 
			
		||||
cost-destination=economy.chargeFreeDestination
 | 
			
		||||
chargefreedestination=economy.chargeFreeDestination
 | 
			
		||||
freegatesgreen=economy.freeGatesGreen
 | 
			
		||||
CheckUpdates=
 | 
			
		||||
economy.freeGatesGreen=economy.freeGatesColored
 | 
			
		||||
teleportMessage=
 | 
			
		||||
registerMessage=
 | 
			
		||||
destroyzMessage=
 | 
			
		||||
noownersMessage=
 | 
			
		||||
unselectMessage=
 | 
			
		||||
collisinMessage=
 | 
			
		||||
cantAffordToUse=
 | 
			
		||||
cantAffordToNew=
 | 
			
		||||
portal-open=
 | 
			
		||||
portal-closed=
 | 
			
		||||
cost-type=
 | 
			
		||||
cost-to-activate=
 | 
			
		||||
taxaccount=taxAccount
 | 
			
		||||
usevault=
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# stargate Configuration File
 | 
			
		||||
# Main stargate config
 | 
			
		||||
 | 
			
		||||
# language - The language file to load for messages
 | 
			
		||||
# 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)
 | 
			
		||||
language: en
 | 
			
		||||
# adminUpdateAlert - Whether to alert admins about new plugin updates
 | 
			
		||||
adminUpdateAlert: true
 | 
			
		||||
@@ -40,7 +40,8 @@ gates:
 | 
			
		||||
    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 - Whether to protect gate entrance material (More resource intensive. Only enable if using 
 | 
			
		||||
    #  destroyable open/closed material)
 | 
			
		||||
    protectEntrance: false
 | 
			
		||||
  functionality:
 | 
			
		||||
    enableBungee: false
 | 
			
		||||
@@ -48,18 +49,21 @@ gates:
 | 
			
		||||
    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 - 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 - 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 - 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
 | 
			
		||||
 | 
			
		||||
# I------------I-------------I #
 | 
			
		||||
# ######################## #
 | 
			
		||||
# stargate economy options #
 | 
			
		||||
# I------------I-------------I #
 | 
			
		||||
# ######################## #
 | 
			
		||||
economy:
 | 
			
		||||
  # useEconomy - Whether to use an economy plugin
 | 
			
		||||
  useEconomy: false
 | 
			
		||||
@@ -78,14 +82,26 @@ economy:
 | 
			
		||||
  # freeGatesColor - The color to use for marking free gates
 | 
			
		||||
  freeGatesColor: DARK_GREEN
 | 
			
		||||
 | 
			
		||||
# I-------I-------I #
 | 
			
		||||
# ############# #
 | 
			
		||||
# Debug options #
 | 
			
		||||
# I-------I-------I #
 | 
			
		||||
# ############# #
 | 
			
		||||
debugging:
 | 
			
		||||
  # debug - Debug -- Only enable if you have issues, massive console output
 | 
			
		||||
  debug: false
 | 
			
		||||
  # permissionDebug - This will output any and all Permissions checks to console, used for permissions debugging (Requires debug: true)
 | 
			
		||||
  # permissionDebug - This will output any and all Permissions checks to console, used for permissions debugging 
 | 
			
		||||
  #  (Requires debug: true)
 | 
			
		||||
  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 - 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
 | 
			
		||||
							
								
								
									
										44
									
								
								src/main/resources/lang/ja.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/main/resources/lang/ja.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
author=furplag
 | 
			
		||||
prefix=[Stargate]
 | 
			
		||||
teleportMsg=テレポート
 | 
			
		||||
destroyMsg=ゲートが破壊されました
 | 
			
		||||
invalidMsg=無効な行き先
 | 
			
		||||
blockMsg=ブロックされた行き先
 | 
			
		||||
destEmpty=行き先リストが空です
 | 
			
		||||
denyMsg=アクセスが拒否されました
 | 
			
		||||
reloaded= Stargate をリロードしました
 | 
			
		||||
 | 
			
		||||
ecoDeduct=%cost% の値引き
 | 
			
		||||
ecoRefund=%cost% の返金
 | 
			
		||||
ecoObtain= Stargate %portal% から %cost% を得ました
 | 
			
		||||
ecoInFunds=資金の不足
 | 
			
		||||
ecoLoadError= Vault が読み込まれましたが、Economy プラグインをフックできませんでした
 | 
			
		||||
vaultLoadError=Economy は有効になっていますが、Vault をロードできないため Economy は無効化されました
 | 
			
		||||
vaultLoaded= Vault v%version% が見つかりました
 | 
			
		||||
 | 
			
		||||
createMsg=ゲートが作成されました
 | 
			
		||||
createNetDeny=対象のネットワークにアクセスできません
 | 
			
		||||
createGateDeny=対象のゲートレイアウトにアクセスできません
 | 
			
		||||
createPersonal=パーソナルネットワーク上にゲートを作成する
 | 
			
		||||
createNameLength=ゲート名が短すぎるか長すぎます
 | 
			
		||||
createExists=すでに存在するゲート名です
 | 
			
		||||
createFull=対象のネットワークはいっぱいです
 | 
			
		||||
createWorldDeny=あなたはその世界にアクセスできません
 | 
			
		||||
createConflict=ゲートが既存のゲートと競合しています
 | 
			
		||||
 | 
			
		||||
signRightClick=右クリック
 | 
			
		||||
signToUse=ゲートを使用する
 | 
			
		||||
signRandom=ランダム
 | 
			
		||||
signDisconnected=切断
 | 
			
		||||
signInvalidGate=無効なゲート
 | 
			
		||||
 | 
			
		||||
bungeeDisabled=BungeeCord サポートは無効になっています
 | 
			
		||||
bungeeDeny=BungeeCord ゲートを作成する権限がありません
 | 
			
		||||
bungeeEmpty=BungeeCord ゲートには、行き先とネットワークの両方が必要です
 | 
			
		||||
bungeeSign=テレポート先:
 | 
			
		||||
 | 
			
		||||
portalInfoTitle=[STARGATE INFO]
 | 
			
		||||
portalInfoName=ゲート名: %name%
 | 
			
		||||
portalInfoDestination=行き先: %destination%
 | 
			
		||||
portalInfoNetwork=ネットワーク: %network%
 | 
			
		||||
portalInfoServer=サーバー: %server%
 | 
			
		||||
							
								
								
									
										39
									
								
								src/main/resources/lang/zh_cn.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/main/resources/lang/zh_cn.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
author=YKDZ
 | 
			
		||||
signRightClick=右键
 | 
			
		||||
ecoLoadError=Vault 已加载, 但未检测到合适的经济插件
 | 
			
		||||
createConflict=星门与现有星门冲突
 | 
			
		||||
invalidMsg=无效的目的地
 | 
			
		||||
prefix=[星门] 
 | 
			
		||||
ecoObtain=从星门 %portal% 收取了 %cost%
 | 
			
		||||
vaultLoaded=检测到 Vault v%version%
 | 
			
		||||
reloaded=星门插件已重载
 | 
			
		||||
bungeeDeny=你没有创建跨服星门的权限.
 | 
			
		||||
signToUse=以使用星门
 | 
			
		||||
signInvalidGate=未知星门
 | 
			
		||||
bungeeEmpty=跨服星门需要提供目的地和网络.
 | 
			
		||||
createMsg=星门已创建
 | 
			
		||||
bungeeDisabled=跨服功能已被禁用.
 | 
			
		||||
blockMsg=目的地被阻挡
 | 
			
		||||
ecoInFunds=余额不足
 | 
			
		||||
createNameLength=名称过短或过长.
 | 
			
		||||
vaultLoadError=未检测到Vault. 经济模块已禁用
 | 
			
		||||
denyMsg=访问被拒
 | 
			
		||||
ecoDeduct=花费 %cost%
 | 
			
		||||
signDisconnected=已取消链接
 | 
			
		||||
createNetDeny=你没有这个星门网络的许可
 | 
			
		||||
bungeeSign=传送到
 | 
			
		||||
portalInfoName=名称: %name%
 | 
			
		||||
destroyMsg=星门已被破坏
 | 
			
		||||
portalInfoTitle=[星门信息]
 | 
			
		||||
createExists=与已有星门重名
 | 
			
		||||
teleportMsg=已传送
 | 
			
		||||
createGateDeny=你没有使用这个星门结构的权限
 | 
			
		||||
signRandom=随机
 | 
			
		||||
portalInfoServer=服务器: %server%
 | 
			
		||||
createWorldDeny=你没有链接这个世界的权限
 | 
			
		||||
portalInfoDestination=目的地: %destination%
 | 
			
		||||
portalInfoNetwork=星门网络: %network%
 | 
			
		||||
destEmpty=目的地列表为空
 | 
			
		||||
createPersonal=在私人网络中创建星门
 | 
			
		||||
ecoRefund=退款 %cost%
 | 
			
		||||
createFull=此星门网络已满
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
name: Stargate
 | 
			
		||||
main: net.knarcraft.stargate.Stargate
 | 
			
		||||
version: 0.9.3.4
 | 
			
		||||
version: '${project.version}'
 | 
			
		||||
description: Stargate mod for Bukkit Revived
 | 
			
		||||
author: EpicKnarvik97
 | 
			
		||||
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]
 | 
			
		||||
website: https://git.knarcraft.net/EpicKnarvik97/Stargate
 | 
			
		||||
api-version: 1.18
 | 
			
		||||
softdepend: [ Vault ]
 | 
			
		||||
softdepend: [ Vault, dynmap ]
 | 
			
		||||
commands:
 | 
			
		||||
  stargate:
 | 
			
		||||
    aliases:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user