1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-08-13 10:04:51 +02:00

Move EssentialsSpawn into the main plugin, going to make it a component in the near future

This commit is contained in:
md_5
2012-03-03 13:19:10 +11:00
parent 22a37a0c1b
commit 3ed78c0520
15 changed files with 325 additions and 1710 deletions

View File

@@ -23,6 +23,7 @@ import com.earth2me.essentials.listener.*;
import com.earth2me.essentials.register.payment.Methods; import com.earth2me.essentials.register.payment.Methods;
import com.earth2me.essentials.settings.GroupsHolder; import com.earth2me.essentials.settings.GroupsHolder;
import com.earth2me.essentials.settings.SettingsHolder; import com.earth2me.essentials.settings.SettingsHolder;
import com.earth2me.essentials.settings.SpawnsHolder;
import com.earth2me.essentials.user.UserMap; import com.earth2me.essentials.user.UserMap;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
@@ -64,6 +65,7 @@ public class Essentials extends JavaPlugin implements IEssentials
private transient IBackup backup; private transient IBackup backup;
private transient IItemDb itemDb; private transient IItemDb itemDb;
private transient IGroups groups; private transient IGroups groups;
private transient SpawnsHolder spawns;
private transient final Methods paymentMethod = new Methods(); private transient final Methods paymentMethod = new Methods();
//private transient PermissionsHandler permissionsHandler; //private transient PermissionsHandler permissionsHandler;
private transient IUserMap userMap; private transient IUserMap userMap;
@@ -170,6 +172,8 @@ public class Essentials extends JavaPlugin implements IEssentials
reloadList.add(commandHandler); reloadList.add(commandHandler);
economy = new Economy(this); economy = new Economy(this);
reloadList.add(economy); reloadList.add(economy);
spawns = new SpawnsHolder(this);
reloadList.add(spawns);
reload(); reload();
} }
catch (YAMLException exception) catch (YAMLException exception)

View File

@@ -1,8 +1,8 @@
package com.earth2me.essentials.spawn; package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._; import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.api.IUser;
import com.earth2me.essentials.commands.EssentialsCommand; import com.earth2me.essentials.settings.SpawnsHolder;
public class Commandsetspawn extends EssentialsCommand public class Commandsetspawn extends EssentialsCommand
@@ -11,7 +11,7 @@ public class Commandsetspawn extends EssentialsCommand
public void run(final IUser user, final String commandLabel, final String[] args) throws Exception public void run(final IUser user, final String commandLabel, final String[] args) throws Exception
{ {
final String group = args.length > 0 ? getFinalArg(args, 0) : "default"; final String group = args.length > 0 ? getFinalArg(args, 0) : "default";
((SpawnStorage)module).setSpawn(user.getLocation(), group); ((SpawnsHolder)module).setSpawn(user.getLocation(), group);
user.sendMessage(_("spawnSet", group)); user.sendMessage(_("spawnSet", group));
} }
} }

View File

@@ -1,11 +1,10 @@
package com.earth2me.essentials.spawn; package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._; import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.Trade; import com.earth2me.essentials.Trade;
import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.api.IUser;
import com.earth2me.essentials.commands.EssentialsCommand;
import com.earth2me.essentials.commands.NotEnoughArgumentsException;
import com.earth2me.essentials.perm.Permissions; import com.earth2me.essentials.perm.Permissions;
import com.earth2me.essentials.settings.SpawnsHolder;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
@@ -49,7 +48,7 @@ public class Commandspawn extends EssentialsCommand
private void respawn(final IUser user, final Trade charge) throws Exception private void respawn(final IUser user, final Trade charge) throws Exception
{ {
final SpawnStorage spawns = (SpawnStorage)this.module; final SpawnsHolder spawns = (SpawnsHolder)this.module;
final Location spawn = spawns.getSpawn(ess.getGroups().getMainGroup(user)); final Location spawn = spawns.getSpawn(ess.getGroups().getMainGroup(user));
user.getTeleport().teleport(spawn, charge, TeleportCause.COMMAND); user.getTeleport().teleport(spawn, charge, TeleportCause.COMMAND);
} }

