Compare commits

...

6 Commits

18 changed files with 394 additions and 162 deletions

View File

@@ -2,7 +2,7 @@
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@@ -1,13 +1,13 @@
#Sat Mar 03 21:02:20 PST 2012
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.6
org.eclipse.jdt.core.compiler.source=1.7

View File

@@ -1,3 +1,4 @@
# Description
Metropolis generates a home for each user connecting to your world with roads between them. As new users connect the city expands.
WorldGuard regions are used for each home and for the city as a whole.
@@ -8,40 +9,39 @@ Each user gets assigned a home region named "h_username" where username is repla
After creation these regions can be modified as normal via WorldGuard commands.
INSTALL:
# Install
To install just drop the jar into your plugins folder. All necessarry data will be created on first launch.
CONFIG:
# Config
Edit the config.yml file. You can set the height to clear above roads, the road width, the plot size (incluing half the road width on either side), the road material, and the level at which the road is generated.
Changelog:
v0.5
Added example docs
Added Commands to plugin.yml to move and evict homes
Added floor and road supports to config file and generation
v0.4.6
Added optional generation of a sign identifying owner in plots on creation
Added a Cuboid constructor that takes a worldedit selection
Added a debug mode that enables extra logging. MetropolisPlugin.DEBUG should be true for snapshots and false for release builds.
Added an occupied Plots list to MetropolisPlugin to keep track of both player homes and reserved plots.
Added the Plot class as a parent of PlayerHome and moved relevant code to it.
Added a command to reserve plots that aren't tied to a player. This can be used to setup a larger protected area around spawn
v0.4.5
v0.4.4
Added a welcome message telling players where their home is.
Switched from PlayerLoginEvent to PlayerJoinEvent
v0.4.3
Removed call to saveconfig on plugin unload.
v0.4.2
Made city region refresh on server restart.
v0.4.1
v0.4
v0.3
Added command to generate a home for a user that is not currently logged in.
v0.2.1
Made config file save on load and disable.
v0.2
Added configuration options.
v0.1
Initial Release
# Changelog
* v0.5
Added example docs
Added Commands to plugin.yml to move and evict homes
Added floor and road supports to config file and generation
* v0.4.6
Added optional generation of a sign identifying owner in plots on creation
Added a Cuboid constructor that takes a worldedit selection
Added a debug mode that enables extra logging. MetropolisPlugin.DEBUG should be true for snapshots and false for release builds.
Added an occupied Plots list to MetropolisPlugin to keep track of both player homes and reserved plots.
Added the Plot class as a parent of PlayerHome and moved relevant code to it.
Added a command to reserve plots that aren't tied to a player. This can be used to setup a larger protected area around spawn
* v0.4.5
* v0.4.4
Added a welcome message telling players where their home is.
Switched from PlayerLoginEvent to PlayerJoinEvent
* v0.4.3
Removed call to saveconfig on plugin unload.
* v0.4.2
Made city region refresh on server restart.
* v0.4.1
* v0.4
* v0.3
Added command to generate a home for a user that is not currently logged in.
* v0.2.1
Made config file save on load and disable.
* v0.2
Added configuration options.
* v0.1
Initial Release

16
pom.xml
View File

