mirror of
https://github.com/taoneill/war.git
synced 2024-11-10 20:50:04 +01:00
War 2.0 for SpongeAPI started!
Just started rewriting a bit, in case this API really does come through eventually. Sponge is scheduled for release in November. Whadya think @taoneill ? Pouvez-vous nous aider @kugick ?
This commit is contained in:
parent
e786c09bd0
commit
1d54a2a6c0
5
sponge/.gitignore
vendored
Normal file
5
sponge/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
target/
|
||||||
|
war.iml
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
.workspace/
|
181
sponge/pom.xml
Normal file
181
sponge/pom.xml
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.tommytony</groupId>
|
||||||
|
<artifactId>war</artifactId>
|
||||||
|
<version>2.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>War</name>
|
||||||
|
<url>http://war.tommytony.com</url>
|
||||||
|
<description>The original TDM/CTF plugin for Minecraft</description>
|
||||||
|
<inceptionYear>2010</inceptionYear>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>MIT License</name>
|
||||||
|
<url>http://opensource.org/licenses/MIT</url>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<organization>
|
||||||
|
<name>TeamWar</name>
|
||||||
|
<url>http://community.tommytony.com</url>
|
||||||
|
</organization>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<id>cmastudios</id>
|
||||||
|
<name>Connor Monahan</name>
|
||||||
|
<email>cma@tommytony.com</email>
|
||||||
|
<url>https://cmastudios.me</url>
|
||||||
|
<organization>TeamWar</organization>
|
||||||
|
<organizationUrl>http://community.tommytony.com</organizationUrl>
|
||||||
|
<roles>
|
||||||
|
<role>maintainer</role>
|
||||||
|
</roles>
|
||||||
|
<timezone>America/Chicago</timezone>
|
||||||
|
</developer>
|
||||||
|
<developer>
|
||||||
|
<id>tommytony</id>
|
||||||
|
<name>Thomas-Antoine O'Neill</name>
|
||||||
|
<email>taoneill@tommytony.com</email>
|
||||||
|
<url>http://tommytony.com</url>
|
||||||
|
<organization>TeamWar</organization>
|
||||||
|
<organizationUrl>http://community.tommytony.com</organizationUrl>
|
||||||
|
<roles>
|
||||||
|
<role>dictator</role>
|
||||||
|
</roles>
|
||||||
|
<timezone>America/Montreal</timezone>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<issueManagement>
|
||||||
|
<system>GitHub</system>
|
||||||
|
<url>https://github.com/taoneill/war/issues</url>
|
||||||
|
</issueManagement>
|
||||||
|
|
||||||
|
<ciManagement>
|
||||||
|
<system>Jenkins</system>
|
||||||
|
<url>http://ci.tommytony.com</url>
|
||||||
|
</ciManagement>
|
||||||
|
|
||||||
|
<mailingLists>
|
||||||
|
<mailingList>
|
||||||
|
<name>Google Groups</name>
|
||||||
|
<subscribe>minecraft-war+subscribe@googlegroups.com</subscribe>
|
||||||
|
<unsubscribe>minecraft-war+unsubscribe@googlegroups.com</unsubscribe>
|
||||||
|
<post>minecraft-war@googlegroups.com</post>
|
||||||
|
<archive>https://groups.google.com/forum/#!forum/minecraft-war</archive>
|
||||||
|
</mailingList>
|
||||||
|
</mailingLists>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:https://github.com/taoneill/war.git</connection>
|
||||||
|
<developerConnection>scm:git:https://github.com/taoneill/war.git</developerConnection>
|
||||||
|
<tag>HEAD</tag>
|
||||||
|
<url>https://github.com/taoneill/war</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<distributionManagement>
|
||||||
|
<downloadUrl>http://war.tommytony.com</downloadUrl>
|
||||||
|
<repository>
|
||||||
|
<id>war-repo</id>
|
||||||
|
<name>War Jenkins Maven Builds</name>
|
||||||
|
<url>http://ci.tommytony.com/plugin/repository/everything/</url>
|
||||||
|
</repository>
|
||||||
|
</distributionManagement>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>war-repo</id>
|
||||||
|
<url>http://ci.tommytony.com/plugin/repository/everything/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spongepowered</groupId>
|
||||||
|
<artifactId>spongeapi</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.xerial</groupId>
|
||||||
|
<artifactId>sqlite-jdbc</artifactId>
|
||||||
|
<version>3.7.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.yaml</groupId>
|
||||||
|
<artifactId>snakeyaml</artifactId>
|
||||||
|
<version>1.14</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>2.0.2</version>
|
||||||
|
<configuration>
|
||||||
|
<source>7</source>
|
||||||
|
<target>7</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>1.7.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<artifactSet>
|
||||||
|
<includes>
|
||||||
|
<include>org.xerial:sqlite-jdbc</include>
|
||||||
|
<include>org.yaml:snakeyaml</include>
|
||||||
|
</includes>
|
||||||
|
</artifactSet>
|
||||||
|
<minimizeJar>false</minimizeJar>
|
||||||
|
<relocations>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.sqlite</pattern>
|
||||||
|
<shadedPattern>com.tommytony.war.sqlite</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.ibex</pattern>
|
||||||
|
<shadedPattern>com.tommytony.war.ibex</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.yaml.snakeyaml</pattern>
|
||||||
|
<shadedPattern>com.tommytony.war.yaml</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
</relocations>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
<directory>${basedir}/src/main/resources/</directory>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
</project>
|
133
sponge/src/main/java/com/tommytony/war/WarConfig.java
Normal file
133
sponge/src/main/java/com/tommytony/war/WarConfig.java
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package com.tommytony.war;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.spongepowered.api.entity.Player;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main war configuration database.
|
||||||
|
*/
|
||||||
|
public class WarConfig implements Closeable {
|
||||||
|
private final WarPlugin plugin;
|
||||||
|
/**
|
||||||
|
* Database configuration descriptor.
|
||||||
|
*/
|
||||||
|
private Connection conn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the war config database for future use.
|
||||||
|
*
|
||||||
|
* @param file War configuration database location.
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public WarConfig(WarPlugin plugin, File file) throws FileNotFoundException, SQLException {
|
||||||
|
this.plugin = plugin;
|
||||||
|
if (!file.exists())
|
||||||
|
throw new FileNotFoundException("Can't find war main database");
|
||||||
|
conn = DriverManager.getConnection("jdbc:sqlite:" + file.getPath());
|
||||||
|
try (Statement stmt = conn.createStatement()) {
|
||||||
|
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS settings (option TEXT, value BLOB)");
|
||||||
|
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS zones (name TEXT)");
|
||||||
|
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS zonemakers (uuid TEXT)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of an integer setting.
|
||||||
|
*
|
||||||
|
* @param setting The type of setting to look up.
|
||||||
|
* @return the value of the setting or the default if not found.
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public int getInt(WarSetting setting) throws SQLException {
|
||||||
|
try (PreparedStatement stmt = conn.prepareStatement("SELECT value FROM settings WHERE option = ?")) {
|
||||||
|
stmt.setString(1, setting.name());
|
||||||
|
try (ResultSet result = stmt.executeQuery()) {
|
||||||
|
if (result.next()) {
|
||||||
|
return result.getInt(1);
|
||||||
|
} else {
|
||||||
|
return (int) setting.defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load all the enabled war zones on the server.
|
||||||
|
*
|
||||||
|
* @return list of war zones.
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public Collection<String> getZones() throws SQLException {
|
||||||
|
ArrayList<String> zones = new ArrayList<>();
|
||||||
|
try (Statement stmt = conn.createStatement();
|
||||||
|
ResultSet result = stmt.executeQuery("SELECT name FROM zones")) {
|
||||||
|
while (result.next()) {
|
||||||
|
zones.add(result.getString(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ImmutableList.copyOf(zones);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get server zone makers. These people have permission to create zones.
|
||||||
|
*
|
||||||
|
* @return list of zone makers.
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public Collection<Player> getZoneMakers() throws SQLException {
|
||||||
|
ArrayList<Player> makers = new ArrayList<>();
|
||||||
|
try (Statement stmt = conn.createStatement();
|
||||||
|
ResultSet result = stmt.executeQuery("SELECT uuid FROM zonemakers")) {
|
||||||
|
while (result.next()) {
|
||||||
|
UUID playerId = UUID.fromString(result.getString(1));
|
||||||
|
if (playerId == null)
|
||||||
|
continue;
|
||||||
|
Player player = plugin.getGame().getPlayer(playerId);
|
||||||
|
if (player == null)
|
||||||
|
continue;
|
||||||
|
makers.add(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ImmutableList.copyOf(makers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes this stream and releases any system resources associated
|
||||||
|
* with it. If the stream is already closed then invoking this
|
||||||
|
* method has no effect.
|
||||||
|
*
|
||||||
|
* @throws java.io.IOException if an I/O error occurs
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
try {
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible types of settings stored in the war server config database.
|
||||||
|
*/
|
||||||
|
public enum WarSetting {
|
||||||
|
MAXZONES(Integer.class, 20);
|
||||||
|
private final Class<?> dataType;
|
||||||
|
private final Object defaultValue;
|
||||||
|
|
||||||
|
private WarSetting(Class<?> dataType, Object defaultValue) {
|
||||||
|
this.dataType = dataType;
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
sponge/src/main/java/com/tommytony/war/WarPlugin.java
Normal file
51
sponge/src/main/java/com/tommytony/war/WarPlugin.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package com.tommytony.war;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.spongepowered.api.Game;
|
||||||
|
import org.spongepowered.api.event.SpongeEventHandler;
|
||||||
|
import org.spongepowered.api.event.state.PreInitializationEvent;
|
||||||
|
import org.spongepowered.api.event.state.ServerStartingEvent;
|
||||||
|
import org.spongepowered.api.plugin.Plugin;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
@Plugin(id = "war", name = "War", version = "2.0-SNAPSHOT")
|
||||||
|
public class WarPlugin {
|
||||||
|
private Game game;
|
||||||
|
private Logger logger;
|
||||||
|
private File dataDir;
|
||||||
|
private WarConfig config;
|
||||||
|
|
||||||
|
@SpongeEventHandler
|
||||||
|
public void onConstruction(PreInitializationEvent event) throws InstantiationException {
|
||||||
|
game = event.getGame();
|
||||||
|
logger = event.getPluginLog();
|
||||||
|
dataDir = event.getConfigurationDirectory();
|
||||||
|
try {
|
||||||
|
Class.forName("com.tommytony.war.sqlite.JDBC").newInstance();
|
||||||
|
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
|
||||||
|
throw new InstantiationException("Failed to load SQLite database");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SpongeEventHandler
|
||||||
|
public void onStartUp(ServerStartingEvent event) throws FileNotFoundException, SQLException {
|
||||||
|
if (!dataDir.exists() && !dataDir.mkdirs())
|
||||||
|
throw new FileNotFoundException("Failed to make War data folder at " + dataDir.getPath());
|
||||||
|
config = new WarConfig(this, new File(dataDir, "war.sl3"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Game getGame() {
|
||||||
|
return game;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Logger getLogger() {
|
||||||
|
return logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WarConfig getConfig() {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,134 @@
|
|||||||
|
package com.tommytony.war.command;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.tommytony.war.WarConfig;
|
||||||
|
import com.tommytony.war.WarPlugin;
|
||||||
|
import org.spongepowered.api.entity.Player;
|
||||||
|
import org.spongepowered.api.service.permission.Subject;
|
||||||
|
import org.spongepowered.api.util.command.CommandCallable;
|
||||||
|
import org.spongepowered.api.util.command.CommandException;
|
||||||
|
import org.spongepowered.api.util.command.CommandSource;
|
||||||
|
import org.spongepowered.api.util.command.Description;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class WarConfigCommand implements CommandCallable {
|
||||||
|
private final WarPlugin plugin;
|
||||||
|
|
||||||
|
public WarConfigCommand(WarPlugin plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the command based on input arguments.
|
||||||
|
* <p/>
|
||||||
|
* <p>The implementing class must perform the necessary permission
|
||||||
|
* checks.</p>
|
||||||
|
*
|
||||||
|
* @param source The caller of the command
|
||||||
|
* @param arguments The raw arguments for this command
|
||||||
|
* @param parents A stack of parent commands, where the first entry is
|
||||||
|
* the root command
|
||||||
|
* @return Whether a command was processed
|
||||||
|
* @throws org.spongepowered.api.util.command.CommandException Thrown on a command error
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean call(CommandSource source, String arguments, List<String> parents) throws CommandException {
|
||||||
|
if (!testPermission(source)) {
|
||||||
|
source.sendMessage("You do not have permission for this command.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
source.sendMessage("you do have permission");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a description of the command, detailing usage information.
|
||||||
|
*
|
||||||
|
* @return The command description
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Description getDescription() {
|
||||||
|
return new Description() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getShortDescription() {
|
||||||
|
return "View/modify war config";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getHelp() {
|
||||||
|
return "Allows viewing of the war server config or changing various settings.";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsage() {
|
||||||
|
return "[-p] setting:value...";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getPermissions() {
|
||||||
|
return ImmutableList.of("war.admin", "war.admin.config");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether this command can probably be executed by the given source.
|
||||||
|
* <p/>
|
||||||
|
* <p>If implementations are unsure if the command can be executed by
|
||||||
|
* the source, {@code true} should be returned. Return values of this method
|
||||||
|
* may be used to determine whether this command is listed in command
|
||||||
|
* listings.</p>
|
||||||
|
*
|
||||||
|
* @param source The caller of the command
|
||||||
|
* @return Whether permission is (probably) granted
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean testPermission(CommandSource source) {
|
||||||
|
if (source instanceof Player) {
|
||||||
|
try {
|
||||||
|
if (plugin.getConfig().getZoneMakers().contains(source)) {
|
||||||
|
source.sendMessage("You are a zone maker.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
plugin.getLogger().error("Loading zone makers for testing permission", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (source instanceof Subject && ((Subject) source).isPermitted("war.admin.config")) {
|
||||||
|
source.sendMessage("You are a war admin.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(source instanceof Player) && !(source instanceof Subject)) {
|
||||||
|
source.sendMessage("You are console or something.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of suggestions based on input.
|
||||||
|
* <p/>
|
||||||
|
* <p>If a suggestion is chosen by the user, it will replace the last
|
||||||
|
* word.</p>
|
||||||
|
*
|
||||||
|
* @param source The command source
|
||||||
|
* @param arguments The arguments entered up to this point
|
||||||
|
* @return A list of suggestions
|
||||||
|
* @throws org.spongepowered.api.util.command.CommandException Thrown if there was a parsing error
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<String> getSuggestions(CommandSource source, String arguments) throws CommandException {
|
||||||
|
ArrayList<String> suggestions = new ArrayList<>();
|
||||||
|
for (WarConfig.WarSetting setting : WarConfig.WarSetting.values()) {
|
||||||
|
if (setting.name().toLowerCase().startsWith(arguments.toLowerCase()))
|
||||||
|
suggestions.add(setting.name().toLowerCase() + ":");
|
||||||
|
}
|
||||||
|
return suggestions;
|
||||||
|
}
|
||||||
|
}
|
103
sponge/src/main/java/com/tommytony/war/struct/Region.java
Normal file
103
sponge/src/main/java/com/tommytony/war/struct/Region.java
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
package com.tommytony.war.struct;
|
||||||
|
|
||||||
|
import org.spongepowered.api.block.Block;
|
||||||
|
import org.spongepowered.api.math.Vector3d;
|
||||||
|
import org.spongepowered.api.world.Location;
|
||||||
|
import org.spongepowered.api.world.extent.BlockVolume;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A selection of blocks in the world. Identified by two corners.
|
||||||
|
*/
|
||||||
|
public class Region implements BlockVolume {
|
||||||
|
/**
|
||||||
|
* One corner of the selection.
|
||||||
|
*/
|
||||||
|
private Location first;
|
||||||
|
/**
|
||||||
|
* The second corner of the selection.
|
||||||
|
*/
|
||||||
|
private Location second;
|
||||||
|
|
||||||
|
public Region(Location first, Location second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the minimum value of the selection.
|
||||||
|
*
|
||||||
|
* @return the minimum value.
|
||||||
|
*/
|
||||||
|
public Location getMin() {
|
||||||
|
return new Location(first.getExtent(), first.getPosition().min(second.getPosition()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the maximum value of the selection.
|
||||||
|
*
|
||||||
|
* @return the maximum value.
|
||||||
|
*/
|
||||||
|
public Location getMax() {
|
||||||
|
return new Location(first.getExtent(), first.getPosition().max(second.getPosition()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of the region in the X dimension.
|
||||||
|
*
|
||||||
|
* @return X dimension length.
|
||||||
|
*/
|
||||||
|
public int getSizeX() {
|
||||||
|
return getMax().getBlock().getX() - getMin().getBlock().getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of the region in the Y dimension.
|
||||||
|
*
|
||||||
|
* @return Y dimension length.
|
||||||
|
*/
|
||||||
|
public int getSizeY() {
|
||||||
|
return getMax().getBlock().getY() - getMin().getBlock().getY();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of the region in the Z dimension.
|
||||||
|
*
|
||||||
|
* @return Z dimension length.
|
||||||
|
*/
|
||||||
|
public int getSizeZ() {
|
||||||
|
return getMax().getBlock().getZ() - getMin().getBlock().getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the total area of the region.
|
||||||
|
*
|
||||||
|
* @return region total area.
|
||||||
|
*/
|
||||||
|
public int getSize() {
|
||||||
|
return getSizeX() * getSizeY() * getSizeZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a representation of the block at the given position.
|
||||||
|
*
|
||||||
|
* @param position The position
|
||||||
|
* @return The block
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Block getBlock(Vector3d position) {
|
||||||
|
return first.getExtent().getBlock(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a representation of the block at the given position.
|
||||||
|
*
|
||||||
|
* @param x The X position
|
||||||
|
* @param y The Y position
|
||||||
|
* @param z The Z position
|
||||||
|
* @return The block
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Block getBlock(int x, int y, int z) {
|
||||||
|
return first.getExtent().getBlock(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user