View File

@@ -0,0 +1,307 @@
package com.earth2me.essentials.settings;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.api.IEssentials;
import com.earth2me.essentials.api.IEssentialsModule;
import com.earth2me.essentials.api.ISettings;
import com.earth2me.essentials.api.IUser;
import com.earth2me.essentials.storage.AsyncStorageObjectHolder;
import com.earth2me.essentials.storage.Location.WorldNotLoadedException;
import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.textreader.KeywordReplacer;
import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.textreader.SimpleTextPager;
import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import org.bukkit.*;
import org.bukkit.event.Event;
import org.bukkit.event.EventException;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.EventExecutor;
public class SpawnsHolder extends AsyncStorageObjectHolder<Spawns> implements IEssentialsModule
{
public SpawnsHolder(final IEssentials ess)
{
super(ess, Spawns.class);
onReload();
registerListeners();
}
@Override
public File getStorageFile()
{
return new File(ess.getDataFolder(), "spawn.yml");
}
public void setSpawn(final Location loc, final String group)
{
acquireWriteLock();
try
{
if (getData().getSpawns() == null)
{
getData().setSpawns(new HashMap<String, com.earth2me.essentials.storage.Location>());
}
getData().getSpawns().put(group.toLowerCase(Locale.ENGLISH), new com.earth2me.essentials.storage.Location(loc));
}
finally
{
unlock();
}
if ("default".equalsIgnoreCase(group))
{
loc.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
}
}
public Location getSpawn(final String group)
{
acquireReadLock();
try
{
if (getData().getSpawns() == null || group == null)
{
return getWorldSpawn();
}
final Map<String, com.earth2me.essentials.storage.Location> spawnMap = getData().getSpawns();
String groupName = group.toLowerCase(Locale.ENGLISH);
if (!spawnMap.containsKey(groupName))
{
groupName = "default";
}
if (!spawnMap.containsKey(groupName))
{
return getWorldSpawn();
}
try
{
return spawnMap.get(groupName).getBukkitLocation();
}
catch (WorldNotLoadedException ex)
{
return getWorldSpawn();
}
}
finally
{
unlock();
}
}
private Location getWorldSpawn()
{
for (World world : ess.getServer().getWorlds())
{
if (world.getEnvironment() != World.Environment.NORMAL)
{
continue;
}
return world.getSpawnLocation();
}
return ess.getServer().getWorlds().get(0).getSpawnLocation();
}
public EventPriority getRespawnPriority()
{
acquireReadLock();
try
{
for (EventPriority priority : EventPriority.values())
{
if (priority.toString().equalsIgnoreCase(getData().getRespawnPriority()))
{
return priority;
}
}
return EventPriority.NORMAL;
}
finally
{
unlock();
}
}
public Location getNewbieSpawn()
{
acquireReadLock();
try
{
if (getData().getNewbieSpawn() == null || getData().getNewbieSpawn().isEmpty()
|| getData().getNewbieSpawn().equalsIgnoreCase("none"))
{
return null;
}
return getSpawn(getData().getNewbieSpawn());
}
finally
{
unlock();
}
}
public boolean getAnnounceNewPlayers()
{
acquireReadLock();
try
{
return getData().getNewPlayerAnnouncement() != null && !getData().getNewPlayerAnnouncement().isEmpty();
}
finally
{
unlock();
}
}
public String getAnnounceNewPlayerFormat(IUser user)
{
acquireReadLock();
try
{
return getData().getNewPlayerAnnouncement().replace('&', '§').replace("§§", "&").replace("{PLAYER}", user.getDisplayName()).replace("{DISPLAYNAME}", user.getDisplayName()).replace("{GROUP}", ess.getGroups().getMainGroup(user)).replace("{USERNAME}", user.getName()).replace("{ADDRESS}", user.getAddress().toString());
}
finally
{
unlock();
}
}
private void registerListeners()
{
final SpawnPlayerListener playerListener = new SpawnPlayerListener(ess, this);
ess.getServer().getPluginManager().registerEvent(PlayerRespawnEvent.class, playerListener, getRespawnPriority(), new EventExecutor()
{
@Override
public void execute(final Listener ll, final Event event) throws EventException
{
((SpawnPlayerListener)ll).onPlayerRespawn((PlayerRespawnEvent)event);
}
}, ess);
ess.getServer().getPluginManager().registerEvent(PlayerJoinEvent.class, playerListener, getRespawnPriority(), new EventExecutor()
{
@Override
public void execute(final Listener ll, final Event event) throws EventException
{
((SpawnPlayerListener)ll).onPlayerJoin((PlayerJoinEvent)event);
}
}, ess);
}
private class SpawnPlayerListener implements Listener
{
private final transient IEssentials ess;
private final transient SpawnsHolder spawns;
public SpawnPlayerListener(final IEssentials ess, final SpawnsHolder spawns)
{
super();
this.ess = ess;
this.spawns = spawns;
}
public void onPlayerRespawn(final PlayerRespawnEvent event)
{
final IUser user = ess.getUser(event.getPlayer());
boolean respawnAtHome = false;
final ISettings settings = ess.getSettings();
settings.acquireReadLock();
try
{
respawnAtHome = ess.getSettings().getData().getCommands().getHome().isRespawnAtHome();
}
finally
{
settings.unlock();
}
if (respawnAtHome)
{
Location home;
final Location bed = user.getBedSpawnLocation();
if (bed != null && bed.getBlock().getType() == Material.BED_BLOCK)
{
home = bed;
}
else
{
home = user.getHome(user.getLocation());
}
if (home != null)
{
event.setRespawnLocation(home);
return;
}
}
final Location spawn = spawns.getSpawn(ess.getGroups().getMainGroup(user));
if (spawn != null)
{
event.setRespawnLocation(spawn);
}
}
public void onPlayerJoin(final PlayerJoinEvent event)
{
final IUser user = ess.getUser(event.getPlayer());
if (user.hasPlayedBefore())
{
return;
}
if (spawns.getNewbieSpawn() != null)
{
ess.scheduleSyncDelayedTask(new NewPlayerTeleport(user), 1L);
}
if (spawns.getAnnounceNewPlayers())
{
final IText output = new KeywordReplacer(new SimpleTextInput(spawns.getAnnounceNewPlayerFormat(user)), user, ess);
final SimpleTextPager pager = new SimpleTextPager(output);
ess.broadcastMessage(user, pager.getString(0));
}
}
private class NewPlayerTeleport implements Runnable
{
private final transient IUser user;
public NewPlayerTeleport(final IUser user)
{
this.user = user;
}
@Override
public void run()
{
if (user.getBase() instanceof OfflinePlayer)
{
return;
}
try
{
final Location spawn = spawns.getNewbieSpawn();
if (spawn != null)
{
user.getTeleport().now(spawn, false, PlayerTeleportEvent.TeleportCause.PLUGIN);
}
}
catch (Exception ex)
{
Bukkit.getLogger().log(Level.WARNING, _("teleportNewPlayerError"), ex);
}
}
}
}
}