@@ -7,7 +7,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.majinnaibu.bukkitplugins</groupId>
<artifactId>Metropolis</artifactId>
<version>0.5-SNAPSHOT</version>
<version>1.0-SNAPSHOT</version>
<name>Metropolis</name>
<description>Metropolis generates homes and streets for players as they connect to your server.</description>
<url>http://www.github.com/headhunter45/Metropolis</url>
@@ -28,20 +28,24 @@
<url>http://files.zachsthings.com/repo</url>
</repository>
-->
<!-- WorldEdit/WorldGuard/CommandBook -->
<repository>
<id>sk89q</id>
<url>http://mvn2.sk89q.com/repo</url>
</repository>
<!-- Bukkit -->
<repository>
<id>bukkit-repo</id>
<url>http://repo.bukkit.org/content/groups/public</url>
</repository>
<!-- Spout -->
<repository>
<id>sonatype-nexus-releases</id>
<url>https://oss.sonatype.org/content/repositories/releases</url>
</repository>
<repository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
@@ -90,5 +94,15 @@
<version>1.0-beta-6</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,14 +1,13 @@
package com.majinnaibu.bukkitplugins.metropolis;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
@@ -29,6 +28,8 @@ import org.bukkit.plugin.java.JavaPlugin;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisDebugGenerateTestHomesCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisDebugGetMaterialCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisDebugMatchMaterialCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisFlagResetCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisHomeEvictCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisHomeGenerateCommand;
@@ -38,7 +39,6 @@ import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisHomeMoveComman
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisPlotGoCommand;
import com.majinnaibu.bukkitplugins.metropolis.commands.MetropolisPlotReserveCommand;
import com.majinnaibu.bukkitplugins.metropolis.eventlisteners.PlayerJoinListener;
import com.sk89q.util.yaml.YAMLProcessor;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
@@ -66,9 +66,9 @@ public class MetropolisPlugin extends JavaPlugin {
public RegionManager regionManager = null;
private List<Plot> _occupiedPlots;
private HashMap<String, List<Plot>> _ownedPlots;
private HashMap<UUID, List<Plot>> _ownedPlots;
private HashMap<String, UserOverride> _userOverrides;
private HashMap<String, Integer> _currentHomes;
private HashMap<UUID, Integer> _currentHomes;
private PlayerJoinListener _playerJoinListener = null;
@@ -117,16 +117,17 @@ public class MetropolisPlugin extends JavaPlugin {
public void onEnable() {
pdf = getDescription();
_ownedPlots = new HashMap<String, List<Plot>>();
_ownedPlots = new HashMap<UUID, List<Plot>>();
_userOverrides = new HashMap<String, UserOverride>();
_currentHomes = new HashMap<String, Integer>();
_currentHomes = new HashMap<UUID, Integer>();
loadCurrentHomes();
if(DEBUG){log.info("Checking config");}
Configuration config = getConfig();
if(!config.contains("version")){
//new
if(DEBUG){log.info("No config exists. Assuming new installation.");}
config.set("version", version);
}else{
int configVersion = safeGetIntFromConfig(config, "version");
if(configVersion < version){
@@ -135,14 +136,10 @@ public class MetropolisPlugin extends JavaPlugin {
//upgrade config
config.set("version", version);
}
saveConfig();
if(DEBUG){log.info("Config updated");}
}
}
config.set("version", version);
saveConfig();
config.options().copyDefaults(true);
if(DEBUG){log.info("Reading configuration from file.");}
@@ -165,7 +162,7 @@ public class MetropolisPlugin extends JavaPlugin {
spawnFloorMaterial = safeGetMaterialFromConfig(config, "spawn.material");
generateWall = safeGetBooleanFromConfig(config, "wall.generate");
wallMaterial = safeGetMaterialFromConfig(config, "wall.material");
wallHeight = safeGetIntFromConfig(config, "wall.material");
wallHeight = safeGetIntFromConfig(config, "wall.height");
worldName = safeGetStringFromConfig(config, "worldname");
_maxPlots = safeGetIntFromConfig(config, "plot.multiplier");
_plotMultiplier = safeGetIntFromConfig(config, "plot.maxPerPlayer");
@@ -284,6 +281,8 @@ public class MetropolisPlugin extends JavaPlugin {
RegisterCommandHandler("metropolis", new MetropolisCommand(this));
RegisterCommandHandler("metropolis-debug-generatetesthomes", new MetropolisDebugGenerateTestHomesCommand(this));
RegisterCommandHandler("metropolis-debug-getmaterial", new MetropolisDebugGetMaterialCommand(this));
RegisterCommandHandler("metropolis-debug-matchmaterial", new MetropolisDebugMatchMaterialCommand(this));
RegisterCommandHandler("metropolis-flag-reset", new MetropolisFlagResetCommand(this));
@@ -298,20 +297,20 @@ public class MetropolisPlugin extends JavaPlugin {
}
private void loadCurrentHomes() {
YAMLProcessor processor = new YAMLProcessor(new File(getDataFolder(), "currentHomes.yml"), true);
try {
processor.load();
} catch (IOException e) {
log.info(e.toString());
return;
}
Set<String> keys = processor.getMap().keySet();
_currentHomes.clear();
for(String username : keys){
_currentHomes.put(username, processor.getInt(username, 0));
}
// YAMLProcessor processor = new YAMLProcessor(new File(getDataFolder(), "currentHomes.yml"), true);
// try {
// processor.load();
// } catch (IOException e) {
// log.info(e.toString());
// return;
// }
//
// Set<String> keys = processor.getMap().keySet();
//
// _currentHomes.clear();
// for(String username : keys){
// _currentHomes.put(username, processor.getInt(username, 0));
// }
}
private void buildUserOverrides() {
@@ -352,6 +351,7 @@ public class MetropolisPlugin extends JavaPlugin {
}
}
@SuppressWarnings("unused")
private Cuboid getCuboid(int row, int col) {
//This is only used for debug info
BlockVector min = getPlotMin(row, col, 1);
@@ -396,12 +396,10 @@ public class MetropolisPlugin extends JavaPlugin {
}
private Material safeGetMaterialFromConfig(Configuration config, String name){
Material material = null;
if(config.isInt(name)){
material = Material.getMaterial(config.getInt(name));
}else if(config.isString(name)){
material = Material.getMaterial(config.getString(name));
if(material== null){
Material material = Material.AIR;
if(config.isString(name)){
material = Material.matchMaterial(config.getString(name));
if(material == null){
material = Material.matchMaterial(config.getString(name));
}
}
@@ -410,7 +408,7 @@ public class MetropolisPlugin extends JavaPlugin {
}
private void throwInvalidConfigException() {
log.info("Metropolis: ERROR config file is invalid. Please correct Metropolis/config.yml and restart the server.");
log.info("Metropolis: ERROR config file is invalid. Please correct or delete plugins/Metropolis/config.yml and restart the server.");
throw new RuntimeException("Config file is invalid.");
}
@@ -454,12 +452,12 @@ public class MetropolisPlugin extends JavaPlugin {
ProtectedCuboidRegion cuboidRegion = (ProtectedCuboidRegion) region;
if(cuboidRegion.getId().startsWith("h_")){
PlayerHome home = PlayerHome.get(region);
if(!_currentHomes.containsKey(home.getPlayerName()))
if(!_currentHomes.containsKey(home.getPlayerUUID()))
{
_currentHomes.put(home.getPlayerName(), home.getNumber());
_currentHomes.put(home.getPlayerUUID(), home.getNumber());
}
_occupiedPlots.add(home);
addOwnedPlot(home.getPlayerName(), home);
addOwnedPlot(home.getPlayerUUID(), home);
}else if(cuboidRegion.getId().startsWith("r_")){
_occupiedPlots.add(Plot.get(cuboidRegion));
}
@@ -469,14 +467,14 @@ public class MetropolisPlugin extends JavaPlugin {
size=calculateCitySize();
}
private void addOwnedPlot(String substring, Plot plot) {
if(_ownedPlots.containsKey(substring)){
List<Plot> plots = _ownedPlots.get(substring);
private void addOwnedPlot(UUID playerUUID, Plot plot) {
if(_ownedPlots.containsKey(playerUUID)){
List<Plot> plots = _ownedPlots.get(playerUUID);
plots.add(plot);
}else{
List<Plot> plots = new ArrayList<Plot>();
plots.add(plot);
_ownedPlots.put(substring, plots);
_ownedPlots.put(playerUUID, plots);
}
}
@@ -488,14 +486,14 @@ public class MetropolisPlugin extends JavaPlugin {
public PlayerHome getPlayerHome(Player player) {
PlayerHome home = null;
String regionName = "h_" + player.getName();
String regionName = "h_1_" + player.getUniqueId().toString();
ProtectedRegion homeRegion = regionManager.getRegion(regionName);
if(homeRegion == null){
if(DEBUG){
log.info(String.format("Creating home for player %s", player.getName()));
}
home = generateHome(player.getName());
home = generateHome(player);
}else{
home = new PlayerHome(homeRegion);
}
@@ -830,7 +828,7 @@ public class MetropolisPlugin extends JavaPlugin {
return (cuboid.minZ - roadWidth/2)/gridSizeZ;
}
private void setHomeOccupied(String owner, BlockVector minimumPoint, BlockVector maximumPoint) {
private void setHomeOccupied(OfflinePlayer owner, BlockVector minimumPoint, BlockVector maximumPoint) {
PlayerHome home = new PlayerHome(owner, minimumPoint, maximumPoint);
if(!_occupiedPlots.contains(home)){
@@ -838,13 +836,13 @@ public class MetropolisPlugin extends JavaPlugin {
}
}
public PlayerHome generateHome(String playerName) {
int multiplier = getPlotMultiplier(playerName);
public PlayerHome generateHome(OfflinePlayer playerName) {
int multiplier = getPlotMultiplier(playerName.getName());
if(DEBUG){log.info(String.format("Generating home for %s", playerName));}
if(DEBUG){log.info(String.format("Generating home for %s", playerName.getName()));}
Cuboid homeCuboid = null;
ProtectedRegion phomeRegion = null;
String regionName = "h_1_" + playerName;
String regionName = "h_1_" + playerName.getUniqueId();
phomeRegion = regionManager.getRegion(regionName);
if(phomeRegion != null){
return PlayerHome.get(phomeRegion);
@@ -864,7 +862,7 @@ public class MetropolisPlugin extends JavaPlugin {
newHomeRegion.setFlag(DefaultFlag.TNT, StateFlag.State.DENY);
DefaultDomain d = newHomeRegion.getOwners();
d.addPlayer(playerName);
d.addPlayer(playerName.getName());
newHomeRegion.setPriority(1);
regionManager.addRegion(newHomeRegion);
@@ -901,10 +899,10 @@ public class MetropolisPlugin extends JavaPlugin {
if(DEBUG){log.info(String.format("generateSign: %s", String.valueOf(generateSign)));}
if(generateSign){
generateSign(homeCuboid, playerName);
generateSign(homeCuboid, playerName.getName());
}
if(DEBUG){log.info(String.format("Done generating home for %s", playerName));}
if(DEBUG){log.info(String.format("Done generating home for %s", playerName.getName()));}
return new PlayerHome(newHomeRegion);
}
@@ -1018,7 +1016,7 @@ public class MetropolisPlugin extends JavaPlugin {
public void assignPlot(OfflinePlayer player) {
//PlayerHome home = generateHome(player.getName());
generateHome(player.getName());
generateHome(player);
}
private int getPlotMultiplier(String name) {
@@ -1044,12 +1042,33 @@ public class MetropolisPlugin extends JavaPlugin {
return null;
}
@SuppressWarnings("deprecation")
public Player getPlayer(String name) {
return getServer().getPlayer(name);
}
Player player = null;
UUID playerUUID = null;
try {
playerUUID = UUID.fromString(name);
player = Bukkit.getPlayer(playerUUID);
} catch (IllegalArgumentException ex) {
player = Bukkit.getPlayer(name);
}
return player; }
@SuppressWarnings("deprecation")
public OfflinePlayer getOfflinePlayer(String name){
return getServer().getOfflinePlayer(name);
OfflinePlayer player = null;
UUID playerUUID = null;
try {
playerUUID = UUID.fromString(name);
player = Bukkit.getOfflinePlayer(playerUUID);
} catch (IllegalArgumentException ex) {
player = Bukkit.getOfflinePlayer(name);
}
return player;
}
public String teleportPlayerToPlot(Player player, Plot plot) {
@@ -1062,9 +1081,9 @@ public class MetropolisPlugin extends JavaPlugin {
return null;
}
public boolean homeExists(String playerName, int homeNumber) {
public boolean homeExists(UUID playerUUID, int homeNumber) {
for(Plot plot: _occupiedPlots){
if(plot.getRegionName().equalsIgnoreCase(String.format("h_%d_%s", homeNumber, playerName))){
if(plot.getRegionName().equalsIgnoreCase(String.format("h_%d_%s", homeNumber, playerUUID.toString()))){
return true;
}
}
@@ -1072,13 +1091,13 @@ public class MetropolisPlugin extends JavaPlugin {
return false;
}
public void setHome(String name, int newHomeNumber) {
_currentHomes.put(name, newHomeNumber);
public void setHome(UUID playerUUID, int newHomeNumber) {
_currentHomes.put(playerUUID, newHomeNumber);
saveCurrentHomes();
}
private void saveCurrentHomes() {
File outFile = new File(getDataFolder(), "currentHomes.yml");
//File outFile = new File(getDataFolder(), "currentHomes.yml");
// TODO Auto-generated method stub

View File

@@ -1,8 +1,12 @@
package com.majinnaibu.bukkitplugins.metropolis;
import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.bukkit.OfflinePlayer;
import com.avaje.ebean.validation.NotNull;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
@@ -12,22 +16,30 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@Table(name="Metropolis_PlayerHome")
public class PlayerHome extends Plot{
@NotNull
private String playerName;
public String getPlayerName(){return this.playerName;}
public void setPlayerName(String playerName){this.playerName = playerName;}
private UUID playerUUID = null;
public UUID getPlayerUUID(){return this.playerUUID;}
public void setPlayerUUID(UUID playerUUID){this.playerUUID = playerUUID;}
private int number;
public PlayerHome(String owner, BlockVector min, BlockVector max) {
super("h_" + owner, min, max);
this.playerName = owner;
public PlayerHome(UUID owner, BlockVector min, BlockVector max) {
super("h_1_" + owner, min, max);
this.playerUUID = owner;
}
public PlayerHome(OfflinePlayer owner, BlockVector min, BlockVector max) {
super("h_1_" + owner.getUniqueId(), min, max);
this.playerUUID = owner.getUniqueId();
}
public PlayerHome() {
this.playerName = "";
this.playerUUID = null;
}
public PlayerHome(ProtectedRegion homeRegion){
this.playerUUID = null;
this.number = 0;
try{
String rname = homeRegion.getId();
@@ -36,13 +48,12 @@ public class PlayerHome extends Plot{
if(secondUnderscore > 2){
try{
this.number = Integer.parseInt(rname.substring(2, secondUnderscore));
this.playerName = rname.substring(secondUnderscore+1);
this.playerUUID = UUID.fromString(rname.substring(secondUnderscore+1));
}catch(Exception ex){
this.number = 0;
}
}else{
this.number = 0;
this.playerName = rname.substring(2);
}
setCuboid(new Cuboid(homeRegion.getMinimumPoint(), homeRegion.getMaximumPoint()));
@@ -63,7 +74,7 @@ public class PlayerHome extends Plot{
PlayerHome otherPlayerHome = (PlayerHome)other;
if(!this.playerName.equals(otherPlayerHome.playerName)){
if(!this.playerUUID.equals(otherPlayerHome.playerUUID)){
return false;
}
@@ -77,7 +88,7 @@ public class PlayerHome extends Plot{
public String toFriendlyString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Metropolis Home {Owner: %s min: (%d, %d, %d) max: (%d, %d, %d)}", getPlayerName(), getCuboid().getMinX(), getCuboid().getMinY(), getCuboid().getMinZ(), getCuboid().getMaxX(), getCuboid().getMaxY(), getCuboid().getMaxZ()));
sb.append(String.format("Metropolis Home {Owner: %s min: (%d, %d, %d) max: (%d, %d, %d)}", getPlayerUUID(), getCuboid().getMinX(), getCuboid().getMinY(), getCuboid().getMinZ(), getCuboid().getMaxX(), getCuboid().getMaxY(), getCuboid().getMaxZ()));
return sb.toString();
}

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.bukkitplugins.metropolis.commands;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -20,7 +21,7 @@ public class MetropolisDebugGenerateTestHomesCommand implements CommandExecutor
try{
int numHomes = Integer.parseInt(args[0]);
for(int i=1; i<= numHomes; i++){
_plugin.generateHome(String.format("test%d", i));
_plugin.generateHome(Bukkit.getOfflinePlayer(String.format("test%d", i)));
}
return true;

View File

@@ -0,0 +1,30 @@
package com.majinnaibu.bukkitplugins.metropolis.commands;
import java.util.logging.Level;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import com.majinnaibu.bukkitplugins.metropolis.MetropolisPlugin;
public class MetropolisDebugGetMaterialCommand implements CommandExecutor {
private MetropolisPlugin _plugin;
public MetropolisDebugGetMaterialCommand(MetropolisPlugin plugin) {
_plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
try {
sender.sendMessage(String.format("Material.getMaterial(\"%s\") returns \"%s\"", args[0], Material.getMaterial(args[0])));
return true;
} catch(Exception ex) {
_plugin.getLogger().log(Level.ALL, "Error", ex);
return false;
}
}
}

View File

@@ -0,0 +1,30 @@
package com.majinnaibu.bukkitplugins.metropolis.commands;
import java.util.logging.Level;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import com.majinnaibu.bukkitplugins.metropolis.MetropolisPlugin;
public class MetropolisDebugMatchMaterialCommand implements CommandExecutor {
private MetropolisPlugin _plugin;
public MetropolisDebugMatchMaterialCommand(MetropolisPlugin plugin) {
_plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
try {
sender.sendMessage(String.format("Material.getMaterial(\"%s\") returns \"%s\"", String.join(" ", args), Material.matchMaterial(args[0])));
return true;
} catch(Exception ex) {
_plugin.getLogger().log(Level.ALL, "Error", ex);
return false;
}
}
}

View File

@@ -18,31 +18,33 @@ public class MetropolisHomeEvictCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
//get the player and region
String playerName = "";
String targetUUIDString = null;
OfflinePlayer targetPlayer = null;
if(args.length == 0){
return false;
}
if(args.length >= 1){
playerName = args[0];
targetUUIDString = args[0];
targetPlayer = _plugin.getOfflinePlayer(targetUUIDString);
}
OfflinePlayer player = _plugin.getServer().getOfflinePlayer(playerName);
if(player == null){
sender.sendMessage(String.format("The requested player {%s}does not appear to exist.", playerName));
if(targetPlayer == null){
sender.sendMessage(String.format("The requested player {%s}does not appear to exist.", targetUUIDString));
return false;
}
ProtectedRegion region = _plugin.getRegion(String.format("h_%s", player.getName()));
ProtectedRegion region = _plugin.getRegion(String.format("h_%s", targetPlayer.getUniqueId().toString()));
if(region == null){
sender.sendMessage(String.format("The player {%s} has no home to be evicted from."));
return false;
}
//remove the player as owner and/or member of the region
region.getMembers().removePlayer(playerName);
region.getOwners().removePlayer(playerName);
region.getMembers().removePlayer(targetPlayer.getName());//playerName);
region.getOwners().removePlayer(targetPlayer.getName());
//if the region has no owners delete the region
if(region.getMembers().size() == 0 && region.getOwners().size() == 0){

View File

@@ -1,5 +1,6 @@
package com.majinnaibu.bukkitplugins.metropolis.commands;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -14,13 +15,14 @@ public class MetropolisHomeGenerateCommand implements CommandExecutor {
_plugin = plugin;
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(args.length < 1){
return false;
}
_plugin.generateHome(args[0]);
_plugin.generateHome(Bukkit.getOfflinePlayer(args[0]));
sender.sendMessage("[Metropolis] Home generated for " + args[0]);

View File

@@ -21,32 +21,9 @@ public class MetropolisHomeGoCommand implements CommandExecutor {
Player player = null;
if(sender instanceof Player){
player = (Player)sender;
if(args.length >= 1){
if(player.hasPermission("")){
player = _plugin.getServer().getPlayer(args[0]);
if(player == null){
sender.sendMessage(String.format("Unable to find player %s", args[0]));
return false;
}
}else{
sender.sendMessage("Permission denied");
return false;
}
}
}else{
if(args.length >= 1){
player = _plugin.getServer().getPlayer(args[0]);
if(player == null){
sender.sendMessage(String.format("Unable to find player %s", args[0]));
return false;
}
}else{
sender.sendMessage("You must be a player");
return false;
}
sender.sendMessage("You must be a player");
return false;
}
PlayerHome home = _plugin.getPlayerHome(player);

View File

@@ -41,11 +41,11 @@ public class MetropolisHomeMoveCommand implements CommandExecutor {
return false;
}
if(player == null || !_plugin.homeExists(player.getName(), newHomeNumber)){
if(player == null || !_plugin.homeExists(player.getUniqueId(), newHomeNumber)){
return false;
}
_plugin.setHome(player.getName(), newHomeNumber);
_plugin.setHome(player.getUniqueId(), newHomeNumber);
return true;
}

View File

@@ -1,5 +0,0 @@
package com.majinnaibu.bukkitplugins.metropolis.util;
public class Material {
public static final int signTypeId = 63;
}

View File

@@ -0,0 +1,44 @@
//From evilmidget38 at https://gist.github.com/evilmidget38/a5c971d2f2b2c3b3fb37
package com.majinnaibu.bukkitplugins.metropolis.util;
import com.google.common.collect.ImmutableList;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable;
public class NameFetcher implements Callable<Map<UUID, String>> {
private static final String PROFILE_URL = "https://sessionserver.mojang.com/session/minecraft/profile/";
private final JSONParser jsonParser = new JSONParser();
private final List<UUID> uuids;
public NameFetcher(List<UUID> uuids) {
this.uuids = ImmutableList.copyOf(uuids);
}
@Override
public Map<UUID, String> call() throws Exception {
Map<UUID, String> uuidStringMap = new HashMap<UUID, String>();
for (UUID uuid: uuids) {
HttpURLConnection connection = (HttpURLConnection) new URL(PROFILE_URL+uuid.toString().replace("-", "")).openConnection();
JSONObject response = (JSONObject) jsonParser.parse(new InputStreamReader(connection.getInputStream()));
String name = (String) response.get("name");
if (name == null) {
continue;
}
String cause = (String) response.get("cause");
String errorMessage = (String) response.get("errorMessage");
if (cause != null && cause.length() > 0) {
throw new IllegalStateException(errorMessage);
}
uuidStringMap.put(uuid, name);
}
return uuidStringMap;
}
}

View File

@@ -0,0 +1,97 @@
//From evilmidget38 at https://gist.github.com/evilmidget38/26d70114b834f71fb3b4
package com.majinnaibu.bukkitplugins.metropolis.util;
import com.google.common.collect.ImmutableList;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.Callable;
public class UUIDFetcher implements Callable<Map<String, UUID>> {
private static final double PROFILES_PER_REQUEST = 100;
private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft";
private final JSONParser jsonParser = new JSONParser();
private final List<String> names;
private final boolean rateLimiting;
public UUIDFetcher(List<String> names, boolean rateLimiting) {
this.names = ImmutableList.copyOf(names);
this.rateLimiting = rateLimiting;
}
public UUIDFetcher(List<String> names) {
this(names, true);
}
public Map<String, UUID> call() throws Exception {
Map<String, UUID> uuidMap = new HashMap<String, UUID>();
int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST);
for (int i = 0; i < requests; i++) {
HttpURLConnection connection = createConnection();
String body = JSONArray.toJSONString(names.subList(i * 100, Math.min((i + 1) * 100, names.size())));
writeBody(connection, body);
JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream()));
for (Object profile : array) {
JSONObject jsonProfile = (JSONObject) profile;
String id = (String) jsonProfile.get("id");
String name = (String) jsonProfile.get("name");
UUID uuid = UUIDFetcher.getUUID(id);
uuidMap.put(name, uuid);
}
if (rateLimiting && i != requests - 1) {
Thread.sleep(100L);
}
}
return uuidMap;
}
private static void writeBody(HttpURLConnection connection, String body) throws Exception {
OutputStream stream = connection.getOutputStream();
stream.write(body.getBytes());
stream.flush();
stream.close();
}
private static HttpURLConnection createConnection() throws Exception {
URL url = new URL(PROFILE_URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
return connection;
}
private static UUID getUUID(String id) {
return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" +id.substring(20, 32));
}
public static byte[] toBytes(UUID uuid) {
ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]);
byteBuffer.putLong(uuid.getMostSignificantBits());
byteBuffer.putLong(uuid.getLeastSignificantBits());
return byteBuffer.array();
}
public static UUID fromBytes(byte[] array) {
if (array.length != 16) {
throw new IllegalArgumentException("Illegal byte array length: " + array.length);
}
ByteBuffer byteBuffer = ByteBuffer.wrap(array);
long mostSignificant = byteBuffer.getLong();
long leastSignificant = byteBuffer.getLong();
return new UUID(mostSignificant, leastSignificant);
}
public static UUID getUUIDOf(String name) throws Exception {
return new UUIDFetcher(Arrays.asList(name)).call().get(name);
}
}

View File

@@ -4,26 +4,27 @@ plot:
sizeZ: 32
offsetX: 0
offsetY: 0
offsetZ: 0
offsetZ: 0
multiplier: 1
maxPerPlayer: 1
initial: 1
initial: 1
floor:
generate: true
generate: true
clearSpaceAbove: 66
material: GRASS
supports:
generate: true
generate: true
material: STONE
sign:
generate: true
generate: true
road:
width: 4
clearSpaceAbove: 66
level: 62
level: 62
material: COBBLESTONE
supports:
generate: true
generate: true
material: STONE
spawn:
generate: true
setAsWorldSpawn: true

View File

@@ -1,10 +1,19 @@
name: Metropolis
main: com.majinnaibu.bukkitplugins.metropolis.MetropolisPlugin
version: 1.0
depend: [WorldGuard]
softdepend: [WorldEdit,CommandBook]
version: 0.5
database: false
commands:
metropolis:
description: This command displays the current metropolis version.
usage: /metropolis
usage: /metropolis
metropolis-home-generate:
description: This command generates a home for a user as if they'd just logged in.
permission: metropolis.home.generate
usage: /metropolis-home-generate <playername>
metropolis-home-list:
description: This lists the regions managed by Metropolis
permission: metropolis.home.list
usage: /metropolis-home-list
metropolis-home-evict: