Updated API version to Sponge:2.1-SNAPSHOT

This commit is contained in:
Connor Monahan 2015-08-23 18:09:33 -05:00
parent 06f7fe9655
commit b133f03543
8 changed files with 130 additions and 315 deletions

View File

@ -94,12 +94,15 @@
<repositories> <repositories>
<repository> <repository>
<id>war-repo</id> <id>sponge-maven-repo</id>
<url>http://ci.tommytony.com/plugin/repository/everything/</url> <name>Sponge maven repo</name>
</repository> <url>http://repo.spongepowered.org/maven</url>
<repository> <releases>
<id>sponge-repo</id> <enabled>true</enabled>
<url>http://repo.spongepowered.org/Sponge/maven/</url> </releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository> </repository>
</repositories> </repositories>
@ -113,7 +116,8 @@
<dependency> <dependency>
<groupId>org.spongepowered</groupId> <groupId>org.spongepowered</groupId>
<artifactId>spongeapi</artifactId> <artifactId>spongeapi</artifactId>
<version>1.0</version> <version>2.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>

View File

@ -105,7 +105,7 @@ public class WarConfig implements Closeable {
UUID playerId = UUID.fromString(result.getString(1)); UUID playerId = UUID.fromString(result.getString(1));
if (playerId == null) if (playerId == null)
continue; continue;
Optional<Player> player = plugin.getGame().getPlayer(playerId); Optional<Player> player = plugin.getGame().getServer().getPlayer(playerId);
if (player.isPresent()) if (player.isPresent())
makers.add(player.get()); makers.add(player.get());
} }
@ -137,7 +137,7 @@ public class WarConfig implements Closeable {
private final Class<?> dataType; private final Class<?> dataType;
private final Object defaultValue; private final Object defaultValue;
private WarSetting(Class<?> dataType, Object defaultValue) { WarSetting(Class<?> dataType, Object defaultValue) {
this.dataType = dataType; this.dataType = dataType;
this.defaultValue = defaultValue; this.defaultValue = defaultValue;
} }

View File

@ -1,39 +1,48 @@
package com.tommytony.war; package com.tommytony.war;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.tommytony.war.command.WarConfigCommand;
import com.tommytony.war.command.WarzoneCommand; import com.tommytony.war.command.WarzoneCommand;
import com.tommytony.war.zone.Warzone; import com.tommytony.war.zone.Warzone;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.spongepowered.api.Game; import org.spongepowered.api.Game;
import org.spongepowered.api.event.Subscribe;
import org.spongepowered.api.event.state.PreInitializationEvent; import org.spongepowered.api.event.state.PreInitializationEvent;
import org.spongepowered.api.event.state.ServerStartedEvent; import org.spongepowered.api.event.state.ServerStartedEvent;
import org.spongepowered.api.event.state.ServerStartingEvent; import org.spongepowered.api.event.state.ServerStartingEvent;
import org.spongepowered.api.plugin.Plugin; import org.spongepowered.api.plugin.Plugin;
import org.spongepowered.api.util.event.Subscribe; import org.spongepowered.api.service.config.DefaultConfig;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Plugin(id = "war", name = "War", version = "2.0-SNAPSHOT") @Plugin(id = "war", name = "War", version = "2.0-SNAPSHOT")
public class WarPlugin { public class WarPlugin {
private Game game; private Game game;
@Inject
private Logger logger; private Logger logger;
@Inject
@DefaultConfig(sharedRoot = false)
private File dataDir; private File dataDir;
private WarConfig config; private WarConfig config;
private Map<String, Warzone> zones; private Map<String, Warzone> zones;
@Subscribe @Subscribe
public void onConstruction(PreInitializationEvent event) throws InstantiationException { public void onConstruction(PreInitializationEvent event) throws InstantiationException {
game = event.getGame(); game = event.getGame();
logger = event.getPluginLog();
dataDir = event.getConfigurationDirectory();
try { try {
Class.forName("com.tommytony.war.sqlite.JDBC").newInstance(); Class.forName("com.tommytony.war.sqlite.JDBC").newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new InstantiationException("Failed to load SQLite database"); throw new InstantiationException("Failed to load SQLite database");
} }
zones = new HashMap<>();
} }
@Subscribe @Subscribe
@ -51,6 +60,7 @@ public class WarPlugin {
public void onStart(ServerStartedEvent event) { public void onStart(ServerStartedEvent event) {
// register commands // register commands
game.getCommandDispatcher().register(this, new WarzoneCommand(this), "warzone", "zone"); game.getCommandDispatcher().register(this, new WarzoneCommand(this), "warzone", "zone");
game.getCommandDispatcher().register(this, new WarConfigCommand(this), "warcfg", "warconfig");
} }
public Game getGame() { public Game getGame() {

View File

@ -1,133 +1,74 @@
package com.tommytony.war.command; package com.tommytony.war.command;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.tommytony.war.WarConfig; import com.tommytony.war.WarConfig;
import com.tommytony.war.WarPlugin; import com.tommytony.war.WarPlugin;
import org.spongepowered.api.entity.player.Player; import org.spongepowered.api.entity.player.Player;
import org.spongepowered.api.service.permission.Subject; import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.Texts;
import org.spongepowered.api.util.command.CommandCallable; import org.spongepowered.api.util.command.CommandCallable;
import org.spongepowered.api.util.command.CommandException; import org.spongepowered.api.util.command.CommandException;
import org.spongepowered.api.util.command.CommandResult;
import org.spongepowered.api.util.command.CommandSource; import org.spongepowered.api.util.command.CommandSource;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class WarConfigCommand implements CommandCallable { public class WarConfigCommand implements CommandCallable {
private final Optional<Text> desc = Optional.of((Text) Texts.of("View/modify War config"));
private final Optional<Text> help = Optional.of((Text) Texts.of("Allows viewing of the server config or changing various settings."));
private final Text usage = (Text) Texts.of("[-p] setting value");
private final WarPlugin plugin; private final WarPlugin plugin;
public WarConfigCommand(WarPlugin plugin) { public WarConfigCommand(WarPlugin plugin) {
this.plugin = 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 @Override
public boolean call(CommandSource source, String arguments, List<String> parents) throws CommandException { public CommandResult process(CommandSource source, String arguments) throws CommandException {
if (!testPermission(source)) { throw new UnsupportedOperationException("Not implemented yet");
source.sendMessage("You do not have permission for this command.");
return true;
}
source.sendMessage("you do have permission");
return false;
} }
/**
* 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 short one-line description of this command.
*
* @return A description, if available
*/
@Override
public Optional<String> getShortDescription() {
return Optional.of("View/modify war config");
}
/**
* Get a longer help text about this command.
*
* @return A help text, if available
*/
@Override
public Optional<String> getHelp() {
return Optional.of("Allows viewing of the war server config or changing various settings.");
}
/**
* Get the usage string of this command.
* <p/>
* <p>A usage string may look like
* {@code [-w &lt;world&gt;] &lt;var1&gt; &lt;var2&gt;}.</p>
*
* @return A usage string
*/
@Override
public String getUsage() {
return "[-p] setting:value...";
}
/**
* 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 @Override
public List<String> getSuggestions(CommandSource source, String arguments) throws CommandException { public List<String> getSuggestions(CommandSource source, String arguments) throws CommandException {
ArrayList<String> suggestions = new ArrayList<>(); ImmutableList.Builder<String> list = ImmutableList.builder();
for (WarConfig.WarSetting setting : WarConfig.WarSetting.values()) { for (WarConfig.WarSetting setting : WarConfig.WarSetting.values()) {
if (setting.name().toLowerCase().startsWith(arguments.toLowerCase())) if (setting.name().toLowerCase().startsWith(arguments.toLowerCase()))
suggestions.add(setting.name().toLowerCase() + ":"); list.add(setting.name().toLowerCase() + ":");
} }
return suggestions; return list.build();
}
@Override
public boolean testPermission(CommandSource source) {
try {
if (source instanceof Player && plugin.getConfig().getZoneMakers().contains(source)) {
return true;
}
} catch (SQLException e) {
plugin.getLogger().error("Loading zone makers for testing permission", e);
}
if (source.hasPermission("war.config")) {
return true;
}
return false;
}
@Override
public Optional<? extends Text> getShortDescription(CommandSource source) {
return desc;
}
@Override
public Optional<? extends Text> getHelp(CommandSource source) {
return help;
}
@Override
public Text getUsage(CommandSource source) {
return usage;
} }
} }

View File

@ -1,126 +1,82 @@
package com.tommytony.war.command; package com.tommytony.war.command;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.tommytony.war.WarPlugin; import com.tommytony.war.WarPlugin;
import com.tommytony.war.zone.Warzone; import com.tommytony.war.zone.Warzone;
import org.spongepowered.api.entity.player.Player; import org.spongepowered.api.entity.player.Player;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.Texts;
import org.spongepowered.api.util.command.CommandCallable; import org.spongepowered.api.util.command.CommandCallable;
import org.spongepowered.api.util.command.CommandException; import org.spongepowered.api.util.command.CommandException;
import org.spongepowered.api.util.command.CommandResult;
import org.spongepowered.api.util.command.CommandSource; import org.spongepowered.api.util.command.CommandSource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* Teleport to warzone. * Teleport to warzone.
*/ */
public class WarzoneCommand implements CommandCallable { public class WarzoneCommand implements CommandCallable {
private final Optional<Text> desc = Optional.of((Text) Texts.of("Teleport to a zone"));
private final Optional<Text> help = Optional.of((Text) Texts.of("Teleport to a warzone, or join automatically."));
private final Text usage = (Text) Texts.of("<zone>");
private WarPlugin plugin; private WarPlugin plugin;
public WarzoneCommand(WarPlugin plugin) { public WarzoneCommand(WarPlugin plugin) {
this.plugin = 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 @Override
public boolean call(CommandSource source, String arguments, List<String> parents) throws CommandException { public CommandResult process(CommandSource commandSource, String s) throws CommandException {
if (!(source instanceof Player)) { if (!(commandSource instanceof Player)) {
return false; return CommandResult.empty();
} }
String[] argv = arguments.split(" "); String[] argv = s.split(" ");
if (argv.length < 1) { if (argv.length < 1) {
return false; return CommandResult.empty();
} }
String zoneName = argv[0]; String zoneName = argv[0];
Optional<Warzone> zone = plugin.getZone(zoneName); Optional<Warzone> zone = plugin.getZone(zoneName);
if (!zone.isPresent()) { if (!zone.isPresent()) {
return false; return CommandResult.empty();
} }
Player player = (Player) source; Player player = (Player) commandSource;
player.teleport(zone.get().getTeleport()); player.setLocation(zone.get().getTeleport());
return true; return CommandResult.success();
} }
/**
* 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 @Override
public boolean testPermission(CommandSource source) { public List<String> getSuggestions(CommandSource commandSource, String s) throws CommandException {
return true; ImmutableList.Builder<String> list = ImmutableList.builder();
} for (Warzone zone : plugin.getZones().values()) {
if (zone.getName().toLowerCase().startsWith(s.toLowerCase())) {
/** list.add(zone.getName());
* Get a short one-line description of this command. }
*
* @return A description, if available
*/
@Override
public Optional<String> getShortDescription() {
return Optional.of("Teleport to a zone");
}
/**
* Get a longer help text about this command.
*
* @return A help text, if available
*/
@Override
public Optional<String> getHelp() {
return Optional.of("Use this command to teleport to a zone lobby");
}
/**
* Get the usage string of this command.
* <p/>
* <p>A usage string may look like
* {@code [-w &lt;world&gt;] &lt;var1&gt; &lt;var2&gt;}.</p>
*
* @return A usage string
*/
@Override
public String getUsage() {
return "<zone>";
}
/**
* 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 (String zone : plugin.getZones().keySet()) {
if (zone.toLowerCase().startsWith(arguments.toLowerCase()))
suggestions.add(zone);
} }
return suggestions; return list.build();
}
@Override
public boolean testPermission(CommandSource commandSource) {
return commandSource.hasPermission("war.teleport");
}
@Override
public Optional<? extends Text> getShortDescription(CommandSource commandSource) {
return desc;
}
@Override
public Optional<? extends Text> getHelp(CommandSource commandSource) {
return help;
}
@Override
public Text getUsage(CommandSource commandSource) {
return usage;
} }
} }

View File

@ -1,103 +0,0 @@
package com.tommytony.war.struct;
import org.spongepowered.api.block.BlockLoc;
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 BlockLoc 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 BlockLoc getBlock(int x, int y, int z) {
return first.getExtent().getBlock(x, y, z);
}
}

View File

@ -19,7 +19,7 @@ public class Warzone {
private final String name; private final String name;
private final ZoneStorage db; private final ZoneStorage db;
private final ZoneConfig config; private final ZoneConfig config;
private Location teleport; private Location<World> teleport;
/** /**
* Load or create a war zone from the war settings store. * Load or create a war zone from the war settings store.
@ -56,11 +56,11 @@ public class Warzone {
return name; return name;
} }
public Location getTeleport() { public Location<World> getTeleport() {
try { try {
Optional<Location> lobby = db.getPosition("lobby", Optional.<World>absent()); Optional<Location> lobby = db.getPosition("lobby", Optional.<World>absent());
if (lobby.isPresent()) if (lobby.isPresent())
return lobby.get(); return lobby.<World>get();
else throw new RuntimeException("No teleport location found for zone " + name); else throw new RuntimeException("No teleport location found for zone " + name);
} catch (SQLException e) { } catch (SQLException e) {
plugin.getLogger().error("Retrieving teleport", e); plugin.getLogger().error("Retrieving teleport", e);

View File

@ -2,7 +2,6 @@ package com.tommytony.war.zone;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.tommytony.war.WarPlugin; import com.tommytony.war.WarPlugin;
import org.spongepowered.api.math.Vectors;
import org.spongepowered.api.world.Location; import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World; import org.spongepowered.api.world.World;
@ -86,10 +85,18 @@ public class ZoneStorage implements AutoCloseable {
try (ResultSet resultSet = stmt.executeQuery()) { try (ResultSet resultSet = stmt.executeQuery()) {
if (resultSet.next()) { if (resultSet.next()) {
World resultWorld; World resultWorld;
if (world.isPresent()) resultWorld = world.get(); if (world.isPresent()) {
else resultWorld = plugin.getGame().getWorld(resultSet.getString("world")); resultWorld = world.get();
return Optional.of(new Location(resultWorld, Vectors.create3d( } else {
resultSet.getDouble("x"), resultSet.getDouble("y"), resultSet.getDouble("z")))); Optional<World> optwld = plugin.getGame().getServer().getWorld(resultSet.getString("world"));
if (optwld.isPresent()) {
resultWorld = optwld.get();
} else {
return Optional.absent();
}
}
return Optional.of(new Location(resultWorld,
resultSet.getDouble("x"), resultSet.getDouble("y"), resultSet.getDouble("z")));
} }
} }
} }