View File

@@ -286,6 +286,10 @@ commands:
description: Creates a jail where you specified named [jailname] description: Creates a jail where you specified named [jailname]
usage: /<command> <jailname> usage: /<command> <jailname>
aliases: [esetjail] aliases: [esetjail]
setspawn:
description: Set the spawnpoint to your current position.
usage: /<command> <group>
aliases: [esetspawn]
setwarp: setwarp:
description: Creates a new warp. description: Creates a new warp.
usage: /<command> <warp> usage: /<command> <warp>
@@ -298,6 +302,10 @@ commands:
description: Toggles if you can see msg/mail commands in chat. description: Toggles if you can see msg/mail commands in chat.
usage: /<command> usage: /<command>
aliases: [esocialspy] aliases: [esocialspy]
spawn:
description: Teleport to the spawnpoint.
usage: /<command> [player]
aliases: [esetspawn]
spawner: spawner:
description: Change the mob type of a spawner description: Change the mob type of a spawner
usage: /<command> <mob> usage: /<command> <mob>

View File

@@ -1,76 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project [ <!ENTITY buildinc SYSTEM "../build.inc.xml"> ]>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="EssentialsSpawn" default="default" basedir=".">
<description>Builds, tests, and runs the project EssentialsSpawn.</description>
<import file="nbproject/build-impl.xml"/>
&buildinc;
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar-with-manifest: JAR building (if you are using a manifest)
-do-jar-without-manifest: JAR building (if you are not using a manifest)
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="EssentialsSpawn-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +0,0 @@
build.xml.data.CRC32=45238b6c
build.xml.script.CRC32=46e3642f
build.xml.stylesheet.CRC32=28e38971@1.38.2.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=e7b96939
nbproject/build-impl.xml.script.CRC32=f45f4172
nbproject/build-impl.xml.stylesheet.CRC32=fcddb364@1.50.1.46

View File

@@ -1 +0,0 @@
DoNotUseThreads

View File

@@ -1,113 +0,0 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=EssentialsSpawn
application.vendor=
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=2
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=120
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAnnotationArgs=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineArrayInit=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAssignment=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineBinaryOp=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineCallArgs=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineDisjunctiveCatchTypes=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineFor=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineImplements=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineMethodParams=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineParenthesized=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTernaryOp=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineThrows=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTryResources=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesAfterClassHeader=0
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesBeforeClass=2
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importGroupsOrder=*
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width=4
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indentCasesFromSwitch=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement=NEW_LINE
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeCatchOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeElseOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeFinallyOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeWhileOnNewLine=true
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.separateImportGroups=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceAfterTypeCast=false
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab=4
auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size=4
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/EssentialsSpawn.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.bukkit.jar=../lib/bukkit.jar
includes=**
jar.compress=true
javac.classpath=\
${reference.Essentials.jar}:\
${file.reference.bukkit.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.6
javac.target=1.6
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}:\
${libs.junit_4.10.classpath}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=true
platform.active=default_platform
project.Essentials=../Essentials
reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>EssentialsSpawn</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
<libraries xmlns="http://www.netbeans.org/ns/ant-project-libraries/1">
<definitions>../lib\nblibraries.properties</definitions>
</libraries>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>Essentials</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration>
</project>

View File

@@ -1,77 +0,0 @@
package com.earth2me.essentials.spawn;
import com.earth2me.essentials.EssentialsCommandHandler;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.api.ICommandHandler;
import com.earth2me.essentials.api.IEssentials;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Event;
import org.bukkit.event.EventException;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.plugin.EventExecutor;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
public class EssentialsSpawn extends JavaPlugin
{
private static final Logger LOGGER = Bukkit.getLogger();
private transient IEssentials ess;
private transient SpawnStorage spawns;
private transient ICommandHandler commandHandler;
public void onEnable()
{
final PluginManager pluginManager = getServer().getPluginManager();
ess = (IEssentials)pluginManager.getPlugin("Essentials3");
if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion()))
{
LOGGER.log(Level.WARNING, _("versionMismatchAll"));
}
if (!ess.isEnabled())
{
this.setEnabled(false);
return;
}
spawns = new SpawnStorage(ess);
ess.addReloadListener(spawns);
commandHandler = new EssentialsCommandHandler(EssentialsSpawn.class.getClassLoader(), "com.earth2me.essentials.spawn.Command", "essentials.", spawns, ess);
final EssentialsSpawnPlayerListener playerListener = new EssentialsSpawnPlayerListener(ess, spawns);
pluginManager.registerEvent(PlayerRespawnEvent.class, playerListener, spawns.getRespawnPriority(), new EventExecutor()
{
@Override
public void execute(final Listener ll, final Event event) throws EventException
{
((EssentialsSpawnPlayerListener)ll).onPlayerRespawn((PlayerRespawnEvent)event);
}
}, this);
pluginManager.registerEvent(PlayerJoinEvent.class, playerListener, spawns.getRespawnPriority(), new EventExecutor()
{
@Override
public void execute(final Listener ll, final Event event) throws EventException
{
((EssentialsSpawnPlayerListener)ll).onPlayerJoin((PlayerJoinEvent)event);
}
}, this);
}
public void onDisable()
{
}
@Override
public boolean onCommand(final CommandSender sender, final Command command,
final String commandLabel, final String[] args)
{
return commandHandler.handleCommand(sender, command, commandLabel, args);
}
}

View File

@@ -1,128 +0,0 @@
package com.earth2me.essentials.spawn;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.api.IEssentials;
import com.earth2me.essentials.api.ISettings;
import com.earth2me.essentials.api.IUser;
import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.textreader.KeywordReplacer;
import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.textreader.SimpleTextPager;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
public class EssentialsSpawnPlayerListener implements Listener
{
private final transient IEssentials ess;
private final transient SpawnStorage spawns;
public EssentialsSpawnPlayerListener(final IEssentials ess, final SpawnStorage spawns)
{
super();
this.ess = ess;
this.spawns = spawns;
}
public void onPlayerRespawn(final PlayerRespawnEvent event)
{
final IUser user = ess.getUser(event.getPlayer());
boolean respawnAtHome = false;
final ISettings settings = ess.getSettings();
settings.acquireReadLock();
try
{
respawnAtHome = ess.getSettings().getData().getCommands().getHome().isRespawnAtHome();
}
finally
{
settings.unlock();
}
if (respawnAtHome)
{
Location home;
final Location bed = user.getBedSpawnLocation();
if (bed != null && bed.getBlock().getType() == Material.BED_BLOCK)
{
home = bed;
}
else
{
home = user.getHome(user.getLocation());
}
if (home != null)
{
event.setRespawnLocation(home);
return;
}
}
final Location spawn = spawns.getSpawn(ess.getGroups().getMainGroup(user));
if (spawn != null)
{
event.setRespawnLocation(spawn);
}
}
public void onPlayerJoin(final PlayerJoinEvent event)
{
final IUser user = ess.getUser(event.getPlayer());
if (user.hasPlayedBefore())
{
return;
}
if (spawns.getNewbieSpawn() != null)
{
ess.scheduleSyncDelayedTask(new NewPlayerTeleport(user), 1L);
}
if (spawns.getAnnounceNewPlayers())
{
final IText output = new KeywordReplacer(new SimpleTextInput(spawns.getAnnounceNewPlayerFormat(user)), user, ess);
final SimpleTextPager pager = new SimpleTextPager(output);
ess.broadcastMessage(user, pager.getString(0));
}
}
private class NewPlayerTeleport implements Runnable
{
private final transient IUser user;
public NewPlayerTeleport(final IUser user)
{
this.user = user;
}
@Override
public void run()
{
if (user.getBase() instanceof OfflinePlayer)
{
return;
}
try
{
final Location spawn = spawns.getNewbieSpawn();
if (spawn != null)
{
user.getTeleport().now(spawn, false, TeleportCause.PLUGIN);
}
}
catch (Exception ex)
{
Bukkit.getLogger().log(Level.WARNING, _("teleportNewPlayerError"), ex);
}
}
}
}

View File

@@ -1,164 +0,0 @@
package com.earth2me.essentials.spawn;
import com.earth2me.essentials.api.IEssentials;
import com.earth2me.essentials.api.IEssentialsModule;
import com.earth2me.essentials.api.IUser;
import com.earth2me.essentials.settings.Spawns;
import com.earth2me.essentials.storage.AsyncStorageObjectHolder;
import com.earth2me.essentials.storage.Location.WorldNotLoadedException;
import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.event.EventPriority;
public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IEssentialsModule
{
public SpawnStorage(final IEssentials ess)
{
super(ess, Spawns.class);
onReload();
}
@Override
public File getStorageFile()
{
return new File(ess.getDataFolder(), "spawn.yml");
}
public void setSpawn(final Location loc, final String group)
{
acquireWriteLock();
try
{
if (getData().getSpawns() == null)
{
getData().setSpawns(new HashMap<String, com.earth2me.essentials.storage.Location>());
}
getData().getSpawns().put(group.toLowerCase(Locale.ENGLISH), new com.earth2me.essentials.storage.Location(loc));
}
finally
{
unlock();
}
if ("default".equalsIgnoreCase(group))
{
loc.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
}
}
public Location getSpawn(final String group)
{
acquireReadLock();
try
{
if (getData().getSpawns() == null || group == null)
{
return getWorldSpawn();
}
final Map<String, com.earth2me.essentials.storage.Location> spawnMap = getData().getSpawns();
String groupName = group.toLowerCase(Locale.ENGLISH);
if (!spawnMap.containsKey(groupName))
{
groupName = "default";
}
if (!spawnMap.containsKey(groupName))
{
return getWorldSpawn();
}
try
{
return spawnMap.get(groupName).getBukkitLocation();
}
catch (WorldNotLoadedException ex)
{
return getWorldSpawn();
}
}
finally
{
unlock();
}
}
private Location getWorldSpawn()
{
for (World world : ess.getServer().getWorlds())
{
if (world.getEnvironment() != World.Environment.NORMAL)
{
continue;
}
return world.getSpawnLocation();
}
return ess.getServer().getWorlds().get(0).getSpawnLocation();
}
public EventPriority getRespawnPriority()
{
acquireReadLock();
try
{
for (EventPriority priority : EventPriority.values())
{
if (priority.toString().equalsIgnoreCase(getData().getRespawnPriority()))
{
return priority;
}
}
return EventPriority.NORMAL;
}
finally
{
unlock();
}
}
public Location getNewbieSpawn()
{
acquireReadLock();
try
{
if (getData().getNewbieSpawn() == null || getData().getNewbieSpawn().isEmpty()
|| getData().getNewbieSpawn().equalsIgnoreCase("none"))
{
return null;
}
return getSpawn(getData().getNewbieSpawn());
}
finally
{
unlock();
}
}
public boolean getAnnounceNewPlayers()
{
acquireReadLock();
try
{
return getData().getNewPlayerAnnouncement() != null && !getData().getNewPlayerAnnouncement().isEmpty();
}
finally
{
unlock();
}
}
public String getAnnounceNewPlayerFormat(IUser user)
{
acquireReadLock();
try
{
return getData().getNewPlayerAnnouncement().replace('&', '§').replace("§§", "&").replace("{PLAYER}", user.getDisplayName()).replace("{DISPLAYNAME}", user.getDisplayName()).replace("{GROUP}", ess.getGroups().getMainGroup(user)).replace("{USERNAME}", user.getName()).replace("{ADDRESS}", user.getAddress().toString());
}
finally
{
unlock();
}
}
}

View File

@@ -1,16 +0,0 @@
# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
name: EssentialsSpawn
main: com.earth2me.essentials.spawn.EssentialsSpawn
# Note to developers: This next line cannot change, or the automatic versioning system will break.
version: TeamCity
website: http://tiny.cc/EssentialsWiki
description: Provides spawn control commands, utilizing Essentials.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits]
depend: [Essentials3]
commands:
setspawn:
description: Set the spawnpoint to your current position.
usage: /<command> <group>
spawn:
description: Teleport to the spawnpoint.
usage: /<command> [player]