summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZenexer <Zenexer@e251c2fe-e539-e718-e476-b85c1f46cddb>2011-03-30 04:03:21 +0000
committerZenexer <Zenexer@e251c2fe-e539-e718-e476-b85c1f46cddb>2011-03-30 04:03:21 +0000
commitcb21bc4d7a67f0974c2773fdd0f5376f177c068e (patch)
treef1584fe391f77c648a1d7d25385ef16229b756de
downloadEssentials-cb21bc4d7a67f0974c2773fdd0f5376f177c068e.tar
Essentials-cb21bc4d7a67f0974c2773fdd0f5376f177c068e.tar.gz
Essentials-cb21bc4d7a67f0974c2773fdd0f5376f177c068e.tar.lz
Essentials-cb21bc4d7a67f0974c2773fdd0f5376f177c068e.tar.xz
Essentials-cb21bc4d7a67f0974c2773fdd0f5376f177c068e.zip
2.1 prerelease, part 2 of 3
git-svn-id: https://svn.java.net/svn/essentials~svn/trunk2.1@1015 e251c2fe-e539-e718-e476-b85c1f46cddb
-rw-r--r--BuildAll/build.xml74
-rw-r--r--BuildAll/nbproject/build-impl.xml1142
-rw-r--r--BuildAll/nbproject/genfiles.properties8
-rw-r--r--BuildAll/nbproject/private/config.properties0
-rw-r--r--BuildAll/nbproject/private/private.properties6
-rw-r--r--BuildAll/nbproject/project.properties90
-rw-r--r--BuildAll/nbproject/project.xml68
-rw-r--r--Essentials/.gitignore7
-rw-r--r--Essentials/build.xml75
-rw-r--r--Essentials/nbproject/build-impl.xml1058
-rw-r--r--Essentials/nbproject/genfiles.properties11
-rw-r--r--Essentials/nbproject/private/private.properties1
-rw-r--r--Essentials/nbproject/project.properties76
-rw-r--r--Essentials/nbproject/project.xml19
-rw-r--r--Essentials/settings/Editor.zipbin0 -> 18717 bytes
-rw-r--r--Essentials/src/com/earth2me/essentials/Backup.java82
-rw-r--r--Essentials/src/com/earth2me/essentials/Essentials.java684
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java214
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsConf.java120
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsEcoBlockListener.java159
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java65
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java452
-rw-r--r--Essentials/src/com/earth2me/essentials/IConf.java5
-rw-r--r--Essentials/src/com/earth2me/essentials/InventoryWorkaround.java136
-rw-r--r--Essentials/src/com/earth2me/essentials/ItemDb.java110
-rw-r--r--Essentials/src/com/earth2me/essentials/Jail.java117
-rw-r--r--Essentials/src/com/earth2me/essentials/Mob.java122
-rw-r--r--Essentials/src/com/earth2me/essentials/NetherPortal.java167
-rw-r--r--Essentials/src/com/earth2me/essentials/OfflinePlayer.java351
-rw-r--r--Essentials/src/com/earth2me/essentials/PlayerExtension.java141
-rw-r--r--Essentials/src/com/earth2me/essentials/PlayerWrapper.java416
-rw-r--r--Essentials/src/com/earth2me/essentials/Settings.java348
-rw-r--r--Essentials/src/com/earth2me/essentials/Spawn.java87
-rw-r--r--Essentials/src/com/earth2me/essentials/TargetBlock.java599
-rw-r--r--Essentials/src/com/earth2me/essentials/TeleportTimer.java73
-rw-r--r--Essentials/src/com/earth2me/essentials/User.java695
-rw-r--r--Essentials/src/com/earth2me/essentials/Warps.java244
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandafk.java32
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandantioch.java39
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandback.java22
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandbackup.java43
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandbalance.java23
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandban.java42
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandbanip.java30
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java56
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java32
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandburn.java32
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java99
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandcompass.java32
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commanddeljail.java33
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java41
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commanddepth.java24
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandeco.java82
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandessentials.java30
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandext.java29
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandgc.java29
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java33
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandgive.java49
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandgod.java32
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandheal.java53
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandhelp.java129
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java33
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandhome.java21
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java39
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commanditem.java45
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandjails.java37
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandjump.java50
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandkick.java41
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandkickall.java55
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandkill.java33
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandkit.java150
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandlist.java93
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandmail.java52
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandme.java43
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandmotd.java25
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandmsg.java85
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandmute.java64
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandnick.java129
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandnuble.java21
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandpay.java42
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandping.java26
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandplugin.java161
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandr.java37
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandrealname.java40
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandreloadall.java37
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandrules.java23
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandsell.java63
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandsethome.java22
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java28
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java30
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandspawner.java41
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java188
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java23
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtime.java63
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java67
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtop.java26
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtp.java61
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtpa.java34
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java40
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java33
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java37
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtphere.java34
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtpo.java34
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java31
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtppos.java42
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java21
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandtree.java64
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandunban.java35
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java35
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandwarp.java74
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandwhois.java44
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandworld.java67
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandworth.java48
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java80
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java20
-rw-r--r--Essentials/src/config.yml385
-rw-r--r--Essentials/src/items.csv887
-rw-r--r--Essentials/src/plugin.yml248
-rw-r--r--Essentials/test/com/earth2me/essentials/EssentialsTest.java60
-rw-r--r--Essentials/test/com/earth2me/essentials/PermissionsTest.java17
-rw-r--r--Essentials/test/com/earth2me/essentials/UserTest.java72
-rw-r--r--Essentials/workdir/EssentialsGroupManager/config.yml0
-rw-r--r--Essentials/workdir/banned-ips.txt0
-rw-r--r--Essentials/workdir/banned-players.txt0
-rw-r--r--Essentials/workdir/ops.txt0
-rw-r--r--Essentials/workdir/plugins/Permissions/default.yml0
-rw-r--r--Essentials/workdir/server.log264
-rw-r--r--Essentials/workdir/server.log.10
-rw-r--r--Essentials/workdir/server.log.1.lck0
-rw-r--r--Essentials/workdir/server.properties13
-rw-r--r--Essentials/workdir/userdata/TestPlayer1.yml2
-rw-r--r--Essentials/workdir/white-list.txt0
-rw-r--r--EssentialsChat/build.xml76
-rw-r--r--EssentialsChat/nbproject/build-impl.xml1072
-rw-r--r--EssentialsChat/nbproject/genfiles.properties8
-rw-r--r--EssentialsChat/nbproject/private/private.properties1
-rw-r--r--EssentialsChat/nbproject/project.properties79
-rw-r--r--EssentialsChat/nbproject/project.xml28
-rw-r--r--EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java43
-rw-r--r--EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListener.java61
-rw-r--r--EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatWorker.java122
-rw-r--r--EssentialsChat/src/plugin.yml8
-rw-r--r--EssentialsGroupBridge/build.xml74
-rw-r--r--EssentialsGroupBridge/nbproject/build-impl.xml1047
-rw-r--r--EssentialsGroupBridge/nbproject/genfiles.properties8
-rw-r--r--EssentialsGroupBridge/nbproject/private/private.properties1
-rw-r--r--EssentialsGroupBridge/nbproject/project.properties78
-rw-r--r--EssentialsGroupBridge/nbproject/project.xml25
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/Messaging.classbin0 -> 2604 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/Misc$string.classbin0 -> 982 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/Misc.classbin0 -> 3980 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/configuration/ConfigurationHandler.classbin0 -> 788 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/configuration/DefaultConfiguration.classbin0 -> 435 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/database/Wrapper$Type.classbin0 -> 1107 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/database/Wrapper.classbin0 -> 5428 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/permissions/Control.classbin0 -> 27337 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.classbin0 -> 3198 bytes
-rw-r--r--EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java102
-rw-r--r--EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java428
-rw-r--r--EssentialsGroupBridge/src/plugin.yml3
-rw-r--r--EssentialsGroupManager/build.xml74
-rw-r--r--EssentialsGroupManager/nbproject/build-impl.xml1033
-rw-r--r--EssentialsGroupManager/nbproject/genfiles.properties8
-rw-r--r--EssentialsGroupManager/nbproject/private/private.properties1
-rw-r--r--EssentialsGroupManager/nbproject/project.properties73
-rw-r--r--EssentialsGroupManager/nbproject/project.xml15
-rw-r--r--EssentialsGroupManager/src/config.yml14
-rw-r--r--EssentialsGroupManager/src/groups.yml172
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java120
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java1634
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java114
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java122
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java87
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java187
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java45
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java192
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java204
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java939
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java423
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java856
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java163
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GMLoggerHandler.java26
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java51
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/PermissionCheckResult.java66
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/StringPermissionComparator.java50
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/Tasks.java111
-rw-r--r--EssentialsGroupManager/src/plugin.yml165
-rw-r--r--EssentialsGroupManager/src/users.yml59
-rw-r--r--EssentialsProtect/MANIFEST.MF2
-rw-r--r--EssentialsProtect/build.xml86
-rw-r--r--EssentialsProtect/nbproject/build-impl.xml1072
-rw-r--r--EssentialsProtect/nbproject/genfiles.properties8
-rw-r--r--EssentialsProtect/nbproject/private/private.properties1
-rw-r--r--EssentialsProtect/nbproject/project.properties91
-rw-r--r--EssentialsProtect/nbproject/project.xml28
-rw-r--r--EssentialsProtect/src/README.TXT30
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java154
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java272
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectData.java533
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java197
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java70
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectRegions.java5
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectSqlProperties.java12
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java15
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java9
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java292
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java205
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java89
-rw-r--r--EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java87
-rw-r--r--EssentialsProtect/src/plugin.yml8
-rw-r--r--EssentialsSpawn/build.xml76
-rw-r--r--EssentialsSpawn/nbproject/build-impl.xml1072
-rw-r--r--EssentialsSpawn/nbproject/genfiles.properties8
-rw-r--r--EssentialsSpawn/nbproject/private/private.properties1
-rw-r--r--EssentialsSpawn/nbproject/project.properties76
-rw-r--r--EssentialsSpawn/nbproject/project.xml28
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java24
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java23
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java65
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java51
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnWorker.java56
-rw-r--r--EssentialsSpawn/src/plugin.yml15
-rw-r--r--build.inc.xml7
-rw-r--r--lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jarbin0 -> 17873 bytes
-rw-r--r--lib/Permissions.jarbin0 -> 32227 bytes
-rw-r--r--lib/c3p0-0.9.1.2.jarbin0 -> 610790 bytes
-rw-r--r--lib/craftbukkit-0.0.1-SNAPSHOT.jarbin0 -> 1458639 bytes
-rw-r--r--lib/gson.jarbin0 -> 164986 bytes
-rw-r--r--lib/iConomy.jarbin0 -> 65038 bytes
-rw-r--r--lib/junit/junit-3.8.2-api.zipbin0 -> 72555 bytes
-rw-r--r--lib/junit/junit-3.8.2.jarbin0 -> 118932 bytes
-rw-r--r--lib/junit_4/junit-4.5-api.zipbin0 -> 184067 bytes
-rw-r--r--lib/junit_4/junit-4.5-src.jarbin0 -> 109014 bytes
-rw-r--r--lib/junit_4/junit-4.5.jarbin0 -> 196787 bytes
-rw-r--r--lib/mysql.jarbin0 -> 703265 bytes
-rw-r--r--lib/nblibraries.properties12
-rw-r--r--lib/sqlite.jarbin0 -> 1304214 bytes
237 files changed, 28831 insertions, 0 deletions
diff --git a/BuildAll/build.xml b/BuildAll/build.xml
new file mode 100644
index 000000000..496f85c34
--- /dev/null
+++ b/BuildAll/build.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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="BuildAll" default="default" basedir=".">
+ <description>Builds, tests, and runs the project BuildAll.</description>
+ <import file="nbproject/build-impl.xml"/>
+ <!--
+
+ 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="BuildAll-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>
diff --git a/BuildAll/nbproject/build-impl.xml b/BuildAll/nbproject/build-impl.xml
new file mode 100644
index 000000000..09a0e0d9d
--- /dev/null
+++ b/BuildAll/nbproject/build-impl.xml
@@ -0,0 +1,1142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="BuildAll-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target name="-pre-init-libraries">
+ <property location="..\lib\nblibraries.properties" name="libraries.path"/>
+ <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/>
+ <pathconvert dirsep="/" property="libraries.dir">
+ <path path="${libraries.dir.nativedirsep}"/>
+ </pathconvert>
+ <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/>
+ <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/>
+ </target>
+ <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: BuildAll was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.EssentialsChat}" name="call.subproject"/>
+ <param location="${project.EssentialsChat}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.EssentialsGroupBridge}" name="call.subproject"/>
+ <param location="${project.EssentialsGroupBridge}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.EssentialsGroupManager}" name="call.subproject"/>
+ <param location="${project.EssentialsGroupManager}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.EssentialsProtect}" name="call.subproject"/>
+ <param location="${project.EssentialsProtect}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.EssentialsSpawn}" name="call.subproject"/>
+ <param location="${project.EssentialsSpawn}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: BuildAll was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.EssentialsChat}" name="call.subproject"/>
+ <param location="${project.EssentialsChat}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.EssentialsGroupBridge}" name="call.subproject"/>
+ <param location="${project.EssentialsGroupBridge}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.EssentialsGroupManager}" name="call.subproject"/>
+ <param location="${project.EssentialsGroupManager}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.EssentialsProtect}" name="call.subproject"/>
+ <param location="${project.EssentialsProtect}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.EssentialsSpawn}" name="call.subproject"/>
+ <param location="${project.EssentialsSpawn}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/BuildAll/nbproject/genfiles.properties b/BuildAll/nbproject/genfiles.properties
new file mode 100644
index 000000000..55c9a217a
--- /dev/null
+++ b/BuildAll/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=60061751
+build.xml.script.CRC32=7a797370
+build.xml.stylesheet.CRC32=28e38971@1.42.1.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=60061751
+nbproject/build-impl.xml.script.CRC32=5fce336c
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
diff --git a/BuildAll/nbproject/private/config.properties b/BuildAll/nbproject/private/config.properties
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/BuildAll/nbproject/private/config.properties
diff --git a/BuildAll/nbproject/private/private.properties b/BuildAll/nbproject/private/private.properties
new file mode 100644
index 000000000..999794c06
--- /dev/null
+++ b/BuildAll/nbproject/private/private.properties
@@ -0,0 +1,6 @@
+compile.on.save=false
+do.depend=false
+do.jar=true
+javac.debug=true
+javadoc.preview=true
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/BuildAll/nbproject/project.properties b/BuildAll/nbproject/project.properties
new file mode 100644
index 000000000..6b8e235e1
--- /dev/null
+++ b/BuildAll/nbproject/project.properties
@@ -0,0 +1,90 @@
+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=BuildAll
+application.vendor=Paul
+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}/BuildAll.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${reference.Essentials.jar}:\
+ ${reference.EssentialsChat.jar}:\
+ ${reference.EssentialsGroupBridge.jar}:\
+ ${reference.EssentialsGroupManager.jar}:\
+ ${reference.EssentialsProtect.jar}:\
+ ${reference.EssentialsSpawn.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}:\
+ ${libs.junit.classpath}:\
+ ${libs.junit_4.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=false
+platform.active=default_platform
+project.Essentials=../Essentials
+project.EssentialsChat=../EssentialsChat
+project.EssentialsGroupBridge=../EssentialsGroupBridge
+project.EssentialsGroupManager=../EssentialsGroupManager
+project.EssentialsProtect=../EssentialsProtect
+project.EssentialsSpawn=../EssentialsSpawn
+reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar
+reference.EssentialsChat.jar=${project.EssentialsChat}/dist/EssentialsChat.jar
+reference.EssentialsGroupBridge.jar=${project.EssentialsGroupBridge}/dist/EssentialsGroupBridge.jar
+reference.EssentialsGroupManager.jar=${project.EssentialsGroupManager}/dist/EssentialsGroupManager.jar
+reference.EssentialsProtect.jar=${project.EssentialsProtect}/dist/original-EssentialsProtect.jar
+reference.EssentialsSpawn.jar=${project.EssentialsSpawn}/dist/EssentialsSpawn.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
diff --git a/BuildAll/nbproject/project.xml b/BuildAll/nbproject/project.xml
new file mode 100644
index 000000000..86e1cc4a7
--- /dev/null
+++ b/BuildAll/nbproject/project.xml
@@ -0,0 +1,68 @@
+<?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>BuildAll</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>
+ <reference>
+ <foreign-project>EssentialsChat</foreign-project>
+ <artifact-type>jar</artifact-type>
+ <script>build.xml</script>
+ <target>jar</target>
+ <clean-target>clean</clean-target>
+ <id>jar</id>
+ </reference>
+ <reference>
+ <foreign-project>EssentialsGroupBridge</foreign-project>
+ <artifact-type>jar</artifact-type>
+ <script>build.xml</script>
+ <target>jar</target>
+ <clean-target>clean</clean-target>
+ <id>jar</id>
+ </reference>
+ <reference>
+ <foreign-project>EssentialsGroupManager</foreign-project>
+ <artifact-type>jar</artifact-type>
+ <script>build.xml</script>
+ <target>jar</target>
+ <clean-target>clean</clean-target>
+ <id>jar</id>
+ </reference>
+ <reference>
+ <foreign-project>EssentialsProtect</foreign-project>
+ <artifact-type>jar</artifact-type>
+ <script>build.xml</script>
+ <target>jar</target>
+ <clean-target>clean</clean-target>
+ <id>jar</id>
+ </reference>
+ <reference>
+ <foreign-project>EssentialsSpawn</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>
diff --git a/Essentials/.gitignore b/Essentials/.gitignore
new file mode 100644
index 000000000..437c8c683
--- /dev/null
+++ b/Essentials/.gitignore
@@ -0,0 +1,7 @@
+# NetBeans cruft
+/build
+/dist
+/nbproject/private
+
+# Mac cruft
+.DS_Store
diff --git a/Essentials/build.xml b/Essentials/build.xml
new file mode 100644
index 000000000..0742d234f
--- /dev/null
+++ b/Essentials/build.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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="Essentials" default="default" basedir=".">
+
+ <description>Builds, tests, and runs the project Essentials.</description>
+ <import file="nbproject/build-impl.xml"/>
+ <!--
+
+ 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="Essentials-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>
diff --git a/Essentials/nbproject/build-impl.xml b/Essentials/nbproject/build-impl.xml
new file mode 100644
index 000000000..131d7414d
--- /dev/null
+++ b/Essentials/nbproject/build-impl.xml
@@ -0,0 +1,1058 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="Essentials-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target name="-pre-init-libraries">
+ <property location="../lib\nblibraries.properties" name="libraries.path"/>
+ <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/>
+ <pathconvert dirsep="/" property="libraries.dir">
+ <path path="${libraries.dir.nativedirsep}"/>
+ </pathconvert>
+ <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/>
+ <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/>
+ </target>
+ <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: Essentials was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: Essentials was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/Essentials/nbproject/genfiles.properties b/Essentials/nbproject/genfiles.properties
new file mode 100644
index 000000000..169fb44fa
--- /dev/null
+++ b/Essentials/nbproject/genfiles.properties
@@ -0,0 +1,11 @@
+build.xml.data.CRC32=7d758acf
+build.xml.script.CRC32=3233ee78
+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=ab78ce15
+nbproject/build-impl.xml.script.CRC32=4b464ee6
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
+nbproject/profiler-build-impl.xml.data.CRC32=ab78ce15
+nbproject/profiler-build-impl.xml.script.CRC32=abda56ed
+nbproject/profiler-build-impl.xml.stylesheet.CRC32=f10cf54c@1.11.1
diff --git a/Essentials/nbproject/private/private.properties b/Essentials/nbproject/private/private.properties
new file mode 100644
index 000000000..94183418a
--- /dev/null
+++ b/Essentials/nbproject/private/private.properties
@@ -0,0 +1 @@
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/Essentials/nbproject/project.properties b/Essentials/nbproject/project.properties
new file mode 100644
index 000000000..67c5646c9
--- /dev/null
+++ b/Essentials/nbproject/project.properties
@@ -0,0 +1,76 @@
+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=Essentials
+application.vendor=Paul
+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}/Essentials.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.craftbukkit-0.0.1-SNAPSHOT.jar=..\\lib\\craftbukkit-0.0.1-SNAPSHOT.jar
+file.reference.iConomy.jar=..\\lib\\iConomy.jar
+file.reference.Permissions.jar=..\\lib\\Permissions.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${file.reference.iConomy.jar}:\
+ ${file.reference.Permissions.jar}:\
+ ${file.reference.craftbukkit-0.0.1-SNAPSHOT.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+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=false
+platform.active=default_platform
+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=-Djline.terminal=jline.UnsupportedTerminal
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/Essentials/nbproject/project.xml b/Essentials/nbproject/project.xml
new file mode 100644
index 000000000..aa1a9f770
--- /dev/null
+++ b/Essentials/nbproject/project.xml
@@ -0,0 +1,19 @@
+<?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>Essentials</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"/>
+ </configuration>
+</project>
diff --git a/Essentials/settings/Editor.zip b/Essentials/settings/Editor.zip
new file mode 100644
index 000000000..7635328f8
--- /dev/null
+++ b/Essentials/settings/Editor.zip
Binary files differ
diff --git a/Essentials/src/com/earth2me/essentials/Backup.java b/Essentials/src/com/earth2me/essentials/Backup.java
new file mode 100644
index 000000000..aa0cb1476
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Backup.java
@@ -0,0 +1,82 @@
+package com.earth2me.essentials;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.CraftServer;
+
+public class Backup implements Runnable {
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private CraftServer server;
+ private boolean running = false;
+ private int taskId = -1;
+ private boolean active = false;
+
+ public Backup() {
+ server = (CraftServer)Essentials.getStatic().getServer();
+ if (server.getOnlinePlayers().length > 0) {
+ startTask();
+ }
+ }
+
+ void onPlayerJoin() {
+ startTask();
+ }
+
+ private void startTask() {
+ if (!running) {
+ long interval = Essentials.getSettings().getBackupInterval()*1200; // minutes -> ticks
+ if (interval < 1200) {
+ return;
+ }
+ taskId = server.getScheduler().scheduleSyncRepeatingTask(Essentials.getStatic(), this, interval, interval);
+ running = true;
+ }
+ }
+
+ public void run() {
+ if (active) return;
+ active = true;
+ final String command = Essentials.getSettings().getBackupCommand();
+ if (command == null || "".equals(command)) {
+ return;
+ }
+ logger.log(Level.INFO, "Backup started");
+ final CommandSender cs = server.getServer().console;
+ server.dispatchCommand(cs, "save-all");
+ server.dispatchCommand(cs, "save-off");
+
+ server.getScheduler().scheduleAsyncDelayedTask(Essentials.getStatic(),
+ new Runnable() {
+
+ public void run() {
+ try {
+ Process child = Runtime.getRuntime().exec(command);
+ child.waitFor();
+ } catch (InterruptedException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ } finally {
+ server.getScheduler().scheduleSyncDelayedTask(Essentials.getStatic(),
+ new Runnable() {
+
+ public void run() {
+ server.dispatchCommand(cs, "save-on");
+ if (server.getOnlinePlayers().length == 0) {
+ running = false;
+ if (taskId != -1) {
+ server.getScheduler().cancelTask(taskId);
+ }
+ }
+ active = false;
+ logger.log(Level.INFO, "Backup finished");
+ }
+ });
+ }
+ }
+ });
+ }
+
+}
diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java
new file mode 100644
index 000000000..f9bd1d655
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Essentials.java
@@ -0,0 +1,684 @@
+package com.earth2me.essentials;
+
+import com.earth2me.essentials.commands.EssentialsCommand;
+import java.io.*;
+import java.util.*;
+import java.util.logging.*;
+import org.bukkit.*;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.commands.IEssentialsCommand;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.bukkit.command.PluginCommand;
+import org.bukkit.craftbukkit.scheduler.CraftScheduler;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event.Priority;
+import org.bukkit.event.Event.Type;
+import org.bukkit.plugin.*;
+import org.bukkit.plugin.java.*;
+import org.yaml.snakeyaml.*;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+
+public class Essentials extends JavaPlugin
+{
+ public static final String AUTHORS = "Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo and ceulemans.";
+ public static final int minBukkitBuildVersion = 556;
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private static final Yaml yaml = new Yaml(new SafeConstructor());
+ private static Map<String, Object> users;
+ private static Settings settings;
+ private static final Object usersLock = new Object();
+ public static Object permissions = null;
+ public final Map<User, User> tpcRequests = new HashMap<User, User>();
+ public final Map<User, Boolean> tpcHere = new HashMap<User, Boolean>();
+ public final List<User> away = new ArrayList<User>();
+ private EssentialsPlayerListener playerListener;
+ private EssentialsBlockListener blockListener;
+ private EssentialsEntityListener entityListener;
+ private static Essentials staticThis = null;
+ public Spawn spawn;
+ private Jail jail;
+ private Warps warps;
+ private List<IConf> confList;
+ public ArrayList bans = new ArrayList();
+ public ArrayList bannedIps = new ArrayList();
+ public Backup backup;
+
+ public Essentials() throws IOException
+ {
+ loadClasses();
+ }
+
+ public static void ensureEnabled(Server server)
+ {
+ PluginManager pm = server.getPluginManager();
+ Essentials ess = (Essentials)pm.getPlugin("Essentials");
+ if (!ess.isEnabled())
+ pm.enablePlugin(ess);
+ loadClasses();
+ }
+
+ @SuppressWarnings("CallToThreadDumpStack")
+ public static void loadClasses()
+ {
+ final String[] classes = new String[]
+ {
+ "commands.IEssentialsCommand",
+ "commands.EssentialsCommand",
+ "User",
+ "TargetBlock",
+ "Spawn",
+ "Settings",
+ "OfflinePlayer",
+ "ItemDb",
+ "Mob"
+ };
+
+ try
+ {
+ for (String c : classes)
+ Essentials.class.getClassLoader().loadClass("com.earth2me.essentials." + c);
+ }
+ catch (Throwable ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public static Essentials getStatic()
+ {
+ return staticThis;
+ }
+
+ public static Settings getSettings()
+ {
+ return settings;
+ }
+
+ public void setupPermissions()
+ {
+ Plugin permPlugin = this.getServer().getPluginManager().getPlugin("Permissions");
+ if (permissions == null && permPlugin != null) permissions = permPlugin;
+ }
+
+ public Player getPlayer(String[] args, int pos)
+ throws IndexOutOfBoundsException, NoSuchFieldException
+ {
+ if (args.length <= pos) throw new IndexOutOfBoundsException("§cInvalid command syntax. Did you forget an argument?");
+ List<Player> matches = getServer().matchPlayer(args[0]);
+ if (matches.size() < 1) throw new NoSuchFieldException("§cNo matching players could be found.");
+ return matches.get(0);
+ }
+
+ public void setStatic()
+ {
+ staticThis = this;
+ }
+
+ @SuppressWarnings("LoggerStringConcat")
+ public void onEnable()
+ {
+ setStatic();
+ confList = new ArrayList<IConf>();
+ settings = new Settings(this.getDataFolder());
+ confList.add(settings);
+ this.spawn = new Spawn(getServer(), this.getDataFolder());
+ confList.add(spawn);
+ warps = new Warps(getServer(), this.getDataFolder());
+ confList.add(warps);
+ reload();
+ this.backup = new Backup();
+
+ PluginManager pm = getServer().getPluginManager();
+ for (Plugin plugin : pm.getPlugins()) {
+ if (plugin.getDescription().getName().startsWith("Essentials")) {
+ if (!plugin.getDescription().getVersion().equals(this.getDescription().getVersion())) {
+ logger.log(Level.WARNING, "Version mismatch! Please update "+plugin.getDescription().getName()+" to the same version.");
+ }
+ }
+ }
+ Matcher versionMatch = Pattern.compile("git-Bukkit-([0-9]+).([0-9]+).([0-9]+)-[0-9]+-[0-9a-z]+-b([0-9]+)jnks.*").matcher(getServer().getVersion());
+ if (versionMatch.matches()) {
+ int versionNumber = Integer.parseInt(versionMatch.group(4));
+ if (versionNumber < minBukkitBuildVersion) {
+ logger.log(Level.WARNING, "Bukkit version is not the recommended build for Essentials.");
+ }
+ } else {
+ logger.log(Level.INFO, "Bukkit version format changed. Version not checked.");
+ }
+
+
+ playerListener = new EssentialsPlayerListener(this);
+ pm.registerEvent(Type.PLAYER_JOIN, playerListener, Priority.Monitor, this);
+ pm.registerEvent(Type.PLAYER_QUIT, playerListener, Priority.Monitor, this);
+ pm.registerEvent(Type.PLAYER_CHAT, playerListener, Priority.Monitor, this);
+ if (getSettings().getNetherPortalsEnabled())
+ pm.registerEvent(Type.PLAYER_MOVE, playerListener, Priority.High, this);
+ pm.registerEvent(Type.PLAYER_LOGIN, playerListener, Priority.High, this);
+ pm.registerEvent(Type.PLAYER_TELEPORT, playerListener, Priority.High, this);
+ pm.registerEvent(Type.PLAYER_INTERACT, playerListener, Priority.Monitor, this);
+
+ blockListener = new EssentialsBlockListener(this);
+ pm.registerEvent(Type.SIGN_CHANGE, blockListener, Priority.Monitor, this);
+ pm.registerEvent(Type.BLOCK_BREAK, blockListener, Priority.Monitor, this);
+ pm.registerEvent(Type.BLOCK_PLACE, blockListener, Priority.Monitor, this);
+
+ entityListener = new EssentialsEntityListener(this);
+ pm.registerEvent(Type.ENTITY_DAMAGE, entityListener, Priority.Lowest, this);
+ pm.registerEvent(Type.ENTITY_COMBUST, entityListener, Priority.Lowest, this);
+ pm.registerEvent(Type.ENTITY_DEATH, entityListener, Priority.Lowest, this);
+
+ jail = new Jail(this.getDataFolder());
+ confList.add(jail);
+ pm.registerEvent(Type.BLOCK_BREAK, jail, Priority.High, this);
+ pm.registerEvent(Type.BLOCK_DAMAGE, jail, Priority.High, this);
+ pm.registerEvent(Type.BLOCK_PLACE, jail, Priority.High, this);
+
+ attachEcoListeners();
+
+ if (settings.isNetherEnabled() && getServer().getWorlds().size() < 2)
+ {
+ getServer().createWorld(settings.getNetherName(), World.Environment.NETHER);
+ }
+
+ logger.info("Loaded " + this.getDescription().getName() + " build " + this.getDescription().getVersion() + " maintained by " + AUTHORS);
+ }
+
+ public void onDisable()
+ {
+ staticThis = null;
+ }
+
+ public void reload()
+ {
+ loadData();
+ loadBanList();
+
+ for (IConf iConf : confList)
+ {
+ iConf.reloadConfig();
+ }
+
+ try
+ {
+ ItemDb.load(getDataFolder(), "items.csv");
+ }
+ catch (Exception ex)
+ {
+ logger.log(Level.WARNING, "Could not load items.csv.", ex);
+ }
+ }
+
+ public static Map<String, Object> getData(User player)
+ {
+ return getData(player.getName());
+ }
+
+ public static Map<String, Object> getData(String player)
+ {
+ try
+ {
+ Map<String, Object> retval;
+ synchronized (usersLock)
+ {
+ retval = (Map<String, Object>)users.get(player.toLowerCase());
+ }
+ return retval == null ? new HashMap<String, Object>() : retval;
+ }
+ catch (Throwable ex)
+ {
+ return new HashMap<String, Object>();
+ }
+ }
+
+ public static void flushData()
+ {
+ Thread run = new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ if (!Essentials.getStatic().getDataFolder().exists())
+ Essentials.getStatic().getDataFolder().mkdirs();
+ File file = new File(Essentials.getStatic().getDataFolder(), "users.yml");
+ if (!file.exists())
+ file.createNewFile();
+
+ FileWriter tx = new FileWriter(file);
+ synchronized (usersLock)
+ {
+ tx.write(yaml.dump(users));
+ }
+ tx.flush();
+ tx.close();
+ }
+ catch (Throwable ex)
+ {
+ Logger.getLogger(Essentials.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ });
+ run.setDaemon(false);
+ run.start();
+ }
+
+ public static void loadData()
+ {
+ try
+ {
+ if (!Essentials.getStatic().getDataFolder().exists()) Essentials.getStatic().getDataFolder().mkdirs();
+ File file = new File(Essentials.getStatic().getDataFolder(), "users.yml");
+ if (!file.exists()) file.createNewFile();
+
+ FileInputStream rx = new FileInputStream(file);
+ synchronized (usersLock)
+ {
+ users = (Map<String, Object>)yaml.load(new UnicodeReader(rx));
+ }
+ rx.close();
+ }
+ catch (Exception ex)
+ {
+ Logger.getLogger(Essentials.class.getName()).log(Level.SEVERE, null, ex);
+ synchronized (usersLock)
+ {
+ users = new HashMap<String, Object>();
+ }
+ }
+ finally
+ {
+ synchronized (usersLock)
+ {
+ if (users == null) users = new HashMap<String, Object>();
+ }
+ }
+ }
+
+ public static void setData(User player, Map<String, Object> data)
+ {
+ setData(player.getName(), data);
+ }
+
+ public static void setData(String player, Map<String, Object> data)
+ {
+ synchronized (usersLock)
+ {
+ users.put(player.toLowerCase(), data);
+ }
+ }
+
+ public static List<String> readMail(User player)
+ {
+ return readMail(player.getName());
+ }
+
+ public static List<String> readMail(String player)
+ {
+ try
+ {
+ Map<String, Object> data = getData(player);
+ List<String> retval = (List<String>)data.get("mail");
+ return retval == null ? new ArrayList<String>() : retval;
+ }
+ catch (Throwable ex)
+ {
+ return new ArrayList<String>();
+ }
+ }
+
+ public static void clearMail(User player)
+ {
+ try
+ {
+ Map<String, Object> data = getData(player);
+ data.put("mail", new ArrayList<String>());
+ setData(player, data);
+ flushData();
+ }
+ catch (Throwable ex)
+ {
+ }
+ }
+
+ public static void sendMail(User from, String to, String message)
+ throws Exception
+ {
+ try
+ {
+ Map<String, Object> data = getData(ChatColor.stripColor(to));
+ List<String> mail = readMail(to);
+ mail.add(ChatColor.stripColor(from.getDisplayName()) + ": " + message);
+ data.put("mail", mail);
+ setData(to, data);
+ flushData();
+ }
+ catch (Throwable ex)
+ {
+ throw new Exception("An error was encountered while sending the mail.", ex);
+ }
+ }
+
+ public String readNickname(User player)
+ {
+ try
+ {
+ Map<String, Object> data = getData(player);
+ String nick = (String)data.get("nickname");
+ if (nick == null)
+ return player.getName();
+ if (nick.equals(player.getName()))
+ return player.getName();
+ return getSettings().getNicknamePrefix() + nick;
+ }
+ catch (Exception ex)
+ {
+ return player.getName();
+ }
+ }
+
+ public void saveNickname(User player, String nickname) throws Exception
+ {
+ try
+ {
+ Map<String, Object> data = getData(player);
+ data.put("nickname", nickname);
+ setData(player, data);
+ flushData();
+ }
+ catch (Throwable ex)
+ {
+ throw new Exception("An error was encountered while saving the nickname.", ex);
+ }
+ }
+
+ public String[] getMotd(CommandSender sender, String def)
+ {
+ return getLines(sender, "motd", def);
+ }
+
+ public String[] getLines(CommandSender sender, String node, String def)
+ {
+ List<String> lines = (List<String>)getConfiguration().getProperty(node);
+ if (lines == null) return new String[0];
+ String[] retval = new String[lines.size()];
+
+ if (lines == null || lines.isEmpty() || lines.get(0) == null)
+ {
+ try
+ {
+ lines = new ArrayList<String>();
+ // "[]" in YaML indicates empty array, so respect that
+ if (!getConfiguration().getString(node, def).equals("[]"))
+ {
+ lines.add(getConfiguration().getString(node, def));
+ retval = new String[lines.size()];
+ }
+ }
+ catch (Throwable ex2)
+ {
+ System.out.println(ChatColor.DARK_RED + "Notice: Your configuration file has a corrupt " + node + " node.");
+ return new String[0];
+ }
+ }
+
+ // if still empty, call it a day
+ if (lines == null || lines.isEmpty() || lines.get(0) == null)
+ return new String[0];
+
+ for (int i = 0; i < lines.size(); i++)
+ {
+ String m = lines.get(i);
+ if (m == null)
+ continue;
+ m = m.replace('&', '§').replace("§§", "&");
+
+ if (sender instanceof User || sender instanceof Player)
+ {
+ User user = User.get(sender);
+ m = m.replace("{PLAYER}", user.getDisplayName());
+ m = m.replace("{IP}", user.getAddress().toString());
+ m = m.replace("{BALANCE}", Double.toString(user.getMoney()));
+ }
+
+ m = m.replace("{ONLINE}", Integer.toString(getServer().getOnlinePlayers().length));
+
+ if (m.matches(".*\\{PLAYERLIST\\}.*"))
+ {
+ StringBuilder online = new StringBuilder();
+ for (Player p : getServer().getOnlinePlayers())
+ {
+ if (online.length() > 0)
+ online.append(", ");
+ online.append(p.getDisplayName());
+ }
+ m = m.replace("{PLAYERLIST}", online.toString());
+ }
+
+ if (sender instanceof Player)
+ {
+ try
+ {
+ Class User = getClassLoader().loadClass("bukkit.Vandolis.User");
+ Object vuser = User.getConstructor(User.class).newInstance((Player)sender);
+ m = m.replace("{RED:BALANCE}", User.getMethod("getMoney").invoke(vuser).toString());
+ m = m.replace("{RED:BUYS}", User.getMethod("getNumTransactionsBuy").invoke(vuser).toString());
+ m = m.replace("{RED:SELLS}", User.getMethod("getNumTransactionsSell").invoke(vuser).toString());
+ }
+ catch (Throwable ex)
+ {
+ m = m.replace("{RED:BALANCE}", "N/A");
+ m = m.replace("{RED:BUYS}", "N/A");
+ m = m.replace("{RED:SELLS}", "N/A");
+ }
+ }
+
+ retval[i] = m + " ";
+ }
+ return retval;
+ }
+
+ public static String FormatTime(long Milliseconds)
+ { // format time into a string showing hours, minutes, or seconds
+ if (Milliseconds > 3600000)
+ {
+ double val = Math.round((double)Milliseconds / 360000D) / 10D;
+ return val + " hour" + (val > 1 ? "s" : "");
+ }
+ else if (Milliseconds > 60000)
+ {
+ double val = Math.round((double)Milliseconds / 6000D) / 10D;
+ return val + " minute" + (val > 1 ? "s" : "");
+ }
+ else if (Milliseconds <= 1000)
+ return "1 second";
+ else
+ return (Milliseconds / 1000L) + " seconds";
+ }
+
+ @SuppressWarnings("LoggerStringConcat")
+ public static void previewCommand(CommandSender sender, Command command, String commandLabel, String[] args)
+ {
+ if (sender instanceof Player)
+ logger.info(ChatColor.BLUE + "[PLAYER_COMMAND] " + ((Player)sender).getName() + ": /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0));
+ }
+
+ @Override
+ @SuppressWarnings(
+ {
+ "LoggerStringConcat", "CallToThreadDumpStack"
+ })
+ public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args)
+ {
+ // Allow plugins to override the command via onCommand
+ for (Plugin p : getServer().getPluginManager().getPlugins())
+ {
+ if (p == this)
+ continue;
+
+ PluginDescriptionFile desc = p.getDescription();
+ if (desc == null)
+ continue;
+
+ if (desc.getName() == null)
+ continue;
+
+ if (!(desc.getCommands() instanceof Map))
+ continue;
+
+ Map<String, Object> cmds = (Map<String, Object>)desc.getCommands();
+ if (!cmds.containsKey(command.getName()))
+ continue;
+
+ PluginCommand pcmd = getServer().getPluginCommand(desc.getName() + ":" + commandLabel);
+
+ if (pcmd == null)
+ continue;
+
+ return getServer().getPluginCommand(p.getDescription().getName() + ":" + commandLabel).execute(sender, commandLabel, args);
+ }
+
+ try
+ {
+ previewCommand(sender, command, commandLabel, args);
+ User user = sender instanceof Player ? User.get(sender) : null;
+
+ // New mail notification
+ if (user != null && !Essentials.getSettings().isCommandDisabled("mail") && !commandLabel.equals("mail"))
+ {
+ List<String> mail = Essentials.readMail(user);
+ if (!mail.isEmpty()) user.sendMessage(ChatColor.RED + "You have " + mail.size() + " messages!§f Type §7/mail read§f to view your mail.");
+ }
+
+ // Check for disabled commands
+ if (Essentials.getSettings().isCommandDisabled(commandLabel)) return true;
+
+ IEssentialsCommand cmd;
+ try
+ {
+ cmd = (IEssentialsCommand)Essentials.class.getClassLoader().loadClass("com.earth2me.essentials.commands.Command" + command.getName()).newInstance();
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage(ChatColor.RED + "That command is improperly loaded.");
+ ex.printStackTrace();
+ return true;
+ }
+
+ // Check authorization
+ if (user != null && !user.isAuthorized(cmd))
+ {
+ logger.warning(user.getName() + " was denied access to command.");
+ user.sendMessage(ChatColor.RED + "You do not have access to that command.");
+ return true;
+ }
+
+ // Run the command
+ try
+ {
+ if (user == null)
+ cmd.run(getServer(), this, sender, commandLabel, command, args);
+ else
+ cmd.run(getServer(), this, user, commandLabel, command, args);
+ return true;
+ }
+ catch (Throwable ex)
+ {
+ sender.sendMessage(ChatColor.RED + "Error: " + ex.getMessage());
+ return true;
+ }
+ }
+ catch (Throwable ex)
+ {
+ ex.printStackTrace();
+ return true;
+ }
+ }
+
+ public void loadBanList()
+ {
+ //I don't like this but it needs to be done until CB fixors
+ File file = new File("banned-players.txt");
+ File ipFile = new File("banned-ips.txt");
+ try
+ {
+ if (!file.exists()) throw new FileNotFoundException("banned-players.txt not found");
+
+ BufferedReader rx = new BufferedReader(new FileReader(file));
+ bans.clear();
+ try
+ {
+ for (int i = 0; rx.ready(); i++)
+ {
+
+ String line = rx.readLine().trim().toLowerCase();
+ if (line.startsWith("#")) continue;
+ bans.add(line);
+
+ }
+ }
+ catch (IOException io)
+ {
+ logger.log(Level.SEVERE, "Error reading banned-players.txt", io);
+ }
+ }
+ catch (FileNotFoundException ex)
+ {
+ logger.log(Level.SEVERE, "Error reading banned-players.txt", ex);
+ }
+
+ try
+ {
+ if (!ipFile.exists()) throw new FileNotFoundException("banned-ips.txt not found");
+
+ BufferedReader rx = new BufferedReader(new FileReader(ipFile));
+ bannedIps.clear();
+ try
+ {
+ for (int i = 0; rx.ready(); i++)
+ {
+
+ String line = rx.readLine().trim().toLowerCase();
+ if (line.startsWith("#")) continue;
+ bannedIps.add(line);
+
+ }
+ }
+ catch (IOException io)
+ {
+ logger.log(Level.SEVERE, "Error reading banned-ips.txt", io);
+ }
+ }
+ catch (FileNotFoundException ex)
+ {
+ logger.log(Level.SEVERE, "Error reading banned-ips.txt", ex);
+ }
+ }
+
+ private void attachEcoListeners()
+ {
+ PluginManager pm = getServer().getPluginManager();
+ EssentialsEcoBlockListener blockListener = new EssentialsEcoBlockListener();
+ pm.registerEvent(Type.BLOCK_BREAK, blockListener, Priority.High, this);
+ pm.registerEvent(Type.SIGN_CHANGE, blockListener, Priority.Monitor, this);
+ }
+
+ public CraftScheduler getScheduler()
+ {
+ return (CraftScheduler)this.getServer().getScheduler();
+ }
+
+ public static Jail getJail()
+ {
+ return getStatic().jail;
+ }
+
+ public static Warps getWarps()
+ {
+ return getStatic().warps;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java
new file mode 100644
index 000000000..a52a6c225
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java
@@ -0,0 +1,214 @@
+package com.earth2me.essentials;
+
+import java.util.ArrayList;
+import org.bukkit.*;
+import org.bukkit.block.*;
+import org.bukkit.craftbukkit.block.CraftSign;
+import org.bukkit.event.block.*;
+
+
+public class EssentialsBlockListener extends BlockListener
+{
+ private final Essentials parent;
+ public final static ArrayList<Material> protectedBlocks = new ArrayList<Material>(4);
+
+ static
+ {
+ protectedBlocks.add(Material.CHEST);
+ protectedBlocks.add(Material.BURNING_FURNACE);
+ protectedBlocks.add(Material.FURNACE);
+ protectedBlocks.add(Material.DISPENSER);
+ }
+
+ public EssentialsBlockListener(Essentials parent)
+ {
+ this.parent = parent;
+ }
+
+ @Override
+ public void onBlockBreak(BlockBreakEvent event)
+ {
+ if (event.isCancelled()) return;
+ if (Essentials.getSettings().areSignsDisabled()) return;
+ User user = User.get(event.getPlayer());
+ if (protectedBlocks.contains(event.getBlock().getType()) && !user.isAuthorized("essentials.signs.protection.override"))
+ {
+ if (isBlockProtected(event.getBlock(), user))
+ {
+ event.setCancelled(true);
+ user.sendMessage("§cYou do not have permission to destroy that chest.");
+ return;
+ }
+ }
+
+ if (checkProtectionSign(event.getBlock(), user) == NOT_ALLOWED)
+ {
+ event.setCancelled(true);
+ user.sendMessage("§cYou do not have permission to destroy that sign.");
+ }
+ }
+
+ @Override
+ public void onSignChange(SignChangeEvent event)
+ {
+ if (event.isCancelled()) return;
+ if (Essentials.getSettings().areSignsDisabled()) return;
+ User user = User.get(event.getPlayer());
+
+ try
+ {
+ if (event.getLine(0).equalsIgnoreCase("[Protection]"))
+ {
+ Block block = event.getBlock();
+ if (user.isAuthorized("essentials.signs.protection.create") && hasAdjacentChest(block) && !isBlockProtected(block, user))
+ event.setLine(0, "§1[Protection]");
+ else
+ event.setLine(0, "§4[Protection]");
+ event.setLine(3, user.getName());
+ return;
+ }
+ if (event.getLine(0).equalsIgnoreCase("[Disposal]"))
+ {
+ if (user.isAuthorized("essentials.signs.disposal.create"))
+ event.setLine(0, "§1[Disposal]");
+ else
+ event.setLine(0, "§4[Disposal]");
+ return;
+ }
+ if (event.getLine(0).equalsIgnoreCase("[Heal]"))
+ {
+ if (user.isAuthorized("essentials.signs.heal.create"))
+ event.setLine(0, "§1[Heal]");
+ else
+ event.setLine(0, "§4[Heal]");
+ return;
+ }
+ if (event.getLine(0).equalsIgnoreCase("[Free]"))
+ {
+ event.setLine(0, "§4[Free]");
+ ItemDb.get(event.getLine(1));
+ if (user.isAuthorized("essentials.signs.free.create"))
+ event.setLine(0, "§1[Free]");
+ return;
+ }
+ if (event.getLine(0).equalsIgnoreCase("[Mail]"))
+ {
+ if (user.isAuthorized("essentials.signs.mail.create"))
+
+ event.setLine(0, "§1[Mail]");
+ else
+ event.setLine(0, "§4[Mail]");
+ return;
+ }
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ }
+ }
+
+ @Override
+ public void onBlockPlace(BlockPlaceEvent event) {
+ Block signBlock = event.getBlockAgainst();
+ if (signBlock.getType() == Material.WALL_SIGN || signBlock.getType() == Material.SIGN_POST) {
+ Sign sign = new CraftSign(signBlock);
+ if (sign.getLine(0).matches("§1\\[[a-zA-Z]+\\]")) {
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+
+
+
+ public boolean hasAdjacentChest(Block block)
+ {
+ Block[] faces = getAdjacentBlocks(block);
+ for (Block b : faces)
+ {
+ if (protectedBlocks.contains(b.getType()))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ private static final int NOT_ALLOWED = 0;
+ private static final int ALLOWED = 1;
+ private static final int NOSIGN = 2;
+
+ private static int checkProtectionSign(Block block, User user)
+ {
+ if (block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN)
+ {
+ Sign sign = new CraftSign(block);
+ if (sign.getLine(0).equalsIgnoreCase("§1[Protection]") && !user.isAuthorized("essentials.signs.protection.override"))
+ {
+ if (sign.getLine(1).equalsIgnoreCase(user.getName()))
+ {
+ return ALLOWED;
+ }
+ if (sign.getLine(2).equalsIgnoreCase(user.getName()))
+ {
+ return ALLOWED;
+ }
+ if (sign.getLine(3).equalsIgnoreCase(user.getName()))
+ {
+ return ALLOWED;
+ }
+ return NOT_ALLOWED;
+ }
+ }
+ return NOSIGN;
+ }
+
+ private static Block[] getAdjacentBlocks(Block block)
+ {
+ return new Block[]
+ {
+ block.getFace(BlockFace.NORTH),
+ block.getFace(BlockFace.SOUTH),
+ block.getFace(BlockFace.EAST),
+ block.getFace(BlockFace.WEST),
+ block.getFace(BlockFace.DOWN),
+ block.getFace(BlockFace.UP)
+ };
+ }
+
+ public static boolean isBlockProtected(Block block, User user)
+ {
+ Block[] faces = getAdjacentBlocks(block);
+ boolean protect = false;
+ for (Block b : faces)
+ {
+ int check = checkProtectionSign(b, user);
+ if (check == NOT_ALLOWED)
+ {
+ protect = true;
+ }
+ if (check == ALLOWED)
+ {
+ return false;
+ }
+
+ if (protectedBlocks.contains(b.getType()))
+ {
+ Block[] faceChest = getAdjacentBlocks(b);
+
+ for (Block a : faceChest)
+ {
+ check = checkProtectionSign(a, user);
+ if (check == NOT_ALLOWED)
+ {
+ protect = true;
+ }
+ if (check == ALLOWED)
+ {
+ return false;
+ }
+ }
+ }
+ }
+ return protect;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsConf.java b/Essentials/src/com/earth2me/essentials/EssentialsConf.java
new file mode 100644
index 000000000..616f39a6c
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/EssentialsConf.java
@@ -0,0 +1,120 @@
+package com.earth2me.essentials;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.util.config.Configuration;
+
+
+public class EssentialsConf extends Configuration
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private File configFile;
+ private String templateName = null;
+ private Class<?> resourceClass = EssentialsConf.class;
+
+ public EssentialsConf(File configFile)
+ {
+ super(configFile);
+ this.configFile = configFile;
+ if (this.root == null) {
+ this.root = new HashMap<String, Object>();
+ }
+ }
+
+ @Override
+ public void load()
+ {
+ configFile = configFile.getAbsoluteFile();
+ if (!configFile.getParentFile().exists())
+ {
+ configFile.getParentFile().mkdirs();
+ }
+ if (!configFile.exists())
+ {
+ if (templateName != null)
+ {
+ logger.log(Level.INFO, "Creating config from template: " + configFile.toString());
+ createFromTemplate();
+ }
+ else
+ {
+ try
+ {
+ logger.log(Level.INFO, "Creating empty config: " + configFile.toString());
+ configFile.createNewFile();
+ }
+ catch (IOException ex)
+ {
+ logger.log(Level.SEVERE, "Failed to create config " + configFile.toString(), ex);
+ }
+ }
+ }
+ super.load();
+ if (this.root == null) {
+ this.root = new HashMap<String, Object>();
+ }
+ }
+
+ private void createFromTemplate()
+ {
+ OutputStream ostr = null;
+ try
+ {
+ InputStream istr = resourceClass.getResourceAsStream(templateName);
+ if (istr == null)
+ {
+ logger.log(Level.SEVERE, "Could not find template " + templateName);
+ return;
+ }
+ ostr = new FileOutputStream(configFile);
+ byte[] buffer = new byte[1024];
+ int length = 0;
+ length = istr.read(buffer);
+ while (length > 0)
+ {
+ ostr.write(buffer, 0, length);
+ length = istr.read(buffer);
+ }
+ ostr.close();
+ istr.close();
+ }
+ catch (IOException ex)
+ {
+ logger.log(Level.SEVERE, "Failed to write config " + configFile.toString(), ex);
+ return;
+ }
+ finally
+ {
+ try
+ {
+ ostr.close();
+ }
+ catch (IOException ex)
+ {
+ logger.log(Level.SEVERE, "Failed to close config " + configFile.toString(), ex);
+ return;
+ }
+ }
+ }
+
+ public void setTemplateName(String templateName)
+ {
+ this.templateName = templateName;
+ }
+
+ public File getFile()
+ {
+ return configFile;
+ }
+
+ public void setTemplateName(String templateName, Class<?> resClass) {
+ this.templateName = templateName;
+ this.resourceClass = resClass;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEcoBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEcoBlockListener.java
new file mode 100644
index 000000000..885985ebc
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/EssentialsEcoBlockListener.java
@@ -0,0 +1,159 @@
+package com.earth2me.essentials;
+
+import org.bukkit.Material;
+import org.bukkit.block.Sign;
+import org.bukkit.craftbukkit.block.CraftSign;
+import org.bukkit.craftbukkit.inventory.CraftInventory;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockListener;
+import org.bukkit.event.block.SignChangeEvent;
+import org.bukkit.inventory.ItemStack;
+
+
+public class EssentialsEcoBlockListener extends BlockListener
+{
+ @Override
+ public void onBlockBreak(BlockBreakEvent event)
+ {
+ if (event.isCancelled()) return;
+ if (Essentials.getSettings().areSignsDisabled()) return;
+ User user = User.get(event.getPlayer());
+ if (event.getBlock().getType() != Material.WALL_SIGN && event.getBlock().getType() != Material.SIGN_POST)
+ return;
+ Sign sign = new CraftSign(event.getBlock());
+
+ if (sign.getLine(0).equals("§1[Trade]"))
+ {
+ if (!sign.getLine(3).substring(2).equals(user.getName())) {
+ if (!user.isOp()) {
+ event.setCancelled(true);
+ }
+ return;
+ }
+ try
+ {
+ String[] l1 = sign.getLines()[1].split("[ :-]+");
+ String[] l2 = sign.getLines()[2].split("[ :-]+");
+ boolean m1 = l1[0].matches("\\$[0-9]+");
+ boolean m2 = l2[0].matches("\\$[0-9]+");
+ int q1 = Integer.parseInt(m1 ? l1[0].substring(1) : l1[0]);
+ int q2 = Integer.parseInt(m2 ? l2[0].substring(1) : l2[0]);
+ int r1 = Integer.parseInt(l1[m1 ? 1 : 2]);
+ int r2 = Integer.parseInt(l2[m2 ? 1 : 2]);
+ if (q1 < 1 || q2 < 1) throw new Exception("Quantities must be greater than 0.");
+
+ ItemStack i1 = m1 || r1 <= 0 ? null : ItemDb.get(l1[1], r1);
+ ItemStack i2 = m2 || r2 <= 0 ? null : ItemDb.get(l2[1], r2);
+
+ if (m1)
+ user.giveMoney(r1);
+ else if (i1 != null)
+ user.getWorld().dropItem(user.getLocation(), i1);
+
+ if (m2)
+ user.giveMoney(r2);
+ else if (i2 != null)
+ user.getWorld().dropItem(user.getLocation(), i2);
+
+ sign.setType(Material.AIR);
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ }
+ return;
+ }
+ }
+
+ @Override
+ public void onSignChange(SignChangeEvent event)
+ {
+ if (Essentials.getSettings().areSignsDisabled()) return;
+ User user = User.get(event.getPlayer());
+
+ if (event.getLine(0).equalsIgnoreCase("[Buy]") && user.isAuthorized("essentials.signs.buy.create"))
+ {
+ try
+ {
+ event.setLine(0, "§1[Buy]");
+ event.setLine(1, "" + Math.abs(Integer.parseInt(event.getLine(1))));
+ ItemDb.get(event.getLine(2));
+ event.setLine(3, "$" + Integer.parseInt(event.getLine(3).replaceAll("[^0-9]", "")));
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ event.setLine(0, "§4[Buy]");
+ event.setLine(1, "#");
+ event.setLine(2, "Item");
+ event.setLine(3, "$Price");
+ }
+ return;
+ }
+
+ if (event.getLine(0).equalsIgnoreCase("[Sell]") && user.isAuthorized("essentials.signs.sell.create"))
+ {
+ try
+ {
+ event.setLine(0, "§1[Sell]");
+ event.setLine(1, "" + Math.abs(Integer.parseInt(event.getLine(1))));
+ ItemDb.get(event.getLine(2));
+ event.setLine(3, "$" + Integer.parseInt(event.getLine(3).replaceAll("[^0-9]", "")));
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ event.setLine(0, "§4[Sell]");
+ event.setLine(1, "#");
+ event.setLine(2, "Item");
+ event.setLine(3, "$Price");
+ }
+ return;
+ }
+
+ if (event.getLine(0).equalsIgnoreCase("[Trade]") && user.isAuthorized("essentials.signs.trade.create"))
+ {
+ try
+ {
+ String[] l1 = event.getLines()[1].split("[ :-]+");
+ String[] l2 = event.getLines()[2].split("[ :-]+");
+ boolean m1 = l1[0].matches("\\$[0-9]+");
+ boolean m2 = l2[0].matches("\\$[0-9]+");
+ int q1 = Integer.parseInt(m1 ? l1[0].substring(1) : l1[0]);
+ int q2 = Integer.parseInt(m2 ? l2[0].substring(1) : l2[0]);
+ int r2 = Integer.parseInt(l2[m2 ? 1 : 2]);
+ r2 = r2 - r2 % q2;
+ if (q1 < 1 || q2 < 1 || r2 < 1) throw new Exception("Quantities must be greater than 0.");
+ if (!m1) ItemDb.get(l1[1]);
+
+ if (m2)
+ {
+ if (user.getMoney() < r2) throw new Exception("You do not have sufficient funds.");
+ user.takeMoney(r2);
+ user.sendMessage("r2: " + r2 + " q2: " + q2);
+ }
+ else
+ {
+ ItemStack i2 = ItemDb.get(l2[1], r2);
+ if (!InventoryWorkaround.containsItem((CraftInventory)user.getInventory(), true, i2)) throw new Exception("You do not have " + r2 + "x " + l2[1] + ".");
+ InventoryWorkaround.removeItem((CraftInventory)user.getInventory(), true, i2);
+ user.updateInventory();
+ }
+
+ event.setLine(0, "§1[Trade]");
+ event.setLine(1, (m1 ? "$" + q1 : q1 + " " + l1[1]) + ":0");
+ event.setLine(2, (m2 ? "$" + q2 : q2 + " " + l2[1]) + ":" + r2);
+ event.setLine(3, "§8" + user.getName());
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ event.setLine(0, "§4[Trade]");
+ event.setLine(1, "# ItemOr$");
+ event.setLine(2, "# ItemOr$:#");
+ event.setLine(3, "§8" + user.getName());
+ }
+ return;
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java
new file mode 100644
index 000000000..15355021a
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java
@@ -0,0 +1,65 @@
+package com.earth2me.essentials;
+
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.event.entity.EntityCombustEvent;
+import org.bukkit.event.entity.EntityDamageByBlockEvent;
+import org.bukkit.event.entity.EntityDamageByProjectileEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDeathEvent;
+import org.bukkit.event.entity.EntityListener;
+
+
+public class EssentialsEntityListener extends EntityListener
+{
+ private final Server server;
+ private final Essentials parent;
+
+ public EssentialsEntityListener(Essentials parent)
+ {
+ this.parent = parent;
+ this.server = parent.getServer();
+ }
+
+ @Override
+ public void onEntityDamage(EntityDamageEvent event)
+ {
+ if (event instanceof EntityDamageEvent || event instanceof EntityDamageByBlockEvent || event instanceof EntityDamageByProjectileEvent)
+ {
+
+ if (event.getEntity() instanceof Player && User.get(event.getEntity()).isGodModeEnabled())
+ {
+ CraftPlayer player = (CraftPlayer)event.getEntity();
+ player.getHandle().fireTicks = 0;
+ player.setRemainingAir(player.getMaximumAir());
+ event.setCancelled(true);
+ }
+ }
+ }
+
+
+ @Override
+ public void onEntityCombust(EntityCombustEvent event)
+ {
+ if (event.getEntity() instanceof Player && User.get(event.getEntity()).isGodModeEnabled())
+ {
+ event.setCancelled(true);
+ }
+ }
+
+ @Override
+ public void onEntityDeath(EntityDeathEvent event)
+ {
+ if (event.getEntity() instanceof Player)
+ {
+ User user = User.get(event.getEntity());
+ if(user.isAuthorized("essentials.back.ondeath"))
+ {
+ user.lastLocation = user.getLocation();
+ user.sendMessage("§7Use the /back command to return to your death point");
+ }
+ }
+ }
+
+}
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
new file mode 100644
index 000000000..58cddcacd
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
@@ -0,0 +1,452 @@
+package com.earth2me.essentials;
+
+import java.util.List;
+import java.util.logging.Logger;
+import net.minecraft.server.InventoryPlayer;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.block.Sign;
+import org.bukkit.craftbukkit.block.CraftSign;
+import org.bukkit.craftbukkit.inventory.CraftInventory;
+import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
+import org.bukkit.event.player.*;
+import org.bukkit.event.player.PlayerLoginEvent.Result;
+import org.bukkit.inventory.ItemStack;
+
+
+public class EssentialsPlayerListener extends PlayerListener
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private final Server server;
+ private final Essentials parent;
+
+ public EssentialsPlayerListener(Essentials parent)
+ {
+ this.parent = parent;
+ this.server = parent.getServer();
+ }
+
+ private void onPlayerInteractEco(PlayerInteractEvent event)
+ {
+ if (Essentials.getSettings().areSignsDisabled()) return;
+ User user = User.get(event.getPlayer());
+ if (event.getClickedBlock().getType() != Material.WALL_SIGN && event.getClickedBlock().getType() != Material.SIGN_POST)
+ return;
+ Sign sign = new CraftSign(event.getClickedBlock());
+
+ if (sign.getLine(0).equals("§1[Buy]") && user.isAuthorized("essentials.signs.buy.use"))
+ {
+ try
+ {
+ int amount = Integer.parseInt(sign.getLine(1));
+ ItemStack item = ItemDb.get(sign.getLine(2), amount);
+ int cost = Integer.parseInt(sign.getLine(3).substring(1));
+ if (user.getMoney() < cost) throw new Exception("You do not have sufficient funds.");
+ user.takeMoney(cost);
+ user.getInventory().addItem(item);
+ user.updateInventory();
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ }
+ return;
+ }
+
+ if (sign.getLine(0).equals("§1[Sell]") && user.isAuthorized("essentials.signs.sell.use"))
+ {
+ try
+ {
+ int amount = Integer.parseInt(sign.getLine(1));
+ ItemStack item = ItemDb.get(sign.getLine(2), amount);
+ int cost = Integer.parseInt(sign.getLine(3).substring(1));
+ if (!InventoryWorkaround.containsItem((CraftInventory)user.getInventory(), true, item)) throw new Exception("You do not have enough items to sell.");
+ user.giveMoney(cost);
+ InventoryWorkaround.removeItem((CraftInventory)user.getInventory(), true, item);
+ user.updateInventory();
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ }
+ return;
+ }
+
+ if (sign.getLine(0).equals("§1[Trade]") && user.isAuthorized("essentials.signs.trade.use"))
+ {
+ try
+ {
+ String[] l1 = sign.getLines()[1].split("[ :-]+");
+ String[] l2 = sign.getLines()[2].split("[ :-]+");
+ boolean m1 = l1[0].matches("\\$[0-9]+");
+ boolean m2 = l2[0].matches("\\$[0-9]+");
+ int q1 = Integer.parseInt(m1 ? l1[0].substring(1) : l1[0]);
+ int q2 = Integer.parseInt(m2 ? l2[0].substring(1) : l2[0]);
+ int r1 = Integer.parseInt(l1[m1 ? 1 : 2]);
+ int r2 = Integer.parseInt(l2[m2 ? 1 : 2]);
+ r1 = r1 - r1 % q1;
+ r2 = r2 - r2 % q2;
+ if (q1 < 1 || q2 < 1) throw new Exception("Quantities must be greater than 0.");
+
+ ItemStack i1 = m1 || r1 <= 0 ? null : ItemDb.get(l1[1], r1);
+ ItemStack qi1 = m1 ? null : ItemDb.get(l1[1], q1);
+ ItemStack qi2 = m2 ? null : ItemDb.get(l2[1], q2);
+
+ if (user.getName().equals(sign.getLines()[3].substring(2)))
+ {
+ if (m1)
+ {
+ user.giveMoney(r1);
+ }
+ else if (i1 != null)
+ {
+ user.getInventory().addItem(i1);
+ user.updateInventory();
+ }
+ r1 = 0;
+ sign.setLine(1, (m1 ? "$" + q1 : q1 + " " + l1[1]) + ":" + r1);
+ }
+ else
+ {
+ if (m1)
+ {
+ if (user.getMoney() < q1)
+ throw new Exception("You do not have sufficient funds.");
+ }
+ else
+ {
+ if (!InventoryWorkaround.containsItem((CraftInventory)user.getInventory(), true, qi1))
+ throw new Exception("You do not have " + q1 + "x " + l1[1] + ".");
+ }
+
+ if (r2 < q2) throw new Exception("The trade sign does not have enough supply left.");
+
+ if (m1)
+ user.takeMoney(q1);
+ else
+ InventoryWorkaround.removeItem((CraftInventory)user.getInventory(), true, qi1);
+
+ if (m2)
+ user.giveMoney(q2);
+ else
+ user.getInventory().addItem(qi2);
+
+ user.updateInventory();
+
+ r1 += q1;
+ r2 -= q2;
+
+ sign.setLine(0, "§1[Trade]");
+ sign.setLine(1, (m1 ? "$" + q1 : q1 + " " + l1[1]) + ":" + r1);
+ sign.setLine(2, (m2 ? "$" + q2 : q2 + " " + l2[1]) + ":" + r2);
+
+ user.sendMessage("§7Trade completed.");
+ }
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ }
+ return;
+ }
+ }
+
+ @Override
+ public void onPlayerInteract(PlayerInteractEvent event)
+ {
+ if (event.isCancelled()) return;
+ User user = User.get(event.getPlayer());
+ if (user.isJailed())
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ onPlayerInteractEco(event);
+ onPlayerInteractSigns(event);
+
+ if (!Essentials.getSettings().areSignsDisabled() && EssentialsBlockListener.protectedBlocks.contains(event.getClickedBlock().getType()))
+ {
+ if (!user.isAuthorized("essentials.signs.protection.override"))
+ {
+ if (EssentialsBlockListener.isBlockProtected(event.getClickedBlock(), user))
+ {
+ event.setCancelled(true);
+ user.sendMessage("§cYou do not have permission to access that chest.");
+ return;
+ }
+ }
+ }
+
+ if (Essentials.getSettings().getBedSetsHome() && event.getClickedBlock().getType() == Material.BED_BLOCK)
+ {
+ try
+ {
+ user.setHome();
+ user.sendMessage("§7Your home is now set to this bed.");
+ }
+ catch (Throwable ex)
+ {
+ }
+ }
+ }
+
+ private void onPlayerInteractSigns(PlayerInteractEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (user.isJailed()) return;
+ if (Essentials.getSettings().areSignsDisabled()) return;
+ if (event.getClickedBlock().getType() != Material.WALL_SIGN && event.getClickedBlock().getType() != Material.SIGN_POST)
+ return;
+ Sign sign = new CraftSign(event.getClickedBlock());
+
+ try
+ {
+ if (sign.getLine(0).equals("§1[Free]") && user.isAuthorized("essentials.signs.free.use"))
+ {
+ ItemStack item = ItemDb.get(sign.getLine(1));
+ CraftInventoryPlayer inv = new CraftInventoryPlayer(new InventoryPlayer(user.getHandle()));
+ inv.clear();
+ item.setAmount(9 * 4 * 64);
+ inv.addItem(item);
+ user.showInventory(inv);
+ return;
+ }
+ if (sign.getLine(0).equals("§1[Disposal]") && user.isAuthorized("essentials.signs.disposal.use"))
+ {
+ CraftInventoryPlayer inv = new CraftInventoryPlayer(new InventoryPlayer(user.getHandle()));
+ inv.clear();
+ user.showInventory(inv);
+ return;
+ }
+ if (sign.getLine(0).equals("§1[Heal]") && user.isAuthorized("essentials.signs.heal.use"))
+ {
+ user.setHealth(20);
+ user.sendMessage("§7You have been healed.");
+ return;
+ }
+ if (sign.getLine(0).equals("§1[Mail]") && user.isAuthorized("essentials.signs.mail.use") && user.isAuthorized("essentials.mail"))
+ {
+ List<String> mail = Essentials.readMail(user);
+ if (mail.isEmpty())
+ {
+ user.sendMessage("§cYou do not have any mail!");
+ return;
+ }
+ for (String s : mail) user.sendMessage(s);
+ user.sendMessage("§cTo mark your mail as read, type §c/mail clear");
+ return;
+ }
+ }
+ catch (Throwable ex)
+ {
+ user.sendMessage("§cError: " + ex.getMessage());
+ }
+ }
+
+ @Override
+ public void onPlayerRespawn(PlayerRespawnEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ user.setDisplayName(user.getNick());
+ updateCompass(user);
+ }
+
+ @Override
+ public void onPlayerChat(PlayerChatEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (user.isMuted())
+ {
+ event.setCancelled(true);
+ logger.info(user.getName() + " tried to speak, but is muted.");
+ }
+ }
+
+ @Override
+ public void onPlayerMove(PlayerMoveEvent event)
+ {
+ if (event.isCancelled()) return;
+ final User user = User.get(event.getPlayer());
+
+ if (!Essentials.getSettings().getNetherPortalsEnabled()) return;
+
+ final Block block = event.getPlayer().getWorld().getBlockAt(event.getTo().getBlockX(), event.getTo().getBlockY(), event.getTo().getBlockZ());
+ List<World> worlds = server.getWorlds();
+
+ if (block.getType() == Material.PORTAL && worlds.size() > 1 && user.isAuthorized("essentials.portal"))
+ {
+ if (user.getJustPortaled()) return;
+
+ Location loc = event.getTo();
+ final World world = worlds.get(user.getWorld() == worlds.get(0) ? 1 : 0);
+
+ double factor;
+ if (user.getWorld().getEnvironment() == World.Environment.NETHER && world.getEnvironment() == World.Environment.NORMAL)
+ factor = 16.0;
+ else if (user.getWorld().getEnvironment() != world.getEnvironment())
+ factor = 1.0 / 16.0;
+ else
+ factor = 1.0;
+
+ int x = loc.getBlockX();
+ int y = loc.getBlockY();
+ int z = loc.getBlockZ();
+
+ if (user.getWorld().getBlockAt(x, y, z - 1).getType() == Material.PORTAL)
+ z--;
+ if (user.getWorld().getBlockAt(x - 1, y, z).getType() == Material.PORTAL)
+ x--;
+
+ x = (int)(x * factor);
+ z = (int)(z * factor);
+ loc = new Location(world, x + .5, y, z + .5);
+
+ Block dest = world.getBlockAt(x, y, z);
+ NetherPortal portal = NetherPortal.findPortal(dest);
+ if (portal == null)
+ {
+ if (world.getEnvironment() == World.Environment.NETHER || Essentials.getSettings().getGenerateExitPortals())
+ {
+ portal = NetherPortal.createPortal(dest);
+ logger.info(event.getPlayer().getName() + " used a portal and generated an exit portal.");
+ user.sendMessage("§7Generating an exit portal.");
+ loc = portal.getSpawn();
+ }
+ }
+ else
+ {
+ logger.info(event.getPlayer().getName() + " used a portal and used an existing exit portal.");
+ user.sendMessage("§7Teleporting via portal to an existing portal.");
+ loc = portal.getSpawn();
+ }
+
+ event.setFrom(loc);
+ event.setTo(loc);
+ try
+ {
+ user.teleportToNow(loc);
+ }
+ catch (Exception ex)
+ {
+ user.sendMessage(ex.getMessage());
+ }
+ user.setJustPortaled(true);
+ user.sendMessage("§7Teleporting via portal.");
+
+ event.setCancelled(true);
+ return;
+ }
+
+ user.setJustPortaled(false);
+ }
+
+ @Override
+ public void onPlayerQuit(PlayerQuitEvent event)
+ {
+ if (!Essentials.getSettings().getReclaimSetting())
+ return;
+
+ User.get(event.getPlayer()).dispose();
+ Thread thread = new Thread(new Runnable()
+ {
+ @SuppressWarnings("LoggerStringConcat")
+ public void run()
+ {
+ try
+ {
+ Thread.sleep(1000);
+ Runtime rt = Runtime.getRuntime();
+ double mem = rt.freeMemory();
+ rt.runFinalization();
+ rt.gc();
+ mem = rt.freeMemory() - mem;
+ mem /= 1024 * 1024;
+ logger.info("Freed " + mem + " MB.");
+ }
+ catch (InterruptedException ex)
+ {
+ return;
+ }
+ }
+ });
+ thread.setPriority(Thread.MIN_PRIORITY);
+ thread.start();
+ }
+
+ @Override
+ public void onPlayerJoin(PlayerJoinEvent event)
+ {
+ Essentials.getStatic().backup.onPlayerJoin();
+ User user = User.get(event.getPlayer());
+
+ //we do not know the ip address on playerlogin so we need to do this here.
+ if (user.isIpBanned())
+ {
+ user.kickPlayer("The Ban Hammer has spoken!");
+ return;
+ }
+
+ user.setDisplayName(user.getNick());
+
+ if (!Essentials.getSettings().isCommandDisabled("motd") && user.isAuthorized("essentials.motd"))
+ {
+ for (String m : parent.getMotd(user, null))
+ {
+ if (m == null) continue;
+ user.sendMessage(m);
+ }
+ }
+
+ if (!Essentials.getSettings().isCommandDisabled("mail"))
+ {
+ List<String> mail = Essentials.readMail(user);
+ if (mail.isEmpty()) user.sendMessage("§7You have no new mail.");
+ else user.sendMessage("§cYou have " + mail.size() + " messages!§f Type §7/mail read§f to view your mail.");
+ }
+ }
+
+ @Override
+ public void onPlayerLogin(PlayerLoginEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (event.getResult() != Result.ALLOWED)
+ return;
+
+ if (user.isBanned())
+ {
+ event.disallow(Result.KICK_BANNED, "The Ban Hammer has spoken!");
+ return;
+ }
+
+ if (server.getOnlinePlayers().length >= server.getMaxPlayers() && !user.isOp())
+ {
+ event.disallow(Result.KICK_FULL, "Server is full");
+ return;
+ }
+
+ updateCompass(user);
+ }
+
+ private void updateCompass(User user)
+ {
+ try
+ {
+ if (server.getPluginManager().isPluginEnabled("EssentialsHome"))
+ user.setCompassTarget(user.getHome());
+ }
+ catch (Throwable ex)
+ {
+ }
+ }
+
+ @Override
+ public void onPlayerTeleport(PlayerTeleportEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (user.currentJail == null || user.currentJail.isEmpty())
+ return;
+ event.setCancelled(true);
+ user.sendMessage(ChatColor.RED + "You do the crime, you do the time.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/IConf.java b/Essentials/src/com/earth2me/essentials/IConf.java
new file mode 100644
index 000000000..a523f8638
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/IConf.java
@@ -0,0 +1,5 @@
+package com.earth2me.essentials;
+
+public interface IConf {
+ public void reloadConfig();
+}
diff --git a/Essentials/src/com/earth2me/essentials/InventoryWorkaround.java b/Essentials/src/com/earth2me/essentials/InventoryWorkaround.java
new file mode 100644
index 000000000..aabd7b02b
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/InventoryWorkaround.java
@@ -0,0 +1,136 @@
+package com.earth2me.essentials;
+
+import java.util.HashMap;
+import org.bukkit.craftbukkit.inventory.CraftInventory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.inventory.ItemStack;
+
+/*
+ * This class can be removed when
+ * https://github.com/Bukkit/CraftBukkit/pull/193
+ * is accepted to CraftBukkit
+ */
+public class InventoryWorkaround {
+
+ public static int first(CraftInventory ci, ItemStack item, boolean forceDurability, boolean forceAmount) {
+ return next(ci, item, 0, forceDurability, forceAmount);
+ }
+
+ public static int next(CraftInventory ci, ItemStack item, int start, boolean forceDurability, boolean forceAmount) {
+ CraftItemStack[] inventory = ci.getContents();
+ for (int i = start; i < inventory.length; i++) {
+ CraftItemStack cItem = inventory[i];
+ if (item.getTypeId() == cItem.getTypeId() && (!forceAmount || item.getAmount() == cItem.getAmount()) && (!forceDurability || cItem.getDurability() == item.getDurability())) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static HashMap<Integer, ItemStack> removeItem(CraftInventory ci, boolean forceDurability, ItemStack... items) {
+ HashMap<Integer, ItemStack> leftover = new HashMap<Integer, ItemStack>();
+
+ // TODO: optimization
+
+ for (int i = 0; i < items.length; i++) {
+ ItemStack item = items[i];
+ if (item == null) {
+ continue;
+ }
+ int toDelete = item.getAmount();
+
+ while (true) {
+
+ // Bail when done
+ if (toDelete <= 0) {
+ break;
+ }
+
+ // get first Item, ignore the amount
+ int first = first(ci, item, forceDurability, false);
+
+ // Drat! we don't have this type in the inventory
+ if (first == -1) {
+ item.setAmount(toDelete);
+ leftover.put(i, item);
+ break;
+ } else {
+ CraftItemStack itemStack = ci.getItem(first);
+ int amount = itemStack.getAmount();
+
+ if (amount <= toDelete) {
+ toDelete -= amount;
+ // clear the slot, all used up
+ ci.clear(first);
+ } else {
+ // split the stack and store
+ itemStack.setAmount(amount - toDelete);
+ ci.setItem(first, itemStack);
+ toDelete = 0;
+ }
+ }
+ }
+ }
+ return leftover;
+ }
+
+ public static boolean containsItem(CraftInventory ci, boolean forceDurability, ItemStack... items) {
+ HashMap<Integer, ItemStack> leftover = new HashMap<Integer, ItemStack>();
+
+ // TODO: optimization
+
+ // combine items
+
+ ItemStack[] combined = new ItemStack[items.length];
+ for (int i = 0; i < items.length; i++) {
+ if (items[i] == null) {
+ continue;
+ }
+ for (int j = 0; j < combined.length; j++) {
+ if (combined[j] == null) {
+ combined[j] = new ItemStack(items[i].getType(), items[i].getAmount(), items[i].getDurability());
+ break;
+ }
+ if (combined[j].getTypeId() == items[i].getTypeId() && (!forceDurability || combined[j].getDurability() == items[i].getDurability())) {
+ combined[j].setAmount(combined[j].getAmount() + items[i].getAmount());
+ break;
+ }
+ }
+ }
+
+ for (int i = 0; i < combined.length; i++) {
+ ItemStack item = combined[i];
+ if (item == null) {
+ continue;
+ }
+ int mustHave = item.getAmount();
+ int position = 0;
+
+ while (true) {
+ // Bail when done
+ if (mustHave <= 0) {
+ break;
+ }
+
+ int slot = next(ci, item, position, forceDurability, false);
+
+ // Drat! we don't have this type in the inventory
+ if (slot == -1) {
+ leftover.put(i, item);
+ break;
+ } else {
+ CraftItemStack itemStack = ci.getItem(slot);
+ int amount = itemStack.getAmount();
+
+ if (amount <= mustHave) {
+ mustHave -= amount;
+ } else {
+ mustHave = 0;
+ }
+ position = slot + 1;
+ }
+ }
+ }
+ return leftover.isEmpty();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/ItemDb.java b/Essentials/src/com/earth2me/essentials/ItemDb.java
new file mode 100644
index 000000000..8c3c47bab
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/ItemDb.java
@@ -0,0 +1,110 @@
+package com.earth2me.essentials;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+import java.util.logging.Logger;
+import org.bukkit.inventory.ItemStack;
+
+
+public class ItemDb
+{
+ private final static Logger logger = Logger.getLogger("Minecraft");
+ private static Map<String, Integer> items = new HashMap<String, Integer>();
+ private static Map<String, Short> durabilities = new HashMap<String, Short>();
+
+ @SuppressWarnings("LoggerStringConcat")
+ public static void load(File folder, String fname) throws IOException
+ {
+ folder.mkdirs();
+ File file = new File(folder, fname);
+
+ if (!file.exists())
+ {
+ file.createNewFile();
+ InputStream res = ItemDb.class.getResourceAsStream("/items.csv");
+ FileWriter tx = new FileWriter(file);
+ try
+ {
+ for (int i = 0; (i = res.read()) > 0;) tx.write(i);
+ }
+ finally
+ {
+ try
+ {
+ tx.flush();
+ tx.close();
+ res.close();
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+ }
+
+ BufferedReader rx = new BufferedReader(new FileReader(file));
+ try
+ {
+ items.clear();
+
+ for (int i = 0; rx.ready(); i++)
+ {
+ try
+ {
+ String line = rx.readLine().trim().toLowerCase();
+ if (line.startsWith("#"))
+ continue;
+
+ String[] parts = line.split("[^a-z0-9]");
+ if (parts.length < 2)
+ continue;
+
+ int numeric = Integer.parseInt(parts[1]);
+
+ durabilities.put(parts[0], parts.length > 2 && !parts[2].equals("0") ? Short.parseShort(parts[2]) : 0);
+ items.put(parts[0], numeric);
+ }
+ catch (Exception ex)
+ {
+ logger.warning("Error parsing " + fname + " on line " + i);
+ }
+ }
+ }
+ finally
+ {
+ rx.close();
+ }
+ }
+
+ public static ItemStack get(String id, int quantity) throws Exception {
+ ItemStack retval = get(id);
+ retval.setAmount(quantity);
+ return retval;
+ }
+
+ public static ItemStack get(String id) throws Exception
+ {
+ ItemStack retval = new ItemStack(getUnsafe(id));
+ retval.setAmount(Essentials.getSettings().getDefaultStackSize());
+ retval.setDurability(durabilities.containsKey(id) ? durabilities.get(id) : 0);
+ if (items.containsValue(retval.getTypeId()) || true) return retval;
+ throw new Exception("Unknown item numeric: " + retval);
+ }
+
+ private static int getUnsafe(String id) throws Exception
+ {
+ try
+ {
+ return Integer.parseInt(id);
+ }
+ catch (NumberFormatException ex)
+ {
+ if (items.containsKey(id)) return items.get(id);
+ throw new Exception("Unknown item name: " + id);
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/Jail.java b/Essentials/src/com/earth2me/essentials/Jail.java
new file mode 100644
index 000000000..5e0dd87ee
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Jail.java
@@ -0,0 +1,117 @@
+package com.earth2me.essentials;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockDamageEvent;
+import org.bukkit.event.block.BlockListener;
+import org.bukkit.event.block.BlockPlaceEvent;
+
+
+public class Jail extends BlockListener implements IConf
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private EssentialsConf config;
+
+ public Jail(File dataFolder)
+ {
+ config = new EssentialsConf(new File(dataFolder, "jail.yml"));
+ config.load();
+ }
+
+ public void setJail(Location loc, String jailName) throws Exception
+ {
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("world", loc.getWorld().getName());
+ map.put("x", loc.getX());
+ map.put("y", loc.getY());
+ map.put("z", loc.getZ());
+ map.put("yaw", loc.getYaw());
+ map.put("pitch", loc.getPitch());
+ config.setProperty(jailName.toLowerCase(), map);
+ config.save();
+ }
+
+ public Location getJail(String jailName) throws Exception
+ {
+ if (config.getProperty(jailName.toLowerCase()) == null)
+ {
+ throw new Exception("That jail does not exist");
+ }
+
+ World jWorld = null;
+ String world = config.getString(jailName + ".world", ""); // wh.spawnX
+ double x = config.getDouble(jailName + ".x", 0); // wh.spawnX
+ double y = config.getDouble(jailName + ".y", 0); // wh.spawnY
+ double z = config.getDouble(jailName + ".z", 0); // wh.spawnZ
+ float yaw = (float)config.getDouble(jailName + ".yaw", 0);
+ float pitch = (float)config.getDouble(jailName + ".pitch", 0);
+ for (World w : Essentials.getStatic().getServer().getWorlds())
+ {
+ if (w.getName().equalsIgnoreCase(world))
+ {
+ jWorld = w;
+ break;
+ }
+
+ }
+ return new Location(jWorld, x, y, z, yaw, pitch);
+ }
+
+ public void sendToJail(User user, String jail) throws Exception
+ {
+ user.teleport(getJail(jail));
+ user.currentJail = jail;
+ }
+
+ public void delJail(String jail) throws Exception
+ {
+ config.removeProperty(jail.toLowerCase());
+ config.save();
+ }
+
+ public List<String> getJails() throws Exception
+ {
+ return config.getKeys(null);
+ }
+
+ public void reloadConfig()
+ {
+ config.load();
+ }
+
+ @Override
+ public void onBlockBreak(BlockBreakEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (user.isJailed())
+ {
+ event.setCancelled(true);
+ }
+ }
+
+ @Override
+ public void onBlockPlace(BlockPlaceEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (user.isJailed())
+ {
+ event.setCancelled(true);
+ }
+ }
+
+ @Override
+ public void onBlockDamage(BlockDamageEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ if (user.isJailed())
+ {
+ event.setCancelled(true);
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/Mob.java b/Essentials/src/com/earth2me/essentials/Mob.java
new file mode 100644
index 000000000..3c0d9bd1e
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Mob.java
@@ -0,0 +1,122 @@
+package com.earth2me.essentials;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.logging.Logger;
+import net.minecraft.server.Entity;
+import net.minecraft.server.WorldServer;
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.entity.CraftEntity;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.Player;
+
+
+public enum Mob
+{
+ CHICKEN("Chicken", Enemies.FRIENDLY),
+ COW("Cow", Enemies.FRIENDLY),
+ CREEPER("Creeper", Enemies.ENEMY),
+ GHAST("Ghast", Enemies.ENEMY),
+ GIANT("Giant", "GiantZombie", Enemies.ENEMY),
+ PIG("Pig", Enemies.FRIENDLY),
+ PIGZOMB("PigZombie", Enemies.NEUTRAL),
+ SHEEP("Sheep", Enemies.FRIENDLY, ""),
+ SKELETON("Skeleton", Enemies.ENEMY),
+ SLIME("Slime", Enemies.ENEMY),
+ SPIDER("Spider", Enemies.ENEMY),
+ SQUID("Squid", Enemies.FRIENDLY),
+ ZOMBIE("Zombie", Enemies.ENEMY),
+ MONSTER("Monster", Enemies.ENEMY);
+
+ public static final Logger logger = Logger.getLogger("Minecraft");
+
+ private Mob(String n, Enemies en, String s)
+ {
+ this.s = s;
+ this.name = n;
+ this.craftClass = n;
+ this.entityClass = n;
+ this.type = en;
+ }
+
+ private Mob(String n, Enemies en)
+ {
+ this.name = n;
+ this.craftClass = n;
+ this.entityClass = n;
+ this.type = en;
+ }
+
+ private Mob(String n, String ec, Enemies en)
+ {
+ this.name = n;
+ this.craftClass = n;
+ this.entityClass = ec;
+ this.type = en;
+ }
+
+ private Mob(String n, String ec, String cc, Enemies en)
+ {
+ this.name = n;
+ this.entityClass = ec;
+ this.craftClass = cc;
+ this.type = en;
+ }
+ public String s = "s";
+ public String name;
+ public Enemies type;
+ private String entityClass;
+ private String craftClass;
+ private static final HashMap<String, Mob> hashMap = new HashMap<String, Mob>();
+
+ static
+ {
+ for (Mob mob : Mob.values())
+ {
+ hashMap.put(mob.name, mob);
+ }
+ }
+
+ @SuppressWarnings({"unchecked", "CallToThreadDumpStack"})
+ public CraftEntity spawn(Player player, Server server) throws MobException
+ {
+ try
+ {
+ WorldServer world = ((org.bukkit.craftbukkit.CraftWorld)player.getWorld()).getHandle();
+ Constructor<CraftEntity> craft = (Constructor<CraftEntity>)ClassLoader.getSystemClassLoader().loadClass("org.bukkit.craftbukkit.entity.Craft" + craftClass).getConstructors()[0];
+ Constructor<Entity> entity = (Constructor<Entity>)ClassLoader.getSystemClassLoader().loadClass("net.minecraft.server.Entity" + entityClass).getConstructors()[0];
+ return craft.newInstance((CraftServer)server, entity.newInstance(world));
+ }
+ catch (Exception ex)
+ {
+ logger.warning("Unable to spawn mob.");
+ ex.printStackTrace();
+ throw new MobException();
+ }
+ }
+
+
+ public enum Enemies
+ {
+ FRIENDLY("friendly"),
+ NEUTRAL("neutral"),
+ ENEMY("enemy");
+
+ private Enemies(String t)
+ {
+ this.type = t;
+ }
+ protected String type;
+ }
+
+
+ public class MobException extends Exception
+ {
+ private static final long serialVersionUID = 1L;
+ }
+
+ public static Mob fromName(String n)
+ {
+ return hashMap.get(n);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/NetherPortal.java b/Essentials/src/com/earth2me/essentials/NetherPortal.java
new file mode 100644
index 000000000..25ebe5e23
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/NetherPortal.java
@@ -0,0 +1,167 @@
+/**
+ * @author SpaceManiac
+ * @licent MIT
+ * @origin https://github.com/SpaceManiac/Nether/blob/master/org/innectis/Nether/NetherPortal.java
+ */
+package com.earth2me.essentials;
+
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+public class NetherPortal
+{
+ private Block block;
+
+ public NetherPortal(Block b)
+ {
+ block = b;
+ }
+
+ public Block getBlock()
+ {
+ return block;
+ }
+
+ public void setBlock(Block b)
+ {
+ block = b;
+ }
+
+ // Return a random spawnable location
+ public Location getSpawn()
+ {
+ if (block.getWorld().getBlockAt(block.getX() + 1, block.getY(), block.getZ()).getType().equals(Material.PORTAL)
+ || block.getWorld().getBlockAt(block.getX() - 1, block.getY(), block.getZ()).getType().equals(Material.PORTAL))
+ {
+ // portal is in X direction
+ return new Location(block.getWorld(), block.getX() + 1,
+ block.getY(), block.getZ() + 1.5 - 2 * Math.round(Math.random()));
+ }
+ else
+ {
+ // portal is in Z direction
+ return new Location(block.getWorld(), block.getX() + 1.5 - 2 * Math.round(Math.random()),
+ block.getY(), block.getZ() + 1);
+ }
+ }
+
+ // ==============================
+ // Find a nearby portal within 16 blocks of the given block
+ // Not guaranteed to be the nearest
+ public static NetherPortal findPortal(Block dest)
+ {
+ World world = dest.getWorld();
+
+ // Get list of columns in a circle around the block
+ ArrayList<Block> columns = new ArrayList<Block>();
+ for (int x = dest.getX() - 16; x <= dest.getX() + 16; ++x)
+ {
+ for (int z = dest.getZ() - 16; z <= dest.getZ() + 16; ++z)
+ {
+ int dx = dest.getX() - x, dz = dest.getZ() - z;
+ if (dx * dx + dz * dz <= 256)
+ {
+ columns.add(world.getBlockAt(x, 0, z));
+ }
+ }
+ }
+
+ // For each column try to find a portal block
+ for (Block col : columns)
+ {
+ for (int y = 127; y >= 0; --y)
+ {
+ Block b = world.getBlockAt(col.getX(), y, col.getZ());
+ if (b.getType().equals(Material.PORTAL) && Math.abs(dest.getY() - y) <= 16)
+ {
+ // Huzzah!
+ return new NetherPortal(b);
+ }
+ }
+ }
+
+ // Nope!
+ return null;
+ }
+
+ // Create a new portal at the specified block, fudging position if needed
+ // Will occasionally end up making portals in bad places, but let's hope not
+ public static NetherPortal createPortal(Block dest)
+ {
+ World world = dest.getWorld();
+
+ // Try not to spawn within water or lava
+ Material m = dest.getType();
+ while (((m.equals(Material.LAVA) || m.equals(Material.WATER) || m.equals(Material.STATIONARY_LAVA)
+ || m.equals(Material.STATIONARY_WATER) || m.equals(Material.SAND) || m.equals(Material.GRAVEL))) &&
+ dest.getY() < 120)
+ {
+ dest = world.getBlockAt(dest.getX(), dest.getY() + 4, dest.getZ());
+ m = dest.getType();
+ }
+
+ // Not too high or too low overall
+ if (dest.getY() > 120)
+ {
+ dest = world.getBlockAt(dest.getX(), 120, dest.getZ());
+ }
+ else if (dest.getY() < 8)
+ {
+ dest = world.getBlockAt(dest.getX(), 8, dest.getZ());
+ }
+
+ // Create the physical portal
+ // For now, don't worry about direction
+
+ int x = dest.getX(), y = dest.getY(), z = dest.getZ();
+ Logger.getLogger("Minecraft").log(Level.INFO, "Creating portal at "+x+","+y+","+z+".");
+
+ // Clear area around portal
+ ArrayList<Block> columns = new ArrayList<Block>();
+ for (int x2 = x - 4; x2 <= x + 4; ++x2)
+ {
+ for (int z2 = z - 4; z2 <= z + 4; ++z2)
+ {
+ double dx = x + 0.5f - x2, dz = z - z2;
+ if (dx * dx + dz * dz <= 13)
+ {
+ columns.add(world.getBlockAt(x2, 0, z2));
+ }
+ }
+ }
+
+ // Clear area around portal
+ for (Block col : columns)
+ {
+ // Stone platform
+ world.getBlockAt(col.getX(), y - 1, col.getZ()).setType(Material.STONE);
+ for (int yd = 0; yd < 4; ++yd)
+ {
+ world.getBlockAt(col.getX(), y + yd, col.getZ()).setType(Material.AIR);
+ }
+ }
+
+ // Build obsidian frame
+ for (int xd = -1; xd < 3; ++xd)
+ {
+ for (int yd = -1; yd < 4; ++yd)
+ {
+ if (xd == -1 || yd == -1 || xd == 2 || yd == 3)
+ {
+ world.getBlockAt(x + xd, y + yd, z).setType(Material.OBSIDIAN);
+ }
+ }
+ }
+
+ // Set it alight!
+ dest.setType(Material.FIRE);
+
+ return new NetherPortal(dest);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java
new file mode 100644
index 000000000..5fffdfa99
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java
@@ -0,0 +1,351 @@
+package com.earth2me.essentials;
+
+import java.net.InetSocketAddress;
+import java.util.HashSet;
+import java.util.List;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Arrow;
+import org.bukkit.entity.Egg;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Snowball;
+import org.bukkit.entity.Vehicle;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.PlayerInventory;
+import org.bukkit.util.Vector;
+
+
+public class OfflinePlayer implements Player
+{
+ private final String name;
+ private Location location = new Location(null, 0, 0, 0, 0, 0);
+
+ public OfflinePlayer(String name)
+ {
+ this.name = name;
+ }
+
+ public boolean isOnline()
+ {
+ return false;
+ }
+
+ public boolean isOp()
+ {
+ return false;
+ }
+
+ public void sendMessage(String string)
+ {
+ }
+
+ public String getDisplayName()
+ {
+ return name;
+ }
+
+ public void setDisplayName(String string)
+ {
+ }
+
+ public void setCompassTarget(Location lctn)
+ {
+ }
+
+ public InetSocketAddress getAddress()
+ {
+ return null;
+ }
+
+ public void kickPlayer(String string)
+ {
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public PlayerInventory getInventory()
+ {
+ return null;
+ }
+
+ public ItemStack getItemInHand()
+ {
+ return null;
+ }
+
+ public void setItemInHand(ItemStack is)
+ {
+ }
+
+ public int getHealth()
+ {
+ return 0;
+ }
+
+ public void setHealth(int i)
+ {
+ }
+
+ public Egg throwEgg()
+ {
+ return null;
+ }
+
+ public Snowball throwSnowball()
+ {
+ return null;
+ }
+
+ public Arrow shootArrow()
+ {
+ return null;
+ }
+
+ public boolean isInsideVehicle()
+ {
+ return false;
+ }
+
+ public boolean leaveVehicle()
+ {
+ return false;
+ }
+
+ public Vehicle getVehicle()
+ {
+ return null;
+ }
+
+ public Location getLocation()
+ {
+ return location;
+ }
+
+ public World getWorld()
+ {
+ return null;
+ }
+
+ public void teleportTo(Location lctn)
+ {
+ }
+
+ public void teleportTo(Entity entity)
+ {
+ }
+
+ public int getEntityId()
+ {
+ return -1;
+ }
+
+ public boolean performCommand(String string)
+ {
+ return false;
+ }
+
+ public boolean isPlayer()
+ {
+ return false;
+ }
+
+ public int getRemainingAir()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setRemainingAir(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public int getMaximumAir()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setMaximumAir(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public boolean isSneaking()
+ {
+ return false;
+ }
+
+ public void setSneaking(boolean bln)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void updateInventory()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void chat(String string)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public double getEyeHeight()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public double getEyeHeight(boolean bln)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public List<Block> getLineOfSight(HashSet<Byte> hs, int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Block getTargetBlock(HashSet<Byte> hs, int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public List<Block> getLastTwoTargetBlocks(HashSet<Byte> hs, int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public int getFireTicks()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public int getMaxFireTicks()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setFireTicks(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void remove()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Server getServer()
+ {
+ return Essentials.getStatic() == null ? null : Essentials.getStatic().getServer();
+ }
+
+ public Vector getMomentum()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setMomentum(Vector vector)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setVelocity(Vector vector)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Vector getVelocity()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void damage(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void damage(int i, Entity entity)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Location getEyeLocation()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void sendRawMessage(String string) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Location getCompassTarget()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public int getMaximumNoDamageTicks()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setMaximumNoDamageTicks(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public int getLastDamage()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setLastDamage(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public int getNoDamageTicks()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void setNoDamageTicks(int i)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public boolean teleport(Location lctn)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public boolean teleport(Entity entity)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Entity getPassenger()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public boolean setPassenger(Entity entity)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public boolean isEmpty()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public boolean eject()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/PlayerExtension.java b/Essentials/src/com/earth2me/essentials/PlayerExtension.java
new file mode 100644
index 000000000..758f8076d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/PlayerExtension.java
@@ -0,0 +1,141 @@
+package com.earth2me.essentials;
+
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import net.minecraft.server.EntityPlayer;
+import net.minecraft.server.IInventory;
+import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
+import org.bukkit.entity.*;
+
+
+public class PlayerExtension extends PlayerWrapper
+{
+ public PlayerExtension(Player base)
+ {
+ super(base);
+ }
+
+ public boolean isBanned()
+ {
+ return Essentials.getStatic().bans.contains(getName());
+ }
+
+ public boolean isIpBanned()
+ {
+ return Essentials.getStatic().bannedIps.contains(getAddress().getAddress().toString().replace("/", ""));
+ }
+
+ public float getCorrectedYaw()
+ {
+ float angle = (getLocation().getYaw() - 90) % 360;
+ if (angle < 0) angle += 360.0F;
+ return angle;
+ }
+
+ public void showInventory(IInventory inventory)
+ {
+ getHandle().a(inventory);
+ }
+
+ public void showInventory(CraftInventoryPlayer inventory)
+ {
+ showInventory((IInventory)inventory.getInventory());
+ }
+
+ public Location getSafeDestination(Location loc) throws Exception
+ {
+ World world = loc.getWorld();
+ double x = loc.getX();
+ double y = loc.getY();
+ double z = loc.getZ();
+
+ while (isBlockAboveAir(world, x, y, z))
+ {
+ y -= 1.0D;
+ if (y < 0) {
+ throw new Exception("Hole in floor");
+ }
+ }
+
+ while (isBlockUnsafe(world, x, y, z))
+ {
+ y += 1.0D;
+ if (y >= 110.0D) {
+ x += 1.0D;
+ break;
+ }
+ }
+ while (isBlockUnsafe(world, x, y, z))
+ {
+ y -= 1.0D;
+ if (y <= 1.0D)
+ {
+ y = 110.0D;
+ x += 1.0D;
+ }
+ }
+ return new Location(world, x, y, z, loc.getYaw(), loc.getPitch());
+ }
+
+ private boolean isBlockAboveAir(World world, double x, double y, double z)
+ {
+ return world.getBlockAt((int)Math.floor(x), (int)Math.floor(y - 1.0D), (int)Math.floor(z)).getType() == Material.AIR;
+ }
+
+ public boolean isBlockUnsafe(World world, double x, double y, double z)
+ {
+ Block below = world.getBlockAt((int)Math.floor(x), (int)Math.floor(y - 1.0D), (int)Math.floor(z));
+ if (below.getType() == Material.LAVA || below.getType() == Material.STATIONARY_LAVA)
+ return true;
+
+ if (below.getType() == Material.FIRE)
+ return true;
+
+ if ((world.getBlockAt((int)Math.floor(x), (int)Math.floor(y), (int)Math.floor(z)).getType() != Material.AIR)
+ || (world.getBlockAt((int)Math.floor(x), (int)Math.floor(y + 1.0D), (int)Math.floor(z)).getType() != Material.AIR))
+ {
+ return true;
+ }
+ return isBlockAboveAir(world, x, y, z);
+ }
+
+ public TargetBlock getTarget()
+ {
+ return new TargetBlock(getBase());
+ }
+
+ public String getGroup()
+ {
+ try
+ {
+ return com.nijikokun.bukkit.Permissions.Permissions.Security.getGroup(getWorld().getName(), getName());
+ }
+ catch (Throwable ex)
+ {
+ return "default";
+ }
+ }
+
+ public boolean canBuild()
+ {
+ try
+ {
+ return com.nijikokun.bukkit.Permissions.Permissions.Security.canGroupBuild(getWorld().getName(), getGroup());
+ }
+ catch (Throwable ex)
+ {
+ return true;
+ }
+ }
+
+ public EntityPlayer getHandle()
+ {
+ return (EntityPlayer)getCraftPlayer().getHandle();
+ }
+
+ public CraftPlayer getCraftPlayer()
+ {
+ return (CraftPlayer)base;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/PlayerWrapper.java b/Essentials/src/com/earth2me/essentials/PlayerWrapper.java
new file mode 100644
index 000000000..0de6f669e
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/PlayerWrapper.java
@@ -0,0 +1,416 @@
+package com.earth2me.essentials;
+
+import java.net.InetSocketAddress;
+import java.util.*;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.entity.*;
+import org.bukkit.inventory.*;
+import org.bukkit.util.Vector;
+
+public class PlayerWrapper implements Player
+{
+ protected Player base;
+
+ public PlayerWrapper(Player base)
+ {
+ this.base = base;
+ }
+
+ public final Player getBase()
+ {
+ return base;
+ }
+
+ public final Player setBase(Player base)
+ {
+ return this.base = base;
+ }
+
+ @Override
+ public void setDisplayName(String string)
+ {
+ base.setDisplayName(string);
+ }
+
+ @Override
+ public void setCompassTarget(Location lctn)
+ {
+ base.setCompassTarget(lctn);
+ }
+
+ @Override
+ public InetSocketAddress getAddress()
+ {
+ return base.getAddress();
+ }
+
+ @Override
+ public void kickPlayer(String string)
+ {
+ base.kickPlayer(string);
+ }
+
+ @Override
+ public String getName()
+ {
+ return base.getName();
+ }
+
+ @Override
+ public PlayerInventory getInventory()
+ {
+ return base.getInventory();
+ }
+
+ @Override
+ public ItemStack getItemInHand()
+ {
+ return base.getItemInHand();
+ }
+
+ @Override
+ public void setItemInHand(ItemStack is)
+ {
+ base.setItemInHand(is);
+ }
+
+ @Override
+ public int getHealth()
+ {
+ return base.getHealth();
+ }
+
+ @Override
+ public void setHealth(int i)
+ {
+ base.setHealth(i);
+ }
+
+ @Override
+ public Egg throwEgg()
+ {
+ return base.throwEgg();
+ }
+
+ @Override
+ public Snowball throwSnowball()
+ {
+ return base.throwSnowball();
+ }
+
+ @Override
+ public Arrow shootArrow()
+ {
+ return base.shootArrow();
+ }
+
+ @Override
+ public boolean isInsideVehicle()
+ {
+ return base.isInsideVehicle();
+ }
+
+ @Override
+ public boolean leaveVehicle()
+ {
+ return base.leaveVehicle();
+ }
+
+ @Override
+ public Vehicle getVehicle()
+ {
+ return base.getVehicle();
+ }
+
+ @Override
+ public Location getLocation()
+ {
+ return base.getLocation();
+ }
+
+ @Override
+ public World getWorld()
+ {
+ return base.getWorld();
+ }
+
+ @Override
+ public Server getServer()
+ {
+ return base.getServer();
+ }
+
+ @Override
+ public boolean isOnline()
+ {
+ return base.isOnline();
+ }
+
+ @Override
+ public boolean isOp()
+ {
+ return base.isOp();
+ }
+
+ @Override
+ public boolean teleport(Location lctn)
+ {
+ return base.teleport(lctn);
+ }
+
+ @Override
+ public boolean teleport(Entity entity)
+ {
+ return base.teleport(entity);
+ }
+
+ @Override
+ public void sendMessage(String string)
+ {
+ base.sendMessage(string);
+ }
+
+ @Override
+ public void setVelocity(Vector vector)
+ {
+ base.setVelocity(vector);
+ }
+
+ @Override
+ public Vector getVelocity()
+ {
+ return base.getVelocity();
+ }
+
+ @Override
+ public double getEyeHeight()
+ {
+ return base.getEyeHeight();
+ }
+
+ @Override
+ public double getEyeHeight(boolean bln)
+ {
+ return base.getEyeHeight(bln);
+ }
+
+ @Override
+ public List<Block> getLineOfSight(HashSet<Byte> hs, int i)
+ {
+ return base.getLineOfSight(hs, i);
+ }
+
+ @Override
+ public Block getTargetBlock(HashSet<Byte> hs, int i)
+ {
+ return base.getTargetBlock(hs, i);
+ }
+
+ @Override
+ public List<Block> getLastTwoTargetBlocks(HashSet<Byte> hs, int i)
+ {
+ return base.getLastTwoTargetBlocks(hs, i);
+ }
+
+ @Override
+ public int getFireTicks()
+ {
+ return base.getFireTicks();
+ }
+
+ @Override
+ public int getMaxFireTicks()
+ {
+ return base.getMaxFireTicks();
+ }
+
+ @Override
+ public void setFireTicks(int i)
+ {
+ base.setFireTicks(i);
+ }
+
+ @Override
+ public void remove()
+ {
+ base.remove();
+ }
+
+ /**
+ * This is not deprecated because the underlying method isn't really deprecated; rather, it's just "imperfect". By
+ * We will continue to use this method even after the underlying CraftBukkit method is changed, so do not deprecate
+ * it. Chances are Bukkit will also choose to un-deprecate this method at some point.
+ */
+ @Override
+ public void updateInventory()
+ {
+ base.updateInventory();
+ }
+
+ @Override
+ public void chat(String string)
+ {
+ base.chat(string);
+ }
+
+ @Override
+ public boolean isSneaking()
+ {
+ return base.isSneaking();
+ }
+
+ @Override
+ public void setSneaking(boolean bln)
+ {
+ base.setSneaking(bln);
+ }
+
+ @Override
+ public int getEntityId()
+ {
+ return base.getEntityId();
+ }
+
+ @Override
+ public boolean performCommand(String string)
+ {
+ return base.performCommand(string);
+ }
+
+ @Override
+ public int getRemainingAir()
+ {
+ return base.getRemainingAir();
+ }
+
+ @Override
+ public void setRemainingAir(int i)
+ {
+ base.setRemainingAir(i);
+ }
+
+ @Override
+ public int getMaximumAir()
+ {
+ return base.getMaximumAir();
+ }
+
+ @Override
+ public void setMaximumAir(int i)
+ {
+ base.setMaximumAir(i);
+ }
+
+ @Override
+ public String getDisplayName()
+ {
+ if (base.getDisplayName() != null)
+ return base.getDisplayName();
+ else
+ return base.getName();
+ }
+
+ @Override
+ public void damage(int i)
+ {
+ base.damage(i);
+ }
+
+ @Override
+ public void damage(int i, Entity entity)
+ {
+ base.damage(i, entity);
+ }
+
+ @Override
+ public Location getEyeLocation()
+ {
+ return base.getEyeLocation();
+ }
+
+ @Override
+ public void sendRawMessage(String string) {
+ base.sendRawMessage(string);
+ }
+
+ @Override
+ public Location getCompassTarget()
+ {
+ return base.getCompassTarget();
+ }
+
+ @Override
+ public int getMaximumNoDamageTicks()
+ {
+ return base.getMaximumNoDamageTicks();
+ }
+
+ @Override
+ public void setMaximumNoDamageTicks(int i)
+ {
+ base.setMaximumNoDamageTicks(i);
+ }
+
+ @Override
+ public int getLastDamage()
+ {
+ return base.getLastDamage();
+ }
+
+ @Override
+ public void setLastDamage(int i)
+ {
+ base.setLastDamage(i);
+ }
+
+ @Override
+ public int getNoDamageTicks()
+ {
+ return base.getNoDamageTicks();
+ }
+
+ @Override
+ public void setNoDamageTicks(int i)
+ {
+ base.setNoDamageTicks(i);
+ }
+
+ @Override
+ public Entity getPassenger()
+ {
+ return base.getPassenger();
+ }
+
+ @Override
+ public boolean setPassenger(Entity entity)
+ {
+ return base.setPassenger(entity);
+ }
+
+ @Override
+ public boolean isEmpty()
+ {
+ return base.isEmpty();
+ }
+
+ @Override
+ public boolean eject()
+ {
+ return base.eject();
+ }
+
+ @Override
+ @Deprecated
+ public void teleportTo(Location lctn)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ @Deprecated
+ public void teleportTo(Entity entity)
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java
new file mode 100644
index 000000000..9c774b848
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Settings.java
@@ -0,0 +1,348 @@
+package com.earth2me.essentials;
+
+import java.util.*;
+import org.bukkit.ChatColor;
+import com.earth2me.essentials.commands.IEssentialsCommand;
+import java.io.File;
+import java.util.ArrayList;
+import org.bukkit.entity.CreatureType;
+
+
+public class Settings implements IConf
+{
+ private EssentialsConf config;
+
+ public Settings(File dataFolder)
+ {
+ config = new EssentialsConf(new File(dataFolder, "config.yml"));
+ config.setTemplateName("/config.yml");
+ config.load();
+ }
+
+ public boolean getRespawnAtHome()
+ {
+ return config.getBoolean("respawn-at-home", false);
+ }
+
+ public boolean getBedSetsHome()
+ {
+ return config.getBoolean("bed-sethome", false);
+ }
+
+ public int getChatRadius()
+ {
+ return config.getInt("chat.radius", config.getInt("chat-radius", 0));
+ }
+
+ public long getTeleportDelay()
+ {
+ return config.getInt("teleport-delay", 0) * 1000L;
+ }
+
+ public int getDefaultStackSize()
+ {
+ return config.getInt("default-stack-size", 64);
+ }
+
+ public int getStartingBalance()
+ {
+ return config.getInt("starting-balance", 0);
+ }
+
+ public boolean getNetherPortalsEnabled()
+ {
+ return isNetherEnabled() && config.getBoolean("nether.portals-enabled", false);
+ }
+
+ public String getMcslKey()
+ {
+ return config.getString("mcsl-key", "").replaceAll("[^a-zA-Z0-9]", "");
+ }
+
+ public boolean getWhitelistEnabled()
+ {
+ return false;
+ }
+
+ public boolean isCommandDisabled(IEssentialsCommand cmd)
+ {
+ return isCommandDisabled(cmd.getName());
+ }
+
+ public boolean isCommandDisabled(String label)
+ {
+ for (String c : config.getStringList("disabled-commands", new ArrayList<String>(0)))
+ {
+ if (!c.equalsIgnoreCase(label)) continue;
+ return true;
+ }
+ return config.getBoolean("disable-" + label.toLowerCase(), false);
+ }
+
+ public boolean isCommandRestricted(IEssentialsCommand cmd)
+ {
+ return isCommandRestricted(cmd.getName());
+ }
+
+ public boolean isCommandRestricted(String label)
+ {
+ for (String c : config.getStringList("restricted-commands", new ArrayList<String>(0)))
+ {
+ if (!c.equalsIgnoreCase(label)) continue;
+ return true;
+ }
+ return config.getBoolean("restrict-" + label.toLowerCase(), false);
+ }
+
+ public int getCommandCost(IEssentialsCommand cmd)
+ {
+ return getCommandCost(cmd.getName());
+ }
+
+ public int getCommandCost(String label)
+ {
+ int cost = config.getInt("command-costs." + label, 0);
+ if (cost == 0)
+ cost = config.getInt("cost-" + label, 0);
+ return cost;
+ }
+
+ public String getCommandPrefix()
+ {
+ return config.getString("command-prefix", "");
+ }
+
+ public String getNicknamePrefix()
+ {
+ return config.getString("nickname-prefix", "");
+ }
+
+ public long getTeleportCooldown()
+ {
+ return (long)config.getInt("teleport-cooldown", 60) * 1000L;
+ }
+
+ public long getHealCooldown()
+ {
+ return (long)config.getInt("heal-cooldown", 60) * 1000L;
+ }
+
+ public Object getKit(String name)
+ {
+ Map<String, Object> kits = (Map<String, Object>)config.getProperty("kits");
+ return kits.get(name.replace('.', '_').replace('/', '_'));
+ }
+
+ public ChatColor getOperatorColor()
+ {
+ String colorName = config.getString("ops-name-color", null);
+
+ if (colorName == null)
+ return ChatColor.RED;
+
+ try
+ {
+ return ChatColor.valueOf(colorName.toUpperCase());
+ }
+ catch (IllegalArgumentException ex)
+ {
+ }
+
+ return ChatColor.getByCode(Integer.parseInt(colorName, 16));
+ }
+
+ public boolean getReclaimSetting()
+ {
+ return config.getBoolean("reclaim-onlogout", true);
+ }
+
+ public String getNetherName()
+ {
+ return config.getString("nether.folder", "nether");
+ }
+
+ public boolean isNetherEnabled()
+ {
+ return config.getBoolean("nether.enabled", true);
+ }
+
+ public int getSpawnMobLimit()
+ {
+ return config.getInt("spawnmob-limit", 10);
+ }
+
+ public boolean showNonEssCommandsInHelp()
+ {
+ return config.getBoolean("non-ess-in-help", true);
+ }
+
+ public HashMap<String, Boolean> getEpSettings()
+ {
+ HashMap<String, Boolean> epSettings = new HashMap<String, Boolean>();
+
+ epSettings.put("protect.protect.signs", config.getBoolean("protect.protect.signs", true));
+ epSettings.put("protect.protect.rails", config.getBoolean("protect.protect.rails", true));
+ epSettings.put("protect.protect.block-below", config.getBoolean("protect.protect.block-below", true));
+ epSettings.put("protect.protect.prevent-block-on-rails", config.getBoolean("protect.protect.prevent-block-on-rails", false));
+ return epSettings;
+ }
+
+ public HashMap<String, String> getEpDBSettings()
+ {
+ HashMap<String, String> epSettings = new HashMap<String, String>();
+ epSettings.put("protect.datatype", config.getString("protect.datatype", "sqlite"));
+ epSettings.put("protect.username", config.getString("protect.username", "root"));
+ epSettings.put("protect.password", config.getString("protect.password", "root"));
+ epSettings.put("protect.mysqlDb", config.getString("protect.mysqlDb", "jdbc:mysql://localhost:3306/minecraft"));
+ return epSettings;
+ }
+
+ public ArrayList getEpAlertOnPlacement()
+ {
+ ArrayList epAlertPlace = new ArrayList();
+ epAlertPlace.addAll(Arrays.asList(config.getString("protect.alert.on-placement", "").split(",")));
+ return epAlertPlace;
+ }
+
+ public ArrayList getEpAlertOnUse()
+ {
+ ArrayList epAlertUse = new ArrayList();
+ epAlertUse.addAll(Arrays.asList(config.getString("protect.alert.on-use", "").split(",")));
+ return epAlertUse;
+ }
+
+ public ArrayList getEpAlertOnBreak()
+ {
+ ArrayList epAlertPlace = new ArrayList();
+ epAlertPlace.addAll(Arrays.asList(config.getString("protect.alert.on-break", "").split(",")));
+ return epAlertPlace;
+ }
+
+ public ArrayList epBlackListPlacement()
+ {
+ ArrayList epBlack = new ArrayList();
+ epBlack.addAll(Arrays.asList(config.getString("protect.blacklist.placement", "").split(",")));
+ return epBlack;
+ }
+
+ public ArrayList epBlackListUsage()
+ {
+ ArrayList epBlack = new ArrayList();
+ epBlack.addAll(Arrays.asList(config.getString("protect.blacklist.usage", "").split(",")));
+ return epBlack;
+ }
+
+ public HashMap<String, Boolean> getEpGuardSettings()
+ {
+ HashMap<String, Boolean> epSettings = new HashMap<String, Boolean>();
+ epSettings.put("protect.prevent.lava-flow", config.getBoolean("protect.prevent.lava-flow", false));
+ epSettings.put("protect.prevent.water-flow", config.getBoolean("protect.prevent.water-flow", false));
+ epSettings.put("protect.prevent.water-bucket-flow", config.getBoolean("protect.prevent.water-bucket-flow", false));
+ epSettings.put("protect.prevent.fire-spread", config.getBoolean("protect.prevent.fire-spread", false));
+ epSettings.put("protect.prevent.flint-fire", config.getBoolean("protect.prevent.flint-fire", false));
+ epSettings.put("protect.prevent.lava-fire-spread", config.getBoolean("protect.prevent.lava-fire-spread", false));
+ epSettings.put("protect.prevent.tnt-explosion", config.getBoolean("protect.prevent.tnt-explosion", false));
+ epSettings.put("protect.prevent.creeper-explosion", config.getBoolean("protect.prevent.creeper-explosion", false));
+ epSettings.put("protect.prevent.creeper-playerdamage", config.getBoolean("protect.prevent.creeper-playerdamage", false));
+ epSettings.put("protect.prevent.creeper-blockdamage", config.getBoolean("protect.prevent.creeper-blockdamage", false));
+ for (CreatureType ct : CreatureType.values()) {
+ String name = ct.toString().toLowerCase();
+ epSettings.put("protect.prevent.spawn."+name, config.getBoolean("protect.prevent.spawn."+name, false));
+ }
+ return epSettings;
+ }
+
+ public HashMap<String, Boolean> getEpPlayerSettings()
+ {
+ HashMap<String, Boolean> epPlayerSettings = new HashMap<String, Boolean>();
+ epPlayerSettings.put("protect.disable.fall", config.getBoolean("protect.disable.fall", false));
+ epPlayerSettings.put("protect.disable.pvp", config.getBoolean("protect.disable.pvp", false));
+ epPlayerSettings.put("protect.disable.drown", config.getBoolean("protect.disable.drown", false));
+ epPlayerSettings.put("protect.disable.suffocate", config.getBoolean("protect.disable.suffocate", false));
+ epPlayerSettings.put("protect.disable.lavadmg", config.getBoolean("protect.disable.lavadmg", false));
+ epPlayerSettings.put("protect.disable.projectiles", config.getBoolean("protect.disable.projectiles", false));
+ epPlayerSettings.put("protect.disable.contactdmg", config.getBoolean("protect.disable.contactdmg", false));
+ epPlayerSettings.put("protect.disable.firedmg", config.getBoolean("protect.disable.firedmg", false));
+ epPlayerSettings.put("protect.disable.build", config.getBoolean("protect.disable.build", false));
+ return epPlayerSettings;
+
+ }
+
+ public int getEpCreeperMaxHeight()
+ {
+ return config.getInt("protect.creeper.max-height", -1);
+ }
+
+ public boolean areSignsDisabled()
+ {
+ return config.getBoolean("signs-disabled", false);
+ }
+
+ public long getBackupInterval()
+ {
+ return config.getInt("backup.interval", 1440); // 1440 = 24 * 60
+ }
+
+ public String getBackupCommand()
+ {
+ return config.getString("backup.command", null);
+ }
+
+ public String getChatFormat(String group)
+ {
+ return config.getString("chat.group-formats." + (group == null ? "Default" : group),
+ config.getString("chat.format", "&7[{GROUP}]&f {DISPLAYNAME}&7:&f {MESSAGE}"));
+ }
+
+ public boolean getGenerateExitPortals()
+ {
+ return config.getBoolean("nether.generate-exit-portals", true);
+ }
+
+ public boolean getAnnounceNewPlayers()
+ {
+ return !config.getString("newbies.announce-format", "-").isEmpty();
+ }
+
+ public String getAnnounceNewPlayerFormat(User user)
+ {
+ return format(config.getString("newbies.announce-format", "&dWelcome {DISPLAYNAME} to the server!"), user);
+ }
+
+ public String format(String format, User user)
+ {
+ return format.replace('&', '§').replace("§§", "&").replace("{PLAYER}", user.getDisplayName()).replace("{DISPLAYNAME}", user.getDisplayName()).replace("{GROUP}", user.getGroup()).replace("{USERNAME}", user.getName()).replace("{ADDRESS}", user.getAddress().toString());
+ }
+
+ public String getNewbieSpawn()
+ {
+ return config.getString("newbies.spawnpoint", "default");
+ }
+ public boolean getPerWarpPermission()
+ {
+ return config.getBoolean("per-warp-permission", false);
+ }
+
+ public boolean getSortListByGroups()
+ {
+ return config.getBoolean("sort-list-by-groups", true);
+ }
+
+ public void reloadConfig() {
+ config.load();
+ }
+
+ public ArrayList itemSpawnBlacklist()
+ {
+ ArrayList epItemSpwn = new ArrayList();
+ epItemSpwn.addAll(Arrays.asList(config.getString("item-spawn-blacklist", "").split(",")));
+ return epItemSpwn;
+ }
+
+ public ArrayList epBlockBreakingBlacklist()
+ {
+ ArrayList epBreakList = new ArrayList();
+ epBreakList.addAll(Arrays.asList(config.getString("protect.blacklist.break", "").split(",")));
+ return epBreakList;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/Spawn.java b/Essentials/src/com/earth2me/essentials/Spawn.java
new file mode 100644
index 000000000..f3c4de06a
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Spawn.java
@@ -0,0 +1,87 @@
+package com.earth2me.essentials;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.World.Environment;
+
+public class Spawn implements IConf {
+
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private EssentialsConf config;
+ private Server server;
+
+ public Spawn(Server server, File dataFolder) {
+ File configFile = new File(dataFolder, "spawn.yml");
+ this.server = server;
+ config = new EssentialsConf(configFile);
+ config.load();
+ }
+
+ public void setSpawn(Location loc, String group) {
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("world", loc.getWorld().getName());
+ map.put("x", loc.getX());
+ map.put("y", loc.getY());
+ map.put("z", loc.getZ());
+ map.put("yaw", loc.getYaw());
+ map.put("pitch", loc.getPitch());
+ config.setProperty(group, map);
+ config.save();
+
+ if ("default".equals(group)) {
+ loc.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ }
+ }
+
+ public Location getSpawn(String group) {
+ if (config.getProperty(group) == null) {
+ group = "default";
+ }
+ if (config.getProperty(group) == null) {
+ for (World w : server.getWorlds()) {
+ if (w.getEnvironment() != Environment.NORMAL) {
+ continue;
+ }
+ return w.getSpawnLocation();
+ }
+ }
+ String worldId = config.getString(group + ".world", "");
+ World world = server.getWorlds().get(server.getWorlds().size() > 1 ? 1 : 0);
+ for (World w : server.getWorlds()) {
+ if (w.getEnvironment() != Environment.NORMAL) {
+ continue;
+ }
+ world = w;
+ break;
+ }
+ for (World w : server.getWorlds()) {
+ if (!w.getName().equals(worldId)) {
+ continue;
+ }
+ world = w;
+ break;
+ }
+
+ double x = config.getDouble(group + ".x", config.getDouble("default.x", 0));
+ double y = config.getDouble(group + ".y", config.getDouble("default.y", 0));
+ double z = config.getDouble(group + ".z", config.getDouble("default.z", 0));
+ float yaw = (float) config.getDouble(group + ".yaw", config.getDouble("default.yaw", 0));
+ float pitch = (float) config.getDouble(group + ".pitch", config.getDouble("default.pitch", 0));
+ Location retval = new Location(world, x, y, z, yaw, pitch);
+
+ if (y < 1) {
+ retval.setY(world.getHighestBlockYAt(retval));
+ }
+
+ return retval;
+ }
+
+ public void reloadConfig() {
+ config.load();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/TargetBlock.java b/Essentials/src/com/earth2me/essentials/TargetBlock.java
new file mode 100644
index 000000000..d3ac30d2d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/TargetBlock.java
@@ -0,0 +1,599 @@
+package com.earth2me.essentials;
+
+import java.util.ArrayList;
+import org.bukkit.block.Block;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.util.Vector;
+/**
+ * @author toi
+ * Thanks to Raphfrk for optimization of this class.
+ */
+public class TargetBlock {
+
+ private Location loc;
+ private double viewHeight;
+ private int maxDistance;
+ private int[] blockToIgnore;
+ private double checkDistance, curDistance;
+ private double xRotation, yRotation;
+ private Vector targetPos = new Vector();
+ private Vector targetPosDouble = new Vector();
+ private Vector prevPos = new Vector();
+ private Vector offset = new Vector();
+
+ /**
+ * Constructor requiring a player, uses default values
+ *
+ * @param player Player to work with
+ */
+ public TargetBlock(Player player)
+ {
+ this.setValues(player.getLocation(), 300, 1.65, 0.2, null);
+ }
+
+ /**
+ * Constructor requiring a location, uses default values
+ *
+ * @param loc Location to work with
+ */
+ public TargetBlock(Location loc)
+ {
+ this.setValues(loc, 300, 0, 0.2, null);
+ }
+
+ /**
+ * Constructor requiring a player, max distance and a checking distance
+ *
+ * @param player Player to work with
+ * @param maxDistance How far it checks for blocks
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ */
+ public TargetBlock(Player player, int maxDistance, double checkDistance)
+ {
+ this.setValues(player.getLocation(), maxDistance, 1.65, checkDistance, null);
+ }
+
+ /**
+ * Constructor requiring a location, max distance and a checking distance
+ *
+ * @param loc What location to work with
+ * @param maxDistance How far it checks for blocks
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ */
+ public TargetBlock(Location loc, int maxDistance, double checkDistance) {
+ this.setValues(loc, maxDistance, 0, checkDistance, null);
+ }
+
+ /**
+ * Constructor requiring a player, max distance, checking distance and an array of blocks to ignore
+ *
+ * @param player What player to work with
+ * @param maxDistance How far it checks for blocks
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ * @param blocksToIgnore Integer array of what block ids to ignore while checking for viable targets
+ */
+ public TargetBlock (Player player, int maxDistance, double checkDistance, int[] blocksToIgnore)
+ {
+ this.setValues(player.getLocation(), maxDistance, 1.65, checkDistance, blocksToIgnore);
+ }
+
+ /**
+ * Constructor requiring a location, max distance, checking distance and an array of blocks to ignore
+ *
+ * @param loc What location to work with
+ * @param maxDistance How far it checks for blocks
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ * @param blocksToIgnore Array of what block ids to ignore while checking for viable targets
+ */
+ public TargetBlock (Location loc, int maxDistance, double checkDistance, int[] blocksToIgnore)
+ {
+ this.setValues(loc, maxDistance, 0, checkDistance, blocksToIgnore);
+ }
+
+ /**
+ * Constructor requiring a player, max distance, checking distance and an array of blocks to ignore
+ *
+ * @param player What player to work with
+ * @param maxDistance How far it checks for blocks
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ * @param blocksToIgnore String ArrayList of what block ids to ignore while checking for viable targets
+ */
+ public TargetBlock (Player player, int maxDistance, double checkDistance, ArrayList<String> blocksToIgnore)
+ {
+ int[] bti = this.convertStringArraytoIntArray(blocksToIgnore);
+ this.setValues(player.getLocation(), maxDistance, 1.65, checkDistance, bti);
+ }
+
+ /**
+ * Constructor requiring a location, max distance, checking distance and an array of blocks to ignore
+ *
+ * @param loc What location to work with
+ * @param maxDistance How far it checks for blocks
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ * @param blocksToIgnore String ArrayList of what block ids to ignore while checking for viable targets
+ */
+ public TargetBlock (Location loc, int maxDistance, double checkDistance, ArrayList<String> blocksToIgnore)
+ {
+ int[] bti = this.convertStringArraytoIntArray(blocksToIgnore);
+ this.setValues(loc, maxDistance, 0, checkDistance, bti);
+ }
+
+ /**
+ * Set the values, all constructors uses this function
+ *
+ * @param loc Location of the view
+ * @param maxDistance How far it checks for blocks
+ * @param viewPos Where the view is positioned in y-axis
+ * @param checkDistance How often to check for blocks, the smaller the more precise
+ * @param blocksToIgnore Ids of blocks to ignore while checking for viable targets
+ */
+ private void setValues(Location loc, int maxDistance, double viewHeight, double checkDistance, int[] blocksToIgnore)
+ {
+ this.loc = loc;
+ this.maxDistance = maxDistance;
+ this.viewHeight = viewHeight;
+ this.checkDistance = checkDistance;
+ this.blockToIgnore = blocksToIgnore;
+ this.curDistance = 0;
+ xRotation = (loc.getYaw() + 90) % 360;
+ yRotation = loc.getPitch() * -1;
+
+ double h = (checkDistance * Math.cos(Math.toRadians(yRotation)));
+ offset.setY((checkDistance * Math.sin(Math.toRadians(yRotation))));
+ offset.setX((h * Math.cos(Math.toRadians(xRotation))));
+ offset.setZ((h * Math.sin(Math.toRadians(xRotation))));
+
+ targetPosDouble = new Vector(loc.getX(), loc.getY() + viewHeight, loc.getZ());
+ targetPos = new Vector( targetPosDouble.getBlockX(), targetPosDouble.getBlockY(), targetPosDouble.getBlockZ());
+ prevPos = targetPos.clone();
+ }
+
+ /**
+ * Call this to reset checking position to allow you to check for a new target with the same TargetBlock instance.
+ */
+ public void reset()
+ {
+ targetPosDouble = new Vector(loc.getX(), loc.getY() + viewHeight, loc.getZ());
+ targetPos = new Vector( targetPosDouble.getBlockX(), targetPosDouble.getBlockY(), targetPosDouble.getBlockZ());
+ prevPos = targetPos.clone();
+ this.curDistance = 0;
+ }
+
+ /**
+ * Gets the distance to a block. Measures from the block underneath the player to the targetblock
+ * Should only be used when passing player as an constructor parameter
+ *
+ * @return double
+ */
+ public double getDistanceToBlock()
+ {
+ Vector blockUnderPlayer = new Vector(
+ (int) Math.floor(loc.getX() + 0.5),
+ (int) Math.floor(loc.getY() - 0.5),
+ (int) Math.floor(loc.getZ() + 0.5));
+
+ Block blk = getTargetBlock();
+ double x = blk.getX() - blockUnderPlayer.getBlockX();
+ double y = blk.getY() - blockUnderPlayer.getBlockY();
+ double z = blk.getZ() - blockUnderPlayer.getBlockZ();
+
+ return Math.sqrt((Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)));
+ }
+
+ /**
+ * Gets the rounded distance to a block. Measures from the block underneath the player to the targetblock
+ * Should only be used when passing player as an constructor parameter
+ *
+ * @return int
+ */
+ public int getDistanceToBlockRounded()
+ {
+ Vector blockUnderPlayer = new Vector(
+ (int) Math.floor(loc.getX() + 0.5),
+ (int) Math.floor(loc.getY() - 0.5),
+ (int) Math.floor(loc.getZ() + 0.5));
+
+ Block blk = getTargetBlock();
+ double x = blk.getX() - blockUnderPlayer.getBlockX();
+ double y = blk.getY() - blockUnderPlayer.getBlockY();
+ double z = blk.getZ() - blockUnderPlayer.getBlockZ();
+
+ return (int) Math.round((Math.sqrt((Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)))));
+ }
+
+ /**
+ * Gets the floored x distance to a block.
+ *
+ * @return int
+ */
+ public int getXDistanceToBlock()
+ {
+ this.reset();
+ return (int) Math.floor(getTargetBlock().getX() - loc.getBlockX() + 0.5);
+ }
+
+ /**
+ * Gets the floored y distance to a block
+ *
+ * @return int
+ */
+ public int getYDistanceToBlock()
+ {
+ this.reset();
+ return (int) Math.floor(getTargetBlock().getY() - loc.getBlockY() + viewHeight);
+ }
+
+ /**
+ * Gets the floored z distance to a block
+ *
+ * @return int
+ */
+ public int getZDistanceToBlock()
+ {
+ this.reset();
+ return (int) Math.floor(getTargetBlock().getZ() - loc.getBlockZ() + 0.5);
+ }
+
+ /**
+ * Returns the block at the sight. Returns null if out of range or if no viable target was found
+ *
+ * @return Block
+ */
+ @SuppressWarnings("empty-statement")
+ public Block getTargetBlock()
+ {
+ this.reset();
+ while ((getNextBlock() != null) && ((getCurrentBlock().getTypeId() == 0) || this.blockToIgnoreHasValue(getCurrentBlock().getTypeId())));
+ return getCurrentBlock();
+ }
+
+ /**
+ * Sets the type of the block at the sight. Returns false if the block wasn't set.
+ *
+ * @param typeID ID of type to set the block to
+ * @return boolean
+ */
+ @SuppressWarnings("empty-statement")
+ public boolean setTargetBlock(int typeID)
+ {
+ if (Material.getMaterial(typeID) != null)
+ {
+ this.reset();
+ while (getNextBlock() != null && getCurrentBlock().getTypeId() == 0);
+ if (getCurrentBlock() != null)
+ {
+ Block blk = loc.getWorld().getBlockAt(targetPos.getBlockX(), targetPos.getBlockY(), targetPos.getBlockZ());
+ blk.setTypeId(typeID);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets the type of the block at the sight. Returns false if the block wasn't set.
+ *
+ * @param type Material to set the block to
+ * @return boolean
+ */
+ @SuppressWarnings("empty-statement")
+ public boolean setTargetBlock(Material type)
+ {
+ this.reset();
+ while ((getNextBlock() != null) && ((getCurrentBlock().getTypeId() == 0) || this.blockToIgnoreHasValue(getCurrentBlock().getTypeId())));
+ if (getCurrentBlock() != null)
+ {
+ Block blk = loc.getWorld().getBlockAt(targetPos.getBlockX(), targetPos.getBlockY(), targetPos.getBlockZ());
+ blk.setType(type);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Sets the type of the block at the sight. Returns false if the block wasn't set.
+ * Observe! At the moment this function is using the built-in enumerator function .valueOf(String) but would preferably be changed to smarter function, when implemented
+ *
+ * @param type Name of type to set the block to
+ * @return boolean
+ */
+ @SuppressWarnings("empty-statement")
+ public boolean setTargetBlock(String type)
+ {
+ Material mat = Material.valueOf(type);
+ if (mat != null)
+ {
+ this.reset();
+ while ((getNextBlock() != null) && ((getCurrentBlock().getTypeId() == 0) || this.blockToIgnoreHasValue(getCurrentBlock().getTypeId())));
+ if (getCurrentBlock() != null)
+ {
+ Block blk = loc.getWorld().getBlockAt(targetPos.getBlockX(), targetPos.getBlockY(), targetPos.getBlockZ());
+ blk.setType(mat);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the block attached to the face at the sight. Returns null if out of range or if no viable target was found
+ *
+ * @return Block
+ */
+ @SuppressWarnings("empty-statement")
+ public Block getFaceBlock()
+ {
+ while ((getNextBlock() != null) && ((getCurrentBlock().getTypeId() == 0) || this.blockToIgnoreHasValue(getCurrentBlock().getTypeId())));
+ if (getCurrentBlock() != null)
+ {
+ return getPreviousBlock();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Sets the type of the block attached to the face at the sight. Returns false if the block wasn't set.
+ *
+ * @param typeID
+ * @return boolean
+ */
+ public boolean setFaceBlock(int typeID)
+ {
+ if (Material.getMaterial(typeID) != null)
+ {
+ if (getCurrentBlock() != null)
+ {
+ Block blk = loc.getWorld().getBlockAt(prevPos.getBlockX(), prevPos.getBlockY(), prevPos.getBlockZ());
+ blk.setTypeId(typeID);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets the type of the block attached to the face at the sight. Returns false if the block wasn't set.
+ *
+ * @param type
+ * @return boolean
+ */
+ public boolean setFaceBlock(Material type)
+ {
+ if (getCurrentBlock() != null)
+ {
+ Block blk = loc.getWorld().getBlockAt(prevPos.getBlockX(), prevPos.getBlockY(), prevPos.getBlockZ());
+ blk.setType(type);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Sets the type of the block attached to the face at the sight. Returns false if the block wasn't set.
+ * Observe! At the moment this function is using the built-in enumerator function .valueOf(String) but would preferably be changed to smarter function, when implemented
+ *
+ * @param type
+ * @return boolean
+ */
+ public boolean setFaceBlock(String type)
+ {
+ Material mat = Material.valueOf(type);
+ if (mat != null)
+ {
+ if (getCurrentBlock() != null)
+ {
+ Block blk = loc.getWorld().getBlockAt(prevPos.getBlockX(), prevPos.getBlockY(), prevPos.getBlockZ());
+ blk.setType(mat);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Get next block
+ *
+ * @return Block
+ */
+ public Block getNextBlock()
+ {
+ prevPos = targetPos.clone();
+ do
+ {
+ curDistance += checkDistance;
+
+ targetPosDouble.setX(offset.getX() + targetPosDouble.getX());
+ targetPosDouble.setY(offset.getY() + targetPosDouble.getY());
+ targetPosDouble.setZ(offset.getZ() + targetPosDouble.getZ());
+ targetPos = new Vector( targetPosDouble.getBlockX(), targetPosDouble.getBlockY(), targetPosDouble.getBlockZ());
+ }
+ while (curDistance <= maxDistance && targetPos.getBlockX() == prevPos.getBlockX() && targetPos.getBlockY() == prevPos.getBlockY() && targetPos.getBlockZ() == prevPos.getBlockZ());
+ if (curDistance > maxDistance)
+ {
+ return null;
+ }
+
+ return this.loc.getWorld().getBlockAt(this.targetPos.getBlockX(), this.targetPos.getBlockY(), this.targetPos.getBlockZ());
+ }
+
+ /**
+ * Returns the current block along the line of vision
+ *
+ * @return Block
+ */
+ public Block getCurrentBlock()
+ {
+ if (curDistance > maxDistance)
+ {
+ return null;
+ }
+ else
+ {
+ return this.loc.getWorld().getBlockAt(this.targetPos.getBlockX(), this.targetPos.getBlockY(), this.targetPos.getBlockZ());
+ }
+ }
+
+ /**
+ * Sets current block type. Returns false if the block wasn't set.
+ *
+ * @param typeID
+ */
+ public boolean setCurrentBlock(int typeID)
+ {
+ if (Material.getMaterial(typeID) != null)
+ {
+ Block blk = getCurrentBlock();
+ if (blk != null)
+ {
+ blk.setTypeId(typeID);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets current block type. Returns false if the block wasn't set.
+ *
+ * @param type
+ */
+ public boolean setCurrentBlock(Material type)
+ {
+ Block blk = getCurrentBlock();
+ if (blk != null)
+ {
+ blk.setType(type);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Sets current block type. Returns false if the block wasn't set.
+ * Observe! At the moment this function is using the built-in enumerator function .valueOf(String) but would preferably be changed to smarter function, when implemented
+ *
+ * @param type
+ */
+ public boolean setCurrentBlock(String type)
+ {
+ Material mat = Material.valueOf(type);
+ if (mat != null)
+ {
+ Block blk = getCurrentBlock();
+ if (blk != null)
+ {
+ blk.setType(mat);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the previous block in the aimed path
+ *
+ * @return Block
+ */
+ public Block getPreviousBlock()
+ {
+ return this.loc.getWorld().getBlockAt(prevPos.getBlockX(), prevPos.getBlockY(), prevPos.getBlockZ());
+ }
+
+ /**
+ * Sets previous block type id. Returns false if the block wasn't set.
+ *
+ * @param typeID
+ */
+ public boolean setPreviousBlock(int typeID)
+ {
+ if (Material.getMaterial(typeID) != null)
+ {
+ Block blk = getPreviousBlock();
+ if (blk != null)
+ {
+ blk.setTypeId(typeID);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets previous block type id. Returns false if the block wasn't set.
+ *
+ * @param type
+ */
+ public boolean setPreviousBlock(Material type)
+ {
+ Block blk = getPreviousBlock();
+ if (blk != null)
+ {
+ blk.setType(type);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Sets previous block type id. Returns false if the block wasn't set.
+ * Observe! At the moment this function is using the built-in enumerator function .valueOf(String) but would preferably be changed to smarter function, when implemented
+ *
+ * @param type
+ */
+ public boolean setPreviousBlock(String type)
+ {
+ Material mat = Material.valueOf(type);
+ if (mat != null)
+ {
+ Block blk = getPreviousBlock();
+ if (blk != null)
+ {
+ blk.setType(mat);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private int[] convertStringArraytoIntArray(ArrayList<String> array)
+ {
+ if (array != null)
+ {
+ int intarray[] = new int[array.size()];
+ for (int i = 0; i < array.size(); i++)
+ {
+ try
+ {
+ intarray[i] = Integer.parseInt(array.get(i));
+ }
+ catch (NumberFormatException nfe)
+ {
+ intarray[i] = 0;
+ }
+ }
+ return intarray;
+ }
+ return null;
+ }
+
+ private boolean blockToIgnoreHasValue(int value)
+ {
+ if (this.blockToIgnore != null)
+ {
+ if (this.blockToIgnore.length > 0)
+ {
+ for (int i : this.blockToIgnore)
+ {
+ if (i == value)
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/Essentials/src/com/earth2me/essentials/TeleportTimer.java b/Essentials/src/com/earth2me/essentials/TeleportTimer.java
new file mode 100644
index 000000000..11d65170f
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/TeleportTimer.java
@@ -0,0 +1,73 @@
+package com.earth2me.essentials;
+
+import java.util.TimerTask;
+import java.util.Calendar;
+
+
+public abstract class TeleportTimer implements Runnable
+{
+ private long started; // time this task was initiated
+ private long delay; // how long to delay the teleport
+ public User user; // the person doing the teleport
+ private int health;
+ // note that I initially stored a clone of the location for reference, but...
+ // when comparing locations, I got incorrect mismatches (rounding errors, looked like)
+ // so, the X/Y/Z values are stored instead and rounded off
+ private long initX;
+ private long initY;
+ private long initZ;
+
+ public TeleportTimer(User tUser, long tDelay)
+ {
+ this.started = Calendar.getInstance().getTimeInMillis();
+ this.delay = tDelay;
+ this.user = tUser;
+ this.health = user.getHealth();
+ this.initX = Math.round(user.getLocation().getX() * 10000);
+ this.initY = Math.round(user.getLocation().getY() * 10000);
+ this.initZ = Math.round(user.getLocation().getZ() * 10000);
+ }
+
+ // This function needs to be defined when creating a new TeleportTimer
+ // The actual teleport command by itself should be stuck in there, such as teleportToNow(loc)
+ public abstract void DoTeleport();
+
+ public abstract void DoCancel();
+
+ public void run()
+ {
+ if (user == null || !user.isOnline() || user.getLocation() == null)
+ {
+ DoCancel();
+ return;
+ }
+ if (Math.round(user.getLocation().getX() * 10000) != initX
+ || Math.round(user.getLocation().getY() * 10000) != initY
+ || Math.round(user.getLocation().getZ() * 10000) != initZ
+ || user.getHealth() < health)
+ { // user moved, cancel teleport
+ user.cancelTeleport(true);
+ return;
+ }
+
+ health = user.getHealth(); // in case user healed, then later gets injured
+
+ long now = Calendar.getInstance().getTimeInMillis();
+ if (now > started + delay)
+ {
+ try
+ {
+ user.teleportCooldown(false);
+ user.sendMessage("§7Teleportation commencing...");
+ this.DoTeleport();
+ return;
+ }
+ catch (Exception ex)
+ {
+ user.sendMessage("§cCooldown: " + ex.getMessage());
+ }
+ }
+ //else // uncomment for timing debug
+ // user.sendMessage("§7" + (started + delay - now));
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java
new file mode 100644
index 000000000..472015997
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/User.java
@@ -0,0 +1,695 @@
+package com.earth2me.essentials;
+
+import java.util.*;
+import java.util.logging.*;
+import java.io.*;
+import org.bukkit.*;
+import com.earth2me.essentials.commands.IEssentialsCommand;
+import net.minecraft.server.EntityHuman;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.entity.*;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+
+public class User extends PlayerExtension implements Comparable<User>
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private final Yaml yaml = new Yaml(new SafeConstructor());
+ private boolean isLoaded = false;
+ private final File folder;
+ private Map<String, Object> data = new HashMap<String, Object>();
+ private static Map<String, User> users = new HashMap<String, User>();
+ private boolean teleEnabled = true;
+ private long lastTeleport = 0;
+ private long lastHeal = 0;
+ private boolean justPortaled = false;
+ //private TimerTask teleTimer = null;
+ private int teleTimer = -1;
+ public Location lastLocation = null;
+ private User replyTo = null;
+ private boolean isNew = false;
+ public String currentJail;
+ public CraftItemStack[] savedInventory;
+
+ private User(Player base)
+ {
+ super(base);
+ this.folder = new File((Essentials.getStatic() == null ? new File(".") : Essentials.getStatic().getDataFolder()), "userdata");
+
+ if (base instanceof EntityHuman)
+ {
+ this.lastLocation = getBase().getLocation();
+ }
+ load();
+ }
+
+ public static int size()
+ {
+ return users.size();
+ }
+
+ public static <T> User get(T base)
+ {
+ if (base instanceof Player)
+ return get((Player)base);
+ return null;
+ }
+
+ public static <T extends Player> User get(T base)
+ {
+ if (base == null)
+ return null;
+
+ if (base instanceof User)
+ return (User)base;
+
+ if (users.containsKey(base.getName()))
+ return users.get(base.getName()).update(base);
+
+ User u = new User(base);
+ users.put(u.getName(), u);
+ return u;
+ }
+
+ public static <T> void charge(T base, IEssentialsCommand cmd) throws Exception
+ {
+ if (base instanceof Player)
+ User.get(base).charge(cmd);
+ }
+
+ public boolean isNew()
+ {
+ return isNew;
+ }
+
+ public void respawn(Spawn spawn) throws Exception
+ {
+ respawn(spawn, null);
+ }
+
+ public void respawn(Spawn spawn, final String chargeFor) throws Exception
+ {
+ teleport(getSafeDestination(spawn.getSpawn(getGroup())), chargeFor);
+ }
+
+ private User update(Player base)
+ {
+ setBase(base);
+ return this;
+ }
+
+ public boolean isAuthorized(IEssentialsCommand cmd)
+ {
+ return isAuthorized("essentials." + (cmd.getName().equals("r") ? "msg" : cmd.getName()));
+ }
+
+ public boolean isAuthorized(String node)
+ {
+ if (isOp())
+ return true;
+
+ if (isJailed())
+ return false;
+
+ try
+ {
+ return com.nijikokun.bukkit.Permissions.Permissions.Security.permission(base, node);
+ }
+ catch (Throwable ex)
+ {
+ String[] cmds = node.split("\\.", 2);
+ return !Essentials.getSettings().isCommandRestricted(cmds[cmds.length - 1]);
+ }
+ }
+
+ public boolean isTeleEnabled()
+ {
+ return teleEnabled;
+ }
+
+ public boolean toggleTeleEnabled()
+ {
+ return teleEnabled = !teleEnabled;
+ }
+
+ public void teleportCooldown(boolean justCheck) throws Exception
+ {
+ long now = Calendar.getInstance().getTimeInMillis();
+ long cooldown = Essentials.getSettings().getTeleportCooldown();
+ long left = lastTeleport + cooldown - now;
+ if (left > 0 && !isOp() && !isAuthorized("essentials.teleport.cooldown.bypass"))
+ throw new Exception("Time before next teleport: " + Essentials.FormatTime(left));
+ // if justCheck is set, don't update lastTeleport; we're just checking
+ if (!justCheck) lastTeleport = now;
+ }
+
+ public void teleportCooldown() throws Exception
+ {
+ teleportCooldown(true);
+ }
+
+ public void healCooldown() throws Exception
+ {
+ long now = Calendar.getInstance().getTimeInMillis();
+ long cooldown = Essentials.getSettings().getHealCooldown();
+ long left = lastHeal + cooldown - now;
+ if (left > 0 && !isOp() && !isAuthorized("essentials.heal.cooldown.bypass"))
+ throw new Exception("Time before next heal: " + Essentials.FormatTime(left));
+ lastHeal = now;
+ }
+
+ private void load()
+ {
+ if (isLoaded) return;
+ isLoaded = true;
+
+ data = Essentials.getData(this);
+
+ try
+ {
+ if (!folder.exists()) folder.mkdirs();
+ File file = new File(folder, getName() + ".yml");
+ if (!file.exists())
+ {
+ isNew = true;
+ file.createNewFile();
+ logger.info(getName() + " has logged in for the first time.");
+ }
+
+ FileInputStream rx = new FileInputStream(file);
+ Map<String, Object> userData = (Map<String, Object>)yaml.load(new UnicodeReader(rx));
+ if (userData != null) data.putAll(userData);
+ rx.close();
+ }
+ catch (Throwable ex)
+ {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ finally
+ {
+ if (data == null) data = new HashMap<String, Object>();
+ }
+ }
+
+ private void flush()
+ {
+ try
+ {
+ if (!folder.exists()) folder.mkdirs();
+ File file = new File(folder, getName() + ".yml");
+ if (!file.exists()) file.createNewFile();
+
+ FileWriter tx = new FileWriter(file);
+ tx.write(yaml.dump(data));
+ tx.flush();
+ tx.close();
+ }
+ catch (Throwable ex)
+ {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public boolean isGodModeEnabled()
+ {
+ load();
+ return data.containsKey("godmode") && (Boolean)data.get("godmode");
+ }
+
+ public boolean toggleGodMode()
+ {
+ boolean retval = !isGodModeEnabled();
+ data.put("godmode", retval);
+ flush();
+ return retval;
+ }
+
+ public boolean isMuted()
+ {
+ load();
+ return data.containsKey("muted") && (Boolean)data.get("muted");
+ }
+
+ public boolean toggleMuted()
+ {
+ boolean retval = !isMuted();
+ data.put("muted", retval);
+ flush();
+ return retval;
+ }
+
+ public boolean isJailed()
+ {
+ //load(); Do not load config everytime time!
+ return data.containsKey("jailed") && (Boolean)data.get("jailed");
+ }
+
+ public boolean toggleJailed()
+ {
+ boolean retval = !isJailed();
+ data.put("jailed", retval);
+ flush();
+ load();
+ return retval;
+ }
+
+ public double getMoney()
+ {
+ load();
+ if (data.containsKey("money"))
+ {
+ if (data.get("money") instanceof Integer)
+ return (double)((Integer)data.get("money"));
+ return (Double)data.get("money");
+ }
+
+ try
+ {
+ return com.nijiko.coelho.iConomy.iConomy.getBank().getAccount(getName()).getBalance();
+ }
+ catch (Throwable ex)
+ {
+ try
+ {
+ Map<String, Object> idata = Essentials.getData(this);
+ return (Integer)idata.get("money");
+ }
+ catch (Throwable ex2)
+ {
+ return Essentials.getSettings().getStartingBalance();
+ }
+ }
+ }
+
+ public void setMoney(double value)
+ {
+ try
+ {
+ com.nijiko.coelho.iConomy.iConomy.getBank().getAccount(getName()).setBalance(value);
+ }
+ catch (Throwable ex)
+ {
+ data.put("money", value);
+ flush();
+ }
+ }
+
+ public void giveMoney(double value)
+ {
+ if (value == 0) return;
+ setMoney(getMoney() + value);
+ sendMessage("§a$" + value + " has been added to your account.");
+ }
+
+ public void payUser(User reciever, int value) throws Exception
+ {
+ if (value == 0) return;
+ if (!canAfford(value))
+ {
+ throw new Exception("You do not have sufficient funds.");
+ }
+ else
+ {
+ setMoney(getMoney() - value);
+ reciever.setMoney(reciever.getMoney() + value);
+ sendMessage("§a$" + value + " has been sent to " + reciever.getDisplayName());
+ reciever.sendMessage("§a$" + value + " has been recieved from " + getDisplayName());
+ }
+ }
+
+ public void takeMoney(double value)
+ {
+ if (value == 0) return;
+ setMoney(getMoney() - value);
+ sendMessage("§c$" + value + " has been taken from your account.");
+ }
+
+ public void charge(String cmd) throws Exception
+ {
+ double mon = getMoney();
+ double cost = Essentials.getSettings().getCommandCost(cmd.startsWith("/") ? cmd.substring(1) : cmd);
+ if (mon < cost && !isOp())
+ throw new Exception("You do not have sufficient funds.");
+ takeMoney(cost);
+ }
+
+ public void canAfford(String cmd) throws Exception
+ {
+ double mon = getMoney();
+ double cost = Essentials.getSettings().getCommandCost(cmd.startsWith("/") ? cmd.substring(1) : cmd);
+ if (mon < cost && !isOp())
+ throw new Exception("You do not have sufficient funds.");
+ }
+
+ public boolean canAfford(double cost)
+ {
+ double mon = getMoney();
+ if (mon < cost && !isOp())
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ public void canAfford(IEssentialsCommand cmd) throws Exception
+ {
+ canAfford(cmd.getName());
+ }
+
+ public void cancelTeleport(boolean notifyUser)
+ {
+ if (teleTimer == -1) return;
+ try
+ {
+ getServer().getScheduler().cancelTask(teleTimer);
+ if (notifyUser) sendMessage("§cPending teleportation request cancelled.");
+ }
+ catch (Throwable ex)
+ {
+ }
+ finally
+ {
+ teleTimer = -1;
+ }
+ }
+
+ public void cancelTeleport()
+ {
+ cancelTeleport(false);
+ }
+
+ public boolean teleport(final Location loc, final String chargeFor)
+ {
+ final long delay = Essentials.getSettings().getTeleportDelay();
+
+ if (delay <= 0 || isOp() || isAuthorized("essentials.teleport.timer.bypass"))
+ {
+ try
+ {
+ if (chargeFor != null) charge(chargeFor);
+ teleportCooldown(false);
+ return teleportToNow(loc);
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cError: " + ex.getMessage());
+ return false;
+ }
+ }
+
+ cancelTeleport();
+ sendMessage("§7Teleportation will commence in " + Essentials.FormatTime(delay) + ". Don't move.");
+ teleTimer = getServer().getScheduler().scheduleSyncRepeatingTask(Essentials.getStatic(), new TeleportTimer(this, delay)
+ {
+ public void DoTeleport()
+ {
+ try
+ {
+ if (chargeFor != null) charge(chargeFor);
+ teleportToNow(loc);
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cError: " + ex.getMessage());
+ }
+ }
+
+ public void DoCancel()
+ {
+ cancelTeleport();
+ }
+ }, 10, 10);
+ return true;
+ }
+
+ @Override
+ public boolean teleport(final Location loc)
+ {
+ return teleport(loc, null);
+ }
+
+ public boolean teleport(final Entity entity, final String chargeFor)
+ {
+ final long delay = Essentials.getSettings().getTeleportDelay();
+
+ if (delay <= 0 || isOp() || isAuthorized("essentials.teleport.timer.bypass"))
+ {
+ try
+ {
+ if (chargeFor != null) charge(chargeFor);
+ teleportCooldown(false);
+ return teleportToNow(entity);
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cError: " + ex.getMessage());
+ return false;
+ }
+ }
+
+ cancelTeleport();
+ sendMessage("§7Teleportation will commence in " + Essentials.FormatTime(delay) + ". Don't move.");
+ teleTimer = getServer().getScheduler().scheduleSyncRepeatingTask(Essentials.getStatic(), new TeleportTimer(this, delay)
+ {
+ public void DoTeleport()
+ {
+ try
+ {
+ if (chargeFor != null) charge(chargeFor);
+ teleportToNow(entity);
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cError: " + ex.getMessage());
+ }
+ }
+
+ public void DoCancel()
+ {
+ cancelTeleport();
+ }
+ }, 10, 10);
+ return true;
+ }
+
+ @Override
+ public boolean teleport(final Entity entity)
+ {
+ return teleport(entity, null);
+ }
+
+ public Location getHome() throws Exception
+ {
+ if (data.containsKey("home"))
+ {
+ List<Object> vals = (List<Object>)data.get("home");
+ World world = getServer() == null ? null : getServer().getWorlds().get(0);
+ if (vals.size() > 5 && getServer() != null)
+ getServer().getWorld((String)vals.get(5));
+ return new Location(
+ world,
+ (Double)vals.get(0),
+ (Double)vals.get(1),
+ (Double)vals.get(2),
+ ((Double)vals.get(3)).floatValue(),
+ ((Double)vals.get(4)).floatValue());
+ }
+
+ try
+ {
+ Map<String, Object> gdata = Essentials.getData(this);
+ List<Object> vals = (List<Object>)gdata.get("home");
+ World world = getServer().getWorlds().get(0);
+ if (vals.size() > 5)
+ getServer().getWorld((String)vals.get(5));
+ return new Location(world,
+ (Double)vals.get(0),
+ (Double)vals.get(1),
+ (Double)vals.get(2),
+ ((Double)vals.get(3)).floatValue(),
+ ((Double)vals.get(4)).floatValue());
+ }
+ catch (Throwable ex)
+ {
+ throw new Exception("You have not set a home.");
+ }
+ }
+
+ public void teleportToHome(final String chargeFor)
+ {
+ final long delay = Essentials.getSettings().getTeleportDelay();
+
+ Location loc = null;
+ try
+ {
+ // check this first in case user hasn't set a home yet
+ loc = getHome();
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cTeleport: " + ex.getMessage());
+ return;
+ }
+
+ if (delay <= 0 || isOp() || isAuthorized("essentials.teleport.timer.bypass"))
+ {
+ try
+ {
+ if (chargeFor != null) charge(chargeFor);
+ teleportCooldown(false);
+ teleportToNow(loc);
+ sendMessage("§7Teleporting home...");
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cError: " + ex.getMessage());
+ }
+ return;
+ }
+
+ cancelTeleport();
+ sendMessage("§7Teleportation will commence in " + Essentials.FormatTime(delay) + ". Don't move.");
+ teleTimer = getServer().getScheduler().scheduleSyncRepeatingTask(Essentials.getStatic(), new TeleportTimer(this, delay)
+ {
+ public void DoTeleport()
+ {
+ try
+ {
+ if (chargeFor != null) charge(chargeFor);
+ teleportToNow(getHome());
+ }
+ catch (Throwable ex)
+ {
+ sendMessage("§cError: " + ex.getMessage());
+ }
+ }
+
+ public void DoCancel()
+ {
+ cancelTeleport();
+ }
+ }, 10, 10);
+ }
+
+ public void teleportToHome()
+ {
+ teleportToHome(null);
+ }
+
+ public boolean teleportToNow(Location loc) throws Exception
+ {
+ cancelTeleport();
+ lastLocation = getLocation();
+ return getBase().teleport(getSafeDestination(loc));
+ }
+
+ public boolean teleportToNow(Entity entity)
+ {
+ cancelTeleport();
+ lastLocation = getLocation();
+ return getBase().teleport(entity);
+ }
+
+ public void teleportBack(final String chargeFor)
+ {
+ teleport(lastLocation, chargeFor);
+ }
+
+ public void teleportBack()
+ {
+ teleportBack(null);
+ }
+
+ public void dispose()
+ {
+ this.base = new OfflinePlayer(getName());
+ }
+
+ public void charge(IEssentialsCommand cmd) throws Exception
+ {
+ charge(cmd.getName());
+ }
+
+ public boolean getJustPortaled()
+ {
+ return justPortaled;
+ }
+
+ public void setJustPortaled(boolean value)
+ {
+ justPortaled = value;
+ }
+
+ public void setReplyTo(User user)
+ {
+ replyTo = user;
+ }
+
+ public User getReplyTo()
+ {
+ return replyTo;
+ }
+
+ public void setHome()
+ {
+ setHome(getLocation());
+ }
+
+ public void setHome(Location home)
+ {
+ List<Object> vals = new ArrayList<Object>(6);
+ vals.add(new Double(home.getX()));
+ vals.add(new Double(home.getY()));
+ vals.add(new Double(home.getZ()));
+ vals.add(new Double(home.getYaw()));
+ vals.add(new Double(home.getPitch()));
+ vals.add(home.getWorld() == null ? "world" : home.getWorld().getName());
+ data.put("home", vals);
+ flush();
+
+ setCompassTarget(home);
+ }
+
+ public String getNick()
+ {
+ Essentials ess = Essentials.getStatic();
+ String name = ess.getConfiguration().getBoolean("disable-nick", false) ? getName() : ess.readNickname(this);
+ if (isOp() && ess.getConfiguration().getString("ops-name-color", "c").matches("^[0-9a-f]$")) {
+ name = "§" + ess.getConfiguration().getString("ops-name-color", "c") + name + "§f";
+ }
+ return name;
+ }
+
+ public void warpTo(String warp, final String chargeFor) throws Exception
+ {
+ lastLocation = getLocation();
+ Location loc = Essentials.getWarps().getWarp(warp);
+ teleport(loc, chargeFor);
+ sendMessage("§7Warping to " + warp + ".");
+ }
+
+ public void warpTo(String string) throws Exception
+ {
+ warpTo(string, null);
+ }
+
+ public void clearNewFlag()
+ {
+ isNew = false;
+ }
+
+ public int compareTo(User t) {
+ return ChatColor.stripColor(this.getDisplayName()).compareToIgnoreCase(ChatColor.stripColor(t.getDisplayName()));
+ }
+
+ public Boolean canSpawnItem(int itemId)
+ {
+ if(Essentials.getSettings().itemSpawnBlacklist().contains(itemId))return false;
+ return true;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/Warps.java b/Essentials/src/com/earth2me/essentials/Warps.java
new file mode 100644
index 000000000..beaeddf29
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/Warps.java
@@ -0,0 +1,244 @@
+package com.earth2me.essentials;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.World;
+
+public class Warps implements IConf {
+
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ Map<StringIgnoreCase, EssentialsConf> warpPoints = new HashMap<StringIgnoreCase, EssentialsConf>();
+ File warpsFolder;
+ Server server;
+
+ public Warps(Server server, File dataFolder) {
+ this.server = server;
+ warpsFolder = new File(dataFolder, "warps");
+ if (!warpsFolder.exists()) {
+ warpsFolder.mkdirs();
+ } else {
+ convertWarps(dataFolder);
+ }
+ reloadConfig();
+ }
+
+ private String convertToFileName(String name) {
+ return name.toLowerCase().replaceAll("[^a-z0-9]", "_");
+ }
+
+ public boolean isEmpty() {
+ return warpPoints.isEmpty();
+ }
+
+ public Iterable<String> getWarpNames() {
+ List<String> keys = new ArrayList<String>();
+ for (StringIgnoreCase stringIgnoreCase : warpPoints.keySet()) {
+ keys.add(stringIgnoreCase.string);
+ }
+ Collections.sort(keys, String.CASE_INSENSITIVE_ORDER);
+ return keys;
+ }
+
+ public Location getWarp(String warp) throws Exception {
+ EssentialsConf conf = warpPoints.get(new StringIgnoreCase(warp));
+ if (conf == null) {
+ throw new Exception("That warp does not exist.");
+ }
+ double x = conf.getDouble("x", 0);
+ double y = conf.getDouble("y", 0);
+ double z = conf.getDouble("z", 0);
+ float yaw = (float) conf.getDouble("yaw", 0);
+ float pitch = (float) conf.getDouble("pitch", 0);
+ String world = conf.getString("world");
+ World w = server.getWorld(world);
+ if (w == null) {
+ throw new Exception("World of warp does not exist.");
+ }
+ return new Location(w, x, y, z, yaw, pitch);
+ }
+
+ public void setWarp(String name, Location loc) throws Exception {
+ setWarp(name, loc, null);
+ }
+
+ private void setWarp(String name, Location loc, String worldName) throws Exception {
+ String filename = convertToFileName(name);
+ EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
+ if (conf == null) {
+ File confFile = new File(warpsFolder, filename + ".yml");
+ if (confFile.exists()) {
+ throw new Exception("A warp with a similar name already exists.");
+ }
+ conf = new EssentialsConf(confFile);
+ conf.setProperty("name", name);
+ warpPoints.put(new StringIgnoreCase(name), conf);
+ }
+ conf.setProperty("x", loc.getBlockX());
+ conf.setProperty("y", loc.getBlockY());
+ conf.setProperty("z", loc.getBlockZ());
+ conf.setProperty("yaw", loc.getYaw());
+ conf.setProperty("pitch", loc.getPitch());
+ if (worldName != null) {
+ conf.setProperty("world", worldName);
+ } else {
+ conf.setProperty("world", loc.getWorld().getName());
+ }
+ conf.save();
+ }
+
+ public void delWarp(String name) throws Exception {
+ EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
+ if (conf == null) {
+ throw new Exception("Warp does not exist.");
+ }
+ if (!conf.getFile().delete()) {
+ throw new Exception("Problem deleting the warp file.");
+ }
+ warpPoints.remove(new StringIgnoreCase(name));
+ }
+
+ private void convertWarps(File dataFolder) {
+ File[] listOfFiles = warpsFolder.listFiles();
+ if (listOfFiles.length >= 1) {
+ for (int i = 0; i < listOfFiles.length; i++) {
+ String filename = listOfFiles[i].getName();
+ if (listOfFiles[i].isFile() && filename.endsWith(".dat")) {
+ try {
+ BufferedReader rx = new BufferedReader(new FileReader(listOfFiles[i]));
+ double x = Double.parseDouble(rx.readLine().trim());
+ double y = Double.parseDouble(rx.readLine().trim());
+ double z = Double.parseDouble(rx.readLine().trim());
+ float yaw = Float.parseFloat(rx.readLine().trim());
+ float pitch = Float.parseFloat(rx.readLine().trim());
+ String worldName = rx.readLine();
+ rx.close();
+ World w = null;
+ for (World world : server.getWorlds()) {
+ if (world.getEnvironment() != World.Environment.NETHER) {
+ w = world;
+ break;
+ }
+ }
+ boolean forceWorldName = false;
+ if (worldName != null) {
+ worldName.trim();
+ World w1 = null;
+ for (World world : server.getWorlds()) {
+ if (world.getName().equalsIgnoreCase(worldName)) {
+ w1 = world;
+ break;
+ }
+ }
+ if (w1 != null) {
+ w = w1;
+ } else {
+ File worldFolder = new File(dataFolder.getAbsoluteFile().getParentFile().getParentFile(), worldName);
+ if (worldFolder.exists() && worldFolder.isDirectory()) {
+ logger.log(Level.WARNING, "World " + worldName + " not loaded, but directory found. Converting warp anyway.");
+ forceWorldName = true;
+ }
+ }
+ }
+ Location loc = new Location(w, x, y, z, yaw, pitch);
+ setWarp(filename.substring(0, filename.length() - 4), loc, forceWorldName ? worldName : null);
+ if(!listOfFiles[i].renameTo(new File(warpsFolder, filename + ".old")))
+ {
+ throw new Exception("Renaming file " + filename + " failed");
+ }
+ } catch (Exception ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+
+ }
+ File warpFile = new File(dataFolder, "warps.txt");
+ if (warpFile.exists()) {
+ try {
+ BufferedReader rx = new BufferedReader(new FileReader(warpFile));
+ for (String[] parts = new String[0]; rx.ready(); parts = rx.readLine().split(":")) {
+ if (parts.length < 6) {
+ continue;
+ }
+ String name = parts[0];
+ double x = Double.parseDouble(parts[1].trim());
+ double y = Double.parseDouble(parts[2].trim());
+ double z = Double.parseDouble(parts[3].trim());
+ float yaw = Float.parseFloat(parts[4].trim());
+ float pitch = Float.parseFloat(parts[5].trim());
+ if (name.isEmpty()) {
+ continue;
+ }
+ World w = null;
+ for (World world : server.getWorlds()) {
+ if (world.getEnvironment() != World.Environment.NETHER) {
+ w = world;
+ break;
+ }
+ }
+ Location loc = new Location(w, x, y, z, yaw, pitch);
+ setWarp(name, loc);
+ if(!warpFile.renameTo(new File(dataFolder, "warps.txt.old")));
+ {
+ throw new Exception("Renaming warps.txt failed");
+ }
+ }
+ } catch (Exception ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+
+ public final void reloadConfig() {
+ warpPoints.clear();
+ File[] listOfFiles = warpsFolder.listFiles();
+ if (listOfFiles.length >= 1) {
+ for (int i = 0; i < listOfFiles.length; i++) {
+ String filename = listOfFiles[i].getName();
+ if (listOfFiles[i].isFile() && filename.endsWith(".yml")) {
+ EssentialsConf conf = new EssentialsConf(listOfFiles[i]);
+ conf.load();
+ String name = conf.getString("name");
+ if (name != null) {
+ warpPoints.put(new StringIgnoreCase(name), conf);
+ }
+ }
+ }
+ }
+ }
+
+ private class StringIgnoreCase {
+
+ String string;
+
+ public StringIgnoreCase(String string) {
+ this.string = string;
+ }
+
+ @Override
+ public int hashCode() {
+ return string.toLowerCase().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof String) {
+ return string.equalsIgnoreCase((String) o);
+ }
+ if (o instanceof StringIgnoreCase) {
+ return string.equalsIgnoreCase(((StringIgnoreCase) o).string);
+ }
+ return false;
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java
new file mode 100644
index 000000000..eb1ade4cd
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java
@@ -0,0 +1,32 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandafk extends EssentialsCommand
+{
+ public Commandafk()
+ {
+ super("afk");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+
+ if (parent.away.contains(user))
+ {
+ user.sendMessage("§7You are no longer marked as away.");
+ server.broadcastMessage("§7" + user.getDisplayName() + " is no longer AFK");
+ parent.away.remove(user);
+ return;
+ }
+
+ user.sendMessage("§7You are now marked as away.");
+ server.broadcastMessage("§7" + user.getDisplayName() + " is now AFK");
+ parent.away.add(user);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java b/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java
new file mode 100644
index 000000000..9e234ea15
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java
@@ -0,0 +1,39 @@
+package com.earth2me.essentials.commands;
+
+import net.minecraft.server.EntityTNTPrimed;
+import net.minecraft.server.World;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.CraftWorld;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.TargetBlock;
+
+
+public class Commandantioch extends EssentialsCommand
+{
+ public Commandantioch()
+ {
+ super("antioch");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (!user.isOp())
+ {
+ user.sendMessage("§cNone shall pass.");
+ return;
+ }
+
+ server.broadcastMessage("...lobbest thou thy Holy Hand Grenade of Antioch towards thy foe,");
+ server.broadcastMessage("who being naughty in My sight, shall snuff it.");
+
+ Location loc = user.getLocation();
+ World world = ((CraftWorld)user.getWorld()).getHandle();
+ loc = new TargetBlock(user).getTargetBlock().getLocation();
+ EntityTNTPrimed tnt = new EntityTNTPrimed(world, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ world.a(tnt);
+ world.a(tnt, "random.fuse", 1.0F, 1.0F);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandback.java b/Essentials/src/com/earth2me/essentials/commands/Commandback.java
new file mode 100644
index 000000000..03ceba9b6
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandback.java
@@ -0,0 +1,22 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Server;
+
+
+public class Commandback extends EssentialsCommand
+{
+ public Commandback()
+ {
+ super("back");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.canAfford(this);
+ user.sendMessage("§7Returning to previous location.");
+ user.teleportBack(this.getName());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java b/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java
new file mode 100644
index 000000000..7682cd141
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java
@@ -0,0 +1,43 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Backup;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+
+/**
+ *
+ * @author schlex
+ */
+public class Commandbackup extends EssentialsCommand {
+
+ public Commandbackup() {
+ super("backup");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception {
+ Backup backup = Essentials.getStatic().backup;
+ if (backup == null) return;
+ backup.run();
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception {
+ Backup backup = Essentials.getStatic().backup;
+ if (backup == null) return;
+ user.charge(this);
+ backup.run();
+ user.sendMessage("Backup started");
+ }
+
+
+
+
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java b/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java
new file mode 100644
index 000000000..6789af570
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java
@@ -0,0 +1,23 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+
+
+public class Commandbalance extends EssentialsCommand
+{
+ public Commandbalance()
+ {
+ super("balance");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.sendMessage("§7Balance: $" + (args.length < 1 || !user.isAuthorized("essentials.balance.other")
+ ? user
+ : getPlayer(server, args, 0)).getMoney());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandban.java b/Essentials/src/com/earth2me/essentials/commands/Commandban.java
new file mode 100644
index 000000000..c341d4645
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandban.java
@@ -0,0 +1,42 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.CraftServer;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandban extends EssentialsCommand
+{
+ public Commandban()
+ {
+ super("ban");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("§cUsage: /" + commandLabel + " [player] <reason>");
+ return;
+ }
+
+
+ User p = null;
+ if (server.matchPlayer(args[0]).isEmpty())
+ {
+ ((CraftServer)server).getHandle().c.f.a(args[0]);
+ sender.sendMessage("§cPlayer" + args[0] + " banned");
+ }
+ else
+ {
+ p = User.get(server.matchPlayer(args[0]).get(0));
+ p.kickPlayer(args.length > 1 ? getFinalArg(args, 1) : "Banned from server");
+ ((CraftServer)server).getHandle().c.f.a(p.getName());
+ sender.sendMessage("§cPlayer" + p.getName() + " banned");
+ }
+ Essentials.getStatic().loadBanList();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java
new file mode 100644
index 000000000..080bfa663
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java
@@ -0,0 +1,30 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.CraftServer;
+import com.earth2me.essentials.Essentials;
+
+
+public class Commandbanip extends EssentialsCommand
+{
+ public Commandbanip()
+ {
+ super("banip");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [address]");
+ return;
+ }
+
+ ((CraftServer)server).getHandle().c.f.c(args[0]);
+ sender.sendMessage("§7Banned IP address.");
+ Essentials.getStatic().loadBanList();
+
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java
new file mode 100644
index 000000000..a7546bb35
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java
@@ -0,0 +1,56 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.TreeType;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Location;
+
+
+public class Commandbigtree extends EssentialsCommand
+{
+ public Commandbigtree()
+ {
+ super("bigtree");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ Object tree = new Object();
+ if (args.length > 0 && args[0].equalsIgnoreCase("redwood"))
+ {
+ tree = TreeType.TALL_REDWOOD;
+ }
+ else if (args.length > 0 && args[0].equalsIgnoreCase("tree"))
+ {
+ tree = TreeType.BIG_TREE;
+ }
+ else
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [tree|redwood]");
+ return;
+ }
+
+ double x = user.getLocation().getX();
+ double y = user.getLocation().getY();
+ double z = user.getLocation().getZ();
+
+ // offset tree in direction player is facing
+ int r = (int)user.getCorrectedYaw();
+ if (r < 68 || r > 292) x -= 3.0D; // north
+ else if (r > 112 && r < 248) x += 3.0D; // south
+ if (r > 22 && r < 158) z -= 3.0D; // east
+ else if (r > 202 && r < 338) z += 3.0D; // west
+
+ Location safeLocation = user.getSafeDestination(new Location(user.getWorld(), x, y, z));
+ boolean success = user.getWorld().generateTree(safeLocation, (TreeType)tree);
+ if (success)
+ {
+ user.charge(this);
+ user.sendMessage("Big tree spawned.");
+ }
+ else
+ user.sendMessage("§cBig tree generation failure. Try again on grass or dirt.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java b/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java
new file mode 100644
index 000000000..2069e61b9
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandbroadcast.java
@@ -0,0 +1,32 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandbroadcast extends EssentialsCommand
+{
+ public Commandbroadcast()
+ {
+ super("broadcast");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("Usage: /" + commandLabel + " [msg]");
+ }
+
+ StringBuilder message = new StringBuilder();
+ for (int i = 0; i < args.length; i++)
+ {
+ message.append(args[i]);
+ message.append(' ');
+ }
+
+ server.broadcastMessage("[§cBroadcast§f]§a " + message.toString());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandburn.java b/Essentials/src/com/earth2me/essentials/commands/Commandburn.java
new file mode 100644
index 000000000..0c190a0f2
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandburn.java
@@ -0,0 +1,32 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.entity.Player;
+
+public class Commandburn extends EssentialsCommand
+{
+
+ public Commandburn()
+ {
+ super("burn");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 2)
+ {
+ user.sendMessage("§cUsage: /burn [player] [seconds]");
+ return;
+ }
+
+ User.charge(user, this);
+ for (Player p : server.matchPlayer(args[0]))
+ {
+ p.setFireTicks(Integer.parseInt(args[1]) * 20);
+ user.sendMessage("§cYou set " + p.getDisplayName() + " on fire for " + Integer.parseInt(args[1]) + "seconds.");
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java
new file mode 100644
index 000000000..de5c11376
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java
@@ -0,0 +1,99 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+import java.util.List;
+import org.bukkit.ChatColor;
+
+
+public class Commandclearinventory extends EssentialsCommand
+{
+ public Commandclearinventory()
+ {
+ super("clearinventory");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length > 0 && user.isAuthorized("essentials.clearinventory.others"))
+ {
+ if (args[0].length() >= 3)
+ {
+ List<Player> online = server.matchPlayer(args[0]);
+
+ if (!online.isEmpty())
+ {
+ for (Player p : online)
+ {
+ p.getInventory().clear();
+ user.sendMessage("§7Inventory of §c" + p.getDisplayName() + "§7 cleared.");
+ user.charge(this);
+ }
+ }
+ throw new Exception("Player not found");
+ }
+ else
+ {
+ Player u = server.getPlayer(args[0]);
+ if (u != null)
+ {
+ u.getInventory().clear();
+ user.sendMessage("§7Inventory of §c" + u.getDisplayName() + "§7 cleared.");
+ user.charge(this);
+ }
+ else
+ {
+ throw new Exception("Player not found");
+ }
+ }
+ }
+ else
+ {
+ user.getInventory().clear();
+ user.sendMessage("§7Inventory cleared.");
+ user.charge(this);
+ }
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage(ChatColor.RED + "Usage: " + commandLabel + " [player]");
+ return;
+ }
+
+ if (args[0].length() >= 3)
+ {
+ List<Player> online = server.matchPlayer(args[0]);
+
+ if (!online.isEmpty())
+ {
+ for (Player p : online)
+ {
+ p.getInventory().clear();
+ sender.sendMessage("§7Inventory of §c" + p.getDisplayName() + "§7 cleared.");
+ }
+ }
+ throw new Exception("Player not found");
+ }
+ else
+ {
+ Player u = server.getPlayer(args[0]);
+ if (u != null)
+ {
+ u.getInventory().clear();
+ sender.sendMessage("§7Inventory of §c" + u.getDisplayName() + "§7 cleared.");
+ }
+ else
+ {
+ throw new Exception("Player not found");
+ }
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java b/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java
new file mode 100644
index 000000000..f891f0bab
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java
@@ -0,0 +1,32 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandcompass extends EssentialsCommand
+{
+ public Commandcompass()
+ {
+ super("compass");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ int r = (int)user.getCorrectedYaw();
+ String dir;
+ if (r < 23) dir = "N";
+ else if (r < 68) dir = "NE";
+ else if (r < 113) dir = "E";
+ else if (r < 158) dir = "SE";
+ else if (r < 203) dir = "S";
+ else if (r < 248) dir = "SW";
+ else if (r < 293) dir = "W";
+ else if (r < 338) dir = "NW";
+ else dir = "N";
+ user.sendMessage("§7Bearing: " + dir + " (" + r + " degrees)");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddeljail.java b/Essentials/src/com/earth2me/essentials/commands/Commanddeljail.java
new file mode 100644
index 000000000..620db000c
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commanddeljail.java
@@ -0,0 +1,33 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+
+public class Commanddeljail extends EssentialsCommand {
+
+ public Commanddeljail() {
+ super("deljail");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [jailname]");
+ return;
+ }
+ user.charge(this);
+ Essentials.getJail().delJail(args[0]);
+ user.sendMessage("§7Jail " + args[0] + " has been removed");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception {
+ super.run(server, parent, sender, commandLabel, args);
+ }
+
+
+
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java
new file mode 100644
index 000000000..a9811fb8e
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java
@@ -0,0 +1,41 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commanddelwarp extends EssentialsCommand
+{
+ public Commanddelwarp()
+ {
+ super("delwarp");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [warp name]");
+ return;
+ }
+ user.charge(this);
+ Essentials.getWarps().delWarp(args[0]);
+ user.sendMessage("§7Warp removed.");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("§cUsage: /" + commandLabel + " [warp name]");
+ return;
+ }
+
+ Essentials.getWarps().delWarp(args[0]);
+ sender.sendMessage("§7Warp removed.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java
new file mode 100644
index 000000000..d01594809
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java
@@ -0,0 +1,24 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commanddepth extends EssentialsCommand
+{
+ public Commanddepth()
+ {
+ super("depth");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ int y = user.getLocation().getBlockY() - 63;
+ if (y > 0) user.sendMessage("§7You are " + y + " block(s) above sea level.");
+ else if (y < 0) user.sendMessage("§7You are " + (-y) + " block(s) below sea level.");
+ else user.sendMessage("§7You are at sea level.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java
new file mode 100644
index 000000000..79a55f986
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java
@@ -0,0 +1,82 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public class Commandeco extends EssentialsCommand
+{
+ public Commandeco()
+ {
+ super("eco");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ EcoCommands cmd;
+ int amount;
+ try
+ {
+ cmd = EcoCommands.valueOf(args[0].toUpperCase());
+ amount = Integer.parseInt(args[2].replaceAll("[^0-9]", ""));
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage("§cUsage: /eco [give|take|reset] [player] [money]");
+ return;
+ }
+
+ if (args[1].contentEquals("*"))
+ {
+ for (Player p : server.getOnlinePlayers())
+ {
+ User u = User.get(p);
+ switch (cmd)
+ {
+ case GIVE:
+ u.giveMoney(amount);
+ break;
+
+ case TAKE:
+ u.takeMoney(amount);
+ break;
+
+ case RESET:
+ u.setMoney(amount == 0 ? Essentials.getSettings().getStartingBalance() : amount);
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (Player p : server.matchPlayer(args[1]))
+ {
+ User u = User.get(p);
+ switch (cmd)
+ {
+ case GIVE:
+ u.giveMoney(amount);
+ break;
+
+ case TAKE:
+ u.takeMoney(amount);
+ break;
+
+ case RESET:
+ u.setMoney(amount == 0 ? Essentials.getSettings().getStartingBalance() : amount);
+ break;
+ }
+ }
+ }
+ }
+
+
+ private enum EcoCommands
+ {
+ GIVE, TAKE, RESET
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java
new file mode 100644
index 000000000..d4cc4038d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java
@@ -0,0 +1,30 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandessentials extends EssentialsCommand
+{
+ public Commandessentials()
+ {
+ super("essentials");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ parent.reload();
+ user.charge(this);
+ user.sendMessage("§7Essentials Reloaded " + parent.getDescription().getVersion());
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ parent.reload();
+ sender.sendMessage("Essentials Reloaded " + parent.getDescription().getVersion());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/com/earth2me/essentials/commands/Commandext.java
new file mode 100644
index 000000000..1313ba5b9
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandext.java
@@ -0,0 +1,29 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.entity.Player;
+
+public class Commandext extends EssentialsCommand {
+
+ public Commandext() {
+ super("ext");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception {
+ if (args.length < 1) {
+ User.charge(user, this);
+ user.setFireTicks(0);
+ user.sendMessage("§7You extinguished yourself.");
+ return;
+ }
+
+ for (Player p : server.matchPlayer(args[0])) {
+ User.charge(user, this);
+ p.setFireTicks(0);
+ user.sendMessage("§7You extinguished " + p.getDisplayName() + ".");
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgc.java b/Essentials/src/com/earth2me/essentials/commands/Commandgc.java
new file mode 100644
index 000000000..08640e15b
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandgc.java
@@ -0,0 +1,29 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.command.CommandSender;
+
+
+public class Commandgc extends EssentialsCommand
+{
+ public Commandgc()
+ {
+ super("gc");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ sender.sendMessage("Maximum memory: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + " MB");
+ sender.sendMessage("Free memory: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + " MB");
+ for (World w : parent.getServer().getWorlds())
+ {
+ sender.sendMessage(
+ (w.getEnvironment() == World.Environment.NETHER ? "Nether" : "World") + " \"" + w.getName() + "\": "
+ + w.getLoadedChunks().length + " chunks, "
+ + w.getEntities().size() + " entities");
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java b/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java
new file mode 100644
index 000000000..39be2c524
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java
@@ -0,0 +1,33 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Location;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandgetpos extends EssentialsCommand
+{
+ public Commandgetpos()
+ {
+ super("getpos");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "coords" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ Location coords = user.getLocation();
+ user.sendMessage("§7X: " + coords.getBlockX() + " (-North <-> +South)");
+ user.sendMessage("§7Y: " + coords.getBlockY() + " (+Up <-> -Down)");
+ user.sendMessage("§7Z: " + coords.getBlockZ() + " (+East <-> -West)");
+ user.sendMessage("§7Yaw: " + user.getCorrectedYaw() + " (Rotation)");
+ user.sendMessage("§7Pitch: " + coords.getPitch() + " (Head angle)");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/com/earth2me/essentials/commands/Commandgive.java
new file mode 100644
index 000000000..559fc5c32
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandgive.java
@@ -0,0 +1,49 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.ItemDb;
+import com.earth2me.essentials.User;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+
+public class Commandgive extends EssentialsCommand
+{
+ public Commandgive()
+ {
+ super("give");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 2)
+ {
+ sender.sendMessage(ChatColor.RED + "Usage: /" + commandLabel + " [player] [item]<:data> <amount>");
+ return;
+ }
+
+ String[] itemArgs = args[1].split("[^a-zA-Z0-9]");
+ ItemStack stack = ItemDb.get(itemArgs[0]);
+
+ if(sender instanceof Player && !User.get(sender).isAuthorized("essentials.itemspawn.exempt") && !User.get(sender).canSpawnItem(stack.getTypeId()))
+ {
+ sender.sendMessage(ChatColor.RED + "You are not allowed to spawn that item");
+ return;
+ }
+ if (itemArgs.length > 1)
+ stack.setDurability(Short.parseShort(itemArgs[1]));
+ if (args.length > 2)
+ stack.setAmount(Integer.parseInt(args[2]));
+
+ User giveTo = getPlayer(server, args, 0);
+ String itemName = stack.getType().name().toLowerCase().replace('_', ' ');
+ if (sender instanceof Player)
+ User.get(sender).charge(this);
+ sender.sendMessage(ChatColor.BLUE + "Giving " + stack.getAmount() + " of " + itemName + " to " + giveTo.getDisplayName() + ".");
+ giveTo.getInventory().addItem(stack);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgod.java b/Essentials/src/com/earth2me/essentials/commands/Commandgod.java
new file mode 100644
index 000000000..700be8c88
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandgod.java
@@ -0,0 +1,32 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Server;
+import org.bukkit.entity.Player;
+
+
+public class Commandgod extends EssentialsCommand
+{
+ public Commandgod()
+ {
+ super("god");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length > 0 && (user.isAuthorized("essentials.god.others") || user.isOp()))
+ {
+ for (Player p : server.matchPlayer(args[0]))
+ {
+ User u = User.get(p);
+ boolean enabled = u.toggleGodMode();
+ u.sendMessage("§7God mode " + (enabled ? "enabled." : "disabled."));
+ user.sendMessage("§7God mode " + (enabled ? "enabled for " : "disabled for ") + p.getDisplayName() + ".");
+ }
+ return;
+ }
+ user.sendMessage("§7God mode " + (user.toggleGodMode() ? "enabled." : "disabled."));
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java
new file mode 100644
index 000000000..ddadda860
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java
@@ -0,0 +1,53 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public class Commandheal extends EssentialsCommand
+{
+ public Commandheal()
+ {
+ super("heal");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length > 0 && user.isAuthorized("essentials.heal.others"))
+ {
+ if (!user.isAuthorized("essentials.heal.cooldown.bypass")) user.healCooldown();
+ user.charge(this);
+ for (Player p : server.matchPlayer(args[0]))
+ {
+ p.setHealth(20);
+ user.sendMessage("§7Healed " + p.getDisplayName() + ".");
+ }
+ return;
+ }
+
+ if (!user.isAuthorized("essentials.heal.cooldown.bypass")) user.healCooldown();
+ user.charge(this);
+ user.setHealth(20);
+ user.sendMessage("§7You have been healed.");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [player]");
+ return;
+ }
+
+ for (Player p : server.matchPlayer(args[0]))
+ {
+ p.setHealth(20);
+ sender.sendMessage("Healed " + p.getDisplayName() + ".");
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java
new file mode 100644
index 000000000..1468cced5
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java
@@ -0,0 +1,129 @@
+package com.earth2me.essentials.commands;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginDescriptionFile;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandhelp extends EssentialsCommand
+{
+ public final Yaml yaml = new Yaml(new SafeConstructor());
+
+ public Commandhelp()
+ {
+ super("help");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ int page;
+ try
+ {
+ page = args.length > 0 ? Integer.parseInt(args[0]) : 1;
+ }
+ catch (Exception ex)
+ {
+ page = 1;
+ }
+
+ List<String> lines = getHelpLines(parent, user);
+ int start = (page - 1) * 9;
+ int pages = lines.size() / 9 + (lines.size() % 9 > 0 ? 1 : 0);
+
+ user.sendMessage("Page §c" + page + "§f of §c" + pages + "§f:");
+ for (int i = start; i < lines.size() && i < start + 9; i++)
+ {
+ user.sendMessage(lines.get(i));
+ }
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ sender.sendMessage("To view help from the console, type \"?\".");
+ }
+
+ @SuppressWarnings("CallToThreadDumpStack")
+ private List<String> getHelpLines(Essentials parent, User user) throws Exception
+ {
+ List<String> retval = new ArrayList<String>();
+ File file = new File(parent.getDataFolder(), "help.txt");
+ if (file.exists())
+ {
+ BufferedReader rx = new BufferedReader(new FileReader(file));
+ for (String l = null; rx.ready() && (l = rx.readLine()) != null;)
+ {
+ retval.add(l.replace('&', '§'));
+ }
+ return retval;
+ }
+
+ boolean reported = false;
+ for (Plugin p : parent.getServer().getPluginManager().getPlugins())
+ {
+ try
+ {
+ PluginDescriptionFile desc = p.getDescription();
+ HashMap<String, HashMap<String, String>> cmds = (HashMap<String, HashMap<String, String>>)desc.getCommands();
+ for (String k : cmds.keySet())
+ {
+ if (p.getDescription().getName().toLowerCase().contains("essentials"))
+ {
+ String node = "essentials." + k;
+ if (!Essentials.getSettings().isCommandDisabled(k) && user.isAuthorized(node))
+ {
+ HashMap<String, String> v = cmds.get(k);
+ retval.add("§c" + k + "§7: " + v.get("description"));
+ }
+ }
+ else
+ {
+ if (Essentials.getSettings().showNonEssCommandsInHelp())
+ {
+ HashMap<String, String> v = cmds.get(k);
+ if (v.containsKey("permission") && v.get("permission") != null && !(v.get("permission").equals("")))
+ {
+ if (user.isAuthorized(v.get("permission")))
+ {
+ retval.add("§c" + k + "§7: " + v.get("description"));
+ }
+ }
+ else
+ {
+ retval.add("§c" + k + "§7: " + v.get("description"));
+ }
+ }
+
+ }
+ }
+ }
+ catch (NullPointerException ex)
+ {
+
+ continue;
+ }
+ catch (Exception ex)
+ {
+ if (!reported)
+ {
+ ex.printStackTrace();
+ }
+ reported = true;
+ continue;
+ }
+ }
+ return retval;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java b/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java
new file mode 100644
index 000000000..03dbad50e
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java
@@ -0,0 +1,33 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public class Commandhelpop extends EssentialsCommand
+{
+ public Commandhelpop()
+ {
+ super("helpop");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cTo request help from an op, type §f/" + commandLabel+ "§c, followed by your question.");
+ return;
+ }
+
+ user.charge(this);
+ for (Player p : server.getOnlinePlayers())
+ {
+ User u = User.get(p);
+ if (!u.isOp() && !u.isAuthorized("essentials.helpop.receive")) continue;
+ u.sendMessage("§c[HelpOp]§f §7" + user.getDisplayName() + ":§f " + getFinalArg(args, 0));
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java
new file mode 100644
index 000000000..0dc92d25a
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java
@@ -0,0 +1,21 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+public class Commandhome extends EssentialsCommand
+{
+ public Commandhome()
+ {
+ super("home");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.canAfford(this);
+ user.teleportCooldown();
+ user.teleportToHome(this.getName());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java
new file mode 100644
index 000000000..2e7ec407a
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java
@@ -0,0 +1,39 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.inventory.CraftInventory;
+
+public class Commandinvsee extends EssentialsCommand {
+
+ public Commandinvsee() {
+ super("invsee");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception {
+
+ if (args.length == 0 && user.savedInventory == null) {
+ user.sendMessage("§cUsage: /" + commandLabel + " <user>");
+ }
+ User invUser = user;
+ if (args.length == 1) {
+ invUser = getPlayer(server, args, 0);
+ }
+ if (invUser == user && user.savedInventory != null) {
+ ((CraftInventory)invUser.getInventory()).setContents(user.savedInventory);
+ user.savedInventory = null;
+ user.sendMessage("Your inventory has been restored.");
+ return;
+ }
+
+ user.charge(this);
+ if (user.savedInventory == null) {
+ user.savedInventory = ((CraftInventory)user.getInventory()).getContents();
+ }
+ ((CraftInventory)user.getInventory()).setContents(((CraftInventory)invUser.getInventory()).getContents());
+ user.sendMessage("You see the inventory of "+invUser.getDisplayName()+".");
+ user.sendMessage("Use /invsee to restore your inventory.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanditem.java b/Essentials/src/com/earth2me/essentials/commands/Commanditem.java
new file mode 100644
index 000000000..97d1d2218
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commanditem.java
@@ -0,0 +1,45 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.ItemDb;
+import com.earth2me.essentials.User;
+import org.bukkit.ChatColor;
+import org.bukkit.inventory.ItemStack;
+
+
+public class Commanditem extends EssentialsCommand
+{
+ public Commanditem()
+ {
+ super("item");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [item] <amount>");
+ return;
+ }
+ String[] itemArgs = args[0].split("[^a-zA-Z0-9]");
+ ItemStack stack = ItemDb.get(itemArgs[0]);
+
+ if(!user.isAuthorized("essentials.itemspawn.exempt") && !user.canSpawnItem(stack.getTypeId()))
+ {
+ user.sendMessage(ChatColor.RED + "You are not allowed to spawn that item");
+ return;
+ }
+ if (itemArgs.length > 1)
+ stack.setDurability(Short.parseShort(itemArgs[1]));
+
+ if (args.length > 1)
+ stack.setAmount(Integer.parseInt(args[1]));
+
+ String itemName = stack.getType().name().toLowerCase().replace('_', ' ');
+ user.charge(this);
+ user.sendMessage("§7Giving " + stack.getAmount() + " of " + itemName + " to " + user.getDisplayName() + ".");
+ user.getInventory().addItem(stack);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandjails.java b/Essentials/src/com/earth2me/essentials/commands/Commandjails.java
new file mode 100644
index 000000000..75018eb19
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandjails.java
@@ -0,0 +1,37 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+
+public class Commandjails extends EssentialsCommand {
+
+ public Commandjails() {
+ super("jails");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception {
+ StringBuilder jailList = new StringBuilder();
+ for (String j : Essentials.getJail().getJails())
+ {
+ jailList.append(j);
+ jailList.append(' ');
+ }
+ sender.sendMessage("§7" + jailList);
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception {
+ StringBuilder jailList = new StringBuilder();
+ for (String j : Essentials.getJail().getJails())
+ {
+ jailList.append(j);
+ jailList.append(' ');
+ }
+ user.sendMessage("§7" + jailList);
+ }
+
+
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandjump.java b/Essentials/src/com/earth2me/essentials/commands/Commandjump.java
new file mode 100644
index 000000000..b753fc4b3
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandjump.java
@@ -0,0 +1,50 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Location;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.TargetBlock;
+import com.earth2me.essentials.User;
+
+
+public class Commandjump extends EssentialsCommand
+{
+ public Commandjump()
+ {
+ super("jump");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[]
+ {
+ getName(), "j"
+ };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ Location loc;
+ Location cloc = user.getLocation();
+
+ try
+ {
+ loc = new TargetBlock(user, 100, 2.65).getTargetBlock().getLocation();
+ loc.setYaw(cloc.getYaw());
+ loc.setPitch(cloc.getPitch());
+ loc = new TargetBlock(loc).getPreviousBlock().getLocation();
+ loc.setYaw(cloc.getYaw());
+ loc.setPitch(cloc.getPitch());
+ loc.setY(loc.getY() + 1);
+ }
+ catch (NullPointerException ex)
+ {
+ throw new Exception("That would hurt your computer's brain.", ex);
+ }
+
+ user.canAfford(this);
+ user.teleport(loc, this.getName());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkick.java b/Essentials/src/com/earth2me/essentials/commands/Commandkick.java
new file mode 100644
index 000000000..ddf5de5f5
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandkick.java
@@ -0,0 +1,41 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.ChatColor;
+
+
+public class Commandkick extends EssentialsCommand
+{
+ public Commandkick()
+ {
+ super("kick");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage(ChatColor.RED + "Usage: /" + commandLabel + " [player] <reason>");
+ return;
+ }
+
+ User p;
+ try
+ {
+ p = User.get(server.matchPlayer(args[0]).get(0));
+ }
+ catch (Throwable ex)
+ {
+ sender.sendMessage(ChatColor.RED + "That player does not exist!");
+ return;
+ }
+
+ charge(sender);
+ p.kickPlayer(args.length > 1 ? getFinalArg(args, 1) : "Kicked from server");
+
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java b/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java
new file mode 100644
index 000000000..e73f57a00
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandkickall.java
@@ -0,0 +1,55 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+public class Commandkickall extends EssentialsCommand
+{
+ public Commandkickall()
+ {
+ super("kickall");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§7Usage: /" + commandLabel + "<reason>");
+ return;
+ }
+
+
+ for (Player p : server.getOnlinePlayers())
+ {
+ if (server.getOnlinePlayers().length == 1 && p.getName().equalsIgnoreCase(user.getName()))
+ {
+ user.sendMessage("§7Only you online...");
+ return;
+ }
+ else
+ {
+ if (!p.getName().equalsIgnoreCase(user.getName()))
+ {
+ p.kickPlayer(args.length < 1 ? args[0] : "Kicked from server");
+ }
+ }
+ }
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + "<reason>");
+ return;
+ }
+
+ for (Player p : server.getOnlinePlayers())
+ p.kickPlayer(args.length < 1 ? args[0] : "Kicked from server");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkill.java b/Essentials/src/com/earth2me/essentials/commands/Commandkill.java
new file mode 100644
index 000000000..ef5315c85
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandkill.java
@@ -0,0 +1,33 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public class Commandkill extends EssentialsCommand
+{
+ public Commandkill()
+ {
+ super("kill");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("§cUsage: /kill [player]");
+ return;
+ }
+
+ User.charge(sender, this);
+ for (Player p : server.matchPlayer(args[0]))
+ {
+ p.setHealth(0);
+ sender.sendMessage("§cKilled " + p.getDisplayName() + ".");
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java
new file mode 100644
index 000000000..eb251b06b
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java
@@ -0,0 +1,150 @@
+package com.earth2me.essentials.commands;
+
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.inventory.ItemStack;
+
+
+public class Commandkit extends EssentialsCommand
+{
+ static private final Map<User, Map<String, Long>> kitPlayers = new HashMap<User, Map<String, Long>>();
+
+ public Commandkit()
+ {
+ super("kit");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ try
+ {
+ Map<String, Object> kits = (Map<String, Object>)parent.getConfiguration().getProperty("kits");
+ StringBuilder list = new StringBuilder();
+ for (String k : kits.keySet())
+ {
+ if (user.isAuthorized("essentials.kit." + k))
+ {
+ list.append(" ").append(k);
+ }
+ }
+ if (list.length() > 0)
+ {
+ user.sendMessage("§7Kits:" + list.toString());
+ }
+ else
+ {
+ user.sendMessage("§7There are no kits available yet");
+ }
+ }
+ catch (Exception ex)
+ {
+ user.sendMessage("§cThere are no valid kits.");
+ }
+ }
+ else
+ {
+ try
+ {
+ String kitName = args[0].toLowerCase();
+ Object kit = Essentials.getSettings().getKit(kitName);
+ List<String> items;
+
+ if (!user.isAuthorized("essentials.kit." + kitName))
+ {
+ user.sendMessage("§cYou need the §fessentials.kit." + kitName + "§c permission to use that kit.");
+ return;
+ }
+
+ try
+ {
+
+ System.out.println("Kit is timed");
+ Map<String, Object> els = (Map<String, Object>)kit;
+ items = (List<String>)els.get("items");
+ long delay = els.containsKey("delay") ? (Integer)els.get("delay") * 1000L : 0L;
+ long time = Calendar.getInstance().getTimeInMillis();
+
+ Map<String, Long> kitTimes;
+ if (!kitPlayers.containsKey(user))
+ {
+ kitTimes = new HashMap<String, Long>();
+ kitTimes.put(kitName, time);
+ kitPlayers.put(user, kitTimes);
+ }
+ else
+ {
+ kitTimes = kitPlayers.get(user);
+ if (!kitTimes.containsKey(kitName))
+ {
+ kitTimes.put(kitName, time);
+ }
+ else if (kitTimes.get(kitName) + delay <= time)
+ {
+ kitTimes.put(kitName, time);
+ }
+ else
+ {
+ long left = kitTimes.get(kitName) + delay - time;
+ user.sendMessage("§cYou can't use that kit again for another " + Essentials.FormatTime(left) + ".");
+
+ return;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ items = (List<String>)kit;
+ }
+
+ try {
+ user.canAfford("kit-" + kitName);
+ } catch (Exception ex) {
+ user.sendMessage(ex.getMessage());
+ return;
+ }
+
+ boolean spew = false;
+ for (String d : items)
+ {
+ String[] parts = d.split("[^0-9]+", 3);
+ int id = Integer.parseInt(parts[0]);
+ int amount = parts.length > 1 ? Integer.parseInt(parts[parts.length > 2 ? 2 : 1]) : 1;
+ short data = parts.length > 2 ? Short.parseShort(parts[1]) : 0;
+ if(user.getInventory().firstEmpty() != -1)
+ {
+ user.getInventory().addItem(new ItemStack(id, amount, data));
+ }
+ else
+ {
+ spew = true;
+ user.getWorld().dropItemNaturally(user.getLocation(), new ItemStack(id, amount, data));
+ }
+ }
+ if(spew)
+ {
+ user.sendMessage("§7Your inventory was full, placing kit on the floor");
+ }
+ try {
+ user.charge(this);
+ user.charge("kit-" + kitName);
+ } catch (Exception ex) {
+ user.sendMessage(ex.getMessage());
+ }
+ user.sendMessage("§7Giving kit " + args[0].toLowerCase() + ".");
+ }
+ catch (Exception ex)
+ {
+ user.sendMessage("§cThat kit does not exist or is improperly defined.");
+ user.sendMessage("§cPerhaps an item is missing a quantity in the configuration?");
+ }
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandlist.java b/Essentials/src/com/earth2me/essentials/commands/Commandlist.java
new file mode 100644
index 000000000..aeef26ac7
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandlist.java
@@ -0,0 +1,93 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.bukkit.ChatColor;
+
+
+public class Commandlist extends EssentialsCommand
+{
+ public Commandlist()
+ {
+ super("list");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ User.charge(sender, this);
+ StringBuilder online = new StringBuilder();
+ online.append(ChatColor.BLUE).append("There are ").append(ChatColor.RED).append(server.getOnlinePlayers().length);
+ online.append(ChatColor.BLUE).append(" out of a maximum ").append(ChatColor.RED).append(server.getMaxPlayers());
+ online.append(ChatColor.BLUE).append(" players online.");
+ sender.sendMessage(online.toString());
+
+ if (Essentials.getSettings().getSortListByGroups()) {
+ Map<String, List<User>> sort = new HashMap<String, List<User>>();
+ for (Player p : server.getOnlinePlayers())
+ {
+ User u = User.get(p);
+ String group = u.getGroup();
+ List<User> list = sort.get(group);
+ if (list == null) {
+ list = new ArrayList<User>();
+ sort.put(group, list);
+ }
+ list.add(u);
+ }
+ String[] groups = sort.keySet().toArray(new String[0]);
+ Arrays.sort(groups, String.CASE_INSENSITIVE_ORDER);
+ for (String group : groups) {
+ StringBuilder groupString = new StringBuilder();
+ groupString.append(group).append(": ");
+ List<User> users = sort.get(group);
+ Collections.sort(users);
+ boolean first = true;
+ for (User user : users) {
+ if (!first) {
+ groupString.append(", ");
+ } else {
+ first = false;
+ }
+ if (parent.away.contains(user)) {
+ groupString.append("§7[AFK]");
+ }
+ groupString.append(user.getDisplayName());
+ }
+ sender.sendMessage(groupString.toString());
+ }
+ } else {
+ List<User> users = new ArrayList<User>();
+ for (Player p : server.getOnlinePlayers())
+ {
+ users.add(User.get(p));
+ }
+ Collections.sort(users);
+
+ StringBuilder onlineUsers = new StringBuilder();
+ onlineUsers.append("Connected players: ");
+ boolean first = true;
+ for (User user : users) {
+ if (!first) {
+ onlineUsers.append(", ");
+ } else {
+ first = false;
+ }
+ if (parent.away.contains(user)) {
+ onlineUsers.append("§7[AFK]");
+ }
+ onlineUsers.append(user.getDisplayName());
+ }
+ sender.sendMessage(onlineUsers.toString());
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java
new file mode 100644
index 000000000..3e55c982d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java
@@ -0,0 +1,52 @@
+package com.earth2me.essentials.commands;
+
+import java.util.List;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandmail extends EssentialsCommand
+{
+ public Commandmail()
+ {
+ super("mail");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length >= 1 && "read".equalsIgnoreCase(args[0]))
+ {
+ List<String> mail = Essentials.readMail(user);
+ if (mail.isEmpty())
+ {
+ user.sendMessage("§cYou do not have any mail!");
+ return;
+ }
+ for (String s : mail) user.sendMessage(s);
+ user.sendMessage("§cTo mark your mail as read, type §c/mail clear");
+ return;
+ }
+ if(args.length >= 3 && "send".equalsIgnoreCase(args[0]))
+ {
+ if (!user.isAuthorized("essentials.mail.send"))
+ {
+ user.sendMessage("§cYou do not have the §fessentials.mail.send§c permission.");
+ return;
+ }
+
+ user.charge(this);
+ Essentials.sendMail(user, args[1], getFinalArg(args, 2));
+ user.sendMessage("§7Mail sent!");
+ return;
+ }
+ if (args.length >= 1 && "clear".equalsIgnoreCase(args[0]))
+ {
+ Essentials.clearMail(user);
+ user.sendMessage("§7Mail cleared!");
+ return;
+ }
+ user.sendMessage("§7Usage: /mail [read|clear|send [to] [message]]");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/com/earth2me/essentials/commands/Commandme.java
new file mode 100644
index 000000000..6b3deaf1d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandme.java
@@ -0,0 +1,43 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandme extends EssentialsCommand
+{
+ public Commandme()
+ {
+ super("me");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "describe", "action" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (user.isMuted())
+ { user.sendMessage("§7Your voice has been silenced");
+ return;
+ }
+
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /me [description]");
+ return;
+ }
+ StringBuilder message = new StringBuilder();
+ for (int i = 0; i < args.length; i++)
+ {
+ message.append(args[i]);
+ message.append(' ');
+ }
+ user.charge(this);
+ server.broadcastMessage("* " + user.getDisplayName() + " " + message);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java b/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java
new file mode 100644
index 000000000..652310e36
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java
@@ -0,0 +1,25 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.command.CommandSender;
+
+
+public class Commandmotd extends EssentialsCommand
+{
+ public Commandmotd()
+ {
+ super("motd");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ User.charge(sender, this);
+ for (String m : parent.getMotd(sender, "§cThere is no message of the day."))
+ {
+ sender.sendMessage(m);
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java
new file mode 100644
index 000000000..8b02bbf19
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java
@@ -0,0 +1,85 @@
+package com.earth2me.essentials.commands;
+
+import java.util.List;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+import org.bukkit.command.CommandSender;
+
+public class Commandmsg extends EssentialsCommand
+{
+ public Commandmsg()
+ {
+ super("msg");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "m", "tell", "whisper" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 2 || args[0].trim().length() == 0 || args[1].trim().length() == 0)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [player] [message]");
+ return;
+ }
+
+ StringBuilder message = new StringBuilder();
+ for (int i = 1; i < args.length; i++)
+ {
+ message.append(args[i]);
+ message.append(' ');
+ }
+
+ List<Player> matches = server.matchPlayer(args[0]);
+
+ if (matches.isEmpty())
+ {
+ user.sendMessage("§cThere are no players matching that name.");
+ return;
+ }
+
+ user.charge(this);
+ for (Player p : matches)
+ {
+ user.sendMessage("[Me -> " + p.getDisplayName() + "§f] " + message);
+ p.sendMessage("[" + user.getDisplayName() + " -> Me§f] " + message);
+ user.setReplyTo(User.get(p));
+ User.get(p).setReplyTo(user);
+ }
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 2 || args[0].trim().length() == 0 || args[1].trim().length() == 0)
+ {
+ sender.sendMessage("§cUsage: /" + commandLabel + " [player] [message]");
+ return;
+ }
+
+ StringBuilder message = new StringBuilder();
+ for (int i = 1; i < args.length; i++)
+ {
+ message.append(args[i]);
+ message.append(' ');
+ }
+ List<Player> matches = server.matchPlayer(args[0]);
+
+ if (matches.isEmpty())
+ {
+ sender.sendMessage("§cThere are no players matching that name.");
+ }
+
+ for (Player p : matches)
+ {
+ sender.sendMessage("[§2Me -> " + p.getDisplayName() + "§f] " + message);
+ p.sendMessage("[§2{Console} -> Me§f] " + message);
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java
new file mode 100644
index 000000000..30164e25d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java
@@ -0,0 +1,64 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandmute extends EssentialsCommand
+{
+ public Commandmute()
+ {
+ super("kick");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§7Usage: /" + commandLabel + " [player] <reason>");
+ return;
+ }
+
+ String[] sects2 = args[0].split(" +");
+ User p;
+ try
+ {
+ p = User.get(server.matchPlayer(args[0]).get(0));
+ }
+ catch (Exception ex)
+ {
+ user.sendMessage("§cThat player does not exist!");
+ return;
+ }
+
+ user.sendMessage("§7Player " + p.getName() + " " + (p.toggleMuted() ? "muted." : "unmuted."));
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [player] <reason>");
+ return;
+ }
+
+ String[] sects2 = args[0].split(" +");
+ User p;
+ try
+ {
+ p = User.get(server.matchPlayer(args[0]).get(0));
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage("§cThat player does not exist!");
+ return;
+ }
+
+ sender.sendMessage("Player " + p.getName() + " " + (p.toggleMuted() ? "muted." : "unmuted."));
+
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java
new file mode 100644
index 000000000..fb65539b6
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java
@@ -0,0 +1,129 @@
+package com.earth2me.essentials.commands;
+
+import java.util.List;
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public class Commandnick extends EssentialsCommand
+{
+ public Commandnick()
+ {
+ super("nick");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " <target> [nickname]");
+ return;
+ }
+
+ if (args.length > 1)
+ {
+ if (!user.isOp())
+ {
+ user.sendMessage("§cOnly operators can change the nicknames of other users.");
+ return;
+ }
+
+ List<Player> matches = server.matchPlayer(args[0]);
+ if (matches.isEmpty())
+ {
+ user.sendMessage("§cThat player does not exist.");
+ return;
+ }
+
+ User target = User.get(matches.get(0));
+ String nick = args[1];
+ if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick))
+ {
+ target.setDisplayName(target.getName());
+ parent.saveNickname(target, target.getName());
+ target.sendMessage("§7You no longer have a nickname.");
+ }
+ else
+ {
+ user.charge(this);
+ target.setDisplayName(parent.getConfiguration().getString("nickname-prefix", "~") + nick);
+ parent.saveNickname(target, nick);
+ target.sendMessage("§7Your nickname is now §c" + target.getDisplayName() + "§7.");
+ }
+ user.sendMessage("§7Nickname changed.");
+ }
+ else
+ {
+ String nick = args[0];
+ if ("off".equalsIgnoreCase(nick) || user.getName().equalsIgnoreCase(nick))
+ {
+ user.setDisplayName(user.getName());
+ parent.saveNickname(user, user.getName());
+ user.sendMessage("§7You no longer have a nickname.");
+ }
+ else
+ {
+ if (nick.matches("[^a-zA-Z_0-9]"))
+ {
+ user.sendMessage("§cNicknames must be alphanumeric.");
+ return;
+ }
+
+ for (Player p : server.getOnlinePlayers())
+ {
+ if (user == p) continue;
+ String dn = p.getDisplayName().toLowerCase();
+ String n = p.getName().toLowerCase();
+ String nk = nick.toLowerCase();
+ if (nk.equals(dn) || nk.equals(n))
+ {
+ user.sendMessage("§cThat name is already in use.");
+ return;
+ }
+ }
+
+ user.charge(this);
+ user.setDisplayName(parent.getConfiguration().getString("nickname-prefix", "~") + nick);
+ parent.saveNickname(user, nick);
+ user.sendMessage("§7Your nickname is now §c" + user.getDisplayName() + "§7.");
+ }
+ }
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 2)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [target] [nickname]");
+ return;
+ }
+
+ List<Player> matches = server.matchPlayer(args[0]);
+ if (matches.isEmpty())
+ {
+ sender.sendMessage("That player does not exist.");
+ return;
+ }
+
+ User target = User.get(matches.get(0));
+ String nick = args[1];
+ if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick))
+ {
+ target.setDisplayName(target.getName());
+ parent.saveNickname(target, target.getName());
+ target.sendMessage("§7You no longer have a nickname.");
+ }
+ else
+ {
+ target.setDisplayName(parent.getConfiguration().getString("nickname-prefix", "~") + nick);
+ parent.saveNickname(target, nick);
+ target.sendMessage("§7Your nickname is now §c" + target.getDisplayName() + "§7.");
+ }
+ sender.sendMessage("Nickname changed.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnuble.java b/Essentials/src/com/earth2me/essentials/commands/Commandnuble.java
new file mode 100644
index 000000000..dc6ab3ac3
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandnuble.java
@@ -0,0 +1,21 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandnuble extends EssentialsCommand
+{
+ public Commandnuble()
+ {
+ super("nuble");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ user.sendMessage("§7Flight is allowed on this server.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java
new file mode 100644
index 000000000..085f8febe
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java
@@ -0,0 +1,42 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+
+
+public class Commandpay extends EssentialsCommand
+{
+ public Commandpay()
+ {
+ super("pay");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+
+ int amount;
+ try
+ {
+ amount = Integer.parseInt(args[1].replaceAll("[^0-9]", ""));
+ }
+ catch (Exception ex)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [player] [money]");
+ return;
+ }
+
+ for (Player p : server.matchPlayer(args[0]))
+ {
+ User u = User.get(p);
+ user.payUser(u, amount);
+ }
+ }
+
+
+
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandping.java b/Essentials/src/com/earth2me/essentials/commands/Commandping.java
new file mode 100644
index 000000000..36d8e33c3
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandping.java
@@ -0,0 +1,26 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandping extends EssentialsCommand
+{
+ public Commandping()
+ {
+ super("ping");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "pong" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User player, String commandLabel, String[] args) throws Exception
+ {
+ player.sendMessage("Pong!");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandplugin.java b/Essentials/src/com/earth2me/essentials/commands/Commandplugin.java
new file mode 100644
index 000000000..df1ecdaad
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandplugin.java
@@ -0,0 +1,161 @@
+package com.earth2me.essentials.commands;
+
+import java.io.File;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginManager;
+
+
+public class Commandplugin extends EssentialsCommand
+{
+ private Server server;
+
+ public Commandplugin()
+ {
+ super("plugin");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ this.server = server;
+
+ PluginCommands sub = null;
+ try
+ {
+ sub = PluginCommands.valueOf(args[0].toUpperCase());
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage("§cUsage: /plugin [load|reload|enable|disable|list] [PluginName]");
+ return;
+ }
+
+ switch (sub)
+ {
+ case LOAD:
+ if (args.length < 2) return;
+ User.charge(sender, this);
+ loadPlugin(args[1], sender);
+ return;
+
+ case RELOAD:
+ if (args.length < 2) return;
+ User.charge(sender, this);
+ reloadPlugin(args[1], sender);
+ return;
+
+ case ENABLE:
+ if (args.length < 2) return;
+ User.charge(sender, this);
+ enablePlugin(args[1], sender);
+ return;
+
+ case DISABLE:
+ if (args.length < 2) return;
+ User.charge(sender, this);
+ disablePlugin(args[1], sender);
+ return;
+
+ case LIST:
+ User.charge(sender, this);
+ listPlugins(sender);
+ return;
+ }
+ }
+
+ private void listPlugins(CommandSender player)
+ {
+ StringBuilder plugins = new StringBuilder();
+ for (Plugin p : server.getPluginManager().getPlugins())
+ {
+ plugins.append(p.isEnabled() ? " §a" : " §c");
+ plugins.append(p.getDescription().getName());
+ }
+
+ plugins.insert(0, "§7Plugins:§f");
+ player.sendMessage(plugins.toString());
+ }
+
+ private boolean reloadPlugin(String name, CommandSender player)
+ {
+ return disablePlugin(name, player) && enablePlugin(name, player);
+ }
+
+ private boolean loadPlugin(String name, CommandSender sender)
+ {
+ try
+ {
+ PluginManager pm = server.getPluginManager();
+ pm.loadPlugin(new File("plugins", name + ".jar"));
+ sender.sendMessage("§7Plugin loaded.");
+ return enablePlugin(name, sender);
+ }
+ catch (Throwable ex)
+ {
+ sender.sendMessage("§cCould not load plugin. Is the file named properly?");
+ return false;
+ }
+ }
+
+ private boolean enablePlugin(String name, CommandSender sender)
+ {
+ try
+ {
+ final PluginManager pm = server.getPluginManager();
+ final Plugin plugin = pm.getPlugin(name);
+ if (!plugin.isEnabled()) new Thread(new Runnable()
+ {
+ public void run()
+ {
+ synchronized (pm)
+ {
+ pm.enablePlugin(plugin);
+ }
+ }
+ }).start();
+ sender.sendMessage("§7Plugin enabled.");
+ return true;
+ }
+ catch (Throwable ex)
+ {
+ listPlugins(sender);
+ return false;
+ }
+ }
+
+ private boolean disablePlugin(String name, CommandSender sender)
+ {
+ try
+ {
+ final PluginManager pm = server.getPluginManager();
+ final Plugin plugin = pm.getPlugin(name);
+ if (plugin.isEnabled()) new Thread(new Runnable()
+ {
+ public void run()
+ {
+ synchronized (pm)
+ {
+ pm.disablePlugin(plugin);
+ }
+ }
+ }).start();
+ sender.sendMessage("§7Plugin disabled.");
+ return true;
+ }
+ catch (Throwable ex)
+ {
+ listPlugins(sender);
+ return false;
+ }
+ }
+
+
+ private enum PluginCommands
+ {
+ LOAD, RELOAD, LIST, ENABLE, DISABLE
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandr.java b/Essentials/src/com/earth2me/essentials/commands/Commandr.java
new file mode 100644
index 000000000..9bc7f2f97
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandr.java
@@ -0,0 +1,37 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.*;
+import org.bukkit.*;
+
+
+public class Commandr extends EssentialsCommand
+{
+ public Commandr()
+ {
+ super("r");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [message]");
+ return;
+ }
+
+ String message = getFinalArg(args, 0);
+ User target = user.getReplyTo();
+
+ if (target == null)
+ {
+ user.sendMessage("§cYou have nobody to whom you can reply.");
+ }
+
+ user.charge(this);
+ user.sendMessage("[Me -> " + target.getDisplayName() + "] " + message);
+ target.sendMessage("[" + user.getDisplayName() + " -> Me] " + message);
+ user.setReplyTo(target);
+ target.setReplyTo(user);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java b/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java
new file mode 100644
index 000000000..6bec3f633
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java
@@ -0,0 +1,40 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public class Commandrealname extends EssentialsCommand
+{
+ public Commandrealname()
+ {
+ super("realname");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "realnick" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /whois [nickname]");
+ return;
+ }
+ String whois = args[0].toLowerCase();
+ user.charge(this);
+ for (Player p : server.getOnlinePlayers())
+ {
+ User u = User.get(p);
+ String dn = u.getDisplayName().toLowerCase();
+ if (!whois.equals(dn) && !whois.equals(parent.getSettings().getNicknamePrefix() + dn) && !whois.equals(u.getName().toLowerCase())) continue;
+ user.sendMessage(u.getDisplayName() + " is " + u.getName());
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandreloadall.java b/Essentials/src/com/earth2me/essentials/commands/Commandreloadall.java
new file mode 100644
index 000000000..c677bc1c6
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandreloadall.java
@@ -0,0 +1,37 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandreloadall extends EssentialsCommand
+{
+
+ public Commandreloadall()
+ {
+ super("reloadall");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "rel", "pr" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ server.reload();
+ user.sendMessage("§7Reloaded all plugins.");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ server.reload();
+ sender.sendMessage("Reloaded all plugins.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrules.java b/Essentials/src/com/earth2me/essentials/commands/Commandrules.java
new file mode 100644
index 000000000..e94b98755
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandrules.java
@@ -0,0 +1,23 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.*;
+
+
+public class Commandrules extends EssentialsCommand
+{
+ public Commandrules()
+ {
+ super("rules");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ for (String m : parent.getLines(user, "rules", "§cThere are no rules specified yet."))
+ {
+ user.sendMessage(m);
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsell.java b/Essentials/src/com/earth2me/essentials/commands/Commandsell.java
new file mode 100644
index 000000000..11ce4ba6d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandsell.java
@@ -0,0 +1,63 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+import org.bukkit.Material;
+import org.bukkit.inventory.ItemStack;
+
+
+public class Commandsell extends EssentialsCommand
+{
+ public Commandsell()
+ {
+ super("sell");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ ItemStack is = user.getInventory().getItemInHand();
+ if(is.getType() == Material.AIR)
+ throw new Exception("You really tried to sell Air? Put an item in your hand.");
+
+ int id = is.getTypeId();
+ int amount = 0;
+ if (args.length > 0) amount = Integer.parseInt(args[0].replaceAll("[^0-9]", ""));
+ int worth = parent.getConfiguration().getInt("worth-" + id, 0);
+ boolean stack = args.length > 0 && args[0].endsWith("s");
+ boolean requireStack = parent.getConfiguration().getBoolean("trade-in-stacks-" + id, false);
+
+ if (worth < 1) throw new Exception("That item cannot be sold to the server.");
+ if (requireStack && !stack) throw new Exception("Item must be traded in stacks. A quantity of 2s would be two stacks, etc.");
+
+ int max = 0;
+ for (ItemStack s : user.getInventory().all(is).values())
+ {
+ max += s.getAmount();
+ }
+
+ if (stack) amount *= 64;
+ if (amount < 1) amount += max;
+
+ if (requireStack)
+ {
+ amount -= amount % 64;
+ }
+
+ if (amount > max || amount < 1)
+ {
+ user.sendMessage("§cYou do not have enough of that item to sell.");
+ user.sendMessage("§7If you meant to sell all of your items of that type, use /sell without parameters.");
+ user.sendMessage("§7/sell -1 will sell all but one item, etc.");
+ return;
+ }
+
+ user.charge(this);
+ user.getInventory().removeItem(new ItemStack(id, amount));
+ user.updateInventory();
+ user.giveMoney(worth * amount);
+ user.sendMessage("§7Sold for §c$" + (worth * amount) + "§7 (" + amount + " items at $" + worth + " each)");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java
new file mode 100644
index 000000000..f4729ead8
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java
@@ -0,0 +1,22 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandsethome extends EssentialsCommand
+{
+ public Commandsethome()
+ {
+ super("sethome");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.setHome();
+ user.charge(this);
+ user.sendMessage("§7Home set.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java b/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java
new file mode 100644
index 000000000..f5c330188
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java
@@ -0,0 +1,28 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandsetjail extends EssentialsCommand
+{
+ public Commandsetjail()
+ {
+ super("setjail");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /" + commandLabel + " [jailname]");
+ return;
+ }
+ user.charge(this);
+ Essentials.getJail().setJail(user.getLocation(), args[0]);
+ user.sendMessage("§7Jail " + args[0] + " has been set");
+
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java
new file mode 100644
index 000000000..e510a8f73
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java
@@ -0,0 +1,30 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Location;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandsetwarp extends EssentialsCommand
+{
+ public Commandsetwarp()
+ {
+ super("setwarp");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /setwarp [warp name]");
+ return;
+ }
+
+ user.charge(this);
+ Location loc = user.getLocation();
+ Essentials.getWarps().setWarp(args[0], loc);
+ user.sendMessage("§7Warp set.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java
new file mode 100644
index 000000000..d73c0b843
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java
@@ -0,0 +1,41 @@
+package com.earth2me.essentials.commands;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.Server;
+import org.bukkit.block.Block;
+import org.bukkit.block.CreatureSpawner;
+import org.bukkit.entity.CreatureType;
+
+public class Commandspawner extends EssentialsCommand
+{
+ public Commandspawner()
+ {
+ super("spawner");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage(ChatColor.RED + "Usage: /" + commandLabel + " [mob]");
+ return;
+ }
+
+ Block target = user.getTarget().getTargetBlock();
+ if (target.getType() != Material.MOB_SPAWNER)
+ throw new Exception("Target block must be a mob spawner.");
+
+ try
+ {
+ ((CreatureSpawner)target).setCreatureType(CreatureType.fromName(args[0]));
+ }
+ catch (Throwable ex)
+ {
+
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java
new file mode 100644
index 000000000..c1c883a75
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java
@@ -0,0 +1,188 @@
+package com.earth2me.essentials.commands;
+
+import net.minecraft.server.WorldServer;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.entity.CraftEntity;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.Mob;
+import com.earth2me.essentials.Mob.MobException;
+import com.earth2me.essentials.TargetBlock;
+
+
+public class Commandspawnmob extends EssentialsCommand
+{
+ public Commandspawnmob()
+ {
+ super("spawnmob");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[]
+ {
+ getName(), "mob"
+ };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /spawnmob [mob]<,mount><:size> <quantity>");
+ user.sendMessage("§7Mobs: Zombie PigZombie Skeleton Slime Chicken Pig Monster Spider Creeper Ghast Squid Giant Cow Sheep");
+ return;
+ }
+
+ String[] split1 = args[0].split(":");
+ String[] split0 = null;
+ CraftEntity spawned1 = null;
+ Mob mob2 = null;
+ if (split1.length == 1 && !split1[0].equalsIgnoreCase("Slime"))
+ {
+ split0 = args[0].split(",");
+ split1[0] = split0[0];
+ }
+ if (split1.length == 2)
+ {
+ args[0] = split1[0] + "";
+ }
+ Mob mob = Mob.fromName(split1[0].equalsIgnoreCase("PigZombie") ? "PigZombie" : capitalCase(split1[0]));
+ if (mob == null)
+ {
+ user.sendMessage("Invalid mob type.");
+ return;
+ }
+ WorldServer world = ((org.bukkit.craftbukkit.CraftWorld)user.getWorld()).getHandle();
+ CraftEntity spawned = null;
+ try
+ {
+ spawned = mob.spawn(user, server);
+ }
+ catch (MobException e)
+ {
+ user.sendMessage("Unable to spawn mob.");
+ return;
+ }
+ int[] ignore = {8, 9};
+ Location loc = (new TargetBlock(user, 300, 0.2, ignore)).getTargetBlock().getLocation();
+ int blkId = user.getWorld().getBlockTypeIdAt(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ while (!(blkId == 0 || blkId == 8 || blkId == 9))
+ {
+ loc.setY(loc.getY() + 1);
+ blkId = user.getWorld().getBlockTypeIdAt(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ }
+ spawned.teleportTo(loc);
+ world.a(spawned.getHandle());
+ if (split0 != null && split0.length == 2)
+ {
+ mob2 = Mob.fromName(split0[1].equalsIgnoreCase("PigZombie") ? "PigZombie" : capitalCase(split0[1]));
+ if (mob2 == null)
+ {
+ user.sendMessage("Invalid mob type.");
+ return;
+ }
+ try
+ {
+ spawned1 = mob2.spawn(user, server);
+ }
+ catch (MobException e)
+ {
+ user.sendMessage("Unable to spawn mob.");
+ return;
+ }
+ spawned1.teleportTo(spawned);
+ spawned1.getHandle().setPassengerOf(spawned.getHandle());
+ world.a(spawned1.getHandle());
+ }
+ if (split1.length == 2 && "Slime".equals(mob.name))
+ {
+ try
+ {
+ //((EntitySlime)spawned.getHandle()).a(Integer.parseInt(split1[1]));
+ }
+ catch (Exception e)
+ {
+ user.sendMessage("Malformed size.");
+ return;
+ }
+ }
+ if (args.length == 2)
+ {
+ int mobCount = Integer.parseInt(args[1]);
+ int serverLimit = Essentials.getSettings().getSpawnMobLimit();
+ if(mobCount > serverLimit)
+ {
+ mobCount = serverLimit;
+ user.sendMessage("Mob quantity limited to server limit");
+ }
+ user.charge(this);
+ try
+ {
+ for (int i = 1; i < mobCount; i++)
+ {
+ spawned = mob.spawn(user, server);
+ spawned.teleportTo(loc);
+ if (split1.length > 1 && "Slime".equals("Slime"))
+ {
+ try
+ {
+ //((EntitySlime)spawned.getHandle()).a(Integer.parseInt(split1[1]));
+ }
+ catch (Exception e)
+ {
+ user.sendMessage("Malformed size.");
+ return;
+ }
+ }
+ world.a(spawned.getHandle());
+ if (split0.length == 2)
+ {
+ if (mob2 == null)
+ {
+ user.sendMessage("Invalid mob mount.");
+ return;
+ }
+ try
+ {
+ spawned1 = mob2.spawn(user, server);
+ }
+ catch (MobException e)
+ {
+ user.sendMessage("Unable to spawn mob.");
+ return;
+ }
+ spawned1.teleportTo(spawned);
+ spawned1.getHandle().setPassengerOf(spawned.getHandle());
+ world.a(spawned1.getHandle());
+ }
+ }
+ user.sendMessage(args[1] + " " + mob.name.toLowerCase() + mob.s + " spawned.");
+ }
+ catch (MobException e1)
+ {
+ throw new Exception("Unable to spawn mobs. Insert bad excuse here.");
+ }
+ catch (NumberFormatException e2)
+ {
+ throw new Exception("A number goes there, silly.");
+ }
+ catch (NullPointerException np)
+ {
+ throw new Exception("That mob likes to be alone");
+ }
+ }
+ else
+ {
+ user.sendMessage(mob.name + " spawned.");
+ }
+ }
+
+ private String capitalCase(String s)
+ {
+ return s.toUpperCase().charAt(0) + s.toLowerCase().substring(1);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java
new file mode 100644
index 000000000..07ac23e94
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java
@@ -0,0 +1,23 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandsuicide extends EssentialsCommand
+{
+ public Commandsuicide()
+ {
+ super("suicide");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ user.setHealth(0);
+ user.sendMessage("§cGoodbye Cruel World...");
+ server.broadcastMessage("§7" + user.getDisplayName() + " took their own life" );
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtime.java b/Essentials/src/com/earth2me/essentials/commands/Commandtime.java
new file mode 100644
index 000000000..63e565de8
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtime.java
@@ -0,0 +1,63 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtime extends EssentialsCommand
+{
+ public Commandtime()
+ {
+ super("time");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ World world = user.getWorld();
+ long time = world.getTime();
+ time = time - time % 24000;
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /time [day|night]");
+ return;
+ }
+ if ("day".equalsIgnoreCase(args[0]))
+ {
+ user.charge(this);
+ world.setTime(time + 24000);
+ return;
+ }
+ if ("night".equalsIgnoreCase(args[0]))
+ {
+ user.charge(this);
+ world.setTime(time + 37700);
+ return;
+ }
+ throw new Exception("/time only supports day/night.");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ for (World world : server.getWorlds())
+ {
+ long time = world.getTime();
+ time = time - time % 24000;
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /time [day|night]");
+ return;
+ }
+
+ if ("day".equalsIgnoreCase(args[0])) world.setTime(time + 24000);
+ else if ("night".equalsIgnoreCase(args[0])) world.setTime(time + 37700);
+ else throw new Exception("/time only supports day/night.");
+ }
+
+ sender.sendMessage("Time set in all worlds.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java b/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java
new file mode 100644
index 000000000..f6d399a0d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java
@@ -0,0 +1,67 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtogglejail extends EssentialsCommand
+{
+ public Commandtogglejail()
+ {
+ super("togglejail");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1 || args.length > 2)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [player] [jailname]");
+ return;
+ }
+
+ User p;
+ try
+ {
+ p = User.get(server.matchPlayer(args[0]).get(0));
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage("§cThat player does not exist.");
+ return;
+ }
+
+ if (p.isOp() || p.isAuthorized("essentials.jail.exempt"))
+ {
+ sender.sendMessage("§cYou may not jail that person");
+ return;
+ }
+
+ if (args.length == 2 && !p.isJailed()) {
+ User.charge(sender, this);
+ sender.sendMessage("§7Player " + p.getName() + " " + (p.toggleJailed() ? "jailed." : "unjailed."));
+ p.sendMessage("§7You have been jailed");
+ Essentials.getJail().sendToJail(p, args[1]);
+ p.currentJail = (args[1]);
+ return;
+ }
+
+ if (args.length == 2 && p.isJailed() && !args[1].equalsIgnoreCase(p.currentJail)) {
+ sender.sendMessage("§cPerson is already in jail "+ p.currentJail);
+ return;
+ }
+
+ if (args.length == 1 || (args.length == 2 && args[1].equalsIgnoreCase(p.currentJail))) {
+ if (!p.isJailed()) {
+ sender.sendMessage("Usage: /" + commandLabel + " [player] [jailname]");
+ return;
+ }
+ sender.sendMessage("§7Player " + p.getName() + " " + (p.toggleJailed() ? "jailed." : "unjailed."));
+ p.sendMessage("§7You have been released");
+ p.teleportBack();
+ p.currentJail = "";
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtop.java b/Essentials/src/com/earth2me/essentials/commands/Commandtop.java
new file mode 100644
index 000000000..a928701a2
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtop.java
@@ -0,0 +1,26 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Location;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtop extends EssentialsCommand
+{
+ public Commandtop()
+ {
+ super("top");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ int topX = user.getLocation().getBlockX();
+ int topZ = user.getLocation().getBlockZ();
+ int topY = user.getWorld().getHighestBlockYAt(topX, topZ);
+ user.charge(this);
+ user.teleport(new Location(user.getWorld(), user.getLocation().getX(), topY + 1, user.getLocation().getZ()), this.getName());
+ user.sendMessage("§7Teleporting to top.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtp.java b/Essentials/src/com/earth2me/essentials/commands/Commandtp.java
new file mode 100644
index 000000000..a36a7e415
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtp.java
@@ -0,0 +1,61 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.command.CommandSender;
+
+
+public class Commandtp extends EssentialsCommand
+{
+ public Commandtp()
+ {
+ super("tp");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ switch (args.length)
+ {
+ case 0:
+ user.sendMessage("§cUsage: /" + commandLabel + " <target> [to-player]");
+ return;
+
+ case 1:
+ User p = getPlayer(server, args, 0);
+ user.teleportCooldown();
+ if (!p.isTeleEnabled()) throw new Exception(p.getDisplayName() + " has teleportation disabled.");
+ user.sendMessage("§7Teleporting...");
+ user.canAfford(this);
+ user.teleport(p, this.getName());
+ break;
+
+ case 2:
+ if (!user.isAuthorized("essentials.tpohere")) throw new Exception("You need access to /tpohere to teleport other players.");
+ user.sendMessage("§7Teleporting...");
+ user.charge(this);
+ User target = getPlayer(server, args, 0);
+ User toPlayer = getPlayer(server, args, 1);
+ target.teleportToNow(toPlayer);
+ target.sendMessage("§7" + user.getDisplayName() + "§7 teleported you to " + toPlayer.getDisplayName() + "§7.");
+ break;
+ }
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 2)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [target] [to-player]");
+ return;
+ }
+
+ sender.sendMessage("§7Teleporting...");
+ User target = getPlayer(server, args, 0);
+ User toPlayer = getPlayer(server, args, 1);
+ target.teleportToNow(toPlayer);
+ target.sendMessage("§7{Console}§7 teleported you to " + toPlayer.getDisplayName() + "§7.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java
new file mode 100644
index 000000000..491c4363e
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java
@@ -0,0 +1,34 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtpa extends EssentialsCommand
+{
+ public Commandtpa()
+ {
+ super("tpa");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User player, String commandLabel, String[] args) throws Exception
+ {
+ if(args.length < 1)
+ {
+ player.sendMessage("§cUsage: /tpa [playername]");
+ return;
+ }
+
+ User p = getPlayer(server, args, 0);
+ if (!p.isTeleEnabled()) throw new Exception(p.getDisplayName() + " has teleportation disabled.");
+ player.charge(this);
+ parent.tpcRequests.put(p, player);
+ parent.tpcHere.put(p, false);
+ p.sendMessage("§c" + player.getDisplayName() + "§c has requested to teleport to you.");
+ p.sendMessage("§7To teleport, type §c/tpaccept§7.");
+ p.sendMessage("§7To deny this request, type §c/tpdeny§7.");
+ player.sendMessage("§7Request sent to " + p.getDisplayName() + "§7.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java
new file mode 100644
index 000000000..84acdf82c
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java
@@ -0,0 +1,40 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+
+
+public class Commandtpaccept extends EssentialsCommand
+{
+ public Commandtpaccept()
+ {
+ super("tpaccept");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+
+ User p = parent.tpcRequests.get(user);
+ if (p == null) throw new Exception("You do not have a pending request.");
+ parent.tpcRequests.remove(user);
+
+ if (parent.tpcHere.get(user))
+ {
+ user.teleportCooldown();
+ user.canAfford(this);
+ user.sendMessage("§7Teleport request accepted.");
+ p.sendMessage("§7Teleport request accepted.");
+ user.teleport(p, this.getName());
+ }
+ else
+ {
+ user.canAfford(this);
+ user.sendMessage("§7Teleport request accepted.");
+ p.sendMessage("§7Teleport request accepted.");
+ p.teleport(user, this.getName());
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java
new file mode 100644
index 000000000..bf179cc59
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java
@@ -0,0 +1,33 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtpahere extends EssentialsCommand
+{
+ public Commandtpahere()
+ {
+ super("tpahere");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /tpahere [playername]");
+ return;
+ }
+
+ User p = getPlayer(server, args, 0);
+ if (!p.isTeleEnabled()) throw new Exception(p.getDisplayName() + " has teleportation disabled.");
+ user.charge(this);
+ parent.tpcRequests.put(p, user);
+ parent.tpcHere.put(p, true);
+ p.sendMessage("§c" + user.getDisplayName() + "§c has requested that you teleport to him/her.");
+ p.sendMessage("§7To teleport, type §c/tpaccept§7.");
+ user.sendMessage("§7Request sent to " + p.getDisplayName() + "§c.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java
new file mode 100644
index 000000000..6ed5fc8dc
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java
@@ -0,0 +1,37 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtpdeny extends EssentialsCommand
+{
+ public Commandtpdeny()
+ {
+ super("tpdeny");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ User p = parent.tpcRequests.get(user);
+ if (p == null) throw new Exception("You do not have a pending request.");
+ parent.tpcRequests.remove(user);
+
+ if (parent.tpcHere.get(user))
+ {
+ user.charge(this);
+ user.sendMessage("§7Teleport request denied.");
+ p.sendMessage("§7Teleport request denied.");
+ parent.tpcHere.remove(user);
+ }
+ else
+ {
+ user.charge(this);
+ user.sendMessage("§7Teleport request denied.");
+ p.sendMessage("§7Teleport request denied.");
+ parent.tpcRequests.remove(user);
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java
new file mode 100644
index 000000000..3a003b257
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java
@@ -0,0 +1,34 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtphere extends EssentialsCommand
+{
+ public Commandtphere()
+ {
+ super("tphere");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[]
+ {
+ getName(), "telehere", "s"
+ };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User player, String commandLabel, String[] args) throws Exception
+ {
+ User p = getPlayer(server, args, 0);
+ if (!p.isTeleEnabled()) throw new Exception(p.getDisplayName() + " has teleportation disabled.");
+ player.charge(this);
+ p.teleportTo(player);
+ player.sendMessage("§7Teleporting...");
+ p.sendMessage("§7Teleporting...");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java
new file mode 100644
index 000000000..f3fa6900c
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java
@@ -0,0 +1,34 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+
+
+public class Commandtpo extends EssentialsCommand
+{
+ public Commandtpo()
+ {
+ super("tpo");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§c Usage: /tpo [playername]");
+ }
+ else
+ {
+ //Just basically the old tp command
+ User p = getPlayer(server, args, 0);
+ user.teleportCooldown();
+ user.charge(this);
+ user.teleportToNow(p);
+ user.sendMessage("§7Teleporting...");
+ }
+
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java
new file mode 100644
index 000000000..082f49452
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java
@@ -0,0 +1,31 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtpohere extends EssentialsCommand
+{
+ public Commandtpohere()
+ {
+ super("tpohere");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ user.sendMessage("§c Usage: /tpohere [playername]");
+ }
+ else
+ {
+ //Just basically the old tphere command
+ User p = getPlayer(server, args, 0);
+ user.charge(this);
+ p.teleportToNow(user);
+ user.sendMessage("§7Teleporting...");
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java b/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java
new file mode 100644
index 000000000..031735e9a
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java
@@ -0,0 +1,42 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Location;
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtppos extends EssentialsCommand
+{
+ public Commandtppos()
+ {
+ super("tppos");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[]
+ {
+ getName(), "tpp"
+ };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 3)
+ {
+ user.sendMessage("§cUsage: /tppos [x] [y] [z]");
+ return;
+ }
+ int x = Integer.parseInt(args[0]);
+ int y = Integer.parseInt(args[1]);
+ int z = Integer.parseInt(args[2]);
+ Location l = new Location(user.getWorld(),x,y,z);
+ user.canAfford(this);
+ user.teleportCooldown();
+ user.sendMessage("§7Teleporting...");
+ user.teleport(user.getSafeDestination(l), this.getName());
+ }
+} \ No newline at end of file
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java b/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java
new file mode 100644
index 000000000..7e93cc4cf
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java
@@ -0,0 +1,21 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandtptoggle extends EssentialsCommand
+{
+ public Commandtptoggle()
+ {
+ super("tptoggle");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ user.sendMessage("§7Teleportation " + (user.toggleTeleEnabled() ? "enabled." : "disabled."));
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java
new file mode 100644
index 000000000..27ce617c9
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java
@@ -0,0 +1,64 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.TreeType;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+public class Commandtree extends EssentialsCommand
+{
+ public Commandtree()
+ {
+ super("tree");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ Object tree = new Object();
+ if (args.length < 1)
+ {
+ user.sendMessage("§cUsage: /tree [tree|birch|redwood]");
+ return;
+ }
+ else if (args[0].equalsIgnoreCase("birch"))
+ {
+ tree = TreeType.BIRCH;
+ }
+ else if (args[0].equalsIgnoreCase("redwood"))
+ {
+ tree = TreeType.REDWOOD;
+ }
+ else if (args[0].equalsIgnoreCase("tree"))
+ {
+ tree = TreeType.TREE;
+ }
+ else
+ {
+ user.sendMessage("§cUsage: /tree [tree|birch|redwood]");
+ return;
+ }
+
+ double x = user.getLocation().getX();
+ double y = user.getLocation().getY();
+ double z = user.getLocation().getZ();
+
+ // offset tree in direction player is facing
+ int r = (int)user.getCorrectedYaw();
+ if (r < 68 || r > 292) x -= 3.0D; // north
+ else if (r > 112 && r < 248) x += 3.0D; // south
+ if (r > 22 && r < 158) z -= 3.0D; // east
+ else if (r > 202 && r < 338) z += 3.0D; // west
+
+ Location safeLocation = user.getSafeDestination(new Location(user.getWorld(), x, y, z));
+ boolean success = user.getWorld().generateTree(safeLocation, (TreeType)tree);
+ if (success)
+ {
+ user.charge(this);
+ user.sendMessage("§7Tree spawned.");
+ }
+ else
+ user.sendMessage("§cTree generation failure. Try again on grass or dirt.");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java
new file mode 100644
index 000000000..55fd54fad
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java
@@ -0,0 +1,35 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.CraftServer;
+import com.earth2me.essentials.Essentials;
+
+
+public class Commandunban extends EssentialsCommand
+{
+ public Commandunban()
+ {
+ super("unban");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "pardon" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [player]");
+ return;
+ }
+
+ ((CraftServer)server).getHandle().c.f.b(args[0]);
+ sender.sendMessage("Unbanned player.");
+ Essentials.getStatic().loadBanList();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java
new file mode 100644
index 000000000..df152c23f
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java
@@ -0,0 +1,35 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.CraftServer;
+import com.earth2me.essentials.Essentials;
+
+
+public class Commandunbanip extends EssentialsCommand
+{
+ public Commandunbanip()
+ {
+ super("unbanip");
+ }
+
+ @Override
+ public String[] getTriggers()
+ {
+ return new String[] { getName(), "pardonip" };
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("Usage: /" + commandLabel + " [address]");
+ return;
+ }
+
+ ((CraftServer)server).getHandle().c.f.d(args[0]);
+ sender.sendMessage("Unbanned IP address.");
+ Essentials.getStatic().loadBanList();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java
new file mode 100644
index 000000000..c5471f831
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java
@@ -0,0 +1,74 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.Warps;
+
+
+public class Commandwarp extends EssentialsCommand
+{
+ public Commandwarp()
+ {
+ super("warp");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ boolean perWarpPermission = Essentials.getSettings().getPerWarpPermission();
+ if (args.length == 0) {
+ if (!user.isAuthorized("essentials.warp.list"))
+ {
+ user.sendMessage("§cYou do not have Permission to list that warps.");
+ return;
+ }
+
+ Warps warps = Essentials.getWarps();
+ if (warps.isEmpty()) {
+ throw new Exception("No warps defined");
+ }
+ StringBuilder sb = new StringBuilder();
+ int i = 0;
+ for (String warpName : warps.getWarpNames())
+ {
+ if (perWarpPermission)
+ {
+ if (user.isAuthorized("essentials.warp." + warpName))
+ {
+ if (i++ > 0) sb.append(", ");
+ sb.append(warpName);
+ }
+ }
+ else
+ {
+ if (i++ > 0) sb.append(", ");
+ sb.append(warpName);
+ }
+
+ }
+ user.sendMessage(sb.toString());
+ return;
+ }
+
+ try {
+ if (perWarpPermission)
+ {
+ if (user.isAuthorized("essentials.warp." + args[0]))
+ {
+ user.canAfford(this);
+ user.teleportCooldown();
+ user.warpTo(args[0], this.getName());
+ return;
+ }
+ user.sendMessage("§cYou do not have Permission to use that warp.");
+ return;
+ }
+ user.canAfford(this);
+ user.teleportCooldown();
+ user.warpTo(args[0], this.getName());
+ } catch (Exception ex) {
+ user.sendMessage(ex.getMessage());
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java b/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java
new file mode 100644
index 000000000..508e69a58
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java
@@ -0,0 +1,44 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+import org.bukkit.ChatColor;
+
+
+public class Commandwhois extends EssentialsCommand
+{
+ public Commandwhois()
+ {
+ super("whois");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ if (args.length < 1)
+ {
+ sender.sendMessage("§cUsage: /whois [nickname]");
+ return;
+ }
+ String whois = args[0].toLowerCase();
+ User.charge(sender, this);
+ int prefixLength = ChatColor.stripColor(Essentials.getSettings().getNicknamePrefix()).length();
+ for (Player p : server.getOnlinePlayers())
+ {
+ User u = User.get(p);
+ String dn = ChatColor.stripColor(u.getNick());
+ if (!whois.equalsIgnoreCase(dn) && !whois.equalsIgnoreCase(dn.substring(prefixLength)) && !whois.equalsIgnoreCase(u.getName())) continue;
+ sender.sendMessage("");
+ sender.sendMessage(u.getDisplayName() + " is " + u.getName());
+ sender.sendMessage(ChatColor.BLUE + " - Health: " + u.getHealth() + "/20");
+ sender.sendMessage(ChatColor.BLUE + " - Location: (" + u.getLocation().getBlockX() + ", " + u.getLocation().getBlockY() + ", " + u.getLocation().getBlockZ() + ")");
+ if (!parent.getConfiguration().getBoolean("disable-eco", false)) sender.sendMessage(ChatColor.BLUE + " - Money: $" + u.getMoney());
+ sender.sendMessage(ChatColor.BLUE + " - Status: " + (parent.away.contains(u) ? "§cAway" : "Available"));
+ sender.sendMessage(ChatColor.BLUE + " - IP Address: " + u.getAddress().getAddress().toString());
+
+ }
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandworld.java b/Essentials/src/com/earth2me/essentials/commands/Commandworld.java
new file mode 100644
index 000000000..8f3ad45e7
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandworld.java
@@ -0,0 +1,67 @@
+package com.earth2me.essentials.commands;
+
+import java.util.List;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.World;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+
+
+public class Commandworld extends EssentialsCommand
+{
+ public Commandworld()
+ {
+ super("world");
+ }
+
+ @Override
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ World world;
+ List<World> worlds = server.getWorlds();
+
+ if (args.length < 1)
+ {
+ world = worlds.get(user.getWorld() == worlds.get(0) && worlds.size() > 1 ? 1 : 0);
+ }
+ else
+ {
+ try
+ {
+ int wid = Integer.parseInt(args[0]);
+ world = server.getWorlds().get(wid);
+ }
+ catch (Throwable ex)
+ {
+ try
+ {
+ world = server.getWorld(getFinalArg(args, 0));
+ if (world == null) throw new Exception();
+ }
+ catch (Throwable ex2)
+ {
+ user.sendMessage("§cInvalid world.");
+ user.sendMessage("§7Possible worlds are the numbers 0 through " + (server.getWorlds().size() - 1) + ".");
+ user.sendMessage("§7You can also type the name of a specific world.");
+ return;
+ }
+ }
+ }
+
+ double factor;
+ if (user.getWorld().getEnvironment() == World.Environment.NETHER && world.getEnvironment() == World.Environment.NORMAL)
+ factor = 16;
+ else if (user.getWorld().getEnvironment() != world.getEnvironment())
+ factor = 1 / 16;
+ else
+ factor = 1;
+
+ Location loc = user.getLocation();
+ loc = new Location(world, loc.getBlockX() * factor + .5, loc.getBlockY(), loc.getBlockZ() * factor + .5);
+
+ user.canAfford(this);
+ user.teleportCooldown();
+ user.teleport(loc, this.getName());
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandworth.java b/Essentials/src/com/earth2me/essentials/commands/Commandworth.java
new file mode 100644
index 000000000..0933ef4a2
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandworth.java
@@ -0,0 +1,48 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.ItemDb;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+import org.bukkit.inventory.ItemStack;
+
+
+public class Commandworth extends EssentialsCommand
+{
+ public Commandworth()
+ {
+ super("worth");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ ItemStack is = user.getInventory().getItemInHand();
+ int id = is.getTypeId();
+ int amount = is.getAmount();
+
+ try
+ {
+ if (args.length > 0) id = Integer.parseInt(args[0]);
+ }
+ catch (NumberFormatException ex)
+ {
+ id = ItemDb.get(args[0]).getTypeId();
+ }
+
+ try
+ {
+ if (args.length > 1) amount = Integer.parseInt(args[1]);
+ }
+ catch (NumberFormatException ex)
+ {
+ amount = 64;
+ }
+
+ int worth = parent.getConfiguration().getInt("worth-" + id, 0);
+
+ user.charge(this);
+ user.sendMessage("§7Stack of " + id + " worth §c$" + (worth * amount) + "§7 (" + amount + " item(s) at $" + worth + " each)");
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java
new file mode 100644
index 000000000..782f48287
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java
@@ -0,0 +1,80 @@
+package com.earth2me.essentials.commands;
+
+import java.util.List;
+import org.bukkit.Server;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.Essentials;
+import org.bukkit.entity.Player;
+import com.earth2me.essentials.User;
+
+
+public abstract class EssentialsCommand implements IEssentialsCommand
+{
+ private final String name;
+
+ protected EssentialsCommand(String name)
+ {
+ this.name = name;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public String[] getTriggers()
+ {
+ return new String[]
+ {
+ getName()
+ };
+ }
+
+ protected User getPlayer(Server server, String[] args, int pos) throws IndexOutOfBoundsException, NoSuchFieldException
+ {
+ if (args.length <= pos) throw new IndexOutOfBoundsException("§cInvalid command syntax. Did you forget an argument?");
+ List<Player> matches = server.matchPlayer(args[pos]);
+ if (matches.size() < 1) throw new NoSuchFieldException("§cNo matching players could be found.");
+ return User.get(matches.get(0));
+ }
+
+ @Override
+ public final void run(Server server, Essentials parent, User user, String commandLabel, Command cmd, String[] args) throws Exception
+ {
+ run(server, parent, user, commandLabel, args);
+ }
+
+ protected void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ run(server, parent, (CommandSender)user.getBase(), commandLabel, args);
+ }
+
+ @Override
+ public final void run(Server server, Essentials parent, CommandSender sender, String commandLabel, Command cmd, String[] args) throws Exception
+ {
+ run(server, parent, sender, commandLabel, args);
+ }
+
+ protected void run(Server server, Essentials parent, CommandSender sender, String commandLabel, String[] args) throws Exception
+ {
+ throw new Exception("Only in-game players can use " + commandLabel + ".");
+ }
+
+ public static String getFinalArg(String[] args, int start)
+ {
+ StringBuilder bldr = new StringBuilder();
+ for (int i = start; i < args.length; i++)
+ {
+ if (i != start) bldr.append(" ");
+ bldr.append(args[i]);
+ }
+ return bldr.toString();
+ }
+
+ protected void charge(CommandSender sender) throws Exception
+ {
+ if (sender instanceof Player)
+ User.get((Player)sender).charge(this);
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java b/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java
new file mode 100644
index 000000000..d1debd29d
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java
@@ -0,0 +1,20 @@
+package com.earth2me.essentials.commands;
+
+import org.bukkit.*;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import com.earth2me.essentials.*;
+
+
+public interface IEssentialsCommand
+{
+ String getName();
+
+ String[] getTriggers();
+
+ void run(Server server, Essentials parent, User user, String commandLabel, Command cmd, String[] args)
+ throws Exception;
+
+ void run(Server server, Essentials parent, CommandSender sender, String commandLabel, Command cmd, String[] args)
+ throws Exception;
+}
diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml
new file mode 100644
index 000000000..7da7426f6
--- /dev/null
+++ b/Essentials/src/config.yml
@@ -0,0 +1,385 @@
+############################################################
+# +------------------------------------------------------+ #
+# | Notes | #
+# +------------------------------------------------------+ #
+############################################################
+
+# If you want to use special characters in this document, such as accented letters, you MUST save the file as UTF-8, not ANSI.
+# If you receive an error when Essentials loads, ensure that:
+# - No tabs are present: YAML only allows spaces
+# - Indents are correct: YAML heirarchy is based entirely on indentation
+# - You have "escaped" all apostrophes in your text: If you want to write "don't", for example, write "don''t" instead (note the doubled apostrphe)
+# - List items are prefixed with a hyphen and indented:
+# lists:
+# - look like this
+# not:
+# - like this
+# - Text with symbols is enclosed in single or double quotation marks
+# - CraftBukkit and Permissions have been updated: CraftBukkit and Essentials almost always line up, but sometimes other plugins fall behind CraftBukkit's multiple daily updates
+# - You have saved the document as UTF-8, NOT the default, ANSI
+
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | Essentials (Global) | #
+# +------------------------------------------------------+ #
+############################################################
+
+# A color code between 0-9 or a-f. Set to 'none' to disable.
+ops-name-color: 'c'
+
+# The character(s) to prefix all nicknames, so that you know they are not true usernames.
+nickname-prefix: '~'
+
+# The delay, in seconds, required between /home, /tp, etc.
+teleport-cooldown: 0
+
+# The delay, in seconds, before a user actually teleports. If the user moves or gets attacked in this timeframe, the teleport never occurs.
+teleport-delay: 0
+
+# The delay, in seconds, required between /heal attempts
+heal-cooldown: 60
+
+# The number of items given if the quantity parameter is left out in /item or /give.
+default-stack-size: 64
+
+#what to prevent from /i /give
+#e.g item-spawn-blacklist: 46,11,10
+item-spawn-blacklist:
+
+# Whether or not to reclaim memory on player logout; this is technical, and should only be changed under special circumstances.
+# This generally increases server stability unless very specific runtime configurations are used.
+# HOWEVER, it is known to cause lag upon users logging OUT, so beware!
+reclaim-onlogout: false
+
+# Should primitive spawn protection be enabled? For most servers, this should be flase; it is better to use a third-party plugin to protect it.
+spawn-protection: false
+
+# Nether settings (switch between worlds with "/world nether" and "/world normal")
+# Sets whether the nether system is enabled, what folder to save the world in, and whether portals should teleport players between worlds.
+nether:
+ enabled: false
+ folder: nether
+ portals-enabled: false
+ generate-exit-portals: false
+
+# Mob limit on spawnmob
+spawnmob-limit: 10
+
+# The message of the day, displayed on connect and by typing /motd.
+motd:
+ - '&cWelcome, {PLAYER}&c!'
+ - '&fType &c/help&f for a list of commands.'
+ - 'Currently online: {PLAYERLIST}'
+
+# The server rules, available by typing /rules
+rules:
+ - '[1] Be respectful'
+ - '[2] Be ethical'
+ - '[3] Use common sense'
+
+# Disabled commands will be completelly unavailable on the server.
+disabled-commands:
+# - nick
+
+# Restricted commands will only be available to ops.
+# These will have NO EFFECT if you have Permissions installed!
+# These are here only if you want something simpler than Permissions.
+restricted-commands:
+ - bigtree
+ - item
+ - give
+ - heal
+ - plugin
+ - time
+ - top
+ - tp
+ - tphere
+ - tree
+ - setspawn
+ - antioch
+ - kick
+ - ban
+ - unban
+ - top
+ - jump
+ - tpo
+ - tppos
+ - tpohere
+ - economy
+ - setwarp
+ - delwarp
+ - essentials
+ - gc
+ - spawnmob
+ - broadcast
+ - burn
+ - ext
+ - kill
+ - ping
+ - banip
+ - unban
+ - mute
+ - kick
+ - kickall
+ - unbanip
+ - togglejail
+ - setjail
+
+# Note: All items MUST be followed by a quantity!
+# Times are measured in seconds.
+kits:
+ tools:
+ delay: 10
+ items:
+ - 277 1
+ - 278 1
+ - 279 1
+
+# Disable all signs
+signs-disabled: false
+
+# Backup runs a command while saving is disabled
+backup:
+ # Interval in minutes
+ interval: 60
+ # Add a command that backups your data, e.g.
+ # command: 'rdiff-backup World1 backups/World1'
+
+# Set this true to enable permission per warp.
+per-warp-permission: false
+
+# Sort output of /list command by groups
+sort-list-by-groups: false
+
+############################################################
+# +------------------------------------------------------+ #
+# | EssentialsHome | #
+# +------------------------------------------------------+ #
+############################################################
+
+# When users die, should they respawn at their homes, instead of the spawnpoint?
+respawn-at-home: false
+
+# When a user interacts with a bed, should their home be set to that location?
+# If you enable this and remove default user access to the /sethome command, you can make beds the only way for players to set their home location.
+bed-sethome: false
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | EssentialsEco | #
+# +------------------------------------------------------+ #
+############################################################
+
+# Defines the balance with which new players begin. Defaults to 0.
+starting-balance: 0
+
+# worth-# defines the value of an item when it is sold to the server via /sell.
+#worth-1: 1
+#worth-278: 1000
+
+# Defines the cost to use the given commands PER USE
+command-costs:
+ # /example costs $1000 PER USE
+ #example: 1000
+ # /kit tools costs $1500 PER USE
+ # kit-tools: 1500
+
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | EssentialsHelp | #
+# +------------------------------------------------------+ #
+############################################################
+
+#Show other plugins commands in help
+non-ess-in-help: true
+
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | EssentialsServerlist | #
+# +------------------------------------------------------+ #
+############################################################
+
+# This is your server's mcserverlist.net API key. Register your server at mcserverlist.net if you haven't already.
+mcsl-key: ''
+
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | EssentialsChat | #
+# +------------------------------------------------------+ #
+############################################################
+
+# If EssentialsChat is installed, this will define how far a player's voice travels, in blocks. Set to 0 to make all chat global.
+# Note that users with the "essentials.chat.spy" permission will hear everything, regardless of this setting.
+# Users with essentials.chat.shout can override this by prefixing text with an exclamation mark (!)
+# Or with essentials.chat.question can override this by prefixing text with a question mark (?)
+chat:
+ radius: 0
+
+ # If you want the default chat format, uncomment the next line and comment the other format.
+ #format: '<{DISPLAYNAME}> {MESSAGE}'
+ format: '&7[{GROUP}]&f {DISPLAYNAME}&7:&f {MESSAGE}'
+
+ # You can also have group-specific formats:
+ group-formats:
+ Default: '{WORLDNAME} {DISPLAYNAME}&7:&f {MESSAGE}'
+ Admins: '{WORLDNAME} &c[{GROUP}]&f {DISPLAYNAME}&7:&c {MESSAGE}'
+
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | EssentialsProtect | #
+# +------------------------------------------------------+ #
+############################################################
+
+protect:
+ # Database settings for sign/rail protection
+ # get mysql.jar and sqlite and place it in your serverroot/lib directory from here:
+ # http://java.net/projects/essentials/sources/svn/show/lib?rev=435
+
+ # mysql, sqlite or none
+ datatype: 'sqlite'
+
+ # If you specified MySQL above, you MUST enter the appropriate details here.
+ # If you specified SQLite above, these will be IGNORED.
+ username: 'root'
+ password: 'root'
+ mysqlDb: 'jdbc:mysql://localhost:3306/minecraft'
+
+ # For which block types would you like to be alerted?
+ # You can find a list of IDs in plugins/Essentials/Items.csv after loading Essentials for the first time.
+ alert:
+ # 10: lava
+ # 11: still lava
+ # 46: TNT
+ on-placement: 10,11,46
+ # 1: rock (just an example--doesn't actually do much)
+ on-use: 1
+ # 46: TNT
+ on-break: 46
+
+ # Users cannot PLACE these types of blocks/items.
+ # < 255 designates a BLOCK
+ # > 255 designates an ITEM (Some blocks can be placed as blocks OR items; lava blocks can be placed by lava buckets, for example.)
+ blacklist:
+ placement: 327,326,14,56,46,11,10,9,8
+ usage: 327,326,325
+
+ #prevent people from breaking blocks
+ #break: 20,50
+ break:
+
+
+ # General physics/behavior modifications
+ prevent:
+ lava-flow: false
+ water-flow: false
+ water-bucket-flow: false
+ fire-spread: false
+ lava-fire-spread: false
+ flint-fire: false
+ tnt-explosion: false
+ creeper-explosion: false
+ creeper-playerdamage: false
+ creeper-blockdamage: false
+ # Prevent the spawning of creatures
+ spawn:
+ creeper: false
+ ghast: true
+ slime: true
+
+ # Maximum height the creeper should explode. -1 allows them to explode everywhere.
+ # Set prevent.creeper-explosion to true, if you want to disable creeper explosions.
+ creeper:
+ max-height: -1
+
+ # Protect various blocks.
+ protect:
+ # Protect all signs
+ signs: true
+
+ # Prevent users from destroying rails
+ rails: true
+
+ # Blocks below rails/signs are also protected if the respective rail/sign is protected.
+ # This makes it more difficult to circumvent protection, and should be enabled.
+ # This only has an effect if "rails" or "signs" is also enabled.
+ block-below: true
+
+ # Prevent placing blocks above protected rails, this is to stop a potential griefing
+ prevent-block-on-rails: false
+
+ # Disable various default physics and behaviors
+ disable:
+ # Should fall damage be disabled?
+ fall: false
+
+ # Users with the essentials.protect.pvp permission will still be able to attack each other if this is set to true.
+ # They will be unable to attack users without that same permission node.
+ pvp: false
+
+ # Should drowning damage be disabled?
+ # (Split into two behaviors; generally, you want both set to the same value)
+ drown: false
+ suffocate: false
+
+ # Should damage via lava be disabled? Items that fall into lava will still burn to a crisp. ;)
+ lavadmg: false
+
+ # Should arrow damage be disabled
+ projectiles: false
+
+ # This will disable damage from touching cacti.
+ contactdmg: false
+
+ # Burn, baby, burn! Should fire damage be disabled?
+ firedmg: false
+
+ # Should people with build: false in permissions be allowed to build
+ # Set true to disable building for those people
+ build: false
+
+
+
+
+
+
+
+############################################################
+# +------------------------------------------------------+ #
+# | New Players | #
+# +------------------------------------------------------+ #
+############################################################
+
+newbies:
+ # Should we announce to the server when someone logs in for the first time?
+ # If so, use this format, replacing {DISPLAYNAME} with the player name.
+ # If not, set to ''
+ #announce-format: ''
+ announce-format: '&dWelcome {DISPLAYNAME} to the server!'
+
+ # When we spawn for the first time, which spawnpoint do we use?
+ spawnpoint: newbies
+
+# End of File <-- No seriously, you're done with configuration. \ No newline at end of file
diff --git a/Essentials/src/items.csv b/Essentials/src/items.csv
new file mode 100644
index 000000000..3bf204167
--- /dev/null
+++ b/Essentials/src/items.csv
@@ -0,0 +1,887 @@
+#item,id,metadata
+air,0,0
+stone,1,0
+rock,1,0
+grass,2,0
+dirt,3,0
+cobblestone,4,0
+cstone,4,0
+cobble,4,0
+plank,5,0
+woodplank,5,0
+wplank,5,0
+sapling,6,0
+bedrock,7,0
+admin,7,0
+adminium,7,0
+water,8,0
+stationarywater,9,0
+swater,9,0
+lava,10,0
+stationarylava,11,0
+slava,11,0
+sand,12,0
+gravel,13,0
+goldore,14,0
+gore,14,0
+ironore,15,0
+iore,15,0
+coalore,16,0
+core,16,0
+log,17,0
+trunk,17,0
+wood,17,0
+redwood,5,1
+rwood,5,1
+birchwood,5,2
+birch,5,2
+bwood,5,2
+leaves,18,0
+sponge,19,0
+glass,20,0
+lapislazuliore,21,0
+lapisore,21,0
+lore,21,0
+lapislazuliblock,22,0
+lapisblock,22,0
+lblock,22,0
+dispenser,23,0
+dispense,23,0
+sandstone,24,0
+sstone,24,0
+noteblock,25,0
+musicblock,25,0
+nblock,25,0
+mblock,25,0
+bedblock,26,0
+whitecloth,35,0
+cloth,35,0
+whitewool,35,0
+wool,35,0
+whitecotton,35,0
+cotton,35,0
+orangecloth,35,1
+orangewool,35,1
+orangecotton,35,1
+magentacloth,35,2
+magentawool,35,2
+magantacotton,35,2
+lightbluecloth,35,3
+lightbluewool,35,3
+lightbluecotton,35,3
+lbluecloth,35,3
+lbluewool,35,3
+lbluecotton,35,3
+yellowcloth,35,4
+yellowwool,35,4
+yellowcotton,35,4
+lightgreencloth,35,5
+lightgreenwool,35,5
+lightgreencotton,35,5
+lgreencloth,35,5
+lgreenwool,35,5
+lgreencotton,35,5
+pinkcloth,35,6
+pinkwool,35,6
+pinkcotton,35,6
+graycloth,35,7
+graywool,35,7
+graycotton,35,7
+lightgraycloth,35,8
+lightgraywool,35,8
+lightgraycotton,35,8
+lgraycloth,35,8
+lgraywool,35,8
+lgraycotton,35,8
+cyancloth,35,9
+cyanwool,35,9
+cyancotton,35,9
+purplecloth,35,10
+purplewool,35,10
+purplecotton,35,10
+bluecloth,35,11
+bluewool,35,11
+bluecotton,35,11
+browncloth,35,12
+brownwool,35,12
+browncotton,35,12
+darkgreencloth,35,13
+darkgreenwool,35,13
+darkgreencotton,35,13
+dgreencloth,35,13
+dgreenwool,35,13
+dgreencotton,35,13
+greencloth,35,13
+greenwool,35,13
+greencotton,35,13
+redcloth,35,14
+redwool,35,14
+redcotton,35,14
+blackcloth,35,15
+blackwool,35,15
+blackcotton,35,15
+yellowflower,37,0
+yflower,37,0
+flower,37,0
+redrose,38,0
+rrose,38,0
+redflower,38,0
+rflower,38,0
+brownmushroom,39,0
+brownmush,39,0
+bmushroom,39,0
+bmush,39,0
+redmushroom,40,0
+redmush,40,0
+rmushroom,40,0
+rmush,40,0
+goldblock,41,0
+gblock,41,0
+ironblock,42,0
+iblock,42,0
+smoothstonedoublestep,43,0
+stonedoublestep,43,0
+sdoublestep,43,0
+sdstep,43,0
+doublestep,43,0
+step,43,0
+smoothstonedoubleslab,43,0
+stonedoubleslab,43,0
+sdoubleslab,43,0
+sdslab,43,0
+doubleslab,43,0
+slab,43,0
+sanddstonedoublestep,43,1
+sstonedoublestep,43,1
+ssdoublestep,43,1
+ssdstep,43,1
+sanddstonedoubleslab,43,1
+sstonedoubleslab,43,1
+ssdoubleslab,43,1
+ssdslab,43,1
+woodplankdoublestep,43,2
+wplankdoublestep,43,2
+plankdoublestep,43,2
+wpdoublestep,43,2
+pdoublestep,43,2
+wpdstep,43,2
+pdstep,43,2
+woodplankdoubleslab,43,2
+wplankdoubleslab,43,2
+plankdoubleslab,43,2
+wpdoubleslab,43,2
+pdoubleslab,43,2
+wpdslab,43,2
+pdslab,43,2
+cobblestonedoublestep,43,3
+cobbledoublestep,43,3
+cstonedoublestep,43,3
+csdoublestep,43,3
+csdstep,43,3
+cobblestonedoubleslab,43,3
+cobbledoubleslab,43,3
+cstonedoubleslab,43,3
+csdoubleslab,43,3
+csdslab,43,3
+smoothstonestep,44,0
+stonestep,44,0
+sstep,44,0
+step,44,0
+smoothstoneslab,44,0
+stoneslab,44,0
+sslab,44,0
+slab,44,0
+sanddstonestep,44,1
+sstonestep,44,1
+ssstep,44,1
+sanddstoneslab,44,1
+sstoneslab,44,1
+ssslab,44,1
+woodplankstep,44,2
+wplankstep,44,2
+plankstep,44,2
+wpstep,44,2
+pstep,44,2
+woodplankslab,44,2
+wplankslab,44,2
+plankslab,44,2
+wpslab,44,2
+pslab,44,2
+cobblestonestep,44,3
+cobblestep,44,3
+cstonestep,44,3
+csstep,44,3
+cobblestoneslab,44,3
+cobbleslab,44,3
+cstoneslab,44,3
+csslab,44,3
+brickblock,45,0
+bblock,45,0
+tnt,46,0
+bookshelf,47,0
+bookblock,47,0
+mossycobblestone,48,0
+mosscobblestone,48,0
+mcobblestone,48,0
+mossycobble,48,0
+mosscobble,48,0
+mcobble,48,0
+obsidian,49,0
+obsi,49,0
+obby,49,0
+torch,50,0
+fire,51,0
+mobspawner,52,0
+monsterspawner,52,0
+mspawner,52,0
+spawner,52,0
+woodenstairs,53,0
+woodstairs,53,0
+wstairs,53,0
+chest,54,0
+redstonewireblock,55,0
+rstonewireblock,55,0
+redswireblock,55,0
+redwireblock,55,0
+rswireblock,55,0
+rwireblock,55,0
+redstonewire,55,0
+rstonewire,55,0
+redswire,55,0
+redwire,55,0
+rswire,55,0
+rwire,55,0
+diamondore,56,0
+dore,56,0
+diamondblock,57,0
+dblock,57,0
+workbench,58,0
+craftingbench,58,0
+crafterbench,58,0
+craftbench,58,0
+worktable,58,0
+craftingtable,58,0
+craftertable,58,0
+crafttable,58,0
+wbench,58,0
+cbench,58,0
+crops,59,0
+crop,59,0
+soil,60,0
+furnace,61,0
+burningfurnace,62,0
+bfurnace,62,0
+signpost,63,0
+spost,63,0
+woodendoorhalf,64,0
+wooddoorhalf,64,0
+wdoorhalf,64,0
+woodendoorbottom,64,0
+wooddoorbottom,64,0
+wdoorbottom,64,0
+woodendoorblock,64,0
+wooddoorblock,64,0
+wdoorblock,64,0
+ladder,65,0
+minecarttrack,66,0
+minecartrail,66,0
+mcarttrack,66,0
+mcartrail,66,0
+mctrack,66,0
+mcrail,66,0
+track,66,0
+rail,66,0
+cobblestonestairs,67,0
+cstonestairs,67,0
+stonestairs,67,0
+cobblestairs,67,0
+csstairs,67,0
+sstairs,67,0
+cstairs,67,0
+cobblestonestair,67,0
+cstonestair,67,0
+stonestair,67,0
+cobblestair,67,0
+csstair,67,0
+sstair,67,0
+cstair,67,0
+wallsign,68,0
+wsign,68,0
+lever,69,0
+stonepressureplate,70,0
+stonepressplate,70,0
+stonepplate,70,7
+stoneplate,70,0
+splate,70,0
+irondoorhalf,71,0
+idoorhalf,71,0
+irondoorbottom,71,0
+idoorbottom,71,0
+irondoorblock,71,0
+idoorblock,71,0
+woodenpressureplate,72,0
+woodenpressplate,72,0
+woodenpplate,72,0
+woodenplate,72,0
+woodpressureplate,72,0
+woodpressplate,72,0
+woodpplate,72,0
+woodplate,72,0
+wplate,72,0
+redstoneore,73,0
+redsore,73,0
+redore,73,0
+rstoneore,73,0
+rsore,73,0
+glowingredstoneore,74,0
+glowredstoneore,74,0
+gredstoneore,74,0
+glowingrstoneore,74,0
+glowrstoneore,74,0
+grstoneore,74,0
+glowingredsore,74,0
+glowredsore,74,0
+gredsore,74,0
+glowingredore,74,0
+glowredore,74,0
+gredore,74,0
+glowingrsore,74,0
+glowrsore,74,0
+grsore,74,0
+redstonetorchoff,75,0
+rstonetorchoff,75,0
+redstorchoff,75,0
+redtorchoff,75,0
+rstorchoff,75,0
+redstonetorchon,76,0
+redstonetorch,76,0
+rstonetorchon,76,0
+rstonetorch,76,0
+redstorchon,76,0
+redstorch,76,0
+redtorchon,76,0
+redtorch,76,0
+rstorchon,76,0
+rstorch,76,0
+stonebutton,77,0
+sbutton,77,0
+button,77,0
+snowcovering,78,0
+snowcover,78,0
+scover,78,0
+ice,79,0
+snowblock,80,0
+sblock,80,0
+cactus,81,0
+clayblock,82,0
+cblock,82,0
+reedblock,83,0
+rblock,83,0
+jukebox,84,0
+jbox,84,0
+fence,85,0
+pumpkin,86,0
+netherrack,87,0
+netherrock,87,0
+netherstone,87,0
+hellstone,87,0
+nstone,87,0
+hstone,87,0
+soulsand,88,0
+slowsand,88,0
+slowmud,88,0
+ssand,88,0
+smud,88,0
+mud,88,0
+glowingstone,89,0
+glowstone,89,0
+lightstone,89,0
+lstone,89,0
+portal,90,0
+jackolantern,91,0
+pumpkinlantern,91,0
+glowingpumpkin,91,0
+lightpumpkin,91,0
+jpumpkin,91,0
+plantren,91,0
+glowpumpkin,91,0
+gpumpkin,91,0
+lpumpkin,91,0
+cakeblock,92,0
+repeateroff,93,0
+repeatoff,93,0
+delayeroff,93,0
+delayoff,93,0
+dioderoff,93,0
+diodeoff,93,0
+repeateron,94,0
+repeaton,94,0
+delayeron,94,0
+delayon,94,0
+dioderon,94,0
+diodeon,94,0
+ironshovel,256,0
+ironspade,256,0
+ishovel,256,0
+ispade,256,0
+ironpickaxe,257,0
+ironpick,257,0
+ipickaxe,257,0
+ipick,257,0
+ironaxe,258,0
+iaxe,258,0
+flintandsteel,259,0
+lighter,259,0
+apple,260,0
+bow,261,0
+arrow,262,0
+coal,263,0
+diamond,264,0
+ironingot,265,0
+ironbar,265,0
+iingot,265,0
+ibar,265,0
+goldingot,266,0
+goldbar,266,0
+gingot,266,0
+gbar,266,0
+ironsword,267,0
+isword,267,0
+woodensword,268,0
+woodsword,268,0
+wsword,268,0
+woodenshovel,269,0
+woodenspade,269,0
+woodshovel,269,0
+woodspade,269,0
+wshovel,269,0
+wspade,269,0
+woodenpickaxe,270,0
+woodenpick,270,0
+woodpickaxe,270,0
+woodpick,270,0
+wpickaxe,270,0
+wpick,270,0
+woodenaxe,271,0
+woodaxe,271,0
+waxe,271,0
+stonesword,272,0
+ssword,272,0
+stoneshovel,273,0
+stonespade,273,0
+sshovel,273,0
+sspade,273,0
+stonepickaxe,274,0
+stonepick,274,0
+spickaxe,274,0
+spick,274,0
+stoneaxe,275,0
+saxe,275,0
+diamondsword,276,0
+dsword,276,0
+diamondshovel,277,0
+diamondspade,277,0
+dshovel,277,0
+dspade,277,0
+diamondpickaxe,278,0
+diamondpick,278,0
+dpickaxe,278,0
+dpick,278,0
+diamondaxe,279,0
+daxe,279,0
+stick,280,0
+bowl,281,0
+mushroomsoup,282,0
+mrsoup,282,0
+soup,282,0
+goldsword,283,0
+gsword,283,0
+goldshovel,284,0
+goldspade,284,0
+gshovel,284,0
+gspade,284,0
+goldpickaxe,285,0
+goldpick,285,0
+gpickaxe,285,0
+gpick,285,0
+goldaxe,286,0
+gaxe,286,0
+string,287,0
+rope,287,0
+feather,288,0
+gunpowder,289,0
+sulfur,289,0
+woodenhoe,290,0
+woodhoe,290,0
+whoe,290,0
+stonehoe,291,0
+shoe,291,0
+ironhoe,292,0
+ihoe,292,0
+diamondhoe,293,0
+dhoe,293,0
+goldhoe,294,0
+ghoe,294,0
+seeds,295
+seed,295,0
+wheat,296,0
+bread,297,0
+leatherhelmet,298,0
+leatherhelm,298,0
+leatherhat,298,0
+lhelmet,298,0
+lhelm,298,0
+lhat,298,0
+leatherchestplate,299,0
+leatherplatebody,299,0
+leatherplate,299,0
+leathershirt,299,0
+lchestplate,299,0
+lplatebody,299,0
+lplate,299,0
+lshirt,299,0
+leatherleggings,300,0
+leatherlegs,300,0
+leatherpants,300,0
+lleggings,300,0
+llegs,300,0
+lpants,300,0
+leatherboots,301,0
+leathershoes,301,0
+lboots,301,0
+lshoes,301,0
+chainmailhelmet,302,0
+chainmailhelm,302,0
+chainmailhat,302,0
+chainmhelmet,302,0
+chainmhelm,302,0
+chainmhat,302,0
+cmailhelmet,302,0
+cmailhelm,302,0
+cmailhat,302,0
+chainhelmet,302,0
+chainhelm,302,0
+chainhat,302,0
+cmhelmet,302,0
+cmhelm,302,0
+cmhat,302,0
+chelmet,302,0
+chelm,302,0
+chat,302,0
+chainmailchestplate,303,0
+chainmailplatebody,303,0
+chainmailplate,303,0
+chainmailshirt,303,0
+chainmchestplate,303,0
+chainmplatebody,303,0
+chainmplate,303,0
+chainmshirt,303,0
+cmailchestplate,303,0
+cmailplatebody,303,0
+cmailplate,303,0
+cmailshirt,303,0
+chainchestplate,303,0
+chainplatebody,303,0
+chainplate,303,0
+chainshirt,303,0
+cmchestplate,303,0
+cmplatebody,303,0
+cmplate,303,0
+cmshirt,303,0
+clchestplate,303,0
+cplatebody,303,0
+cplate,303,0
+cshirt,303,0
+chainmailleggings,304,0
+chainmaillegs,304,0
+chainmailpants,304,0
+chainmleggings,304,0
+chainmlegs,304,0
+chainmpants,304,0
+cmailleggings,304,0
+cmaillegs,304,0
+cmailpants,304,0
+chainleggings,304,0
+chainlegs,304,0
+chainpants,304,0
+cmleggings,304,0
+cmlegs,304,0
+cmpants,304,0
+cleggings,304,0
+clegs,304,0
+cpants,304,0
+chainmailboots,305,0
+chainmailshoes,305,0
+chainmboots,305,0
+chainmshoes,305,0
+cmailboots,305,0
+cmailshoes,305,0
+chainboots,305,0
+chainshoes,305,0
+cmboots,305,0
+cmshoes,305,0
+cboots,305,0
+cshoes,305,0
+ironhelmet,306,0
+ironhelm,306,0
+ironhat,306,0
+ihelmet,306,0
+ihelm,306,0
+ihat,306,0
+ironchestplate,307,0
+ironplatebody,307,0
+ironplate,307,0
+ironshirt,307,0
+ichestplate,307,0
+iplatebody,307,0
+iplate,307,0
+ishirt,307,0
+ironleggings,308,0
+ironlegs,308,0
+ironpants,308,0
+ileggings,308,0
+ilegs,308,0
+ipants,308,0
+ironboots,309,0
+ironshoes,309,0
+iboots,309,0
+ishoes,309,0
+diamondhelmet,310,0
+diamondhelm,310,0
+diamondhat,310,0
+dhelmet,310,0
+dhelm,310,0
+dhat,310,0
+diamondchestplate,311,0
+diamondplatebody,311,0
+diamondplate,311,0
+diamondshirt,311,0
+dchestplate,311,0
+dplatebody,311,0
+dplate,311,0
+dshirt,311,0
+diamondleggings,312,0
+diamondlegs,312,0
+diamondpants,312,0
+dleggings,312,0
+dlegs,312,0
+dpants,312,0
+diamondboots,313,0
+diamondshoes,313,0
+dboots,313,0
+dshoes,313,0
+goldhelmet,314,0
+goldhelm,314,0
+goldhat,314,0
+ghelmet,314,0
+ghelm,314,0
+ghat,314,0
+goldchestplate,315,0
+goldplatebody,315,0
+goldplate,315,0
+goldshirt,315,0
+gchestplate,315,0
+gplatebody,315,0
+gplateplate,315,0
+gshirt,315,0
+goldleggings,316,0
+goldlegs,316,0
+goldpants,316,0
+gleggings,316,0
+glegs,316,0
+gpants,316,0
+goldboots,317,0
+goldshoes,317,0
+gboots,317,0
+gshoes,317,0
+flint,318,0
+pork,319,0
+rawpork,319,0
+grilledpork,320,0
+cookedpork,320,0
+bacon,320,0
+painting,321,0
+picture,321,0
+goldenapple,322,0
+goldapple,322,0
+gapple,322,0
+sign,323,0
+woodendoor,324,0
+wooddoor,324,0
+wdoor,324,0
+bucket,325,0
+waterbucket,326,0
+wbucket,326,0
+lavabucket,327,0
+lbucket,327,0
+minecart,328,0
+mcart,328,0
+cart,328,0
+saddle,329,0
+irondoor,330,0
+idoor,330,0
+redstone,331,0
+rstone,331,0
+snowball,332,0
+snball,332,0
+boat,333,0
+leather,334,0
+milkbucket,335,0
+mbucket,335,0
+claybrick,336,0
+brick,336,0
+clayball,337,0
+cball,337,0
+clay,337,0
+reeds,338,0
+reed,338,0
+paper,339,0
+papyrus,339,0
+book,340,0
+slimeball,341,0
+slball,341,0
+storageminecart,342,0
+chestminecart,342,0
+storagemcart,342,0
+chestmcart,342,0
+storagecart,342,0
+chestcart,342,0
+sminecart,342,0
+cminecart,342,0
+smcart,342,0
+cmcart,342,0
+scart,342,0
+ccart,342,0
+engineminecart,343,0
+poweredminecart,343,0
+powerminecart,343,0
+furnaceminecart,343,0
+enginemcart,343,0
+poweredmcart,343,0
+powermcart,343,0
+furnacemcart,343,0
+enginecart,343,0
+poweredcart,343,0
+powercart,343,0
+furnacecart,343,0
+eminecart,343,0
+pminecart,343,0
+fminecart,343,0
+emcart,343,0
+pmcart,343,0
+cmcart,343,0
+ecart,343,0
+pcart,343,0
+fcart,343,0
+egg,344,0
+compass,345,0
+fishingrod,346,0
+fishrod,346,0
+frod,346,0
+rod,346,0
+watch,347,0
+clock,347,0
+lightstonedust,348,0
+glowstonedust,348,0
+lsdust,348,0
+gsdust,348,0
+rawfish,349,0
+rfish,349,0
+fish,349,0
+cookedfish,350,0
+cookfish,350,0
+cfish,350,0
+roastedfish,350,0
+roastfish,350,0
+rfish,350,0
+inksack,351,0
+inksac,351,0
+isack,351,0
+isac,351,0
+sack,351,0
+sac,351,0
+blackcolor,351,0
+blackdye,351,0
+rosered,351,1
+redrose,351,1
+redr,351,1
+redcolor,351,1
+reddye,351,1
+cactusgreen,351,2
+greencactus,351,2
+greencolor,351,2
+greendye,351,2
+cocobeans,351,3
+cocobean,351,3
+cbeans,351,3
+cbean,351,3
+beans,351,3
+bean,351,3
+browncocobeans,351,3
+browncocobean,351,3
+browncbeans,351,3
+browncbean,351,3
+brownbeans,351,3
+brownbean,351,3
+brownb,351,3
+browncolor,351,3
+browndye,351,3
+bluelapislzuli,351,4
+bluelapisl,351,4
+bluelapis,351,4
+bluel,351,4
+lapislzuli,351,4
+lapisl,351,4
+lapis,351,4
+bluecolor,351,4
+bluedye,351,4
+purplecolor,351,5
+purpledye,351,5
+cyancolor,351,6
+cyandye,351,6
+lightgraycolor,351,7
+lightgraydye,351,7
+lgraycolor,351,7
+lgraydye,351,7
+graycolor,351,8
+graydye,351,8
+pinkcolor,351,9
+pinkdye,351,9
+limecolor,351,10
+limedye,351,10
+dandelionyellow,351,11
+yellowdandelion,351,11
+yellowd,351,11
+yellowcolor,351,11
+yellowdye,351,11
+lightbluecolor,351,12
+lightbluedye,351,12
+lbluecolor,351,12
+lbluedye,351,12
+magentacolor,351,13
+magentadye,351,13
+orangecolor,351,14
+orangedye,351,14
+whitebonemeal,351,15
+whitebonem,351,15
+bonemeal,351,15
+bonem,351,15
+whitecolor,351,15
+whitedye,351,15
+bone,352,0
+sugar,353,0
+cake,354,0
+bed,355,0
+repeater,356,0
+repeat,356,0
+delayer,356,0
+delay,356,0
+diode,356,0
+goldrecord,2256,0
+golddisk,2256,0
+gorecord,2256,0
+godisk,2256,0
+greenrecord,2257,0
+greendisk,2257,0
+grrecord,2257,0
+grdisk,2257,0 \ No newline at end of file
diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml
new file mode 100644
index 000000000..30e1f2cc3
--- /dev/null
+++ b/Essentials/src/plugin.yml
@@ -0,0 +1,248 @@
+# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
+name: Essentials
+main: com.earth2me.essentials.Essentials
+# Note to developers: This next line cannot change, or the automatic versioning system will break.
+version: TeamCity
+website: http://www.earth2me.net:8001/
+description: Provides an essential, core set of commands for Bukkit.
+authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo]
+commands:
+ afk:
+ description: Marks you as away-from-keyboard.
+ usage: /<command>
+ antioch:
+ description: 'A little surprise for operators. Warning: Point away from face.'
+ usage: /<command>
+ back:
+ description: Teleports you to your location prior to teleporting/spawning/warping.
+ usage: /<command>
+ backup:
+ description: Runs the backup command
+ usage: /<command>
+ balance:
+ description: States the current balance of a player. Defaults to self.
+ usage: /<command> <player>
+ aliases: bal,money
+ ban:
+ description: Bans a player.
+ usage: /<command> [player] <reason>
+ banip:
+ description: Bans an IP address.
+ usage: /<command> [address]
+ broadcast:
+ description: Broadcasts a message to the entire server.
+ usage: /<command> [msg]
+ bigtree:
+ description: Spawn a big tree where you are looking.
+ usage: /<command> [tree|redwood]
+ burn:
+ description: Set a player on fire.
+ usage: /<command> [player] [seconds]
+ clearinventory:
+ description: Clear all items in your inventory.
+ usage: /<command>
+ compass:
+ description: Describes your current bearing.
+ usage: /<command>
+ deljail:
+ description: Removes a jail
+ usage: /<command> [jailname]
+ delwarp:
+ description: Deletes the specified warp.
+ usage: /<command> [warp]
+ aliases: [remwarp,rmwarp]
+ depth:
+ description: States current depth, relative to sea level.
+ usage: /depth
+ eco:
+ description: Manages the server economy.
+ usage: /<command> [give|take|reset] [player] [amount]
+ aliases: economy
+ essentials:
+ description: Reloads essentials.
+ usage: /<command>
+ ext:
+ description: Extinguish players.
+ usage: /<command> <player>
+ getpos:
+ description: Get your current coordinates.
+ usage: /<command>
+ aliases: [coords]
+ gc:
+ description: Reports garbage collection info; useful to plugin/CraftBukkit developers
+ usage: /<command>
+ aliases: [mem,memory]
+ give:
+ description: Give a player an item.
+ usage: /<command> [player] [item|numeric] <amount>
+ god:
+ description: Enables your godly powers.
+ usage: /<command>
+ aliases: [tgm,godmode]
+ heal:
+ description: Heals you or the given player.
+ usage: /<command> <player>
+ help:
+ description: Views a list of available commands.
+ usage: /<command>
+ helpop:
+ description: Request help from online operators.
+ usage: /<command> [message]
+ home:
+ description: Teleport to your home.
+ usage: /<command>
+ invsee:
+ description: See the inventory of other players.
+ usage: /<command> <player>
+ item:
+ description: Spawn an item.
+ usage: /<command> [item|numeric] <amount>
+ aliases: [i]
+ jails:
+ description: List all jails.
+ usage: /<command>
+ jump:
+ description: Jumps to the nearest block in the line of sight.
+ usage: /<command>
+ aliases: [j]
+ kick:
+ description: Kicks a specified player with a reason.
+ usage: /<command> <player> <reason>
+ kickall:
+ description: Kicks all players off the server except the issuer.
+ usage: /<command> <reason>
+ kit:
+ description: Obtains the specified kit or views all available kits.
+ usage: /<command> <kit>
+ kill:
+ description: Kills specified player.
+ usage: /<command> <player>
+ list:
+ description: List all online players.
+ usage: /<command>
+ aliases: [playerlist,who,online]
+ mail:
+ description: Manages inter-player, intra-server mail.
+ usage: /<command> [read|clear|send [to] [message]]
+ me:
+ description: Describes an action in the context of the player.
+ usage: /<command> [description]
+ motd:
+ description: Views the Message Of The Day.
+ usage: /<command>
+ msg:
+ description: Sends a private message to the specified player.
+ usage: /<command> <to> <message>
+ aliases: [m,t]
+ mute:
+ description: Mutes or unmutes a player.
+ usage: /<command> [player]
+ nick:
+ description: Change your nickname or that of another player.
+ usage: /<command> <player> [nickname|off]
+ nuble:
+ description: Used by Nuble to request permission for takeoff.
+ usage: /<command> identify [id]
+ pay:
+ description: Pays another player from your balance
+ usage: /<command> [player] [amount]
+ ping:
+ description: Pong!
+ usage: /<command>
+ aliases: [pong]
+ plugin:
+ description: Enables, disables, or reloads a plugin.
+ usage: /<command> [enable|disable|reload] [plugin]
+ r:
+ description: Quickly reply to the last player to message you.
+ usage: /<command> [message]
+ rules:
+ description: Views the server rules.
+ usage: /<command>
+ reloadall:
+ description: Reloads all plugins.
+ usage: /<command>
+ aliases: [rel]
+ sell:
+ description: Sells the item currently in your hand.
+ usage: /<command> <-><amount>
+ sethome:
+ description: Set your home to your current location.
+ usage: /<command>
+ setjail:
+ description: Creates a jail where you specified named [jailname]
+ usage: /<command> [jailname]
+ setwarp:
+ description: Creates a new warp.
+ usage: /<command> [warp]
+ aliases: [createwarp]
+ spawnmob:
+ description: Spawns a mob.
+ usage: /<command> [mob],<mount>:<slime-size> <amount>
+ suicide:
+ description: Causes you to perish
+ usage: /<command>
+ time:
+ description: Change the server time to day or night.
+ usage: /<command> [day|night]
+ togglejail:
+ description: Prevents a player from interacting with the world and teleports him/her to the the jail specified
+ usage: /<command> [player] [jailname]
+ aliases: [tjail]
+ top:
+ description: Teleport to the highest block at your current coordinates.
+ usage: /<command>
+ tp:
+ description: Teleport to a player.
+ usage: /<command> [player]
+ tpa:
+ description: Request to teleport to the specified player.
+ usage: /<command> <player>
+ tpaccept:
+ description: Accepts a teleport request.
+ usage: /<command>
+ tpahere:
+ description: Request that the specified player teleport to you.
+ usage: /<command> <player>
+ tpdeny:
+ description: Reject a teleport request.
+ usage: /<command>
+ tphere:
+ description: Teleport a player to you.
+ usage: /<command> [player]
+ aliases: s
+ tpo:
+ description: Teleport override for tptoggle.
+ usage: /<command> <player>
+ tpohere:
+ description: Teleport here override for tptoggle.
+ usage: /<command> <player>
+ tppos:
+ description: Teleport to coordinates.
+ usage: /<command> <x> <y> <z>
+ tptoggle:
+ description: Blocks all forms of teleportation.
+ usage: /<command>
+ tree:
+ description: Spawn a tree where you are looking.
+ usage: /<command> [tree|birch|redwood]
+ unban:
+ description: Unbans the specified player.
+ usage: /<command> [player]
+ aliases: pardon
+ unbanip:
+ description: Unbans the specified IP address.
+ usage: /<command> [address]
+ aliases: pardonip
+ warp:
+ description: List all warps or warp to the specified location.
+ usage: /<command> <warp>
+ whois:
+ description: Determine the username behind a nickname.
+ usage: /<command> [nickname]
+ world:
+ description: Switch between worlds.
+ usage: /<command> [world]
+ worth:
+ description: Calculates the worth of items in hand or as specified.
+ usage: /<command> <item> <amount> \ No newline at end of file
diff --git a/Essentials/test/com/earth2me/essentials/EssentialsTest.java b/Essentials/test/com/earth2me/essentials/EssentialsTest.java
new file mode 100644
index 000000000..da98978df
--- /dev/null
+++ b/Essentials/test/com/earth2me/essentials/EssentialsTest.java
@@ -0,0 +1,60 @@
+package com.earth2me.essentials;
+
+import junit.framework.TestCase;
+
+
+public class EssentialsTest extends TestCase
+{
+ public EssentialsTest(String testName)
+ {
+ super(testName);
+ }
+
+ private static void should(String what)
+ {
+ System.out.println("Essentials should " + what);
+ }
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ super.tearDown();
+ }
+
+ public void testLoadClasses()
+ {
+ should("make all classes accessible");
+ Essentials.loadClasses();
+ try
+ {
+ ItemDb itemDb = null;
+ Mob mob = null;
+ NetherPortal netherPortal = null;
+ OfflinePlayer offlinePlayer = null;
+ Settings settings = null;
+ Spawn spawn = null;
+ TargetBlock targetBlock = null;
+ TeleportTimer teleportTimer = null;
+ User user = null;
+ assertNull(itemDb);
+ assertNull(mob);
+ assertNull(netherPortal);
+ assertNull(offlinePlayer);
+ assertNull(settings);
+ assertNull(spawn);
+ assertNull(targetBlock);
+ assertNull(teleportTimer);
+ assertNull(user);
+ }
+ catch (Throwable ex)
+ {
+ fail(ex.toString());
+ }
+ }
+}
diff --git a/Essentials/test/com/earth2me/essentials/PermissionsTest.java b/Essentials/test/com/earth2me/essentials/PermissionsTest.java
new file mode 100644
index 000000000..a630edf85
--- /dev/null
+++ b/Essentials/test/com/earth2me/essentials/PermissionsTest.java
@@ -0,0 +1,17 @@
+package com.earth2me.essentials;
+
+import junit.framework.TestCase;
+
+
+public class PermissionsTest extends TestCase
+{
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ public void test()
+ {
+ }
+}
diff --git a/Essentials/test/com/earth2me/essentials/UserTest.java b/Essentials/test/com/earth2me/essentials/UserTest.java
new file mode 100644
index 000000000..011ba4770
--- /dev/null
+++ b/Essentials/test/com/earth2me/essentials/UserTest.java
@@ -0,0 +1,72 @@
+package com.earth2me.essentials;
+
+import junit.framework.TestCase;
+import org.bukkit.Location;
+
+
+public class UserTest extends TestCase
+{
+ private OfflinePlayer base1;
+
+ public UserTest(String testName)
+ {
+ super(testName);
+ base1 = new OfflinePlayer("TestPlayer1");
+ }
+
+ private void should(String what)
+ {
+ System.out.println(getName() + " should " + what);
+ }
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ super.tearDown();
+ }
+
+ public void testUpdate()
+ {
+ should("update an existing player with the same name, rather than creating a new player");
+ User.get(base1);
+ int size1 = User.size();
+ OfflinePlayer base1alt = new OfflinePlayer(base1.getName());
+ assertEquals(base1alt, User.get(base1alt).getBase());
+ assertTrue(size1 == User.size());
+ }
+
+ public void testHome() throws Exception
+ {
+ should("return the home set by setHome");
+ Location home = new Location(null, 1, 2, 3, 4, 5);
+ User user = User.get(base1);
+ user.setHome(home);
+ assertEquals(user.getHome(), home);
+ }
+
+ public void testMoney()
+ {
+ should("properly set, take, give, and get money");
+ User user = User.get(base1);
+ double i;
+ user.setMoney(i = 100.5);
+ user.takeMoney(50);
+ i -= 50;
+ user.giveMoney(25);
+ i += 25;
+ assertEquals(user.getMoney(), i);
+ }
+
+ public void testGetGroup()
+ {
+ should("return the default group");
+ User user = User.get(base1);
+ assertEquals(user.getGroup(), "default");
+ }
+}
diff --git a/Essentials/workdir/EssentialsGroupManager/config.yml b/Essentials/workdir/EssentialsGroupManager/config.yml
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/EssentialsGroupManager/config.yml
diff --git a/Essentials/workdir/banned-ips.txt b/Essentials/workdir/banned-ips.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/banned-ips.txt
diff --git a/Essentials/workdir/banned-players.txt b/Essentials/workdir/banned-players.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/banned-players.txt
diff --git a/Essentials/workdir/ops.txt b/Essentials/workdir/ops.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/ops.txt
diff --git a/Essentials/workdir/plugins/Permissions/default.yml b/Essentials/workdir/plugins/Permissions/default.yml
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/plugins/Permissions/default.yml
diff --git a/Essentials/workdir/server.log b/Essentials/workdir/server.log
new file mode 100644
index 000000000..de34fdb17
--- /dev/null
+++ b/Essentials/workdir/server.log
@@ -0,0 +1,264 @@
+2011-02-28 16:56:00 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:56:00 [INFO] Loading properties
+2011-02-28 16:56:00 [WARNING] server.properties does not exist
+2011-02-28 16:56:00 [INFO] Generating new properties file
+2011-02-28 16:56:00 [INFO] Starting Minecraft server on *:25565
+2011-02-28 16:56:00 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-468-ga3bf56c-b450jnks (MC: 1.3)
+2011-02-28 16:56:00 [WARNING] Failed to load ban list: java.io.FileNotFoundException: banned-players.txt (The system cannot find the file specified)
+2011-02-28 16:56:00 [WARNING] Failed to load ip ban list: java.io.FileNotFoundException: banned-ips.txt (The system cannot find the file specified)
+2011-02-28 16:56:00 [WARNING] Failed to load ops: java.io.FileNotFoundException: ops.txt (The system cannot find the file specified)
+2011-02-28 16:56:00 [WARNING] Failed to load white-list: java.io.FileNotFoundException: white-list.txt (The system cannot find the file specified)
+2011-02-28 16:56:00 [INFO] Preparing level "world"
+2011-02-28 16:56:00 [INFO] Preparing start region
+2011-02-28 16:56:01 [INFO] §eLoaded Essentials build TeamCity maintained by Zenexer, ementalo, Aelux, and Brettflan
+2011-02-28 16:56:02 [INFO] Preparing spawn area: 4%
+2011-02-28 16:56:03 [INFO] Preparing spawn area: 8%
+2011-02-28 16:56:04 [INFO] Preparing spawn area: 20%
+2011-02-28 16:56:05 [INFO] Preparing spawn area: 32%
+2011-02-28 16:56:06 [INFO] Preparing spawn area: 40%
+2011-02-28 16:56:07 [INFO] Preparing spawn area: 48%
+2011-02-28 16:56:08 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:56:08 [INFO] Loading properties
+2011-02-28 16:56:08 [INFO] Starting Minecraft server on *:25565
+2011-02-28 16:56:08 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-468-ga3bf56c-b450jnks (MC: 1.3)
+2011-02-28 16:56:09 [INFO] Preparing level "world"
+2011-02-28 16:56:09 [INFO] Preparing start region
+2011-02-28 16:56:10 [INFO] §eLoaded Essentials build TeamCity maintained by Zenexer, ementalo, Aelux, and Brettflan
+2011-02-28 16:56:10 [INFO] Preparing spawn area: 4%
+2011-02-28 16:56:10 [INFO] Should update an existing player with the same name, rather than creating a new player
+2011-02-28 16:56:11 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:56:11 [INFO] >
+2011-02-28 16:56:11 [INFO] Preparing spawn area: 8%
+2011-02-28 16:57:39 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:57:39 [INFO] Loading properties
+2011-02-28 16:57:39 [INFO] Starting Minecraft server on *:25565
+2011-02-28 16:57:39 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-468-ga3bf56c-b450jnks (MC: 1.3)
+2011-02-28 16:57:39 [INFO] Preparing level "world"
+2011-02-28 16:57:39 [INFO] Preparing start region
+2011-02-28 16:57:41 [INFO] §eLoaded Essentials build TeamCity maintained by Zenexer, ementalo, Aelux, and Brettflan
+2011-02-28 16:57:41 [INFO] Preparing spawn area: 4%
+2011-02-28 16:57:42 [INFO] Preparing spawn area: 8%
+2011-02-28 16:57:43 [INFO] Preparing spawn area: 16%
+2011-02-28 16:57:44 [INFO] Preparing spawn area: 24%
+2011-02-28 16:57:45 [INFO] Preparing spawn area: 24%
+2011-02-28 16:57:48 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:57:48 [INFO] Loading properties
+2011-02-28 16:57:48 [INFO] Starting Minecraft server on *:25565
+2011-02-28 16:57:48 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-468-ga3bf56c-b450jnks (MC: 1.3)
+2011-02-28 16:57:49 [INFO] Preparing level "world"
+2011-02-28 16:57:49 [INFO] Preparing start region
+2011-02-28 16:57:50 [INFO] §eLoaded Essentials build TeamCity maintained by Zenexer, ementalo, Aelux, and Brettflan
+2011-02-28 16:57:50 [INFO] Preparing spawn area: 8%
+2011-02-28 16:57:51 [INFO] >
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:57:51 [INFO] Preparing spawn area: 12%
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:51 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:52 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:53 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:54 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:55 [INFO]
+2011-02-28 16:57:56 [INFO]
+2011-02-28 16:57:56 [INFO]
+2011-02-28 16:57:56 [INFO]
+2011-02-28 16:57:56 [INFO]
+2011-02-28 16:59:07 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:59:07 [INFO] Loading properties
+2011-02-28 16:59:07 [INFO] Starting Minecraft server on *:25565
+2011-02-28 16:59:07 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-468-ga3bf56c-b450jnks (MC: 1.3)
+2011-02-28 16:59:07 [INFO] Preparing level "world"
+2011-02-28 16:59:07 [INFO] Preparing start region
+2011-02-28 16:59:08 [INFO] Done (0.060s)! For help, type "help" or "?"
+2011-02-28 16:59:08 [INFO] Stopping server
+2011-02-28 16:59:08 [INFO] Saving chunks
+2011-02-28 16:59:09 [INFO] Starting minecraft server version Beta 1.3
+2011-02-28 16:59:09 [INFO] Loading properties
+2011-02-28 16:59:09 [INFO] Starting Minecraft server on *:25565
+2011-02-28 16:59:09 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-468-ga3bf56c-b450jnks (MC: 1.3)
+2011-02-28 16:59:09 [INFO] Preparing level "world"
+2011-02-28 16:59:09 [INFO] Preparing start region
+2011-02-28 16:59:10 [INFO] Done (0.011s)! For help, type "help" or "?"
+2011-02-28 16:59:10 [INFO] Stopping server
+2011-02-28 16:59:10 [INFO] Saving chunks
diff --git a/Essentials/workdir/server.log.1 b/Essentials/workdir/server.log.1
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/server.log.1
diff --git a/Essentials/workdir/server.log.1.lck b/Essentials/workdir/server.log.1.lck
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/server.log.1.lck
diff --git a/Essentials/workdir/server.properties b/Essentials/workdir/server.properties
new file mode 100644
index 000000000..c1f6fa8df
--- /dev/null
+++ b/Essentials/workdir/server.properties
@@ -0,0 +1,13 @@
+#Minecraft server properties
+#Mon Feb 28 16:56:01 EST 2011
+level-name=world
+hellworld=false
+spawn-monsters=true
+online-mode=true
+spawn-animals=true
+max-players=20
+server-ip=
+pvp=true
+server-port=25565
+white-list=false
+spawn-protection=16
diff --git a/Essentials/workdir/userdata/TestPlayer1.yml b/Essentials/workdir/userdata/TestPlayer1.yml
new file mode 100644
index 000000000..c419a1196
--- /dev/null
+++ b/Essentials/workdir/userdata/TestPlayer1.yml
@@ -0,0 +1,2 @@
+home: [1.0, 2.0, 3.0, 4.0, 5.0, world]
+money: 75.5
diff --git a/Essentials/workdir/white-list.txt b/Essentials/workdir/white-list.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Essentials/workdir/white-list.txt
diff --git a/EssentialsChat/build.xml b/EssentialsChat/build.xml
new file mode 100644
index 000000000..ed22cfe0c
--- /dev/null
+++ b/EssentialsChat/build.xml
@@ -0,0 +1,76 @@
+<?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="EssentialsChat" default="default" basedir=".">
+ <description>Builds, tests, and runs the project EssentialsChat.</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="EssentialsChat-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>
diff --git a/EssentialsChat/nbproject/build-impl.xml b/EssentialsChat/nbproject/build-impl.xml
new file mode 100644
index 000000000..e0b698395
--- /dev/null
+++ b/EssentialsChat/nbproject/build-impl.xml
@@ -0,0 +1,1072 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsChat-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target name="-pre-init-libraries">
+ <property location="..\lib\nblibraries.properties" name="libraries.path"/>
+ <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/>
+ <pathconvert dirsep="/" property="libraries.dir">
+ <path path="${libraries.dir.nativedirsep}"/>
+ </pathconvert>
+ <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/>
+ <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/>
+ </target>
+ <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: EssentialsChat was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: EssentialsChat was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/EssentialsChat/nbproject/genfiles.properties b/EssentialsChat/nbproject/genfiles.properties
new file mode 100644
index 000000000..e53628d44
--- /dev/null
+++ b/EssentialsChat/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=7c7f517b
+build.xml.script.CRC32=71afd555
+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=7c7f517b
+nbproject/build-impl.xml.script.CRC32=c24d2db5
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
diff --git a/EssentialsChat/nbproject/private/private.properties b/EssentialsChat/nbproject/private/private.properties
new file mode 100644
index 000000000..94183418a
--- /dev/null
+++ b/EssentialsChat/nbproject/private/private.properties
@@ -0,0 +1 @@
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/EssentialsChat/nbproject/project.properties b/EssentialsChat/nbproject/project.properties
new file mode 100644
index 000000000..315a26576
--- /dev/null
+++ b/EssentialsChat/nbproject/project.properties
@@ -0,0 +1,79 @@
+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=EssentialsChat
+application.vendor=Paul
+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}/EssentialsChat.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.craftbukkit-0.0.1-SNAPSHOT.jar=../lib/craftbukkit-0.0.1-SNAPSHOT.jar
+file.reference.Permissions.jar=..\\lib\\Permissions.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${file.reference.craftbukkit-0.0.1-SNAPSHOT.jar}:\
+ ${file.reference.Permissions.jar}:\
+ ${reference.Essentials.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}:\
+ ${libs.junit.classpath}:\
+ ${libs.junit_4.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=false
+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
diff --git a/EssentialsChat/nbproject/project.xml b/EssentialsChat/nbproject/project.xml
new file mode 100644
index 000000000..da40bbe42
--- /dev/null
+++ b/EssentialsChat/nbproject/project.xml
@@ -0,0 +1,28 @@
+<?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>EssentialsChat</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>
diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java
new file mode 100644
index 000000000..266bd104e
--- /dev/null
+++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java
@@ -0,0 +1,43 @@
+package com.earth2me.essentials.chat;
+
+import com.earth2me.essentials.Essentials;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.event.Event.Priority;
+import org.bukkit.event.Event.Type;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginManager;
+import org.bukkit.plugin.java.JavaPlugin;
+
+
+public class EssentialsChat extends JavaPlugin
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+
+ public EssentialsChat()
+ {
+ super();
+ }
+
+ public void onEnable()
+ {
+ Plugin p = this.getServer().getPluginManager().getPlugin("Essentials");
+ if (p != null) {
+ if (!this.getServer().getPluginManager().isPluginEnabled(p)) {
+ this.getServer().getPluginManager().enablePlugin(p);
+ }
+ }
+ PluginManager pm = getServer().getPluginManager();
+ EssentialsChatPlayerListener playerListener = new EssentialsChatPlayerListener(getServer());
+ pm.registerEvent(Type.PLAYER_JOIN, playerListener, Priority.Monitor, this);
+ pm.registerEvent(Type.PLAYER_CHAT, playerListener, Priority.Highest, this);
+ if (!this.getDescription().getVersion().equals(Essentials.getStatic().getDescription().getVersion())) {
+ logger.log(Level.WARNING, "Version mismatch! Please update all Essentials jars to the same version.");
+ }
+ logger.info("Loaded " + this.getDescription().getName() + " build " + this.getDescription().getVersion() + " by " + Essentials.AUTHORS);
+ }
+
+ public void onDisable()
+ {
+ }
+}
diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListener.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListener.java
new file mode 100644
index 000000000..e351cc865
--- /dev/null
+++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListener.java
@@ -0,0 +1,61 @@
+package com.earth2me.essentials.chat;
+
+import com.earth2me.essentials.Essentials;
+import org.bukkit.Server;
+import org.bukkit.event.player.*;
+
+
+public class EssentialsChatPlayerListener extends PlayerListener
+{
+ private final Server server;
+
+ public EssentialsChatPlayerListener(Server server)
+ {
+ this.server = server;
+ }
+
+ @Override
+ @SuppressWarnings("CallToThreadDumpStack")
+ public void onPlayerJoin(PlayerJoinEvent event)
+ {
+ try
+ {
+ Essentials.loadClasses();
+ EssentialsChatWorker.onPlayerJoin(server, event);
+ }
+ catch (Throwable ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ @SuppressWarnings("CallToThreadDumpStack")
+ public void onPlayerRespawn(PlayerRespawnEvent event)
+ {
+ try
+ {
+ Essentials.loadClasses();
+ EssentialsChatWorker.onPlayerRespawn(server, event);
+ }
+ catch (Throwable ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ @SuppressWarnings("CallToThreadDumpStack")
+ public void onPlayerChat(PlayerChatEvent event)
+ {
+ try
+ {
+ Essentials.loadClasses();
+ EssentialsChatWorker.onPlayerChat(server, event);
+ }
+ catch (Throwable ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatWorker.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatWorker.java
new file mode 100644
index 000000000..e11504259
--- /dev/null
+++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatWorker.java
@@ -0,0 +1,122 @@
+package com.earth2me.essentials.chat;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.nijikokun.bukkit.Permissions.Permissions;
+import java.util.logging.Logger;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerChatEvent;
+import org.bukkit.event.player.PlayerEvent;
+import org.bukkit.event.player.PlayerRespawnEvent;
+
+
+public class EssentialsChatWorker
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+
+ public static void onPlayerRespawn(Server server, PlayerRespawnEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ updateDisplayName(user);
+ }
+
+ public static void onPlayerJoin(Server server, PlayerEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ updateDisplayName(user);
+ }
+
+ private static void updateDisplayName(User user)
+ {
+ try
+ {
+ String group = user.getGroup();
+ try
+ {
+ String prefix = Permissions.Security.getGroupPrefix(user.getWorld().getName(), group).replace('&', '§').replace("{WORLDNAME}", user.getWorld().getName());
+ String suffix = Permissions.Security.getGroupSuffix(user.getWorld().getName(), group).replace('&', '§').replace("{WORLDNAME}", user.getWorld().getName());
+ user.setDisplayName(prefix + user.getNick() + suffix + (suffix.endsWith("§f") ? "" : "§f"));
+ }
+ catch (Throwable ex)
+ {
+ logger.warning("Missing a prefix or suffix for " + group);
+ }
+ }
+ catch (Throwable ex)
+ {
+ logger.warning("Missing Permissions/GroupManager; chat prefixes/suffixes will be disabled.");
+ }
+ }
+
+ public static void onPlayerChat(Server server, PlayerChatEvent event)
+ {
+ User user = User.get(event.getPlayer());
+ updateDisplayName(user);
+
+ if (user.isAuthorized("essentials.chat.color"))
+ event.setMessage(event.getMessage().replaceAll("&([0-9a-f])", "§$1"));
+
+ event.setFormat(Essentials.getSettings().getChatFormat(user.getGroup())
+ .replace('&', '§')
+ .replace("§§", "&")
+ .replace("{DISPLAYNAME}", "%1$s")
+ .replace("{GROUP}", user.getGroup())
+ .replace("{MESSAGE}", "%2$s")
+ .replace("{WORLDNAME}", user.getWorld().getName()));
+
+ int radius = Essentials.getSettings().getChatRadius();
+ if (radius < 1) return;
+
+ if (event.getMessage().startsWith("!") && event.getMessage().length() > 1)
+ {
+ if (user.isAuthorized("essentials.chat.shout"))
+ {
+ event.setMessage(event.getMessage().substring(1));
+ event.setFormat("§7[Shout]§f " + event.getFormat());
+ return;
+ }
+ user.sendMessage("§cYou are not authorized to shout.");
+ event.setCancelled(true);
+ return;
+ }
+
+ if (event.getMessage().startsWith("?") && event.getMessage().length() > 1)
+ {
+ if (user.isAuthorized("essentials.chat.question"))
+ {
+ event.setMessage(event.getMessage().substring(1));
+ event.setFormat("§7[Question]§f " + event.getFormat());
+ return;
+ }
+ user.sendMessage("§cYou are not authorized to use question.");
+ event.setCancelled(true);
+ return;
+ }
+
+ event.setCancelled(true);
+ logger.info("Local: <" + user.getName() + "> " + event.getMessage());
+
+ Location loc = user.getLocation();
+ int x = loc.getBlockX();
+ int y = loc.getBlockY();
+ int z = loc.getBlockZ();
+
+ for (Player p : server.getOnlinePlayers())
+ {
+ User u = User.get(p);
+ if (u != user && !u.isAuthorized("essentials.chat.spy"))
+ {
+ Location l = u.getLocation();
+ int dx = Math.abs(x - l.getBlockX());
+ int dy = Math.abs(y - l.getBlockY());
+ int dz = Math.abs(z - l.getBlockZ());
+ int delta = dx + dy + dz;
+ if (delta > radius) continue;
+ }
+
+ u.sendMessage(String.format(event.getFormat(), user.getDisplayName(), event.getMessage()));
+ }
+ }
+}
diff --git a/EssentialsChat/src/plugin.yml b/EssentialsChat/src/plugin.yml
new file mode 100644
index 000000000..b4f7bb9c9
--- /dev/null
+++ b/EssentialsChat/src/plugin.yml
@@ -0,0 +1,8 @@
+# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
+name: EssentialsChat
+main: com.earth2me.essentials.chat.EssentialsChat
+# Note to developers: This next line cannot change, or the automatic versioning system will break.
+version: TeamCity
+website: http://www.earth2me.net:8001/
+description: Provides chat control features for Essentials. Requires Permissions.
+authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo] \ No newline at end of file
diff --git a/EssentialsGroupBridge/build.xml b/EssentialsGroupBridge/build.xml
new file mode 100644
index 000000000..94dd95861
--- /dev/null
+++ b/EssentialsGroupBridge/build.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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="EssentialsGroupBridge" default="default" basedir=".">
+ <description>Builds, tests, and runs the project EssentialsGroupBridge.</description>
+ <import file="nbproject/build-impl.xml"/>
+ <!--
+
+ 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="EssentialsGroupBridge-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>
diff --git a/EssentialsGroupBridge/nbproject/build-impl.xml b/EssentialsGroupBridge/nbproject/build-impl.xml
new file mode 100644
index 000000000..30d2e9bf6
--- /dev/null
+++ b/EssentialsGroupBridge/nbproject/build-impl.xml
@@ -0,0 +1,1047 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsGroupBridge-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: EssentialsGroupBridge was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.EssentialsGroupManager}" name="call.subproject"/>
+ <param location="${project.EssentialsGroupManager}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: EssentialsGroupBridge was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.EssentialsGroupManager}" name="call.subproject"/>
+ <param location="${project.EssentialsGroupManager}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/EssentialsGroupBridge/nbproject/genfiles.properties b/EssentialsGroupBridge/nbproject/genfiles.properties
new file mode 100644
index 000000000..194afdd81
--- /dev/null
+++ b/EssentialsGroupBridge/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=475c8f4d
+build.xml.script.CRC32=674d9b15
+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=475c8f4d
+nbproject/build-impl.xml.script.CRC32=5fe43282
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
diff --git a/EssentialsGroupBridge/nbproject/private/private.properties b/EssentialsGroupBridge/nbproject/private/private.properties
new file mode 100644
index 000000000..94183418a
--- /dev/null
+++ b/EssentialsGroupBridge/nbproject/private/private.properties
@@ -0,0 +1 @@
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/EssentialsGroupBridge/nbproject/project.properties b/EssentialsGroupBridge/nbproject/project.properties
new file mode 100644
index 000000000..0649cc58f
--- /dev/null
+++ b/EssentialsGroupBridge/nbproject/project.properties
@@ -0,0 +1,78 @@
+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=EssentialsGroupBridge
+application.vendor=gabrielcouto
+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}/EssentialsGroupBridge.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.craftbukkit-0.0.1-SNAPSHOT.jar=..\\lib\\craftbukkit-0.0.1-SNAPSHOT.jar
+file.reference.Permissions.jar=..\\lib\\Permissions.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${reference.EssentialsGroupManager.jar}:\
+ ${file.reference.craftbukkit-0.0.1-SNAPSHOT.jar}:\
+ ${file.reference.Permissions.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}
+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=
+main.class=
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+project.EssentialsGroupManager=../EssentialsGroupManager
+reference.EssentialsGroupManager.jar=${project.EssentialsGroupManager}/dist/EssentialsGroupManager.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
diff --git a/EssentialsGroupBridge/nbproject/project.xml b/EssentialsGroupBridge/nbproject/project.xml
new file mode 100644
index 000000000..f7234f600
--- /dev/null
+++ b/EssentialsGroupBridge/nbproject/project.xml
@@ -0,0 +1,25 @@
+<?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>EssentialsGroupBridge</name>
+ <source-roots>
+ <root id="src.dir"/>
+ </source-roots>
+ <test-roots>
+ <root id="test.src.dir"/>
+ </test-roots>
+ </data>
+ <references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
+ <reference>
+ <foreign-project>EssentialsGroupManager</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>
diff --git a/EssentialsGroupBridge/src/com/nijiko/Messaging.class b/EssentialsGroupBridge/src/com/nijiko/Messaging.class
new file mode 100644
index 000000000..f563d0085
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/Messaging.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/Misc$string.class b/EssentialsGroupBridge/src/com/nijiko/Misc$string.class
new file mode 100644
index 000000000..124b535c3
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/Misc$string.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/Misc.class b/EssentialsGroupBridge/src/com/nijiko/Misc.class
new file mode 100644
index 000000000..4330a303f
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/Misc.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/configuration/ConfigurationHandler.class b/EssentialsGroupBridge/src/com/nijiko/configuration/ConfigurationHandler.class
new file mode 100644
index 000000000..97c1fb35b
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/configuration/ConfigurationHandler.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/configuration/DefaultConfiguration.class b/EssentialsGroupBridge/src/com/nijiko/configuration/DefaultConfiguration.class
new file mode 100644
index 000000000..06d9ee23b
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/configuration/DefaultConfiguration.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/database/Wrapper$Type.class b/EssentialsGroupBridge/src/com/nijiko/database/Wrapper$Type.class
new file mode 100644
index 000000000..173279ddf
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/database/Wrapper$Type.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/database/Wrapper.class b/EssentialsGroupBridge/src/com/nijiko/database/Wrapper.class
new file mode 100644
index 000000000..e1b59f9e1
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/database/Wrapper.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/permissions/Control.class b/EssentialsGroupBridge/src/com/nijiko/permissions/Control.class
new file mode 100644
index 000000000..d0d8845ac
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/permissions/Control.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.class b/EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.class
new file mode 100644
index 000000000..a23287a5b
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijiko/permissions/PermissionHandler.class
Binary files differ
diff --git a/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java b/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java
new file mode 100644
index 000000000..bca7a89ed
--- /dev/null
+++ b/EssentialsGroupBridge/src/com/nijikokun/bukkit/Permissions/Permissions.java
@@ -0,0 +1,102 @@
+package com.nijikokun.bukkit.Permissions;
+
+import com.nijiko.Misc;
+import com.nijiko.configuration.DefaultConfiguration;
+import com.nijiko.permissions.PermissionHandler;
+import java.util.logging.Logger;
+import org.anjocaido.groupmanager.GroupManager;
+import org.anjocaido.groupmanager.permissions.NijikoPermissionsProxy;
+import org.bukkit.Server;
+import org.bukkit.event.player.PlayerChatEvent;
+import org.bukkit.event.player.PlayerListener;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginDescriptionFile;
+import org.bukkit.plugin.java.JavaPlugin;
+
+public class Permissions extends JavaPlugin {
+
+ private class Listener extends PlayerListener {
+
+ private Permissions plugin;
+
+ public Listener(Permissions plugin) {
+ //compiled code
+ throw new RuntimeException("Compiled Code");
+ }
+
+ public void onPlayerCommand(PlayerChatEvent event) {
+ //compiled code
+ throw new RuntimeException("Compiled Code");
+ }
+ }
+ public static final Logger log = Logger.getLogger("Fake Permissions");
+ public static String name = "Permissions";
+ public static String codename = "Hacked Permissions by AnjoCaido";
+ public static String version = "2.0";
+ public static PermissionHandler Security = null;
+ public static Misc Misc = new Misc();
+ public static Server Server;
+ private Listener Listener = null;
+ private DefaultConfiguration config = null;
+ private GroupManager groupManager;
+
+ @Override
+ public void onDisable() {
+ //compiled code
+ //throw new RuntimeException("Compiled Code");
+ // EXAMPLE: Custom code, here we just output some info so we can check all is well
+ PluginDescriptionFile pdfFile = this.getDescription();
+ System.out.println("Fake " + pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!");
+ }
+
+ @Override
+ public void onEnable() {
+ Server = this.getServer();
+ PluginDescriptionFile pdfFile = this.getDescription();
+
+ if (Security == null) {//make sure we have only one instance
+ Plugin p = (Plugin)(this.getServer() == null ? new GroupManager() : this.getServer().getPluginManager().getPlugin("GroupManager"));
+ if (p != null) {
+ if (!p.isEnabled()) {
+ if (this.getServer() == null) {
+ p.onEnable();
+ } else {
+ this.getServer().getPluginManager().enablePlugin(p);
+ }
+ }
+ GroupManager gm = (GroupManager) p;
+ groupManager = gm;
+ Security = new NijikoPermissionsProxy(gm);
+ } else {
+ System.err.println("OOOPS! Fake " + pdfFile.getName() + " version " + pdfFile.getVersion() + " couldn't find GroupManager!");
+ this.getPluginLoader().disablePlugin(this);
+ }
+ }
+ // EXAMPLE: Custom code, here we just output some info so we can check all is well
+ if (pdfFile != null)
+ System.out.println("Fake " + pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!");
+ }
+
+ private void registerEvents() {
+ //compiled code
+ //throw new RuntimeException("Compiled Code");
+ }
+
+ public PermissionHandler getHandler() {
+ //compiled code
+ //throw new RuntimeException("Compiled Code");
+ //System.out.println("Alguem chamou o handler");
+ checkEnable();
+ return Security;
+ }
+
+ public void setupPermissions() {
+ checkEnable();
+ }
+
+ private void checkEnable() {
+ if (!this.isEnabled() && Security == null && this.getServer() != null) {
+ this.getServer().getPluginManager().enablePlugin(this);
+ }
+ }
+}
diff --git a/EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java b/EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java
new file mode 100644
index 000000000..18da0cd56
--- /dev/null
+++ b/EssentialsGroupBridge/src/org/anjocaido/groupmanager/permissions/NijikoPermissionsProxy.java
@@ -0,0 +1,428 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.permissions;
+
+import com.nijiko.permissions.Control;
+import java.io.File;
+import java.util.Map;
+import org.anjocaido.groupmanager.GroupManager;
+import org.bukkit.entity.Player;
+import org.bukkit.util.config.Configuration;
+
+/**
+ * Everything here maintains the model created by Nijikokun
+ *
+ * But implemented to use GroupManager system. Which provides instant changes,
+ * without file access.
+ *
+ * @author gabrielcouto
+ */
+public class NijikoPermissionsProxy extends Control {
+ GroupManager plugin;
+ public NijikoPermissionsProxy(GroupManager plugin){
+ super(null);
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void addGroupPermission(String world, String group, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeGroupPermission(String world, String group, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addGroupInfo(String world, String group, String node, Object data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeGroupInfo(String world, String group, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addUserPermission(String world, String user, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeUserPermission(String world, String user, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addUserInfo(String world, String user, String node, Object data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeUserInfo(String world, String user, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeUserInfo(String user, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addGroupPermission(String group, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeGroupPermission(String group, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addGroupInfo(String group, String node, Object data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeGroupInfo(String group, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addUserPermission(String user, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeUserPermission(String user, String node) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addUserInfo(String user, String node, Object data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setDefaultWorld(String world) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setDirectory(File directory) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean loadWorld(String world) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void forceLoadWorld(String world) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean checkWorld(String world) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void load() {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void load(String world, Configuration config) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void reload() {
+ plugin.getWorldsHolder().reloadAll();
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean reload(String world) {
+ plugin.getWorldsHolder().reloadWorld(world);
+ return true;
+ }
+
+ @Override
+ public void setCache(Map<String, Boolean> Cache) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setCache(String world, Map<String, Boolean> Cache) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setCacheItem(String player, String permission, boolean data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void setCacheItem(String world, String player, String permission, boolean data) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Map<String, Boolean> getCache() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Map<String, Boolean> getCache(String world) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean getCacheItem(String player, String permission) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean getCacheItem(String world, String player, String permission) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeCachedItem(String player, String permission) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void removeCachedItem(String world, String player, String permission) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void clearCache() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void clearCache(String world) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void clearAllCache() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean has(Player player, String permission) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ return permission(player, permission);
+ }
+
+ @Override
+ public boolean permission(Player player, String permission) {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ if(permission==null || permission.equals("")){
+ return false;
+ }
+ if(player==null){
+ GroupManager.logger.severe("A plugin is asking permission '"+permission+"' for a null player... Which plugin does that? Bastards!");
+ return false;
+ }
+ if(player.getWorld()==null){
+ GroupManager.logger.warning("The player "+player.getName()+" has a null world? Treating as default world!");
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().has(player, permission);
+ }
+ return plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getPermissionsHandler().has(player, permission);
+ }
+
+ @Override
+ public String getGroup(String world, String name) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroup(name);
+ }
+
+ @Deprecated
+ @Override
+ public String getGroup(String name) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroup(name);
+ }
+
+ @Override
+ public String[] getGroups(String world, String name) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroups(name);
+ }
+
+ @Deprecated
+ @Override
+ public String[] getGroups(String name) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroups(name);
+ }
+
+ @Override
+ public boolean inGroup(String world, String name, String group) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().inGroup(name,group);
+ }
+
+ @Deprecated
+ @Override
+ public boolean inGroup(String name, String group) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().inGroup(name,group);
+ }
+
+ @Override
+ public String getGroupPrefix(String world, String group) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPrefix(group);
+ }
+
+ @Override
+ public String getGroupPrefix(String group) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPrefix(group);
+ }
+
+ @Override
+ public String getGroupSuffix(String world, String group) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupSuffix(group);
+ }
+
+ @Override
+ public String getGroupSuffix(String group) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupSuffix(group);
+ }
+
+ @Override
+ public boolean canGroupBuild(String world, String group) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().canGroupBuild(group);
+ }
+
+ @Deprecated
+ @Override
+ public boolean canGroupBuild(String group) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().canGroupBuild(group);
+ }
+
+ @Override
+ public String getGroupPermissionString(String world, String group, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionString(group,permission);
+ }
+
+ @Override
+ public String getGroupPermissionString(String group, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionString(group,permission);
+ }
+
+ @Override
+ public int getGroupPermissionInteger(String world, String group, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionInteger(group,permission);
+ }
+
+ @Override
+ public int getGroupPermissionInteger(String group, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionInteger(group,permission);
+ }
+
+ @Override
+ public boolean getGroupPermissionBoolean(String world, String group, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionBoolean(group,permission);
+ }
+
+ @Override
+ public boolean getGroupPermissionBoolean(String group, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionBoolean(group,permission);
+ }
+
+ @Override
+ public double getGroupPermissionDouble(String world, String group, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getGroupPermissionDouble(group,permission);
+ }
+
+ @Override
+ public double getGroupPermissionDouble(String group, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getGroupPermissionDouble(group,permission);
+ }
+
+ @Override
+ public String getUserPermissionString(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionString(name,permission);
+ }
+
+ @Override
+ public String getUserPermissionString(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionString(name,permission);
+ }
+
+ @Override
+ public int getUserPermissionInteger(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionInteger(name,permission);
+ }
+
+ @Override
+ public int getUserPermissionInteger(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionInteger(name,permission);
+ }
+
+ @Override
+ public boolean getUserPermissionBoolean(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionBoolean(name,permission);
+ }
+
+ @Override
+ public boolean getUserPermissionBoolean(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionBoolean(name,permission);
+ }
+
+ @Override
+ public double getUserPermissionDouble(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getUserPermissionDouble(name,permission);
+ }
+
+ @Override
+ public double getUserPermissionDouble(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getUserPermissionDouble(name,permission);
+ }
+
+ @Override
+ public String getPermissionString(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionString(name,permission);
+ }
+
+ @Override
+ public String getPermissionString(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionString(name,permission);
+ }
+
+ @Override
+ public int getPermissionInteger(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionInteger(name,permission);
+ }
+
+ @Override
+ public int getPermissionInteger(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionInteger(name,permission);
+ }
+
+ @Override
+ public boolean getPermissionBoolean(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionBoolean(name,permission);
+ }
+
+ @Override
+ public boolean getPermissionBoolean(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionBoolean(name,permission);
+ }
+
+ @Override
+ public double getPermissionDouble(String world, String name, String permission) {
+ return plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getPermissionDouble(name,permission);
+ }
+
+ @Override
+ public double getPermissionDouble(String name, String permission) {
+ return plugin.getWorldsHolder().getDefaultWorld().getPermissionsHandler().getPermissionDouble(name,permission);
+ }
+
+}
diff --git a/EssentialsGroupBridge/src/plugin.yml b/EssentialsGroupBridge/src/plugin.yml
new file mode 100644
index 000000000..af93ee4a0
--- /dev/null
+++ b/EssentialsGroupBridge/src/plugin.yml
@@ -0,0 +1,3 @@
+name: Permissions
+version: 2.5.1
+main: com.nijikokun.bukkit.Permissions.Permissions
diff --git a/EssentialsGroupManager/build.xml b/EssentialsGroupManager/build.xml
new file mode 100644
index 000000000..9eb86de21
--- /dev/null
+++ b/EssentialsGroupManager/build.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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="EssentialsGroupManager" default="default" basedir=".">
+ <description>Builds, tests, and runs the project EssentialsGroupManager.</description>
+ <import file="nbproject/build-impl.xml"/>
+ <!--
+
+ 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="EssentialsGroupManager-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>
diff --git a/EssentialsGroupManager/nbproject/build-impl.xml b/EssentialsGroupManager/nbproject/build-impl.xml
new file mode 100644
index 000000000..cf2c8bef0
--- /dev/null
+++ b/EssentialsGroupManager/nbproject/build-impl.xml
@@ -0,0 +1,1033 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsGroupManager-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: EssentialsGroupManager was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: EssentialsGroupManager was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/EssentialsGroupManager/nbproject/genfiles.properties b/EssentialsGroupManager/nbproject/genfiles.properties
new file mode 100644
index 000000000..b34deb399
--- /dev/null
+++ b/EssentialsGroupManager/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a6709b83
+build.xml.script.CRC32=5b346364
+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=a6709b83
+nbproject/build-impl.xml.script.CRC32=70ed0f6c
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
diff --git a/EssentialsGroupManager/nbproject/private/private.properties b/EssentialsGroupManager/nbproject/private/private.properties
new file mode 100644
index 000000000..94183418a
--- /dev/null
+++ b/EssentialsGroupManager/nbproject/private/private.properties
@@ -0,0 +1 @@
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/EssentialsGroupManager/nbproject/project.properties b/EssentialsGroupManager/nbproject/project.properties
new file mode 100644
index 000000000..c3e38f7a8
--- /dev/null
+++ b/EssentialsGroupManager/nbproject/project.properties
@@ -0,0 +1,73 @@
+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=EssentialsGroupManager
+application.vendor=gabrielcouto
+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}/EssentialsGroupManager.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.craftbukkit-0.0.1-SNAPSHOT.jar=..\\lib\\craftbukkit-0.0.1-SNAPSHOT.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${file.reference.craftbukkit-0.0.1-SNAPSHOT.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}
+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=
+main.class=
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+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
diff --git a/EssentialsGroupManager/nbproject/project.xml b/EssentialsGroupManager/nbproject/project.xml
new file mode 100644
index 000000000..6cc53fda9
--- /dev/null
+++ b/EssentialsGroupManager/nbproject/project.xml
@@ -0,0 +1,15 @@
+<?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>EssentialsGroupManager</name>
+ <source-roots>
+ <root id="src.dir"/>
+ </source-roots>
+ <test-roots>
+ <root id="test.src.dir"/>
+ </test-roots>
+ </data>
+ </configuration>
+</project>
diff --git a/EssentialsGroupManager/src/config.yml b/EssentialsGroupManager/src/config.yml
new file mode 100644
index 000000000..68308cca2
--- /dev/null
+++ b/EssentialsGroupManager/src/config.yml
@@ -0,0 +1,14 @@
+settings:
+ data:
+ save:
+ minutes: 10
+ logging:
+ level: INFO
+ permission:
+ world:
+ mirror:
+ world1:
+ - world2
+ - world3
+ world4:
+ - world5 \ No newline at end of file
diff --git a/EssentialsGroupManager/src/groups.yml b/EssentialsGroupManager/src/groups.yml
new file mode 100644
index 000000000..73c55b880
--- /dev/null
+++ b/EssentialsGroupManager/src/groups.yml
@@ -0,0 +1,172 @@
+groups:
+ Default:
+ default: true
+ permissions:
+ - essentials.help
+ - essentials.home
+ - essentials.motd
+ - essentials.sethome
+ - essentials.spawn
+ inheritance: []
+ info:
+ prefix: ''
+ build: false
+ suffix: ''
+ SemiAdmin:
+ default: false
+ permissions:
+ - +groupmanager.mandemote
+ - +groupmanager.manpromote
+ - -groupmanager.*
+ - '*'
+ inheritance:
+ - moderator
+ info:
+ prefix: '&c'
+ build: true
+ suffix: SemiAdmin
+ RedFaction:
+ default: false
+ permissions: []
+ inheritance:
+ - peasant
+ info:
+ prefix: '&c'
+ roles-category: faction
+ build: true
+ suffix: Red
+ Farmer:
+ default: false
+ permissions:
+ - essentials.kit
+ - essentials.kit.farmer
+ - essentials.spawnmob
+ inheritance: []
+ info:
+ roles-requirement:
+ - BlueFaction
+ - RedFaction
+ prefix: ''
+ roles-category: job
+ build: false
+ suffix: ''
+ Healer:
+ default: false
+ permissions:
+ - essentials.kit
+ - essentials.kit.healer
+ - essentials.heal
+ inheritance: []
+ info:
+ roles-requirement:
+ - BlueFaction
+ - RedFaction
+ prefix: ''
+ roles-category: job
+ build: false
+ suffix: ''
+ Fighter:
+ default: false
+ permissions:
+ - essentials.kit
+ - essentials.kit.fighter
+ inheritance: []
+ info:
+ prefix: ''
+ roles-category: skill
+ build: false
+ suffix: ''
+ Admin:
+ default: false
+ permissions:
+ - '*'
+ inheritance:
+ - semiadmin
+ info:
+ prefix: ''
+ build: true
+ suffix: ''
+ Miner:
+ default: false
+ permissions:
+ - essentials.kit
+ - essentials.kit.miner
+ - flashlight.regular
+ inheritance: []
+ info:
+ roles-requirement:
+ - BlueFaction
+ - RedFaction
+ prefix: ''
+ roles-category: job
+ build: false
+ suffix: ''
+ FlyingMan:
+ default: false
+ permissions:
+ - nocheat.moving
+ inheritance: []
+ info:
+ roles-requirement: Fighter&SuperCart
+ prefix: ''
+ roles-category: skill
+ build: false
+ suffix: ''
+ Peasant:
+ default: false
+ permissions:
+ - roles.joinrole
+ - roles.leaverole
+ - roles.myroles
+ inheritance:
+ - default
+ info:
+ prefix: '&e'
+ build: true
+ suffix: Peasant
+ BlueFaction:
+ default: false
+ permissions: []
+ inheritance:
+ - peasant
+ info:
+ prefix: '&d'
+ roles-category: faction
+ build: true
+ suffix: Blue
+ Railer:
+ default: false
+ permissions:
+ - essentials.kit
+ - essentials.kit.railer
+ inheritance: []
+ info:
+ roles-requirement: Miner
+ prefix: ''
+ roles-category: subjob
+ build: false
+ suffix: ''
+ SuperCart:
+ default: false
+ permissions:
+ - minecartmania.*
+ inheritance: []
+ info:
+ roles-requirement: Railer
+ prefix: ''
+ roles-category: skill
+ build: false
+ suffix: ''
+ Moderator:
+ default: false
+ permissions:
+ - essentials.tp
+ - essentials.tphere
+ - essentials.item
+ - essentials.give
+ inheritance:
+ - default
+ info:
+ prefix: '&c'
+ build: true
+ suffix: Mod \ No newline at end of file
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java
new file mode 100644
index 000000000..68253eccc
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java
@@ -0,0 +1,120 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Map;
+import java.util.logging.Level;
+import org.anjocaido.groupmanager.utils.Tasks;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class GMConfiguration {
+
+ private GroupManager plugin;
+ private Map<String, Object> rootDataNode;
+ private File configFile;
+
+ public GMConfiguration(GroupManager plugin) {
+ this.plugin = plugin;
+ load();
+ }
+
+ public void load() {
+ if (!plugin.getDataFolder().exists()) {
+ plugin.getDataFolder().mkdirs();
+ }
+ configFile = new File(plugin.getDataFolder(), "config.yml");
+
+ if (!configFile.exists()) {
+ try {
+ Tasks.copy(plugin.getResourceAsStream("config.yml"), configFile);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ }
+
+ Yaml yaml = new Yaml(new SafeConstructor());
+ FileInputStream rx = null;
+ try {
+ rx = new FileInputStream(configFile);
+ } catch (FileNotFoundException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ try {
+ rootDataNode = (Map<String, Object>) yaml.load(new UnicodeReader(rx));
+ if (rootDataNode == null) {
+ throw new NullPointerException();
+ }
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex);
+ } finally {
+ try {
+ rx.close();
+ } catch (IOException ex) {
+ }
+ }
+ adjustLoggerLevel();
+ }
+
+ public Map<String, Object> getMirrorsMap() {
+ if (rootDataNode.get("settings") instanceof Map) {
+ Map<String, Object> settingsNode = (Map<String, Object>) rootDataNode.get("settings");
+ if (settingsNode.get("permission") instanceof Map) {
+ Map<String, Object> permissionNode = (Map<String, Object>) settingsNode.get("permission");
+ if (permissionNode.get("world") instanceof Map) {
+ Map<String, Object> worldsNode = (Map<String, Object>) permissionNode.get("world");
+ if (worldsNode.get("mirror") instanceof Map) {
+ Map<String, Object> mirrorsNode = (Map<String, Object>) worldsNode.get("mirror");
+ return mirrorsNode;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public Integer getSaveInterval() {
+ if (rootDataNode.get("settings") instanceof Map) {
+ Map<String, Object> settingsNode = (Map<String, Object>) rootDataNode.get("settings");
+ if (settingsNode.get("data") instanceof Map) {
+ Map<String, Object> dataNode = (Map<String, Object>) settingsNode.get("data");
+ if (dataNode.get("save") instanceof Map) {
+ Map<String, Object> saveNode = (Map<String, Object>) dataNode.get("save");
+ if (saveNode.get("minutes") instanceof Integer) {
+ return (Integer) saveNode.get("minutes");
+ }
+ }
+ }
+ }
+ return 10;
+ }
+
+ public void adjustLoggerLevel() {
+ if (rootDataNode.get("settings") instanceof Map) {
+ Map<String, Object> settingsNode = (Map<String, Object>) rootDataNode.get("settings");
+ if (settingsNode.get("logging") instanceof Map) {
+ Map<String, Object> loggingNode = (Map<String, Object>) settingsNode.get("logging");
+ if (loggingNode.get("level") instanceof String) {
+ String level = (String) loggingNode.get("level");
+ try {
+ GroupManager.logger.setLevel(Level.parse(level));
+ return;
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+ GroupManager.logger.setLevel(Level.INFO);
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java
new file mode 100644
index 000000000..2ea0007b0
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java
@@ -0,0 +1,1634 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager;
+
+import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler;
+import org.anjocaido.groupmanager.utils.GroupManagerPermissions;
+import org.anjocaido.groupmanager.data.Variables;
+import org.anjocaido.groupmanager.data.User;
+import org.anjocaido.groupmanager.data.Group;
+import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
+import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder;
+import org.anjocaido.groupmanager.utils.GMLoggerHandler;
+import org.anjocaido.groupmanager.utils.PermissionCheckResult;
+import org.bukkit.ChatColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.ConsoleCommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.PluginDescriptionFile;
+import org.bukkit.plugin.java.JavaPlugin;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class GroupManager extends JavaPlugin {
+
+ private File configFile;
+ private File backupFolder;
+ private Runnable commiter;
+ private ScheduledThreadPoolExecutor scheduler;
+ private Map<String, ArrayList<User>> overloadedUsers = new HashMap<String, ArrayList<User>>();
+ private Map<CommandSender, String> selectedWorlds = new HashMap<CommandSender, String>();
+ private WorldsHolder worldsHolder;
+ private boolean validateOnlinePlayer = true;
+ private boolean isReady = false;
+ private GMConfiguration config;
+ public static final Logger logger = Logger.getLogger(GroupManager.class.getName());
+
+ @Override
+ public void onDisable() {
+ if (worldsHolder != null) {
+ worldsHolder.saveChanges();
+ }
+ disableScheduler();
+ // EXAMPLE: Custom code, here we just output some info so we can check all is well
+ PluginDescriptionFile pdfFile = this.getDescription();
+ System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!");
+ }
+
+ @Override
+ public void onEnable() {
+ GroupManager.logger.setUseParentHandlers(false);
+ GMLoggerHandler ch = new GMLoggerHandler();
+ GroupManager.logger.addHandler(ch);
+ logger.setLevel(Level.ALL);
+ if (worldsHolder == null) {
+ prepareFileFields();
+ prepareConfig();
+ worldsHolder = new WorldsHolder(this);
+ }
+
+ PluginDescriptionFile pdfFile = this.getDescription();
+ if (worldsHolder == null) {
+ GroupManager.logger.severe("Can't enable " + pdfFile.getName() + " version " + pdfFile.getVersion() + ", bad loading!");
+ this.getServer().getPluginManager().disablePlugin(this);
+ throw new IllegalStateException("An error ocurred while loading GroupManager");
+ }
+
+ enableScheduler();
+ System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!");
+ }
+
+ public InputStream getResourceAsStream(String fileName) {
+ return this.getClassLoader().getResourceAsStream(fileName);
+ }
+
+ private void prepareFileFields() {
+ configFile = new File(this.getDataFolder(), "config.yml");
+ backupFolder = new File(this.getDataFolder(), "backup");
+ if (!backupFolder.exists()) {
+ getBackupFolder().mkdirs();
+ }
+ }
+
+ private void prepareConfig() {
+ config = new GMConfiguration(this);
+ }
+
+ public void enableScheduler() {
+ if (worldsHolder != null) {
+ disableScheduler();
+ commiter = new Runnable() {
+
+ @Override
+ public void run() {
+ GroupManager.this.worldsHolder.saveChanges();
+ }
+ };
+ scheduler = new ScheduledThreadPoolExecutor(1);
+ int minutes = getConfig().getSaveInterval();
+ scheduler.scheduleAtFixedRate(commiter, minutes, minutes, TimeUnit.MINUTES);
+ GroupManager.logger.info("Scheduled Data Saving is set for every " + minutes + " minutes!");
+ }
+ }
+
+ public void disableScheduler() {
+ if (scheduler != null) {
+ try {
+ scheduler.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
+ scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
+ scheduler.shutdown();
+ } catch (Exception e) {
+ }
+ scheduler = null;
+ GroupManager.logger.info("Scheduled Data Saving is disabled!");
+ }
+ }
+
+ /**
+ * Use the WorldsHolder saveChanges directly instead
+ * Saves the data on file
+ */
+ @Deprecated
+ public void commit() {
+ if (worldsHolder != null) {
+ worldsHolder.saveChanges();
+ }
+ }
+
+ /**
+ * Use worlds holder to reload a specific world
+ * Reloads the data
+ */
+ @Deprecated
+ public void reload() {
+ worldsHolder.reloadAll();
+ }
+
+ public WorldsHolder getWorldsHolder() {
+ return worldsHolder;
+ }
+
+ /**
+ * The handler in the interface created by AnjoCaido
+ * @return
+ */
+ @Deprecated
+ public AnjoPermissionsHandler getPermissionHandler() {
+ return worldsHolder.getDefaultWorld().getPermissionsHandler();
+ }
+
+ /**
+ * A simple interface, for ones that don't want to mess with overloading.
+ * Yet it is affected by overloading. But seamless.
+ * @return the dataholder with all information
+ */
+ @Deprecated
+ public WorldDataHolder getData() {
+ return worldsHolder.getDefaultWorld();
+ }
+
+ /**
+ * Use this if you want to play with overloading.
+ * @return a dataholder with overloading interface
+ */
+ @Deprecated
+ public OverloadedWorldHolder getOverloadedClassData() {
+ return worldsHolder.getDefaultWorld();
+ }
+
+ /**
+ * Called when a command registered by this plugin is received.
+ * @param sender
+ * @param cmd
+ * @param args
+ */
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
+ boolean playerCanDo = false;
+ boolean isConsole = false;
+ Player senderPlayer = null;
+ Group senderGroup = null;
+ User senderUser = null;
+
+
+ //DETERMINING PLAYER INFORMATION
+ if (sender instanceof Player) {
+ senderPlayer = (Player) sender;
+ senderUser = worldsHolder.getWorldData(senderPlayer).getUser(senderPlayer.getName());
+ senderGroup = senderUser.getGroup();
+ if (worldsHolder.getWorldPermissions(senderPlayer).has(senderPlayer, "groupmanager." + cmd.getName())) {
+ playerCanDo = true;
+ }
+ } else if (sender instanceof ConsoleCommandSender) {
+ isConsole = true;
+ }
+
+ //PERMISSIONS FOR COMMAND BEING LOADED
+ OverloadedWorldHolder dataHolder = null;
+ AnjoPermissionsHandler permissionHandler = null;
+
+ if (senderPlayer != null) {
+ dataHolder = worldsHolder.getWorldData(senderPlayer);
+ }
+
+ String selectedWorld = selectedWorlds.get(sender);
+ if (selectedWorld != null) {
+ dataHolder = worldsHolder.getWorldData(selectedWorld);
+ }
+
+ if (dataHolder != null) {
+ permissionHandler = dataHolder.getPermissionsHandler();
+ }
+
+ //VARIABLES USED IN COMMANDS
+
+
+ int count;
+ PermissionCheckResult permissionResult = null;
+ ArrayList<User> removeList = null;
+ String auxString = null;
+ List<Player> match = null;
+ User auxUser = null;
+ Group auxGroup = null;
+ Group auxGroup2 = null;
+
+ GroupManagerPermissions execCmd = null;
+ try {
+ execCmd = GroupManagerPermissions.valueOf(cmd.getName());
+ } catch (Exception e) {
+ //this error happened once with someone. now im prepared... i think
+ GroupManager.logger.severe("===================================================");
+ GroupManager.logger.severe("= ERROR REPORT START =");
+ GroupManager.logger.severe("===================================================");
+ GroupManager.logger.severe("= COPY AND PASTE THIS TO GROUPMANAGER DEVELOPER =");
+ GroupManager.logger.severe("===================================================");
+ GroupManager.logger.severe(this.getDescription().getName());
+ GroupManager.logger.severe(this.getDescription().getVersion());
+ GroupManager.logger.severe("An error occured while trying to execute command:");
+ GroupManager.logger.severe(cmd.getName());
+ GroupManager.logger.severe("With " + args.length + " arguments:");
+ for (String ar : args) {
+ GroupManager.logger.severe(ar);
+ }
+ GroupManager.logger.severe("The field '" + cmd.getName() + "' was not found in enum.");
+ GroupManager.logger.severe("And could not be parsed.");
+ GroupManager.logger.severe("FIELDS FOUND IN ENUM:");
+ for (GroupManagerPermissions val : GroupManagerPermissions.values()) {
+ GroupManager.logger.severe(val.name());
+ }
+ GroupManager.logger.severe("===================================================");
+ GroupManager.logger.severe("= ERROR REPORT ENDED =");
+ GroupManager.logger.severe("===================================================");
+ sender.sendMessage("An error occurred. Ask the admin to take a look at the console.");
+ }
+
+ if (isConsole || playerCanDo) {
+ switch (execCmd) {
+ case manuadd:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ auxGroup = dataHolder.getGroup(args[1]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group not found!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ //PARECE OK
+ auxUser.setGroup(auxGroup);
+ sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'.");
+
+ return true;
+ //break;
+ case manudel:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ //PARECE OK
+ dataHolder.removeUser(auxUser.getName());
+ sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' to default settings.");
+
+ return true;
+ case manuaddsub:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ auxGroup = dataHolder.getGroup(args[1]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group not found!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ //PARECE OK
+ auxUser.addSubGroup(auxGroup);
+ sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'.");
+
+ return true;
+ case manudelsub:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ //PARECE OK
+ auxUser.removeSubGroup(auxGroup);
+ sender.sendMessage(ChatColor.YELLOW + "You removed subgroup '" + auxGroup.getName() + "' from player '" + auxUser.getName() + "' list.");
+
+ return true;
+ case mangadd:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup != null) {
+ sender.sendMessage(ChatColor.RED + "Group already exists!");
+ return false;
+ }
+ //PARECE OK
+ auxGroup = dataHolder.createGroup(args[0]);
+ sender.sendMessage(ChatColor.YELLOW + "You created a group named: " + auxGroup.getName());
+
+ return true;
+ case mangdel:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group not exists!");
+ return false;
+ }
+ //PARECE OK
+ dataHolder.removeGroup(auxGroup.getName());
+ sender.sendMessage(ChatColor.YELLOW + "You deleted a group named " + auxGroup.getName() + ", it's users are default group now.");
+
+ return true;
+ case manuaddp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO SUA PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same group than you, or higher.");
+ return false;
+ }
+ permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
+ if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
+ || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
+ sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have.");
+ return false;
+ }
+ //VALIDANDO PERMISSAO DO DESTINO
+ permissionResult = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
+ if (args[1].startsWith("+")) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) {
+ sender.sendMessage(ChatColor.RED + "The user already has direct access to that permission.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ }
+ } else if (args[1].startsWith("-")) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) {
+ sender.sendMessage(ChatColor.RED + "The user already has an exception for this node.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
+ sender.sendMessage(ChatColor.RED + "The user already has a matching node ");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ }
+ } else {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) {
+ sender.sendMessage(ChatColor.RED + "The user already has direct access to that permission.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ }
+ }
+ //PARECE OK
+ auxUser.addPermission(args[1]);
+ sender.sendMessage(ChatColor.YELLOW + "You added '" + args[1] + "' to player '" + auxUser.getName() + "' permissions.");
+ return true;
+ //break;
+ case manudelp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO SUA PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same group than you, or higher.");
+ return false;
+ }
+ permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
+ if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
+ || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
+ sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have.");
+ return false;
+ }
+ //VALIDANDO PERMISSAO DO DESTINO
+ permissionResult = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ sender.sendMessage(ChatColor.RED + "The user doesn't have direct access to that permission.");
+ return false;
+ }
+ if (!auxUser.hasSamePermissionNode(args[1])) {
+ sender.sendMessage(ChatColor.RED + "This permission node doesn't match any node.");
+ sender.sendMessage(ChatColor.RED + "But might match node: " + permissionResult.accessLevel);
+ return false;
+ }
+ //PARECE OK
+ auxUser.removePermission(args[1]);
+ sender.sendMessage(ChatColor.YELLOW + "You removed '" + args[1] + "' from player '" + auxUser.getName() + "' permissions.");
+
+ return true;
+ //break;
+ case manulistp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ //PARECE OK
+ auxString = "";
+ for (String perm : auxUser.getPermissionList()) {
+ auxString += perm + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "The player '" + auxUser.getName() + "' has following permissions: " + ChatColor.WHITE + auxString);
+ sender.sendMessage(ChatColor.YELLOW + "And all permissions from group: " + auxUser.getGroupName());
+ auxString = "";
+ for (String subGroup : auxUser.subGroupListStringCopy()) {
+ auxString += subGroup + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "And all permissions from subgroups: " + auxString);
+ }
+ } else {
+ sender.sendMessage(ChatColor.YELLOW + "The player '" + auxUser.getName() + "' has no specific permissions.");
+ sender.sendMessage(ChatColor.YELLOW + "Only all permissions from group: " + auxUser.getGroupName());
+ auxString = "";
+ for (String subGroup : auxUser.subGroupListStringCopy()) {
+ auxString += subGroup + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "And all permissions from subgroups: " + auxString);
+ }
+ }
+ return true;
+ case manucheckp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ permissionResult = permissionHandler.checkFullUserPermission(auxUser, args[1]);
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ sender.sendMessage(ChatColor.RED + "The player doesn't have access to that permission");
+ return false;
+ }
+ //PARECE OK
+ //auxString = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
+ if (permissionResult.owner instanceof User) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
+ sender.sendMessage(ChatColor.RED + "The user has directly a negation node for that permission.");
+ } else {
+ sender.sendMessage(ChatColor.YELLOW + "The user has directly this permission.");
+ }
+ sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel);
+ } else if (permissionResult.owner instanceof Group) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
+ sender.sendMessage(ChatColor.RED + "The user inherits the a negation permission from group: " + permissionResult.owner.getName());
+ } else {
+ sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName());
+ }
+ sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel);
+ }
+ return true;
+ case mangaddp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO SUA PERMISSAO
+ permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
+ if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
+ || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
+ sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have.");
+ return false;
+ }
+ //VALIDANDO PERMISSAO DO DESTINO
+ permissionResult = permissionHandler.checkGroupOnlyPermission(auxGroup, args[1]);
+ if (args[1].startsWith("+")) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) {
+ sender.sendMessage(ChatColor.RED + "The group already has direct access to that permission.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ }
+ } else if (args[1].startsWith("-")) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.EXCEPTION)) {
+ sender.sendMessage(ChatColor.RED + "The group already has an exception for this node.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
+ sender.sendMessage(ChatColor.RED + "The group already has a matching node.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ }
+ } else {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) {
+ sender.sendMessage(ChatColor.RED + "The user already has direct access to that permission.");
+ sender.sendMessage(ChatColor.RED + "Node: " + permissionResult.accessLevel);
+ return false;
+ }
+ }
+ //PARECE OK
+ auxGroup.addPermission(args[1]);
+ sender.sendMessage(ChatColor.YELLOW + "You added '" + args[1] + "' to group '" + auxGroup.getName() + "' permissions.");
+
+ return true;
+ case mangdelp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO SUA PERMISSAO
+ permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]);
+ if (!isConsole && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)
+ || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
+ sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have.");
+ return false;
+ }
+ //VALIDANDO PERMISSAO DO DESTINO
+ permissionResult = permissionHandler.checkGroupOnlyPermission(auxGroup, args[1]);
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ sender.sendMessage(ChatColor.RED + "The group doesn't have direct access to that permission.");
+ return false;
+ }
+ if (!auxGroup.hasSamePermissionNode(args[1])) {
+ sender.sendMessage(ChatColor.RED + "This permission node doesn't match any node.");
+ sender.sendMessage(ChatColor.RED + "But might match node: " + permissionResult.accessLevel);
+ return false;
+ }
+ //PARECE OK
+ auxGroup.removePermission(args[1]);
+ sender.sendMessage(ChatColor.YELLOW + "You removed '" + args[1] + "' from group '" + auxGroup.getName() + "' permissions.");
+
+ return true;
+ case manglistp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+
+ //PARECE OK
+ auxString = "";
+ for (String perm : auxGroup.getPermissionList()) {
+ auxString += perm + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "The group '" + auxGroup.getName() + "' has following permissions: " + ChatColor.WHITE + auxString);
+ auxString = "";
+ for (String grp : auxGroup.getInherits()) {
+ auxString += grp + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "And all permissions from groups: " + auxString);
+ }
+
+ } else {
+ sender.sendMessage(ChatColor.YELLOW + "The grpup '" + auxGroup.getName() + "' has no specific permissions.");
+ auxString = "";
+ for (String grp : auxGroup.getInherits()) {
+ auxString += grp + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "Only all permissions from groups: " + auxString);
+ }
+
+ }
+ return true;
+ case mangcheckp:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ permissionResult = permissionHandler.checkGroupPermissionWithInheritance(auxGroup, args[1]);
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ sender.sendMessage(ChatColor.RED + "The group doesn't have access to that permission");
+ return false;
+ }
+ //PARECE OK
+ //auxString = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
+ if (permissionResult.owner instanceof Group) {
+ if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
+ sender.sendMessage(ChatColor.RED + "The group inherits the a negation permission from group: " + permissionResult.owner.getName());
+ } else {
+ sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName());
+ }
+ sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel);
+
+ }
+ return true;
+ case mangaddi:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group 1 does not exists!");
+ return false;
+ }
+ auxGroup2 = dataHolder.getGroup(args[1]);
+ if (auxGroup2 == null) {
+ sender.sendMessage(ChatColor.RED + "Group 2 does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (permissionHandler.searchGroupInInheritance(auxGroup, auxGroup2.getName(), null)) {
+ sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " already inherits " + auxGroup2.getName() + " (might not be directly)");
+ return false;
+ }
+ //PARECE OK
+ auxGroup.addInherits(auxGroup2);
+ sender.sendMessage(ChatColor.RED + "Group " + auxGroup2.getName() + " is now in " + auxGroup.getName() + " inheritance list.");
+
+ return true;
+ case mangdeli:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group 1 does not exists!");
+ return false;
+ }
+ auxGroup2 = dataHolder.getGroup(args[1]);
+ if (auxGroup2 == null) {
+ sender.sendMessage(ChatColor.RED + "Group 2 does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (!permissionHandler.searchGroupInInheritance(auxGroup, auxGroup2.getName(), null)) {
+ sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " does not inherits " + auxGroup2.getName() + ".");
+ return false;
+ }
+ if (!auxGroup.getInherits().contains(auxGroup2.getName())) {
+ sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " does not inherits " + auxGroup2.getName() + " directly.");
+ return false;
+ }
+ //PARECE OK
+ auxGroup.removeInherits(auxGroup2.getName());
+ sender.sendMessage(ChatColor.RED + "Group " + auxGroup2.getName() + " was removed from " + auxGroup.getName() + " inheritance list.");
+
+ return true;
+ case manuaddv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length < 3) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ //PARECE OK
+ auxString = "";
+ for (int i = 2; i < args.length; i++) {
+ auxString += args[i];
+ if ((i + 1) < args.length) {
+ auxString += " ";
+ }
+ }
+ auxUser.getVariables().addVar(args[1], Variables.parseVariableValue(auxString));
+ sender.sendMessage(ChatColor.YELLOW + "Variable " + ChatColor.GOLD + args[1] + ChatColor.YELLOW + ":'" + ChatColor.GREEN + auxString + ChatColor.YELLOW + "' added to the user " + auxUser.getName());
+ return true;
+ case manudelv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ if (!auxUser.getVariables().hasVar(args[1])) {
+ sender.sendMessage(ChatColor.RED + "The user doesn't have directly that variable!");
+ }
+ //PARECE OK
+ auxUser.getVariables().removeVar(args[1]);
+ sender.sendMessage(ChatColor.YELLOW + "Variable " + ChatColor.GOLD + args[1] + ChatColor.YELLOW + " removed from the user " + ChatColor.GREEN + auxUser.getName());
+ return true;
+ case manulistv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ //PARECE OK
+ auxString = "";
+ for (String varKey : auxUser.getVariables().getVarKeyList()) {
+ Object o = auxUser.getVariables().getVarObject(varKey);
+ auxString += ChatColor.GOLD + varKey + ChatColor.WHITE + ":'" + ChatColor.GREEN + o.toString() + ChatColor.WHITE + "', ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ }
+ sender.sendMessage(ChatColor.YELLOW + "Variables of user " + auxUser.getName() + ": ");
+ sender.sendMessage(auxString + ".");
+ sender.sendMessage(ChatColor.YELLOW + "Plus all variables from group: " + auxUser.getGroupName());
+ return true;
+ case manucheckv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ auxGroup = auxUser.getGroup();
+ auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1], null);
+
+ if (!auxUser.getVariables().hasVar(args[1])) {
+ if (auxGroup2 == null) {
+ sender.sendMessage(ChatColor.RED + "The user doesn't have access to that variable!");
+ }
+ }
+ //PARECE OK
+ if (auxUser.getVariables().hasVar(auxString)) {
+ sender.sendMessage(ChatColor.YELLOW + "The value of variable '" + ChatColor.GOLD + args[1] + ChatColor.YELLOW + "' is: '" + ChatColor.GREEN + auxUser.getVariables().getVarObject(args[1]).toString() + ChatColor.WHITE + "'");
+ sender.sendMessage(ChatColor.YELLOW + "This user own directly the variable");
+ }
+ sender.sendMessage(ChatColor.YELLOW + "The value of variable '" + ChatColor.GOLD + args[1] + ChatColor.YELLOW + "' is: '" + ChatColor.GREEN + auxGroup2.getVariables().getVarObject(args[1]).toString() + ChatColor.WHITE + "'");
+ if (!auxGroup.equals(auxGroup2)) {
+ sender.sendMessage(ChatColor.YELLOW + "And the value was inherited from group: " + ChatColor.GREEN + auxGroup2.getName());
+ }
+ return true;
+ case mangaddv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length < 3) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ //PARECE OK
+ auxString = "";
+ for (int i = 2; i < args.length; i++) {
+ auxString += args[i];
+ if ((i + 1) < args.length) {
+ auxString += " ";
+ }
+ }
+ auxGroup.getVariables().addVar(args[1], Variables.parseVariableValue(auxString));
+ sender.sendMessage(ChatColor.YELLOW + "Variable " + ChatColor.GOLD + args[1] + ChatColor.YELLOW + ":'" + ChatColor.GREEN + auxString + ChatColor.YELLOW + "' added to the group " + auxGroup.getName());
+
+ return true;
+ case mangdelv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (!auxGroup.getVariables().hasVar(args[1])) {
+ sender.sendMessage(ChatColor.RED + "The group doesn't have directly that variable!");
+ }
+ //PARECE OK
+ auxGroup.getVariables().removeVar(args[1]);
+ sender.sendMessage(ChatColor.YELLOW + "Variable " + ChatColor.GOLD + args[1] + ChatColor.YELLOW + " removed from the group " + ChatColor.GREEN + auxGroup.getName());
+
+ return true;
+ case manglistv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ //PARECE OK
+ auxString = "";
+ for (String varKey : auxGroup.getVariables().getVarKeyList()) {
+ Object o = auxGroup.getVariables().getVarObject(varKey);
+ auxString += ChatColor.GOLD + varKey + ChatColor.WHITE + ":'" + ChatColor.GREEN + o.toString() + ChatColor.WHITE + "', ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ }
+ sender.sendMessage(ChatColor.YELLOW + "Variables of group " + auxGroup.getName() + ": ");
+ sender.sendMessage(auxString + ".");
+ auxString = "";
+ for (String grp : auxGroup.getInherits()) {
+ auxString += grp + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ sender.sendMessage(ChatColor.YELLOW + "Plus all variables from groups: " + auxString);
+ }
+ return true;
+ case mangcheckv:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ auxGroup = dataHolder.getGroup(args[0]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group does not exists!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1], null);
+ if (auxGroup2 == null) {
+ sender.sendMessage(ChatColor.RED + "The group doesn't have access to that variable!");
+ }
+ //PARECE OK
+ sender.sendMessage(ChatColor.YELLOW + "The value of variable '" + ChatColor.GOLD + args[1] + ChatColor.YELLOW + "' is: '" + ChatColor.GREEN + auxGroup2.getVariables().getVarObject(args[1]).toString() + ChatColor.WHITE + "'");
+ if (!auxGroup.equals(auxGroup2)) {
+ sender.sendMessage(ChatColor.YELLOW + "And the value was inherited from group: " + ChatColor.GREEN + auxGroup2.getName());
+ }
+ return true;
+ case manwhois:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //PARECE OK
+ sender.sendMessage(ChatColor.YELLOW + "Name: " + ChatColor.GREEN + auxUser.getName());
+ sender.sendMessage(ChatColor.YELLOW + "Group: " + ChatColor.GREEN + auxUser.getGroup().getName());
+ sender.sendMessage(ChatColor.YELLOW + "Overloaded: " + ChatColor.GREEN + dataHolder.isOverloaded(auxUser.getName()));
+ auxGroup = dataHolder.surpassOverload(auxUser.getName()).getGroup();
+ if (!auxGroup.equals(auxUser.getGroup())) {
+ sender.sendMessage(ChatColor.YELLOW + "Original Group: " + ChatColor.GREEN + auxGroup.getName());
+ }
+ //victim.permissions.add(args[1]);
+ return true;
+ //break;
+ case tempadd:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ //PARECE OK
+ if (overloadedUsers.get(dataHolder.getName().toLowerCase()) == null) {
+ overloadedUsers.put(dataHolder.getName().toLowerCase(), new ArrayList<User>());
+ }
+ dataHolder.overloadUser(auxUser.getName());
+ overloadedUsers.get(dataHolder.getName().toLowerCase()).add(dataHolder.getUser(auxUser.getName()));
+ sender.sendMessage(ChatColor.YELLOW + "Player overloaded!");
+
+ return true;
+ //break;
+ case tempdel:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ //PARECE OK
+ if (overloadedUsers.get(dataHolder.getName().toLowerCase()) == null) {
+ overloadedUsers.put(dataHolder.getName().toLowerCase(), new ArrayList<User>());
+ }
+ dataHolder.removeOverload(auxUser.getName());
+ if (overloadedUsers.get(dataHolder.getName().toLowerCase()).contains(auxUser)) {
+ overloadedUsers.get(dataHolder.getName().toLowerCase()).remove(auxUser);
+ }
+ sender.sendMessage(ChatColor.YELLOW + "You removed that player overload. He's back to normal!");
+
+ return true;
+ //break;
+ case templist:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //WORKING
+ auxString = "";
+ removeList = new ArrayList<User>();
+ count = 0;
+ for (User u : overloadedUsers.get(dataHolder.getName().toLowerCase())) {
+ if (!dataHolder.isOverloaded(u.getName())) {
+ removeList.add(u);
+ } else {
+ auxString += u.getName() + ", ";
+ count++;
+ }
+ }
+ if (count == 0) {
+ sender.sendMessage(ChatColor.YELLOW + "There is no users in overload mode");
+ return true;
+ }
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ if (overloadedUsers.get(dataHolder.getName().toLowerCase()) == null) {
+ overloadedUsers.put(dataHolder.getName().toLowerCase(), new ArrayList<User>());
+ }
+ overloadedUsers.get(dataHolder.getName().toLowerCase()).removeAll(removeList);
+ sender.sendMessage(ChatColor.YELLOW + " " + count + " Users in overload mode: " + ChatColor.WHITE + auxString);
+ return true;
+ case tempdelall:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //WORKING
+ removeList = new ArrayList<User>();
+ count = 0;
+ for (User u : overloadedUsers.get(dataHolder.getName().toLowerCase())) {
+ if (dataHolder.isOverloaded(u.getName())) {
+ dataHolder.removeOverload(u.getName());
+ count++;
+ }
+ }
+ if (count == 0) {
+ sender.sendMessage(ChatColor.YELLOW + "There is no users in overload mode");
+ return true;
+ }
+ if (overloadedUsers.get(dataHolder.getName().toLowerCase()) == null) {
+ overloadedUsers.put(dataHolder.getName().toLowerCase(), new ArrayList<User>());
+ }
+ overloadedUsers.get(dataHolder.getName().toLowerCase()).clear();
+ sender.sendMessage(ChatColor.YELLOW + " " + count + " Users in overload mode. Now they are normal again.");
+
+ return true;
+ case mansave:
+ worldsHolder.saveChanges();
+ sender.sendMessage(ChatColor.YELLOW + " The changes were saved.");
+ return true;
+ case manload:
+ //THIS CASE DONT NEED SENDER
+ if (args.length > 0) {
+ auxString = "";
+ for (int i = 0; i < args.length; i++) {
+ auxString += args[i];
+ if ((i + 1) < args.length) {
+ auxString += " ";
+ }
+ }
+ worldsHolder.loadWorld(auxString);
+ sender.sendMessage("The request to world '" + auxString + "' was sent.");
+ return true;
+ }
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //WORKING
+ config.load();
+ if (args.length > 0) {
+ auxString = "";
+ for (int i = 0; i < args.length; i++) {
+ auxString += args[i];
+ if ((i + 1) < args.length) {
+ auxString += " ";
+ }
+ }
+ worldsHolder.loadWorld(auxString);
+ sender.sendMessage("The request to world '" + auxString + "' was sent.");
+ } else {
+ worldsHolder.reloadAll();
+ sender.sendMessage(ChatColor.YELLOW + " The current world was reloaded.");
+ }
+ worldsHolder.mirrorSetUp();
+ return true;
+ case listgroups:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //WORKING
+ auxString = "";
+ for (Group g : dataHolder.getGroupList()) {
+ auxString += g.getName() + ", ";
+ }
+ if (auxString.lastIndexOf(",") > 0) {
+ auxString = auxString.substring(0, auxString.lastIndexOf(","));
+ }
+ sender.sendMessage(ChatColor.YELLOW + " Groups Available: " + ChatColor.WHITE + auxString);
+ return true;
+ case manpromote:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ auxGroup = dataHolder.getGroup(args[1]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group not found!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ if (!isConsole && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) {
+ sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher.");
+ return false;
+ }
+ if (!isConsole && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don't inherit.");
+ return false;
+ }
+ if (!isConsole && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line.");
+ return false;
+ }
+ if (!isConsole && (!permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) {
+ sender.sendMessage(ChatColor.RED + "The new group must be a higher rank.");
+ return false;
+ }
+ //PARECE OK
+ auxUser.setGroup(auxGroup);
+ sender.sendMessage(ChatColor.YELLOW + "You changed " + auxUser.getName() + " group to " + auxGroup.getName() + ".");
+
+ return true;
+ //break;
+ case mandemote:
+ //VALIDANDO ESTADO DO SENDER
+ if (dataHolder == null || permissionHandler == null) {
+ sender.sendMessage(ChatColor.RED + "Couldn't retrieve your world. World selection is needed.");
+ sender.sendMessage(ChatColor.RED + "Use /manselect <world>");
+ return true;
+ }
+ //VALIDANDO ARGUMENTOS
+ if (args.length != 2) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ if (validateOnlinePlayer) {
+ match = this.getServer().matchPlayer(args[0]);
+ if (match.size() != 1) {
+ sender.sendMessage(ChatColor.RED + "Player not found!");
+ return false;
+ }
+ }
+ if (match != null) {
+ auxUser = dataHolder.getUser(match.get(0).getName());
+ } else {
+ auxUser = dataHolder.getUser(args[0]);
+ }
+ auxGroup = dataHolder.getGroup(args[1]);
+ if (auxGroup == null) {
+ sender.sendMessage(ChatColor.RED + "Group not found!");
+ return false;
+ }
+ //VALIDANDO PERMISSAO
+ if (!isConsole && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
+ return false;
+ }
+ if (!isConsole && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) {
+ sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher.");
+ return false;
+ }
+ if (!isConsole && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don' inherit.");
+ return false;
+ }
+ if (!isConsole && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) {
+ sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line.");
+ return false;
+ }
+ if (!isConsole && (permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) {
+ sender.sendMessage(ChatColor.RED + "The new group must be a lower rank.");
+ return false;
+ }
+ //PARECE OK
+ auxUser.setGroup(auxGroup);
+ sender.sendMessage(ChatColor.YELLOW + "You changed " + auxUser.getName() + " group to " + auxGroup.getName() + ".");
+
+ return true;
+ //break;
+ case mantogglevalidate:
+ validateOnlinePlayer = !validateOnlinePlayer;
+ sender.sendMessage(ChatColor.YELLOW + "Validade if player is online, now set to: " + Boolean.toString(validateOnlinePlayer));
+ if (!validateOnlinePlayer) {
+ sender.sendMessage(ChatColor.GOLD + "From now on you can edit players not connected... BUT:");
+ sender.sendMessage(ChatColor.LIGHT_PURPLE + "From now on you should type the whole name of the player, correctly.");
+ }
+ return true;
+ case mantogglesave:
+ if (scheduler == null) {
+ enableScheduler();
+ sender.sendMessage(ChatColor.YELLOW + "The auto-saving is enabled!");
+ } else {
+ disableScheduler();
+ sender.sendMessage(ChatColor.YELLOW + "The auto-saving is disabled!");
+ }
+ return true;
+ case manworld:
+ auxString = selectedWorlds.get(sender);
+ if (auxString != null) {
+ sender.sendMessage(ChatColor.YELLOW + "You have the world '" + dataHolder.getName() + "' in your selection.");
+ } else {
+ if (dataHolder == null) {
+ sender.sendMessage(ChatColor.YELLOW + "There is no world selected. And no world is available now.");
+ } else {
+ sender.sendMessage(ChatColor.YELLOW + "You don't have a world in your selection..");
+ sender.sendMessage(ChatColor.YELLOW + "Working with the direct world where your player is.");
+ sender.sendMessage(ChatColor.YELLOW + "Your world now uses permissions of world name: '" + dataHolder.getName() + "' ");
+ }
+ }
+ return true;
+ case manselect:
+ if (args.length < 1) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ sender.sendMessage(ChatColor.YELLOW + "Worlds available: ");
+ ArrayList<OverloadedWorldHolder> worlds = worldsHolder.allWorldsDataList();
+ auxString = "";
+ for (int i = 0; i < worlds.size(); i++) {
+ auxString += worlds.get(i).getName();
+ if ((i + 1) < worlds.size()) {
+ auxString += ", ";
+ }
+ }
+ sender.sendMessage(ChatColor.YELLOW + auxString);
+ return false;
+ }
+ auxString = "";
+ for (int i = 0; i < args.length; i++) {
+ if (args[i] == null) {
+ logger.warning("Bukkit gave invalid arguments array! Cmd: " + cmd.getName() + " args.length: " + args.length);
+ return false;
+ }
+ auxString += args[i];
+ if (i < (args.length - 1)) {
+ auxString += " ";
+ }
+ }
+ dataHolder = worldsHolder.getWorldData(auxString);
+ permissionHandler = dataHolder.getPermissionsHandler();
+ selectedWorlds.put(sender, dataHolder.getName());
+ sender.sendMessage(ChatColor.YELLOW + "You have selected world '" + dataHolder.getName() + "'.");
+ return true;
+ case manclear:
+ if (args.length != 0) {
+ sender.sendMessage(ChatColor.RED + "Review your arguments count!");
+ return false;
+ }
+ selectedWorlds.remove(sender);
+ sender.sendMessage(ChatColor.YELLOW + "You have removed your world selection. Working with current world(if possible).");
+ return true;
+ default:
+ break;
+ }
+ }
+ sender.sendMessage(ChatColor.RED + "You are not allowed to use that command.");
+ return false;
+ }
+
+ /**
+ * @return the config
+ */
+ public GMConfiguration getConfig() {
+ return config;
+ }
+
+ /**
+ * @return the backupFolder
+ */
+ public File getBackupFolder() {
+ return backupFolder;
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java
new file mode 100644
index 000000000..3eb7491dd
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java
@@ -0,0 +1,114 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import org.anjocaido.groupmanager.GroupManager;
+import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
+import org.anjocaido.groupmanager.utils.StringPermissionComparator;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public abstract class DataUnit {
+
+ private WorldDataHolder dataSource;
+ private String name;
+ private boolean changed;
+ private ArrayList<String> permissions = new ArrayList<String>();
+
+ public DataUnit(WorldDataHolder dataSource, String name) {
+ this.dataSource = dataSource;
+ this.name = name;
+ }
+
+ /**
+ * Every group is matched only by their names and DataSources names.
+ * @param o
+ * @return true if they are equal. false if not.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof DataUnit) {
+ DataUnit go = (DataUnit) o;
+ if (this.getName().equalsIgnoreCase(go.getName()) && this.dataSource.getName().equalsIgnoreCase(go.getDataSource().getName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+ hash = 71 * hash + (this.name != null ? this.name.toLowerCase().hashCode() : 0);
+ return hash;
+ }
+
+
+
+
+ /**
+ * @return the dataSource
+ */
+ public WorldDataHolder getDataSource() {
+ return dataSource;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ public void flagAsChanged() {
+ GroupManager.logger.finest("DataSource: "+getDataSource().getName()+" - DataUnit: "+getName()+" flagged as changed!");
+// for(StackTraceElement st: Thread.currentThread().getStackTrace()){
+// GroupManager.logger.finest(st.toString());
+// }
+ changed = true;
+ }
+
+ public boolean isChanged() {
+ return changed;
+ }
+
+ public void flagAsSaved() {
+ GroupManager.logger.finest("DataSource: "+getDataSource().getName()+" - DataUnit: "+getName()+" flagged as saved!");
+ changed = false;
+ }
+
+ public boolean hasSamePermissionNode(String permission) {
+ return permissions.contains(permission);
+ }
+
+ public void addPermission(String permission) {
+ if (!hasSamePermissionNode(permission)) {
+ permissions.add(permission);
+ }
+ flagAsChanged();
+ }
+
+ public boolean removePermission(String permission) {
+ flagAsChanged();
+ return permissions.remove(permission);
+ }
+
+ /**
+ * Use this only to list permissions.
+ * You can't edit the permissions using the returned ArrayList instance
+ * @return a copy of the permission list
+ */
+ public ArrayList<String> getPermissionList() {
+ return (ArrayList<String>) permissions.clone();
+ }
+
+ public void sortPermissions(){
+ Collections.sort(permissions, StringPermissionComparator.getInstance());
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java
new file mode 100644
index 000000000..c734b208e
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java
@@ -0,0 +1,122 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.data;
+
+import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class Group extends DataUnit implements Cloneable {
+
+ /**
+ * The group it inherits DIRECTLY!
+ */
+ private ArrayList<String> inherits = new ArrayList<String>();
+ /**
+ *This one holds the fields in INFO node.
+ * like prefix = 'c'
+ * or build = false
+ */
+ private GroupVariables variables = new GroupVariables(this);
+
+ /**
+ *
+ * @param name
+ */
+ public Group(WorldDataHolder source, String name) {
+ super(source,name);
+ }
+
+ /**
+ * Clone this group
+ * @return a clone of this group
+ */
+ @Override
+ public Group clone() {
+ Group clone = new Group(getDataSource(), this.getName());
+ clone.inherits = ((ArrayList<String>) this.getInherits().clone());
+ for(String perm: this.getPermissionList()){
+ clone.addPermission(perm);
+ }
+ clone.variables = ((GroupVariables) variables).clone(clone);
+ //clone.flagAsChanged();
+ return clone;
+ }
+
+ /**
+ * Use this to deliver a group from a different dataSource to another
+ * @param dataSource
+ * @return
+ */
+ public Group clone(WorldDataHolder dataSource) {
+ if (dataSource.groupExists(this.getName())) {
+ return null;
+ }
+ Group clone = getDataSource().createGroup(this.getName());
+ clone.inherits = ((ArrayList<String>) this.getInherits().clone());
+ for(String perm: this.getPermissionList()){
+ clone.addPermission(perm);
+ }
+ clone.variables = variables.clone(clone);
+ clone.flagAsChanged(); //use this to make the new dataSource save the new group
+ return clone;
+ }
+
+ /**
+ * a COPY of inherits list
+ * You can't manage the list by here
+ * Lol... version 0.6 had a problem because this.
+ * @return the inherits
+ */
+ public ArrayList<String> getInherits() {
+ return (ArrayList<String>) inherits.clone();
+ }
+
+ /**
+ * @param inherits the inherits to set
+ */
+ public void addInherits(Group inherit) {
+ if (!this.getDataSource().groupExists(inherit.getName())) {
+ getDataSource().addGroup(inherit);
+ }
+ if (!inherits.contains(inherit.getName().toLowerCase())) {
+ inherits.add(inherit.getName().toLowerCase());
+ }
+ flagAsChanged();
+ }
+
+ public boolean removeInherits(String inherit) {
+ if (this.inherits.contains(inherit.toLowerCase())) {
+ this.inherits.remove(inherit.toLowerCase());
+ flagAsChanged();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @return the variables
+ */
+ public GroupVariables getVariables() {
+ return variables;
+ }
+
+ /**
+ *
+ * @param varList
+ */
+ public void setVariables(Map<String, Object> varList) {
+ GroupVariables temp = new GroupVariables(this, varList);
+ variables.clearVars();
+ for(String key: temp.getVarKeyList()){
+ variables.addVar(key, temp.getVarObject(key));
+ }
+ flagAsChanged();
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java
new file mode 100644
index 000000000..87c34de2b
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java
@@ -0,0 +1,87 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.data;
+
+import java.util.Map;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class GroupVariables extends Variables implements Cloneable {
+
+ private Group owner;
+
+ public GroupVariables(Group owner) {
+ super(owner);
+ this.owner = owner;
+ addVar("prefix", "");
+ addVar("suffix", "");
+ addVar("build", false);
+ }
+
+ public GroupVariables(Group owner, Map<String, Object> varList) {
+ super(owner);
+ variables = varList;
+ if (variables.get("prefix") == null) {
+ variables.put("prefix", "");
+ owner.flagAsChanged();
+ }
+ //thisGrp.prefix = infoNode.get("prefix").toString();
+
+ if (variables.get("suffix") == null) {
+ variables.put("suffix", "");
+ owner.flagAsChanged();
+ }
+ //thisGrp.suffix = infoNode.get("suffix").toString();
+
+ if (variables.get("build") == null) {
+ variables.put("build", false);
+ owner.flagAsChanged();
+ }
+ this.owner = owner;
+ }
+
+ /**
+ * A clone of all vars here.
+ * @return
+ */
+ protected GroupVariables clone(Group newOwner) {
+ GroupVariables clone = new GroupVariables(newOwner);
+ for (String key : variables.keySet()) {
+ clone.variables.put(key, variables.get(key));
+ }
+ newOwner.flagAsChanged();
+ return clone;
+ }
+
+ /**
+ * Remove a var from the list
+ * @param name
+ */
+ @Override
+ public void removeVar(String name) {
+ try {
+ this.variables.remove(name);
+ } catch (Exception e) {
+ }
+ if (name.equals("prefix")) {
+ addVar("prefix", "");
+ } else if (name.equals("suffix")) {
+ addVar("suffix", "");
+ } else if (name.equals("build")) {
+ addVar("build", false);
+ }
+ owner.flagAsChanged();
+ }
+
+ /**
+ * @return the owner
+ */
+ @Override
+ public Group getOwner() {
+ return owner;
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
new file mode 100644
index 000000000..ceecbfa21
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
@@ -0,0 +1,187 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.data;
+
+import com.sun.org.apache.bcel.internal.generic.AALOAD;
+import java.util.ArrayList;
+import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
+import java.util.Map;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class User extends DataUnit implements Cloneable {
+
+ /**
+ *
+ */
+ private String group = null;
+ private ArrayList<String> subGroups = new ArrayList<String>();
+ /**
+ *This one holds the fields in INFO node.
+ * like prefix = 'c'
+ * or build = false
+ */
+ private UserVariables variables = new UserVariables(this);
+
+
+ /**
+ *
+ * @param name
+ */
+ public User(WorldDataHolder source, String name) {
+ super(source,name);
+ this.group = source.getDefaultGroup().getName();
+ }
+
+ /**
+ *
+ * @return
+ */
+ @Override
+ public User clone() {
+ User clone = new User(getDataSource(), this.getName());
+ clone.group = this.group;
+ for(String perm: this.getPermissionList()){
+ clone.addPermission(perm);
+ }
+ //clone.variables = this.variables.clone();
+ //clone.flagAsChanged();
+ return clone;
+ }
+
+ /**
+ * Use this to deliver a user from one WorldDataHolder to another
+ * @param dataSource
+ * @return null if given dataSource already contains the same user
+ */
+ public User clone(WorldDataHolder dataSource) {
+ if (dataSource.isUserDeclared(this.getName())) {
+ return null;
+ }
+ User clone = dataSource.createUser(this.getName());
+ if (dataSource.getGroup(group) == null) {
+ clone.setGroup(dataSource.getDefaultGroup());
+ } else {
+ clone.setGroup(this.getGroupName());
+ }
+ for(String perm: this.getPermissionList()){
+ clone.addPermission(perm);
+ }
+ //clone.variables = this.variables.clone();
+ clone.flagAsChanged();
+ return clone;
+ }
+
+ public Group getGroup() {
+ Group result = getDataSource().getGroup(group);
+ if (result == null) {
+ this.setGroup(getDataSource().getDefaultGroup());
+ result = getDataSource().getDefaultGroup();
+ }
+ return result;
+ }
+
+ /**
+ * @return the group
+ */
+ public String getGroupName() {
+ Group result = getDataSource().getGroup(group);
+ if (result == null) {
+ group = getDataSource().getDefaultGroup().getName();
+ }
+ return group;
+ }
+
+ /**
+ * @param group the group to set
+ */
+ @Deprecated
+ public void setGroup(String group) {
+ this.group = group;
+ flagAsChanged();
+ }
+
+ /**
+ * @param group the group to set
+ */
+ public void setGroup(Group group) {
+ if (!this.getDataSource().groupExists(group.getName())) {
+ getDataSource().addGroup(group);
+ }
+ group = getDataSource().getGroup(group.getName());
+ this.group = group.getName();
+ flagAsChanged();
+ }
+
+ public void addSubGroup(Group subGroup){
+ if(this.group.equalsIgnoreCase(subGroup.getName())){
+ return;
+ }
+ if (!this.getDataSource().groupExists(subGroup.getName())) {
+ getDataSource().addGroup(subGroup);
+ }
+ subGroup = getDataSource().getGroup(subGroup.getName());
+ removeSubGroup(subGroup);
+ subGroups.add(subGroup.getName());
+ flagAsChanged();
+ }
+ public int subGroupsSize(){
+ return subGroups.size();
+ }
+ public boolean isSubGroupsEmpty(){
+ return subGroups.isEmpty();
+ }
+ public boolean containsSubGroup(Group subGroup){
+ return subGroups.contains(subGroup.getName());
+ }
+ public boolean removeSubGroup(Group subGroup){
+ try{
+ if(subGroups.remove(subGroup.getName())){
+ flagAsChanged();
+ return true;
+ }
+ } catch (Exception e){
+
+ }
+ return false;
+ }
+ public ArrayList<Group> subGroupListCopy(){
+ ArrayList<Group> val = new ArrayList<Group>();
+ for(String gstr: subGroups){
+ Group g = getDataSource().getGroup(gstr);
+ if(g==null){
+ removeSubGroup(g);
+ continue;
+ }
+ val.add(g);
+ }
+ return val;
+ }
+ public ArrayList<String> subGroupListStringCopy(){
+ return (ArrayList<String>) subGroups.clone();
+ }
+
+ /**
+ * @return the variables
+ */
+ public UserVariables getVariables() {
+ return variables;
+ }
+
+ /**
+ *
+ * @param varList
+ */
+ public void setVariables(Map<String, Object> varList) {
+ UserVariables temp = new UserVariables(this, varList);
+ variables.clearVars();
+ for(String key: temp.getVarKeyList()){
+ variables.addVar(key, temp.getVarObject(key));
+ }
+ flagAsChanged();
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java
new file mode 100644
index 000000000..45dfc31e7
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java
@@ -0,0 +1,45 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.anjocaido.groupmanager.data;
+
+import java.util.Map;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class UserVariables extends Variables{
+ private User owner;
+ public UserVariables(User owner){
+ super(owner);
+ this.owner = owner;
+ }
+ public UserVariables(User owner, Map<String, Object> varList) {
+ super(owner);
+ this.variables = varList;
+ this.owner = owner;
+ }
+ /**
+ * A clone of all vars here.
+ * @return
+ */
+ protected UserVariables clone(User newOwner) {
+ UserVariables clone = new UserVariables(newOwner);
+ for (String key : variables.keySet()) {
+ clone.variables.put(key, variables.get(key));
+ }
+ newOwner.flagAsChanged();
+ return clone;
+ }
+ /**
+ * @return the owner
+ */
+ @Override
+ public User getOwner() {
+ return owner;
+ }
+
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java
new file mode 100644
index 000000000..31ed0d795
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java
@@ -0,0 +1,192 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.data;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *A class that holds variables of a user/group.
+ * In groups, it holds the contents of INFO node.
+ * Like:
+ * prefix
+ * suffix
+ * build
+ *
+ * @author gabrielcouto
+ */
+public abstract class Variables implements Cloneable {
+ private DataUnit owner;
+ protected Map<String, Object> variables = new HashMap<String, Object>();
+
+ public Variables(DataUnit owner){
+ this.owner = owner;
+ }
+ /**
+ * Add var to the the INFO node.
+ * examples:
+ * addVar("build",true);
+ * addVar("prefix","c");
+ * @param name key name of the var
+ * @param o the object value of the var
+ */
+ public void addVar(String name, Object o) {
+ if (o == null) {
+ return;
+ }
+ if (variables.containsKey(name)) {
+ variables.remove(name);
+ }
+ variables.put(name, o);
+ owner.flagAsChanged();
+ }
+
+ /**
+ * Returns the object inside the var
+ * @param name
+ * @return a Object if exists. null if doesn't exists
+ */
+ public Object getVarObject(String name) {
+ return variables.get(name);
+ }
+
+ /**
+ * Get the String value for the given var name
+ * @param name the var key name
+ * @return "" if null. or the toString() value of object
+ */
+ public String getVarString(String name) {
+ Object o = variables.get(name);
+ try {
+ return o == null ? "" : o.toString();
+ } catch (Exception e) {
+ return "";
+ }
+ }
+
+ /**
+ *
+ * @param name
+ * @return false if null. or a Boolean.parseBoolean of the string
+ */
+ public Boolean getVarBoolean(String name) {
+ Object o = variables.get(name);
+ try {
+ return o == null ? false : Boolean.parseBoolean(o.toString());
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ /**
+ *
+ * @param name
+ * @return -1 if null. or a parseInt of the string
+ */
+ public Integer getVarInteger(String name) {
+ Object o = variables.get(name);
+ try {
+ return o == null ? -1 : Integer.parseInt(o.toString());
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+
+ /**
+ *
+ * @param name
+ * @return -1 if null. or a parseDouble of the string
+ */
+ public Double getVarDouble(String name) {
+ Object o = variables.get(name);
+ try {
+ return o == null ? -1.0D : Double.parseDouble(o.toString());
+ } catch (Exception e) {
+ return -1.0D;
+
+
+ }
+ }
+
+ /**
+ * All variable keys this is holding
+ * @return
+ */
+ public Set<String> getVarKeyList() {
+ return variables.keySet();
+
+
+ }
+
+ /**
+ * verify is a var exists
+ * @param name the key name of the var
+ * @return true if that var exists
+ */
+ public boolean hasVar(String name) {
+ return variables.containsKey(name);
+
+
+ }
+
+ /**
+ * Returns the quantity of vars this is holding
+ * @return the number of vars
+ */
+ public int getSize() {
+ return variables.size();
+
+
+ }
+
+ /**
+ * Remove a var from the list
+ * @param name
+ */
+ public void removeVar(String name) {
+ try {
+ variables.remove(name);
+ } catch (Exception e) {
+ }
+ owner.flagAsChanged();
+ }
+
+ public static Object parseVariableValue(String value) {
+ try {
+ Integer i = Integer.parseInt(value);
+ return i;
+ } catch (NumberFormatException e) {
+ }
+ try {
+ Double d = Double.parseDouble(value);
+ return d;
+ } catch (NumberFormatException e) {
+ }
+ if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("on")) {
+ return true;
+ } else if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no") || value.equalsIgnoreCase("off")) {
+ return false;
+ }
+ return value;
+
+ }
+
+ public void clearVars(){
+ variables.clear();
+ owner.flagAsChanged();
+ }
+
+ /**
+ * @return the owner
+ */
+ public DataUnit getOwner() {
+ return owner;
+ }
+
+ public boolean isEmpty(){
+ return variables.isEmpty();
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java
new file mode 100644
index 000000000..f735ff5e6
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java
@@ -0,0 +1,204 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.dataholder;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.anjocaido.groupmanager.data.User;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class OverloadedWorldHolder extends WorldDataHolder {
+
+ /**
+ *
+ */
+ protected Map<String, User> overloadedUsers = new HashMap<String, User>();
+
+ /**
+ *
+ * @param ph
+ */
+ public OverloadedWorldHolder(WorldDataHolder ph) {
+ super(ph.getName());
+ this.f = ph.f;
+ this.groupsFile = ph.groupsFile;
+ this.usersFile = ph.usersFile;
+ this.defaultGroup = ph.defaultGroup;
+ this.groups = ph.groups;
+ this.users = ph.users;
+ }
+
+ /**
+ *
+ * @param userName
+ * @return
+ */
+ @Override
+ public User getUser(String userName) {
+ //OVERLOADED CODE
+ if (overloadedUsers.containsKey(userName.toLowerCase())) {
+ return overloadedUsers.get(userName.toLowerCase());
+ }
+ //END CODE
+ if (users.containsKey(userName.toLowerCase())) {
+ return users.get(userName.toLowerCase());
+ }
+ User newUser = createUser(userName);
+ haveUsersChanged = true;
+ return newUser;
+ }
+
+ /**
+ *
+ * @param theUser
+ */
+ @Override
+ public void addUser(User theUser) {
+ if (theUser.getDataSource() != this) {
+ theUser = theUser.clone(this);
+ }
+ if (theUser == null) {
+ return;
+ }
+ if ((theUser.getGroup() == null) || (!groups.containsKey(theUser.getGroupName().toLowerCase()))) {
+ theUser.setGroup(defaultGroup);
+ }
+ //OVERLOADED CODE
+ if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) {
+ overloadedUsers.remove(theUser.getName().toLowerCase());
+ overloadedUsers.put(theUser.getName().toLowerCase(), theUser);
+ return;
+ }
+ //END CODE
+ removeUser(theUser.getName());
+ users.put(theUser.getName().toLowerCase(), theUser);
+ haveUsersChanged = true;
+ }
+
+ /**
+ *
+ * @param userName
+ * @return
+ */
+ @Override
+ public boolean removeUser(String userName) {
+ //OVERLOADED CODE
+ if (overloadedUsers.containsKey(userName.toLowerCase())) {
+ overloadedUsers.remove(userName.toLowerCase());
+ return true;
+ }
+ //END CODE
+ if (users.containsKey(userName.toLowerCase())) {
+ users.remove(userName.toLowerCase());
+ haveUsersChanged = true;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean removeGroup(String groupName) {
+ if (groupName.equals(defaultGroup)) {
+ return false;
+ }
+ for (String key : groups.keySet()) {
+ if (groupName.equalsIgnoreCase(key)) {
+ groups.remove(key);
+ for (String userKey : users.keySet()) {
+ User user = users.get(userKey);
+ if (user.getGroupName().equalsIgnoreCase(key)) {
+ user.setGroup(defaultGroup);
+ }
+
+ }
+ //OVERLOADED CODE
+ for (String userKey : overloadedUsers.keySet()) {
+ User user = overloadedUsers.get(userKey);
+ if (user.getGroupName().equalsIgnoreCase(key)) {
+ user.setGroup(defaultGroup);
+ }
+
+ }
+ //END OVERLOAD
+ haveGroupsChanged = true;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @return
+ */
+ @Override
+ public Collection<User> getUserList() {
+ Collection<User> overloadedList = new ArrayList<User>();
+ Collection<User> normalList = users.values();
+ for (User u : normalList) {
+ if (overloadedUsers.containsKey(u.getName().toLowerCase())) {
+ overloadedList.add(overloadedUsers.get(u.getName().toLowerCase()));
+ } else {
+ overloadedList.add(u);
+ }
+ }
+ return overloadedList;
+ }
+
+ /**
+ *
+ * @param userName
+ * @return
+ */
+ public boolean isOverloaded(String userName) {
+ return overloadedUsers.containsKey(userName.toLowerCase());
+ }
+
+ /**
+ *
+ * @param userName
+ */
+ public void overloadUser(String userName) {
+ if (!isOverloaded(userName)) {
+ User theUser = getUser(userName);
+ theUser = theUser.clone();
+ if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) {
+ overloadedUsers.remove(theUser.getName().toLowerCase());
+ }
+ overloadedUsers.put(theUser.getName().toLowerCase(), theUser);
+ }
+ }
+
+ /**
+ *
+ * @param userName
+ */
+ public void removeOverload(String userName) {
+ overloadedUsers.remove(userName.toLowerCase());
+ }
+
+ /**
+ * Gets the user in normal state. Surpassing the overload state.
+ * It doesn't affect permissions. But it enables plugins change the
+ * actual user permissions even in overload mode.
+ * @param userName
+ * @return
+ */
+ public User surpassOverload(String userName) {
+ if (!isOverloaded(userName)) {
+ return getUser(userName);
+ }
+ if (users.containsKey(userName.toLowerCase())) {
+ return users.get(userName.toLowerCase());
+ }
+ User newUser = createUser(userName);
+ return newUser;
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java
new file mode 100644
index 000000000..96e517abd
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java
@@ -0,0 +1,939 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.dataholder;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.anjocaido.groupmanager.GroupManager;
+import org.anjocaido.groupmanager.data.Group;
+import org.anjocaido.groupmanager.data.User;
+import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler;
+import org.bukkit.Server;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginManager;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
+import org.yaml.snakeyaml.reader.UnicodeReader;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class WorldDataHolder {
+
+ /**
+ *
+ */
+ protected String name;
+ /**
+ * The actual groups holder
+ */
+ protected Map<String, Group> groups = new HashMap<String, Group>();
+ /**
+ * The actual users holder
+ */
+ protected Map<String, User> users = new HashMap<String, User>();
+ /**
+ * Points to the default group
+ */
+ protected Group defaultGroup = null;
+ /**
+ * The file, which this class loads/save data from/to
+ * @deprecated
+ */
+ @Deprecated
+ protected File f;
+ /**
+ *
+ */
+ protected AnjoPermissionsHandler permissionsHandler;
+ /**
+ *
+ */
+ protected File usersFile;
+ /**
+ *
+ */
+ protected File groupsFile;
+ /**
+ *
+ */
+ protected boolean haveUsersChanged = false;
+ /**
+ *
+ */
+ protected boolean haveGroupsChanged = false;
+
+ /**
+ * Prevent direct instantiation
+ * @param worldName
+ */
+ protected WorldDataHolder(String worldName) {
+ name = worldName;
+ }
+
+ /**
+ * The main constructor for a new WorldDataHolder
+ * Please don't set the default group as null
+ * @param worldName
+ * @param defaultGroup the default group. its good to start with one
+ */
+ public WorldDataHolder(String worldName, Group defaultGroup) {
+ this.name = worldName;
+ groups.put(defaultGroup.getName().toLowerCase(), defaultGroup);
+ this.defaultGroup = defaultGroup;
+ }
+
+ /**
+ * Search for a user. If it doesn't exist, create a new one with
+ * default group.
+ *
+ * @param userName the name of the user
+ * @return class that manage that user permission
+ */
+ public User getUser(String userName) {
+ if (users.containsKey(userName.toLowerCase())) {
+ return users.get(userName.toLowerCase());
+ }
+ User newUser = createUser(userName);
+ return newUser;
+ }
+
+ /**
+ * Add a user to the list. If it already exists, overwrite the old.
+ * @param theUser the user you want to add to the permission list
+ */
+ public void addUser(User theUser) {
+ if (theUser.getDataSource() != this) {
+ theUser = theUser.clone(this);
+ }
+ if (theUser == null) {
+ return;
+ }
+ if ((theUser.getGroup() == null)) {
+ theUser.setGroup(defaultGroup);
+ }
+ removeUser(theUser.getName());
+ users.put(theUser.getName().toLowerCase(), theUser);
+ haveUsersChanged = true;
+ }
+
+ /**
+ * Removes the user from the list. (he might become a default user)
+ * @param userName the username from the user to remove
+ * @return true if it had something to remove
+ */
+ public boolean removeUser(String userName) {
+ if (users.containsKey(userName.toLowerCase())) {
+ users.remove(userName.toLowerCase());
+ haveUsersChanged = true;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @param userName
+ * @return
+ */
+ public boolean isUserDeclared(String userName) {
+ return users.containsKey(userName.toLowerCase());
+ }
+
+ /**
+ * Change the default group of the file.
+ * @param group the group you want make default.
+ */
+ public void setDefaultGroup(Group group) {
+ if (!groups.containsKey(group.getName().toLowerCase()) || (group.getDataSource() != this)) {
+ addGroup(group);
+ }
+ defaultGroup = this.getGroup(group.getName());
+ haveGroupsChanged = true;
+ }
+
+ /**
+ * Returns the default group of the file
+ * @return the default group
+ */
+ public Group getDefaultGroup() {
+ return defaultGroup;
+ }
+
+ /**
+ * Returns a group of the given name
+ * @param groupName the name of the group
+ * @return a group if it is found. null if not found.
+ */
+ public Group getGroup(String groupName) {
+ return groups.get(groupName.toLowerCase());
+ }
+
+ /**
+ * Check if a group exists.
+ * Its the same of getGroup, but check if it is null.
+ * @param groupName the name of the group
+ * @return true if exists. false if not.
+ */
+ public boolean groupExists(String groupName) {
+ return groups.containsKey(groupName.toLowerCase());
+ }
+
+ /**
+ * Add a group to the list
+ * @param groupToAdd
+ */
+ public void addGroup(Group groupToAdd) {
+ if (groupToAdd.getDataSource() != this) {
+ groupToAdd = groupToAdd.clone(this);
+ }
+ removeGroup(groupToAdd.getName());
+ groups.put(groupToAdd.getName().toLowerCase(), groupToAdd);
+ haveGroupsChanged = true;
+ }
+
+ /**
+ * Remove the group to the list
+ * @param groupName
+ * @return true if had something to remove. false the group was default or non-existant
+ */
+ public boolean removeGroup(String groupName) {
+ if (defaultGroup != null && groupName.equalsIgnoreCase(defaultGroup.getName())) {
+ return false;
+ }
+ if (groups.containsKey(groupName.toLowerCase())) {
+ groups.remove(groupName.toLowerCase());
+ haveGroupsChanged = true;
+ return true;
+ }
+ return false;
+
+ }
+
+ /**
+ * Creates a new User with the given name
+ * and adds it to this holder.
+ * @param userName the username you want
+ * @return null if user already exists. or new User
+ */
+ public User createUser(String userName) {
+ if (this.users.containsKey(userName.toLowerCase())) {
+ return null;
+ }
+ User newUser = new User(this, userName);
+ newUser.setGroup(defaultGroup);
+ this.addUser(newUser);
+ haveUsersChanged = true;
+ return newUser;
+ }
+
+ /**
+ * Creates a new Group with the given name
+ * and adds it to this holder
+ * @param groupName the groupname you want
+ * @return null if group already exists. or new Group
+ */
+ public Group createGroup(String groupName) {
+ if (this.groups.containsKey(groupName.toLowerCase())) {
+ return null;
+ }
+ Group newGroup = new Group(this, groupName);
+ this.addGroup(newGroup);
+ haveGroupsChanged = true;
+ return newGroup;
+ }
+
+ /**
+ *
+ * @return a collection of the groups
+ */
+ public Collection<Group> getGroupList() {
+ return groups.values();
+ }
+
+ /**
+ *
+ * @return a collection of the users
+ */
+ public Collection<User> getUserList() {
+ return users.values();
+ }
+
+ /**
+ * reads the file again
+ */
+ public void reload() {
+ try {
+ WorldDataHolder ph = load(this.getName(), getGroupsFile(), getUsersFile());
+ this.defaultGroup = ph.defaultGroup;
+ this.groups = ph.groups;
+ this.users = ph.users;
+ } catch (Exception ex) {
+ Logger.getLogger(WorldDataHolder.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ /**
+ * Save by yourself!
+ * @deprecated
+ */
+ @Deprecated
+ public void commit() {
+ writeGroups(this, getGroupsFile());
+ writeUsers(this, getUsersFile());
+ }
+
+ /**
+ * Returns a data holder for the given file
+ * @param worldName
+ * @param file
+ * @return
+ * @throws Exception
+ * @deprecated
+ */
+ @Deprecated
+ public static WorldDataHolder load(String worldName, File file) throws Exception {
+ WorldDataHolder ph = new WorldDataHolder(worldName);
+ ph.f = file;
+ final Yaml yaml = new Yaml(new SafeConstructor());
+ Map<String, Object> rootDataNode;
+ if (!file.exists()) {
+ throw new Exception("The file which should contain permissions does not exist!\n" + file.getPath());
+ }
+ FileInputStream rx = new FileInputStream(file);
+ try {
+ rootDataNode = (Map<String, Object>) yaml.load(new UnicodeReader(rx));
+ if (rootDataNode == null) {
+ throw new NullPointerException();
+ }
+ } catch (Exception ex) {
+ throw new Exception("The following file couldn't pass on Parser.\n" + file.getPath(), ex);
+ } finally {
+ rx.close();
+ }
+ Map<String, List<String>> inheritance = new HashMap<String, List<String>>();
+ try {
+ Map<String, Object> allGroupsNode = (Map<String, Object>) rootDataNode.get("groups");
+ for (String groupKey : allGroupsNode.keySet()) {
+ Map<String, Object> thisGroupNode = (Map<String, Object>) allGroupsNode.get(groupKey);
+ Group thisGrp = ph.createGroup(groupKey);
+ if (thisGrp == null) {
+ throw new IllegalArgumentException("I think this user was declared more than once: " + groupKey);
+ }
+ if (thisGroupNode.get("default") == null) {
+ thisGroupNode.put("default", false);
+ }
+ if ((Boolean.parseBoolean(thisGroupNode.get("default").toString()))) {
+ if (ph.getDefaultGroup() != null) {
+ GroupManager.logger.warning("The group " + thisGrp.getName() + " is declaring be default where" + ph.getDefaultGroup().getName() + " already was.");
+ GroupManager.logger.warning("Overriding first request.");
+ }
+ ph.setDefaultGroup(thisGrp);
+ }
+
+ //PERMISSIONS NODE
+ if (thisGroupNode.get("permissions") == null) {
+ thisGroupNode.put("permissions", new ArrayList<String>());
+ }
+ if (thisGroupNode.get("permissions") instanceof List) {
+ for (Object o : ((List) thisGroupNode.get("permissions"))) {
+ thisGrp.addPermission(o.toString());
+ }
+ } else if (thisGroupNode.get("permissions") instanceof String) {
+ thisGrp.addPermission((String) thisGroupNode.get("permissions"));
+ } else {
+ throw new IllegalArgumentException("Unknown type of permissions node(Should be String or List<String>): " + thisGroupNode.get("permissions").getClass().getName());
+ }
+
+ //INFO NODE
+ Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
+ if (infoNode != null) {
+ thisGrp.setVariables(infoNode);
+ }
+
+ //END INFO NODE
+
+ Object inheritNode = thisGroupNode.get("inheritance");
+ if (inheritNode == null) {
+ thisGroupNode.put("inheritance", new ArrayList<String>());
+ } else if (inheritNode instanceof List) {
+ List<String> groupsInh = (List<String>) inheritNode;
+ for (String grp : groupsInh) {
+ if (inheritance.get(groupKey) == null) {
+ List<String> thisInherits = new ArrayList<String>();
+ inheritance.put(groupKey, thisInherits);
+ }
+ inheritance.get(groupKey).add(grp);
+
+ }
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ throw new Exception("Your Permissions config file is invalid. See console for details.");
+ }
+ if (ph.defaultGroup == null) {
+ throw new IllegalArgumentException("There was no Default Group declared.");
+ }
+ for (String groupKey : inheritance.keySet()) {
+ List<String> inheritedList = inheritance.get(groupKey);
+ Group thisGroup = ph.getGroup(groupKey);
+ for (String inheritedKey : inheritedList) {
+ Group inheritedGroup = ph.getGroup(inheritedKey);
+ if (thisGroup != null && inheritedGroup != null) {
+ thisGroup.addInherits(inheritedGroup);
+ }
+ }
+ }
+ // Process USERS
+ Map<String, Object> allUsersNode = (Map<String, Object>) rootDataNode.get("users");
+ for (String usersKey : allUsersNode.keySet()) {
+ Map<String, Object> thisUserNode = (Map<String, Object>) allUsersNode.get(usersKey);
+ User thisUser = ph.createUser(usersKey);
+ if (thisUser == null) {
+ throw new IllegalArgumentException("I think this user was declared more than once: " + usersKey);
+ }
+ if (thisUserNode.get("permissions") == null) {
+ thisUserNode.put("permissions", new ArrayList<String>());
+ }
+ if (thisUserNode.get("permissions") instanceof List) {
+ for (Object o : ((List) thisUserNode.get("permissions"))) {
+ thisUser.addPermission(o.toString());
+ }
+ } else if (thisUserNode.get("permissions") instanceof String) {
+ thisUser.addPermission(thisUserNode.get("permissions").toString());
+ }
+
+
+ //USER INFO NODE - BETA
+
+ //INFO NODE
+ Map<String, Object> infoNode = (Map<String, Object>) thisUserNode.get("info");
+ if (infoNode != null) {
+ thisUser.setVariables(infoNode);
+ }
+ //END INFO NODE - BETA
+
+ if (thisUserNode.get("group") != null) {
+ Group hisGroup = ph.getGroup(thisUserNode.get("group").toString());
+ if (hisGroup == null) {
+ throw new IllegalArgumentException("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName());
+ }
+ thisUser.setGroup(hisGroup);
+ } else {
+ thisUser.setGroup(ph.defaultGroup);
+ }
+ }
+ return ph;
+ }
+
+ /**
+ * Returns a data holder for the given file
+ * @param worldName
+ * @param groupsFile
+ * @param usersFile
+ * @return
+ * @throws FileNotFoundException
+ * @throws IOException
+ */
+ public static WorldDataHolder load(String worldName, File groupsFile, File usersFile) throws FileNotFoundException, IOException {
+ WorldDataHolder ph = new WorldDataHolder(worldName);
+ ph.groupsFile = groupsFile;
+ ph.usersFile = usersFile;
+
+
+ //READ GROUPS FILE
+ Yaml yamlGroups = new Yaml(new SafeConstructor());
+ Map<String, Object> groupsRootDataNode;
+ if (!groupsFile.exists()) {
+ throw new IllegalArgumentException("The file which should contain permissions does not exist!\n" + groupsFile.getPath());
+ }
+ FileInputStream groupsInputStream = new FileInputStream(groupsFile);
+ try {
+ groupsRootDataNode = (Map<String, Object>) yamlGroups.load(new UnicodeReader(groupsInputStream));
+ if (groupsRootDataNode == null) {
+ throw new NullPointerException();
+ }
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + groupsFile.getPath(), ex);
+ } finally {
+ groupsInputStream.close();
+ }
+
+ //PROCESS GROUPS FILE
+ Map<String, List<String>> inheritance = new HashMap<String, List<String>>();
+ try {
+ Map<String, Object> allGroupsNode = (Map<String, Object>) groupsRootDataNode.get("groups");
+ for (String groupKey : allGroupsNode.keySet()) {
+ Map<String, Object> thisGroupNode = (Map<String, Object>) allGroupsNode.get(groupKey);
+ Group thisGrp = ph.createGroup(groupKey);
+ if (thisGrp == null) {
+ throw new IllegalArgumentException("I think this user was declared more than once: " + groupKey);
+ }
+ if (thisGroupNode.get("default") == null) {
+ thisGroupNode.put("default", false);
+ }
+ if ((Boolean.parseBoolean(thisGroupNode.get("default").toString()))) {
+ if (ph.getDefaultGroup() != null) {
+ GroupManager.logger.warning("The group " + thisGrp.getName() + " is declaring be default where" + ph.getDefaultGroup().getName() + " already was.");
+ GroupManager.logger.warning("Overriding first request.");
+ }
+ ph.setDefaultGroup(thisGrp);
+ }
+
+ //PERMISSIONS NODE
+ if (thisGroupNode.get("permissions") == null) {
+ thisGroupNode.put("permissions", new ArrayList<String>());
+ }
+ if (thisGroupNode.get("permissions") instanceof List) {
+ for (Object o : ((List) thisGroupNode.get("permissions"))) {
+ thisGrp.addPermission(o.toString());
+ }
+ } else if (thisGroupNode.get("permissions") instanceof String) {
+ thisGrp.addPermission((String) thisGroupNode.get("permissions"));
+ } else {
+ throw new IllegalArgumentException("Unknown type of permissions node(Should be String or List<String>): " + thisGroupNode.get("permissions").getClass().getName());
+ }
+
+ //INFO NODE
+ Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
+ if (infoNode != null) {
+ thisGrp.setVariables(infoNode);
+ }
+
+ //END INFO NODE
+
+ Object inheritNode = thisGroupNode.get("inheritance");
+ if (inheritNode == null) {
+ thisGroupNode.put("inheritance", new ArrayList<String>());
+ } else if (inheritNode instanceof List) {
+ List<String> groupsInh = (List<String>) inheritNode;
+ for (String grp : groupsInh) {
+ if (inheritance.get(groupKey) == null) {
+ List<String> thisInherits = new ArrayList<String>();
+ inheritance.put(groupKey, thisInherits);
+ }
+ inheritance.get(groupKey).add(grp);
+
+ }
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ throw new IllegalArgumentException("Your Permissions config file is invalid. See console for details.");
+ }
+ if (ph.defaultGroup == null) {
+ throw new IllegalArgumentException("There was no Default Group declared.");
+ }
+ for (String groupKey : inheritance.keySet()) {
+ List<String> inheritedList = inheritance.get(groupKey);
+ Group thisGroup = ph.getGroup(groupKey);
+ for (String inheritedKey : inheritedList) {
+ Group inheritedGroup = ph.getGroup(inheritedKey);
+ if (thisGroup != null && inheritedGroup != null) {
+ thisGroup.addInherits(inheritedGroup);
+ }
+ }
+ }
+
+
+ //READ USERS FILE
+ Yaml yamlUsers = new Yaml(new SafeConstructor());
+ Map<String, Object> usersRootDataNode;
+ if (!groupsFile.exists()) {
+ throw new IllegalArgumentException("The file which should contain permissions does not exist!\n" + groupsFile.getPath());
+ }
+ FileInputStream usersInputStream = new FileInputStream(usersFile);
+ try {
+ usersRootDataNode = (Map<String, Object>) yamlUsers.load(new UnicodeReader(usersInputStream));
+ if (usersRootDataNode == null) {
+ throw new NullPointerException();
+ }
+ } catch (Exception ex) {
+ throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + groupsFile.getPath(), ex);
+ } finally {
+ usersInputStream.close();
+ }
+
+ // PROCESS USERS FILE
+ Map<String, Object> allUsersNode = (Map<String, Object>) usersRootDataNode.get("users");
+ for (String usersKey : allUsersNode.keySet()) {
+ Map<String, Object> thisUserNode = (Map<String, Object>) allUsersNode.get(usersKey);
+ User thisUser = ph.createUser(usersKey);
+ if (thisUser == null) {
+ throw new IllegalArgumentException("I think this user was declared more than once: " + usersKey);
+ }
+ if (thisUserNode.get("permissions") == null) {
+ thisUserNode.put("permissions", new ArrayList<String>());
+ }
+ if (thisUserNode.get("permissions") instanceof List) {
+ for (Object o : ((List) thisUserNode.get("permissions"))) {
+ thisUser.addPermission(o.toString());
+ }
+ } else if (thisUserNode.get("permissions") instanceof String) {
+ thisUser.addPermission(thisUserNode.get("permissions").toString());
+ }
+
+ //SUBGROUPS LOADING
+ if (thisUserNode.get("subgroups") == null) {
+ thisUserNode.put("subgroups", new ArrayList<String>());
+ }
+ if (thisUserNode.get("subgroups") instanceof List) {
+ for (Object o : ((List) thisUserNode.get("subgroups"))) {
+ Group subGrp = ph.getGroup(o.toString());
+ if (subGrp != null) {
+ thisUser.addSubGroup(subGrp);
+ } else {
+ GroupManager.logger.warning("Subgroup " + o.toString() + " not found for user " + thisUser.getName() + ". Ignoring entry.");
+ }
+ }
+ } else if (thisUserNode.get("subgroups") instanceof String) {
+ Group subGrp = ph.getGroup(thisUserNode.get("subgroups").toString());
+ if (subGrp != null) {
+ thisUser.addSubGroup(subGrp);
+ } else {
+ GroupManager.logger.warning("Subgroup " + thisUserNode.get("subgroups").toString() + " not found for user " + thisUser.getName() + ". Ignoring entry.");
+ }
+ }
+
+
+ //USER INFO NODE - BETA
+
+ //INFO NODE
+ Map<String, Object> infoNode = (Map<String, Object>) thisUserNode.get("info");
+ if (infoNode != null) {
+ thisUser.setVariables(infoNode);
+ }
+ //END INFO NODE - BETA
+
+ if (thisUserNode.get("group") != null) {
+ Group hisGroup = ph.getGroup(thisUserNode.get("group").toString());
+ if (hisGroup == null) {
+ throw new IllegalArgumentException("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName());
+ }
+ thisUser.setGroup(hisGroup);
+ } else {
+ thisUser.setGroup(ph.defaultGroup);
+ }
+ }
+ return ph;
+ }
+
+ /**
+ * Write a dataHolder in a specified file
+ * @param ph
+ * @param file
+ * @deprecated
+ */
+ @Deprecated
+ public static void write(WorldDataHolder ph, File file) {
+ Map<String, Object> root = new HashMap<String, Object>();
+
+ Map<String, Object> pluginMap = new HashMap<String, Object>();
+ root.put("plugin", pluginMap);
+
+ Map<String, Object> permissionsMap = new HashMap<String, Object>();
+ pluginMap.put("permissions", permissionsMap);
+
+ permissionsMap.put("system", "default");
+
+ Map<String, Object> groupsMap = new HashMap<String, Object>();
+ root.put("groups", groupsMap);
+ for (String groupKey : ph.groups.keySet()) {
+ Group group = ph.groups.get(groupKey);
+
+ Map<String, Object> aGroupMap = new HashMap<String, Object>();
+ groupsMap.put(group.getName(), aGroupMap);
+
+ aGroupMap.put("default", group.equals(ph.defaultGroup));
+
+ Map<String, Object> infoMap = new HashMap<String, Object>();
+ aGroupMap.put("info", infoMap);
+
+ for (String infoKey : group.getVariables().getVarKeyList()) {
+ infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
+ }
+
+ aGroupMap.put("inheritance", group.getInherits());
+
+ aGroupMap.put("permissions", group.getPermissionList());
+ }
+
+ Map<String, Object> usersMap = new HashMap<String, Object>();
+ root.put("users", usersMap);
+ for (String userKey : ph.users.keySet()) {
+ User user = ph.users.get(userKey);
+ if ((user.getGroup() == null || user.getGroup().equals(ph.defaultGroup)) && user.getPermissionList().isEmpty()) {
+ continue;
+ }
+
+ Map<String, Object> aUserMap = new HashMap<String, Object>();
+ usersMap.put(user.getName(), aUserMap);
+
+ if (user.getGroup() == null) {
+ aUserMap.put("group", ph.defaultGroup.getName());
+ } else {
+ aUserMap.put("group", user.getGroup().getName());
+ }
+ //USER INFO NODE - BETA
+ if (user.getVariables().getSize() > 0) {
+ Map<String, Object> infoMap = new HashMap<String, Object>();
+ aUserMap.put("info", infoMap);
+
+ for (String infoKey : user.getVariables().getVarKeyList()) {
+ infoMap.put(infoKey, user.getVariables().getVarObject(infoKey));
+ }
+ }
+ //END USER INFO NODE - BETA
+
+ aUserMap.put("permissions", user.getPermissionList());
+ }
+ DumperOptions opt = new DumperOptions();
+ opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+ final Yaml yaml = new Yaml(opt);
+
+ FileWriter tx = null;
+ try {
+ tx = new FileWriter(file, false);
+ tx.write(yaml.dump(root));
+ tx.flush();
+ } catch (Exception e) {
+ } finally {
+ try {
+ tx.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ /**
+ * Write a dataHolder in a specified file
+ * @param ph
+ * @param groupsFile
+ */
+ public static void writeGroups(WorldDataHolder ph, File groupsFile) {
+ Map<String, Object> root = new HashMap<String, Object>();
+
+ Map<String, Object> groupsMap = new HashMap<String, Object>();
+ root.put("groups", groupsMap);
+ for (String groupKey : ph.groups.keySet()) {
+ Group group = ph.groups.get(groupKey);
+
+ Map<String, Object> aGroupMap = new HashMap<String, Object>();
+ groupsMap.put(group.getName(), aGroupMap);
+
+ if (ph.defaultGroup == null) {
+ GroupManager.logger.severe("There is no default group for world: " + ph.getName());
+ }
+ aGroupMap.put("default", group.equals(ph.defaultGroup));
+
+ Map<String, Object> infoMap = new HashMap<String, Object>();
+ aGroupMap.put("info", infoMap);
+
+ for (String infoKey : group.getVariables().getVarKeyList()) {
+ infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
+ }
+
+ aGroupMap.put("inheritance", group.getInherits());
+
+ aGroupMap.put("permissions", group.getPermissionList());
+ }
+
+ DumperOptions opt = new DumperOptions();
+ opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+ final Yaml yaml = new Yaml(opt);
+
+ FileWriter tx = null;
+ try {
+ tx = new FileWriter(groupsFile, false);
+ tx.write(yaml.dump(root));
+ tx.flush();
+ } catch (Exception e) {
+ } finally {
+ try {
+ tx.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ /**
+ * Write a dataHolder in a specified file
+ * @param ph
+ * @param usersFile
+ */
+ public static void writeUsers(WorldDataHolder ph, File usersFile) {
+ Map<String, Object> root = new HashMap<String, Object>();
+
+ Map<String, Object> usersMap = new HashMap<String, Object>();
+ root.put("users", usersMap);
+ for (String userKey : ph.users.keySet()) {
+ User user = ph.users.get(userKey);
+ if ((user.getGroup() == null || user.getGroup().equals(ph.defaultGroup)) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) {
+ continue;
+ }
+
+ Map<String, Object> aUserMap = new HashMap<String, Object>();
+ usersMap.put(user.getName(), aUserMap);
+
+ if (user.getGroup() == null) {
+ aUserMap.put("group", ph.defaultGroup.getName());
+ } else {
+ aUserMap.put("group", user.getGroup().getName());
+ }
+ //USER INFO NODE - BETA
+ if (user.getVariables().getSize() > 0) {
+ Map<String, Object> infoMap = new HashMap<String, Object>();
+ aUserMap.put("info", infoMap);
+ for (String infoKey : user.getVariables().getVarKeyList()) {
+ infoMap.put(infoKey, user.getVariables().getVarObject(infoKey));
+ }
+ }
+ //END USER INFO NODE - BETA
+ aUserMap.put("permissions", user.getPermissionList());
+
+ //SUBGROUPS NODE - BETA
+ aUserMap.put("subgroups", user.subGroupListStringCopy());
+ //END SUBGROUPS NODE - BETA
+ }
+ DumperOptions opt = new DumperOptions();
+ opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+ final Yaml yaml = new Yaml(opt);
+
+ FileWriter tx = null;
+ try {
+ tx = new FileWriter(usersFile, false);
+ tx.write(yaml.dump(root));
+ tx.flush();
+ } catch (Exception e) {
+ } finally {
+ try {
+ tx.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ /**
+ * Don't use this. Unless you want to make this plugin to interact with original Nijikokun Permissions
+ * This method is supposed to make the original one reload the file, and propagate the changes made here.
+ *
+ * Prefer to use the AnjoCaido's fake version of Nijikokun's Permission plugin.
+ * The AnjoCaido's Permission can propagate the changes made on this plugin instantly,
+ * without need to save the file.
+ *
+ * @param server the server that holds the plugin
+ * @deprecated it is not used anymore... unless if you use original Permissions
+ */
+ @Deprecated
+ public static void reloadOldPlugins(Server server) {
+ // Only reload permissions
+ PluginManager pm = server.getPluginManager();
+ Plugin[] plugins = pm.getPlugins();
+ for (int i = 0; i < plugins.length; i++) {
+ plugins[i].getConfiguration().load();
+ try {
+ plugins[i].getClass().getMethod("setupPermissions").invoke(plugins[i]);
+ } catch (Exception ex) {
+ continue;
+ }
+ }
+ }
+
+ /**
+ * @return the permissionsHandler
+ */
+ public AnjoPermissionsHandler getPermissionsHandler() {
+ if (permissionsHandler == null) {
+ permissionsHandler = new AnjoPermissionsHandler(this);
+ }
+ return permissionsHandler;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public boolean haveUsersChanged() {
+ if (haveUsersChanged) {
+ return true;
+ }
+ for (User u : users.values()) {
+ if (u.isChanged()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public boolean haveGroupsChanged() {
+ if (haveGroupsChanged) {
+ return true;
+ }
+ for (Group g : groups.values()) {
+ if (g.isChanged()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ *
+ */
+ public void removeUsersChangedFlag() {
+ haveUsersChanged = false;
+ for (User u : users.values()) {
+ u.flagAsSaved();
+ }
+ }
+
+ /**
+ *
+ */
+ public void removeGroupsChangedFlag() {
+ haveGroupsChanged = false;
+ for (Group g : groups.values()) {
+ g.flagAsSaved();
+ }
+ }
+
+ /**
+ * @return the usersFile
+ */
+ public File getUsersFile() {
+ return usersFile;
+ }
+
+ /**
+ * @return the groupsFile
+ */
+ public File getGroupsFile() {
+ return groupsFile;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
new file mode 100644
index 000000000..83073c10b
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
@@ -0,0 +1,423 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.dataholder.worlds;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.anjocaido.groupmanager.GroupManager;
+import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
+import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
+import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler;
+import org.anjocaido.groupmanager.utils.Tasks;
+import org.bukkit.entity.Player;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class WorldsHolder {
+
+ /**
+ * Map with instances of loaded worlds.
+ */
+ private Map<String, OverloadedWorldHolder> worldsData = new HashMap<String, OverloadedWorldHolder>();
+ /**
+ * Map of mirrors: <nonExistingWorldName, existingAndLoadedWorldName>
+ * The key is the mirror.
+ * The object is the mirrored.
+ *
+ * Mirror shows the same data of mirrored.
+ */
+ private Map<String, String> mirrors = new HashMap<String, String>();
+ private OverloadedWorldHolder defaultWorld;
+ private String serverDefaultWorldName;
+ private GroupManager plugin;
+ private File worldsFolder;
+
+ /**
+ *
+ * @param plugin
+ */
+ public WorldsHolder(GroupManager plugin) {
+ this.plugin = plugin;
+ verifyFirstRun();
+ initialLoad();
+ if (defaultWorld == null) {
+ throw new IllegalStateException("There is no default group! OMG!");
+ }
+ }
+
+ private void initialLoad() {
+ initialWorldLoading();
+ mirrorSetUp();
+ }
+ private void initialWorldLoading(){
+ //LOAD EVERY WORLD POSSIBLE
+ loadWorld(serverDefaultWorldName);
+ defaultWorld = worldsData.get(serverDefaultWorldName);
+
+ for (File folder : worldsFolder.listFiles()) {
+ if (folder.getName().equalsIgnoreCase(serverDefaultWorldName)) {
+ continue;
+ }
+ if (folder.isDirectory()) {
+ loadWorld(folder.getName());
+ }
+ }
+ }
+ public void mirrorSetUp(){
+ mirrors.clear();
+ Map<String, Object> mirrorsMap = plugin.getConfig().getMirrorsMap();
+ if (mirrorsMap != null) {
+ for (String source : mirrorsMap.keySet()) {
+ if (mirrorsMap.get(source) instanceof ArrayList) {
+ ArrayList mirrorList = (ArrayList) mirrorsMap.get(source);
+ for (Object o : mirrorList) {
+ try {
+ mirrors.remove(o.toString().toLowerCase());
+ } catch (Exception e) {
+ }
+ mirrors.put(o.toString().toLowerCase(), getWorldData(source).getName());
+ }
+ } else if (mirrorsMap.get(source) instanceof Object) {
+ String aMirror = mirrorsMap.get(source).toString();
+ mirrors.put(aMirror.toLowerCase(), getWorldData(source).getName());
+ }
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ public void reloadAll() {
+ ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>();
+ for (WorldDataHolder w : worldsData.values()) {
+ if (alreadyDone.contains(w)) {
+ continue;
+ }
+ w.reload();
+ alreadyDone.add(w);
+ }
+ }
+
+ /**
+ *
+ * @param worldName
+ */
+ public void reloadWorld(String worldName) {
+ getWorldData(worldName).reload();
+ }
+
+ /**
+ *
+ */
+ public void saveChanges() {
+ ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>();
+ for (OverloadedWorldHolder w : worldsData.values()) {
+ if (alreadyDone.contains(w)) {
+ continue;
+ }
+ Tasks.removeOldFiles(plugin.getBackupFolder());
+ if (w == null) {
+ GroupManager.logger.severe("WHAT HAPPENED?");
+ continue;
+ }
+ if (w.haveGroupsChanged()) {
+ String groupsFolderName = w.getGroupsFile().getParentFile().getName();
+ File backupGroups = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_g_" + Tasks.getDateString() + ".yml");
+ try {
+ Tasks.copy(w.getGroupsFile(), backupGroups);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ WorldDataHolder.writeGroups(w, w.getGroupsFile());
+ w.removeGroupsChangedFlag();
+ }
+ if (w.haveUsersChanged()) {
+ File backupUsers = new File(plugin.getBackupFolder(), "bkp_" + w.getName() + "_u_" + Tasks.getDateString() + ".yml");
+ try {
+ Tasks.copy(w.getUsersFile(), backupUsers);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ WorldDataHolder.writeUsers(w, w.getUsersFile());
+ w.removeUsersChangedFlag();
+ }
+ alreadyDone.add(w);
+ }
+ }
+
+ /**
+ * Returns the dataHolder for the given world.
+ * If the world is not on the worlds list, returns the default world
+ * holder.
+ *
+ * (WHEN A WORLD IS CONFIGURED TO MIRROR, IT WILL BE ON THE LIST, BUT
+ * POINTING TO ANOTHER WORLD HOLDER)
+ *
+ * Mirrors prevails original data.
+ *
+ * @param worldName
+ * @return
+ */
+ public OverloadedWorldHolder getWorldData(String worldName) {
+ OverloadedWorldHolder data = worldsData.get(worldName.toLowerCase());
+ if (mirrors.containsKey(worldName.toLowerCase())) {
+ String realOne = mirrors.get(worldName.toLowerCase());
+ data = worldsData.get(realOne.toLowerCase());
+ }
+ if (data == null) {
+ GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world...");
+ data = getDefaultWorld();
+ }
+ return data;
+ }
+
+ /**
+ * Do a matching of playerName, if it s found only one player, do
+ * getWorldData(player)
+ * @param playerName
+ * @return null if matching returned no player, or more than one.
+ */
+ public OverloadedWorldHolder getWorldDataByPlayerName(String playerName) {
+ List<Player> matchPlayer = plugin.getServer().matchPlayer(playerName);
+ if (matchPlayer.size() == 1) {
+ return getWorldData(matchPlayer.get(0));
+ }
+ return null;
+ }
+
+ /**
+ * Retrieves the field p.getWorld().getName() and do
+ * getWorld(worldName)
+ * @param p
+ * @return
+ */
+ public OverloadedWorldHolder getWorldData(Player p) {
+ return getWorldData(p.getWorld().getName());
+ }
+
+ /**
+ * It does getWorld(worldName).getPermissionsHandler()
+ * @param worldName
+ * @return
+ */
+ public AnjoPermissionsHandler getWorldPermissions(String worldName) {
+ return getWorldData(worldName).getPermissionsHandler();
+ }
+
+ /**
+ *It does getWorldData(p).getPermission
+ * @param p
+ * @return
+ */
+ public AnjoPermissionsHandler getWorldPermissions(Player p) {
+ return getWorldData(p).getPermissionsHandler();
+ }
+
+ /**
+ * Id does getWorldDataByPlayerName(playerName).
+ * If it doesnt return null, it will return result.getPermissionsHandler()
+ * @param playerName
+ * @return null if the player matching gone wrong.
+ */
+ public AnjoPermissionsHandler getWorldPermissionsByPlayerName(String playerName) {
+ WorldDataHolder dh = getWorldDataByPlayerName(playerName);
+ if (dh != null) {
+ return dh.getPermissionsHandler();
+ }
+ return null;
+ }
+
+ private void verifyFirstRun() {
+ worldsFolder = new File(plugin.getDataFolder(), "worlds");
+ if (!worldsFolder.exists()) {
+ worldsFolder.mkdirs();
+ }
+ Properties server = new Properties();
+ try {
+ server.load(new FileInputStream(new File("server.properties")));
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ serverDefaultWorldName = server.getProperty("level-name").toLowerCase();
+ File defaultWorldFolder = new File(worldsFolder, serverDefaultWorldName);
+ if (!defaultWorldFolder.exists()) {
+ defaultWorldFolder.mkdirs();
+ }
+ if (defaultWorldFolder.exists()) {
+ File groupsFile = new File(defaultWorldFolder, "groups.yml");
+ File usersFile = new File(defaultWorldFolder, "users.yml");
+ File oldDataFile = new File(plugin.getDataFolder(), "data.yml");
+ if (!groupsFile.exists()) {
+ if (oldDataFile.exists()) {
+ try {
+ Tasks.copy(oldDataFile, groupsFile);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ } else {
+ InputStream template = plugin.getResourceAsStream("groups.yml");
+ try {
+ Tasks.copy(template, groupsFile);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ if (!usersFile.exists()) {
+ if (oldDataFile.exists()) {
+ try {
+ Tasks.copy(oldDataFile, usersFile);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ } else {
+ InputStream template = plugin.getResourceAsStream("users.yml");
+ try {
+ Tasks.copy(template, usersFile);
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ try {
+ if (oldDataFile.exists()) {
+ oldDataFile.renameTo(new File(plugin.getDataFolder(), "NOT_USED_ANYMORE_data.yml"));
+ }
+ } catch (Exception ex) {
+ }
+ }
+ }
+
+ /**
+ * Copies the specified world data to another world
+ * @param fromWorld
+ * @param toWorld
+ * @return
+ */
+ public boolean cloneWorld(String fromWorld, String toWorld) {
+ File fromWorldFolder = new File(worldsFolder, fromWorld);
+ File toWorldFolder = new File(worldsFolder, toWorld);
+ if (toWorldFolder.exists() || !fromWorldFolder.exists()) {
+ return false;
+ }
+ File fromWorldGroups = new File(fromWorldFolder, "groups.yml");
+ File fromWorldUsers = new File(fromWorldFolder, "users.yml");
+ if (!fromWorldGroups.exists() || !fromWorldUsers.exists()) {
+ return false;
+ }
+ File toWorldGroups = new File(toWorldFolder, "groups.yml");
+ File toWorldUsers = new File(toWorldFolder, "users.yml");
+ toWorldFolder.mkdirs();
+ try {
+ Tasks.copy(fromWorldGroups, toWorldGroups);
+ Tasks.copy(fromWorldUsers, toWorldUsers);
+ } catch (IOException ex) {
+ Logger.getLogger(WorldsHolder.class.getName()).log(Level.SEVERE, null, ex);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Load a world from file.
+ * If it already been loaded, summon reload method from dataHolder.
+ * @param worldName
+ */
+ public void loadWorld(String worldName) {
+ if (worldsData.containsKey(worldName.toLowerCase())) {
+ worldsData.get(worldName.toLowerCase()).reload();
+ return;
+ }
+ GroupManager.logger.finest("Trying to load world " + worldName + "...");
+ File thisWorldFolder = new File(worldsFolder, worldName);
+ if (thisWorldFolder.exists() && thisWorldFolder.isDirectory()) {
+ File groupsFile = new File(thisWorldFolder, "groups.yml");
+ File usersFile = new File(thisWorldFolder, "users.yml");
+ if (!groupsFile.exists()) {
+ throw new IllegalArgumentException("Groups file for world '" + worldName + "' doesnt exist: " + groupsFile.getPath());
+ }
+ if (!usersFile.exists()) {
+ throw new IllegalArgumentException("Users file for world '" + worldName + "' doesnt exist: " + usersFile.getPath());
+ }
+ try {
+ OverloadedWorldHolder thisWorldData = new OverloadedWorldHolder(WorldDataHolder.load(worldName, groupsFile, usersFile));
+ if (thisWorldData != null) {
+ GroupManager.logger.finest("Successful load of world " + worldName + "...");
+ worldsData.put(worldName.toLowerCase(), thisWorldData);
+ return;
+ }
+ } catch (FileNotFoundException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ return;
+ } catch (IOException ex) {
+ GroupManager.logger.log(Level.SEVERE, null, ex);
+ return;
+ }
+ GroupManager.logger.severe("Failed to load world " + worldName + "...");
+ }
+ }
+
+ /**
+ * Tells if the such world has been mapped.
+ *
+ * It will return true if world is a mirror.
+ *
+ * @param worldName
+ * @return true if world is loaded or mirrored. false if not listed
+ */
+ public boolean isInList(String worldName) {
+ if (worldsData.containsKey(worldName.toLowerCase()) || mirrors.containsKey(worldName.toLowerCase())) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Verify if world has it's own file permissions.
+ *
+ * @param worldName
+ * @return true if it has its own holder. false if not.
+ */
+ public boolean hasOwnData(String worldName) {
+ if (worldsData.containsKey(worldName.toLowerCase())) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @return the defaultWorld
+ */
+ public OverloadedWorldHolder getDefaultWorld() {
+ return defaultWorld;
+ }
+
+ /**
+ * Returns all physically loaded worlds.
+ * @return
+ */
+ public ArrayList<OverloadedWorldHolder> allWorldsDataList() {
+ ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>();
+ for (OverloadedWorldHolder data : worldsData.values()) {
+ if (!list.contains(data)) {
+ list.add(data);
+ }
+ }
+ return list;
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java
new file mode 100644
index 000000000..ca223da81
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java
@@ -0,0 +1,856 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.permissions;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.StringTokenizer;
+import org.anjocaido.groupmanager.GroupManager;
+import org.anjocaido.groupmanager.data.Group;
+import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
+import org.anjocaido.groupmanager.data.User;
+import org.anjocaido.groupmanager.utils.PermissionCheckResult;
+import org.bukkit.entity.Player;
+
+/**
+ * Everything here maintains the model created by Nijikokun
+ *
+ * But implemented to use GroupManager system. Which provides instant changes,
+ * without file access.
+ *
+ * It holds permissions only for one single world.
+ *
+ * @author gabrielcouto
+ */
+public class AnjoPermissionsHandler extends PermissionsReaderInterface {
+
+ WorldDataHolder ph = null;
+
+ /**
+ * It needs a WorldDataHolder to work with.
+ * @param holder
+ */
+ public AnjoPermissionsHandler(WorldDataHolder holder) {
+ ph = holder;
+ }
+
+ /**
+ * A short name method, for permission method.
+ * @param player
+ * @param permission
+ * @return
+ */
+ @Override
+ public boolean has(Player player, String permission) {
+ return permission(player, permission);
+ }
+
+ /**
+ * Checks if a player can use that permission node.
+ * @param player
+ * @param permission
+ * @return
+ */
+ @Override
+ public boolean permission(Player player, String permission) {
+ return checkUserPermission(ph.getUser(player.getName()), permission);
+ }
+
+ /**
+ * Returns the name of the group of that player name.
+ * @param userName
+ * @return
+ */
+ @Override
+ public String getGroup(String userName) {
+ return ph.getUser(userName).getGroup().getName();
+ }
+
+ /**
+ * Verify if player is in suck group.
+ * It will check it's groups inheritance.
+ *
+ * So if you have a group Admin > Moderator
+ *
+ * And verify the player 'MyAdmin', which is Admin, it will return true for both
+ * Admin or Moderator groups.
+ *
+ * Mas if you haave a player 'MyModerator', which is Moderator,
+ * it will give false if you pass Admin in group parameter.
+ *
+ * @param name
+ * @param group
+ * @return
+ */
+ @Override
+ public boolean inGroup(String name, String group) {
+ if (hasGroupInInheritance(ph.getUser(name).getGroup(), group)) {
+ return true;
+ }
+ for (Group subGroup : ph.getUser(name).subGroupListCopy()) {
+ if (hasGroupInInheritance(subGroup, group)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the String prefix for the given group
+ * @param groupName
+ * @return empty string if found none.
+ */
+ @Override
+ public String getGroupPrefix(String groupName) {
+ Group g = ph.getGroup(groupName);
+ if (g == null) {
+ return null;
+ }
+ return g.getVariables().getVarString("prefix");
+ }
+
+ /**
+ * Return the suffix for the given group name
+ * @param groupName
+ * @return
+ */
+ @Override
+ public String getGroupSuffix(String groupName) {
+ Group g = ph.getGroup(groupName);
+ if (g == null) {
+ return null;
+ }
+ return g.getVariables().getVarString("suffix");
+ }
+
+ /**
+ *
+ * @param groupName
+ * @return
+ */
+ @Override
+ public boolean canGroupBuild(String groupName) {
+ Group g = ph.getGroup(groupName);
+ if (g == null) {
+ return false;
+ }
+ return g.getVariables().getVarBoolean("build");
+ }
+
+ /**
+ * It returns a string variable value, set in the INFO node of the group.
+ * It will harvest inheritance for value.
+ * @param groupName
+ * @param variable
+ * @return null if no group with that variable is found.
+ */
+ @Override
+ public String getGroupPermissionString(String groupName, String variable) {
+ Group start = ph.getGroup(groupName);
+ if (start == null) {
+ return null;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return null;
+ }
+ return result.getVariables().getVarString(variable);
+ }
+
+ /**
+ * It returns a Integer variable value
+ * It will harvest inheritance for value.
+ * @param groupName
+ * @param variable
+ * @return -1 if none found or not parseable.
+ */
+ @Override
+ public int getGroupPermissionInteger(String groupName, String variable) {
+ Group start = ph.getGroup(groupName);
+ if (start == null) {
+ return -1;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return -1;
+ }
+ return result.getVariables().getVarInteger(variable);
+ }
+
+ /**
+ * Returns a boolean for given variable in INFO node.
+ * It will harvest inheritance for value.
+ * @param group
+ * @param variable
+ * @return false if not found/not parseable.
+ */
+ @Override
+ public boolean getGroupPermissionBoolean(String group, String variable) {
+ Group start = ph.getGroup(group);
+ if (start == null) {
+ return false;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return false;
+ }
+ return result.getVariables().getVarBoolean(variable);
+ }
+
+ /**
+ * Returns a double value for the given variable name in INFO node.
+ * It will harvest inheritance for value.
+ * @param group
+ * @param variable
+ * @return -1 if not found / not parseable.
+ */
+ @Override
+ public double getGroupPermissionDouble(String group, String variable) {
+ Group start = ph.getGroup(group);
+ if (start == null) {
+ return -1;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return -1;
+ }
+ return result.getVariables().getVarDouble(variable);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * @param user
+ * @param variable
+ * @return
+ */
+ @Override
+ public String getUserPermissionString(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return "";
+ }
+ return auser.getVariables().getVarString(variable);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * @param user
+ * @param variable
+ * @return
+ */
+ @Override
+ public int getUserPermissionInteger(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return -1;
+ }
+ return auser.getVariables().getVarInteger(variable);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * @param user
+ * @param variable
+ * @return
+ */
+ @Override
+ public boolean getUserPermissionBoolean(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return false;
+ }
+ return auser.getVariables().getVarBoolean(variable);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * @param user
+ * @param variable
+ * @return
+ */
+ @Override
+ public double getUserPermissionDouble(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return -1;
+ }
+ return auser.getVariables().getVarDouble(variable);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * If not found, it will search for his Group variables.
+ * It will harvest the inheritance.
+ * @param user
+ * @param variable
+ * @return empty string if not found
+ */
+ @Override
+ public String getPermissionString(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return "";
+ }
+ if (auser.getVariables().hasVar(variable)) {
+ return auser.getVariables().getVarString(variable);
+ }
+ Group start = auser.getGroup();
+ if (start == null) {
+ return "";
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return "";
+ }
+ return result.getVariables().getVarString(variable);
+ //return getUserPermissionString(user, variable);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * If not found, it will search for his Group variables.
+ * It will harvest the inheritance.
+ * @param user
+ * @param variable
+ * @return -1 if not found
+ */
+ @Override
+ public int getPermissionInteger(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return -1;
+ }
+ if (auser.getVariables().hasVar(variable)) {
+ return auser.getVariables().getVarInteger(variable);
+ }
+ Group start = auser.getGroup();
+ if (start == null) {
+ return -1;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return -1;
+ }
+ return result.getVariables().getVarInteger(variable);
+ //return getUserPermissionInteger(string, string1);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * If not found, it will search for his Group variables.
+ * It will harvest the inheritance.
+ * @param user
+ * @param variable
+ * @return false if not found or not parseable to true.
+ */
+ @Override
+ public boolean getPermissionBoolean(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return false;
+ }
+ if (auser.getVariables().hasVar(variable)) {
+ return auser.getVariables().getVarBoolean(variable);
+ }
+ Group start = auser.getGroup();
+ if (start == null) {
+ return false;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return false;
+ }
+ return result.getVariables().getVarBoolean(variable);
+ //return getUserPermissionBoolean(user, string1);
+ }
+
+ /**
+ * Returns the variable value of the user, in INFO node.
+ * If not found, it will search for his Group variables.
+ * It will harvest the inheritance.
+ * @param user
+ * @param variable
+ * @return -1 if not found.
+ */
+ @Override
+ public double getPermissionDouble(String user, String variable) {
+ User auser = ph.getUser(user);
+ if (auser == null) {
+ return -1.0D;
+ }
+ if (auser.getVariables().hasVar(variable)) {
+ return auser.getVariables().getVarDouble(variable);
+ }
+ Group start = auser.getGroup();
+ if (start == null) {
+ return -1.0D;
+ }
+ Group result = nextGroupWithVariable(start, variable);
+ if (result == null) {
+ return -1.0D;
+ }
+ return result.getVariables().getVarDouble(variable);
+ //return getUserPermissionDouble(string, string1);
+ }
+
+ /**
+ * Does not include User's group permission
+ * @param user
+ * @param permission
+ * @return
+ */
+ public PermissionCheckResult checkUserOnlyPermission(User user, String permission) {
+ user.sortPermissions();
+ PermissionCheckResult result = new PermissionCheckResult();
+ result.askedPermission = permission;
+ result.owner = user;
+ for (String access : user.getPermissionList()) {
+ if (comparePermissionString(access, permission)) {
+ result.accessLevel = access;
+ if (access.startsWith("-")) {
+ result.resultType = PermissionCheckResult.Type.NEGATION;
+ } else if (access.startsWith("+")) {
+ result.resultType = PermissionCheckResult.Type.EXCEPTION;
+ } else {
+ result.resultType = PermissionCheckResult.Type.FOUND;
+ }
+ return result;
+ }
+ }
+ result.resultType = PermissionCheckResult.Type.NOTFOUND;
+ return result;
+ }
+
+ /**
+ * Returns the node responsible for that permission.
+ * Does not include User's group permission.
+ * @param group
+ * @param permission
+ * @return the node if permission is found. if not found, return null
+ */
+ public PermissionCheckResult checkGroupOnlyPermission(Group group, String permission) {
+ group.sortPermissions();
+ PermissionCheckResult result = new PermissionCheckResult();
+ result.owner = group;
+ result.askedPermission = permission;
+ for (String access : group.getPermissionList()) {
+ if (comparePermissionString(access, permission)) {
+ result.accessLevel = access;
+ if (access.startsWith("-")) {
+ result.resultType = PermissionCheckResult.Type.NEGATION;
+ } else if (access.startsWith("+")) {
+ result.resultType = PermissionCheckResult.Type.EXCEPTION;
+ } else {
+ result.resultType = PermissionCheckResult.Type.FOUND;
+ }
+ return result;
+ }
+ }
+ result.resultType = PermissionCheckResult.Type.NOTFOUND;
+ return result;
+ }
+
+ /**
+ * Check permissions, including it's group and inheritance.
+ * @param user
+ * @param permission
+ * @return true if permission was found. false if not, or was negated.
+ */
+ public boolean checkUserPermission(User user, String permission) {
+ PermissionCheckResult result = checkFullUserPermission(user, permission);
+ if (result.resultType.equals(PermissionCheckResult.Type.EXCEPTION)
+ || result.resultType.equals(PermissionCheckResult.Type.FOUND)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Do what checkUserPermission did before. But now returning a PermissionCheckResult.
+ * @param user
+ * @param targetPermission
+ * @return
+ */
+ public PermissionCheckResult checkFullUserPermission(User user, String targetPermission) {
+ PermissionCheckResult result = new PermissionCheckResult();
+ result.askedPermission = targetPermission;
+ result.resultType = PermissionCheckResult.Type.NOTFOUND;
+
+ if (user == null || targetPermission == null) {
+ return result;
+ }
+
+ PermissionCheckResult resultUser = checkUserOnlyPermission(user, targetPermission);
+ if (!resultUser.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ return resultUser;
+
+ }
+
+ //IT ONLY CHECKS GROUPS PERMISSIONS IF RESULT FOR USER IS NOT FOUND
+ PermissionCheckResult resultGroup = checkGroupPermissionWithInheritance(user.getGroup(), targetPermission);
+ if (!resultGroup.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ return resultGroup;
+ }
+
+ //SUBGROUPS CHECK
+ for (Group subGroup : user.subGroupListCopy()) {
+ PermissionCheckResult resultSubGroup = checkGroupPermissionWithInheritance(subGroup, targetPermission);
+ if (!resultSubGroup.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ return resultSubGroup;
+ }
+ }
+
+ //THEN IT RETURNS A NOT FOUND
+ return result;
+ }
+
+ /**
+ * Verifies if a given group has a variable. Including it's inheritance.
+ *
+ * it redirects to the other method now. This one was deprecated, and will
+ * be gone in a future release.
+ *
+ * @param start
+ * @param variable
+ * @param alreadyChecked
+ * @return returns the closest inherited group with the variable.
+ * @deprecated use now nextGroupWithVariable(Group start, String targetVariable)
+ */
+ @Deprecated
+ public Group nextGroupWithVariable(Group start, String variable, List<Group> alreadyChecked) {
+ return nextGroupWithVariable(start, variable);
+ }
+
+ /**
+ * Returns the next group, including inheritance, which contains that
+ * variable name.
+ *
+ * It does Breadth-first search
+ *
+ * @param start the starting group to look for
+ * @param targetVariable the variable name
+ * @return The group if found. Null if not.
+ */
+ public Group nextGroupWithVariable(Group start, String targetVariable) {
+ if (start == null || targetVariable == null) {
+ return null;
+ }
+ LinkedList<Group> stack = new LinkedList<Group>();
+ ArrayList<Group> alreadyVisited = new ArrayList<Group>();
+ stack.push(start);
+ alreadyVisited.add(start);
+ while (!stack.isEmpty()) {
+ Group now = stack.pop();
+ if (now.getVariables().hasVar(targetVariable)) {
+ return now;
+ }
+ for (String sonName : now.getInherits()) {
+ Group son = ph.getGroup(sonName);
+ if (son != null && !alreadyVisited.contains(son)) {
+ stack.push(son);
+ alreadyVisited.add(son);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Check if given group inherits another group.
+ *
+ * redirected to the other method. this is deprecated now. and will be gone
+ * in the future releases.
+ *
+ * @param start The group to start the search.
+ * @param askedGroup Name of the group you're looking for
+ * @param alreadyChecked groups to ignore(pass null on it, please)
+ * @return true if it inherits the group.
+ * @deprecated prefer using hasGroupInInheritance(Group start, String askedGroup)
+ */
+ @Deprecated
+ public boolean searchGroupInInheritance(Group start, String askedGroup, List<Group> alreadyChecked) {
+ return hasGroupInInheritance(start, askedGroup);
+ }
+
+ /**
+ * Check if given group inherits another group.
+ *
+ * It does Breadth-first search
+ *
+ * @param start The group to start the search.
+ * @param askedGroup Name of the group you're looking for
+ * @return true if it inherits the group.
+ */
+ public boolean hasGroupInInheritance(Group start, String askedGroup) {
+ if (start == null || askedGroup == null) {
+ return false;
+ }
+ LinkedList<Group> stack = new LinkedList<Group>();
+ ArrayList<Group> alreadyVisited = new ArrayList<Group>();
+ stack.push(start);
+ alreadyVisited.add(start);
+ while (!stack.isEmpty()) {
+ Group now = stack.pop();
+ if (now.getName().equalsIgnoreCase(askedGroup)) {
+ return true;
+ }
+ for (String sonName : now.getInherits()) {
+ Group son = ph.getGroup(sonName);
+ if (son != null && !alreadyVisited.contains(son)) {
+ stack.push(son);
+ alreadyVisited.add(son);
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check if the group has given permission. Including it's inheritance
+ * @param start
+ * @param permission
+ * @param alreadyChecked
+ * @return true if PermissionCheckResult is EXCEPTION or FOUND
+ * @deprecated use the other checkGroupPermissionWithInheritance for everything
+ */
+ @Deprecated
+ public boolean checkGroupPermissionWithInheritance(Group start, String permission, List<Group> alreadyChecked) {
+ PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
+ if (result.resultType.equals(result.resultType.EXCEPTION)
+ || result.resultType.equals(result.resultType.FOUND)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the result of permission check. Including inheritance.
+ * If found anything, the PermissionCheckResult that retuns will
+ * include the Group name, and the result type.
+ * Result types will be EXCEPTION, NEGATION, FOUND.
+ *
+ * If returned type NOTFOUND, the owner will be null,
+ * and ownerType too.
+ *
+ * It does Breadth-first search
+ *
+ * @param start
+ * @param targetPermission
+ * @return
+ */
+ public PermissionCheckResult checkGroupPermissionWithInheritance(Group start, String targetPermission) {
+ if (start == null || targetPermission == null) {
+ return null;
+ }
+ LinkedList<Group> stack = new LinkedList<Group>();
+ List<Group> alreadyVisited = new ArrayList<Group>();
+ stack.push(start);
+ alreadyVisited.add(start);
+ while (!stack.isEmpty()) {
+ Group now = stack.pop();
+ PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targetPermission);
+ if (!resultNow.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
+ return resultNow;
+ }
+ for (String sonName : now.getInherits()) {
+ Group son = ph.getGroup(sonName);
+ if (son != null && !alreadyVisited.contains(son)) {
+ stack.push(son);
+ alreadyVisited.add(son);
+ }
+ }
+ }
+ PermissionCheckResult result = new PermissionCheckResult();
+ result.askedPermission = targetPermission;
+ result.resultType = PermissionCheckResult.Type.NOTFOUND;
+ return result;
+ }
+
+ /**
+ * It uses checkGroupPermissionWithInheritance
+ * and cast the owner to Group type if result type was EXCEPTION or FOUND.
+ *
+ * @param start
+ * @param permission
+ * @param alreadyChecked
+ * @return the group that passed on test. null if no group passed.
+ * @deprecated use checkGroupPermissionWithInheritance for everything now.
+ */
+ @Deprecated
+ public Group nextGroupWithPermission(Group start, String permission, List<Group> alreadyChecked) {
+ PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
+ if (result.resultType.equals(result.resultType.EXCEPTION)
+ || result.resultType.equals(result.resultType.FOUND)) {
+ return (Group) checkGroupPermissionWithInheritance(start, permission).owner;
+ }
+ return null;
+ }
+
+ /**
+ * Return whole list of names of groups in a inheritance chain. Including a
+ * starting group.
+ *
+ * it now redirects to the other method. but get away from this one,
+ * it will disappear in a future release.
+ *
+ * @param start
+ * @param alreadyChecked
+ * @return the group that passed on test. null if no group passed.
+ * @deprecated use the other method with same name, instead
+ */
+ @Deprecated
+ public ArrayList<String> listAllGroupsInherited(Group start, ArrayList<String> alreadyChecked) {
+ return listAllGroupsInherited(start);
+ }
+
+ /**
+ * Return whole list of names of groups in a inheritance chain. Including a
+ * starting group.
+ *
+ * It does Breadth-first search. So closer groups will appear first in list.
+ *
+ * @param start
+ * @return the group that passed on test. null if no group passed.
+ */
+ public ArrayList<String> listAllGroupsInherited(Group start) {
+ if (start == null) {
+ return null;
+ }
+ LinkedList<Group> stack = new LinkedList<Group>();
+ ArrayList<String> alreadyVisited = new ArrayList<String>();
+ stack.push(start);
+ alreadyVisited.add(start.getName());
+ while (!stack.isEmpty()) {
+ Group now = stack.pop();
+ for (String sonName : now.getInherits()) {
+ Group son = ph.getGroup(sonName);
+ if (son != null && !alreadyVisited.contains(son.getName())) {
+ stack.push(son);
+ alreadyVisited.add(son.getName());
+ }
+ }
+ }
+ return alreadyVisited;
+ }
+
+ /**
+ * Compare a user permission like 'myplugin.*' against a full plugin
+ * permission name, like 'myplugin.dosomething'.
+ * As the example above, will return true.
+ *
+ * Please sort permissions before sending them here. So negative tokens
+ * get priority.
+ *
+ * You must test if it start with negative outside this method. It will
+ * only tell if the nodes are matching or not.
+ *
+ * Every '-' or '+' in the beginning is ignored. It will match only
+ * node names.
+ *
+ * @param userAcessLevel
+ * @param fullPermissionName
+ * @return true if found a matching token. false if not.
+ */
+ public boolean comparePermissionString(String userAcessLevel, String fullPermissionName) {
+ if (userAcessLevel == null || fullPermissionName == null) {
+ return false;
+ }
+ GroupManager.logger.finest("COMPARING " + userAcessLevel + " WITH " + fullPermissionName);
+
+ if (userAcessLevel.startsWith("+")) {
+ userAcessLevel = userAcessLevel.substring(1);
+ } else if (userAcessLevel.startsWith("-")) {
+ userAcessLevel = userAcessLevel.substring(1);
+ }
+
+ if (fullPermissionName.startsWith("+")) {
+ fullPermissionName = fullPermissionName.substring(1);
+ } else if (fullPermissionName.startsWith("-")) {
+ fullPermissionName = fullPermissionName.substring(1);
+ }
+
+
+ StringTokenizer levelATokenizer = new StringTokenizer(userAcessLevel, ".");
+ StringTokenizer levelBTokenizer = new StringTokenizer(fullPermissionName, ".");
+ while (levelATokenizer.hasMoreTokens() && levelBTokenizer.hasMoreTokens()) {
+ String levelA = levelATokenizer.nextToken();
+ String levelB = levelBTokenizer.nextToken();
+ GroupManager.logger.finest("ROUND " + levelA + " AGAINST " + levelB);
+ if (levelA.contains("*")) {
+ GroupManager.logger.finest("WIN");
+ return true;
+ }
+ if (levelA.equalsIgnoreCase(levelB)) {
+ if (!levelATokenizer.hasMoreTokens() && !levelBTokenizer.hasMoreTokens()) {
+ GroupManager.logger.finest("WIN");
+ return true;
+ }
+ GroupManager.logger.finest("NEXT");
+ continue;
+ } else {
+ GroupManager.logger.finest("FAIL");
+ return false;
+ }
+
+ }
+ GroupManager.logger.finest("FAIL");
+ return false;
+ }
+
+ /**
+ * Returns a list of all groups.
+ *
+ * Including subgroups.
+ * @param userName
+ * @return
+ */
+ public String[] getGroups(String userName) {
+ ArrayList<String> allGroups = listAllGroupsInherited(ph.getUser(userName).getGroup());
+ for(Group subg: ph.getUser(userName).subGroupListCopy()){
+ allGroups.addAll(listAllGroupsInherited(subg));
+ }
+ String[] arr = new String[allGroups.size()];
+ return allGroups.toArray(arr);
+ }
+
+ /**
+ * A Breadth-first search thru inheritance model.
+ *
+ * Just a model to copy and paste.
+ * This will guarantee the closer groups will be checked first.
+ * @param start
+ * @param targerPermission
+ * @return
+ */
+ private Group breadthFirstSearch(Group start, String targerPermission) {
+ if (start == null || targerPermission == null) {
+ return null;
+ }
+ LinkedList<Group> stack = new LinkedList<Group>();
+ ArrayList<Group> alreadyVisited = new ArrayList<Group>();
+ stack.push(start);
+ alreadyVisited.add(start);
+ while (!stack.isEmpty()) {
+ Group now = stack.pop();
+ PermissionCheckResult resultNow = checkGroupOnlyPermission(now, targerPermission);
+ if (resultNow.resultType.equals(PermissionCheckResult.Type.EXCEPTION)
+ || resultNow.resultType.equals(PermissionCheckResult.Type.FOUND)) {
+ return now;
+ }
+ if (resultNow.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
+ return null;
+ }
+ for (String sonName : now.getInherits()) {
+ Group son = ph.getGroup(sonName);
+ if (son != null && !alreadyVisited.contains(son)) {
+ stack.push(son);
+ alreadyVisited.add(son);
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java
new file mode 100644
index 000000000..90194cddd
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java
@@ -0,0 +1,163 @@
+package org.anjocaido.groupmanager.permissions;
+
+import org.bukkit.entity.Player;
+
+/**
+ * Made by Nijikokun. Changed by Gabriel Couto
+ *
+ * This class is intended to *read* permissions from a single world.
+ *
+ * @author Nijikokun
+ * @author Gabriel Couto
+ */
+public abstract class PermissionsReaderInterface {
+
+
+ /**
+ *
+ * @param player
+ * @param string
+ * @return
+ */
+ public abstract boolean has(Player player, String string);
+
+ /**
+ *
+ * @param player
+ * @param string
+ * @return
+ */
+ public abstract boolean permission(Player player, String string);
+
+ /**
+ *
+ * @param string
+ * @return
+ */
+ public abstract String getGroup(String string);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract boolean inGroup(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @return
+ */
+ public abstract String getGroupPrefix(String string);
+
+ /**
+ *
+ * @param string
+ * @return
+ */
+ public abstract String getGroupSuffix(String string);
+
+ /**
+ *
+ * @param string
+ * @return
+ */
+ public abstract boolean canGroupBuild(String string);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract String getGroupPermissionString(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract int getGroupPermissionInteger(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract boolean getGroupPermissionBoolean(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract double getGroupPermissionDouble(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract String getUserPermissionString(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract int getUserPermissionInteger(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract boolean getUserPermissionBoolean(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract double getUserPermissionDouble(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract String getPermissionString(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract int getPermissionInteger(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract boolean getPermissionBoolean(String string, String string1);
+
+ /**
+ *
+ * @param string
+ * @param string1
+ * @return
+ */
+ public abstract double getPermissionDouble(String string, String string1);
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GMLoggerHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GMLoggerHandler.java
new file mode 100644
index 000000000..87b6806ab
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GMLoggerHandler.java
@@ -0,0 +1,26 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.utils;
+
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class GMLoggerHandler extends ConsoleHandler {
+
+ @Override
+ public void publish(LogRecord record) {
+ String message = "GroupManager - " + record.getLevel() + " - " + record.getMessage();
+ if (record.getLevel().equals(Level.SEVERE) || record.getLevel().equals(Level.WARNING)) {
+ System.err.println(message);
+ } else {
+ System.out.println(message);
+ }
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java
new file mode 100644
index 000000000..781f2753c
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/GroupManagerPermissions.java
@@ -0,0 +1,51 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.utils;
+
+/**
+ * Just a list of commands for this plugin
+ * @author gabrielcouto
+ */
+public enum GroupManagerPermissions {
+ manuadd,
+ manudel,
+ manuaddsub,
+ manudelsub,
+ mangadd,
+ mangdel,
+ manuaddp,
+ manudelp,
+ manulistp,
+ manucheckp,
+ mangaddp,
+ mangdelp,
+ manglistp,
+ mangcheckp,
+ mangaddi,
+ mangdeli,
+ manuaddv,
+ manudelv,
+ manulistv,
+ manucheckv,
+ mangaddv,
+ mangdelv,
+ manglistv,
+ mangcheckv,
+ manwhois,
+ tempadd,
+ tempdel,
+ templist,
+ tempdelall,
+ mansave,
+ manload,
+ listgroups,
+ manpromote,
+ mandemote,
+ mantogglevalidate,
+ mantogglesave,
+ manworld,
+ manselect,
+ manclear
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/PermissionCheckResult.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/PermissionCheckResult.java
new file mode 100644
index 000000000..3ee6fdf30
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/PermissionCheckResult.java
@@ -0,0 +1,66 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.utils;
+
+import org.anjocaido.groupmanager.data.DataUnit;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class PermissionCheckResult {
+ /**
+ * It should be the owner of the access level found.
+ *
+ * Use instanceof to find the owner type
+ */
+ public DataUnit owner;
+ /**
+ * The permission node found in the DataUnit.
+ */
+ public String accessLevel;
+ /**
+ * The full name of the permission you are looking for
+ */
+ public String askedPermission;
+ /**
+ * The result conclusion of the search.
+ * It determines if the owner can do, or not.
+ *
+ * It even determines if it has an owner.
+ */
+ public Type resultType = Type.NOTFOUND;
+
+ /**
+ * The type of result the search can give.
+ */
+ public enum Type {
+
+ /**
+ * If found a matching node starting with '+'.
+ * It means the user CAN do the permission.
+ */
+ EXCEPTION,
+ /**
+ * If found a matching node starting with '-'.
+ * It means the user CANNOT do the permission.
+ */
+ NEGATION,
+ /**
+ * If just found a common matching node.
+ * IT means the user CAN do the permission.
+ */
+ FOUND,
+ /**
+ * If no matchin node was found.
+ * It means the user CANNOT do the permission.
+ *
+ * owner field and accessLevel field should not be considered,
+ * when type is
+ * NOTFOUND
+ */
+ NOTFOUND
+ }
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/StringPermissionComparator.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/StringPermissionComparator.java
new file mode 100644
index 000000000..2e192118d
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/StringPermissionComparator.java
@@ -0,0 +1,50 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.anjocaido.groupmanager.utils;
+
+import java.util.Comparator;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public class StringPermissionComparator implements Comparator<String> {
+
+ @Override
+ public int compare(String permA, String permB) {
+ boolean ap = permA.startsWith("+");
+ boolean bp = permB.startsWith("+");
+ boolean am = permA.startsWith("-");
+ boolean bm = permB.startsWith("-");
+ if(ap&&bp){
+ return 0;
+ }
+ if(ap&&!bp){
+ return -1;
+ }
+ if(!ap&&bp){
+ return 1;
+ }
+ if(am&&bm){
+ return 0;
+ }
+ if(am&&!bm){
+ return -1;
+ }
+ if(!am&&bm){
+ return 1;
+ }
+ return permA.compareToIgnoreCase(permB);
+ }
+ private static StringPermissionComparator instance;
+ public static StringPermissionComparator getInstance(){
+ if(instance==null){
+ instance = new StringPermissionComparator();
+ }
+ return instance;
+ }
+
+}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/Tasks.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/Tasks.java
new file mode 100644
index 000000000..64bdb6209
--- /dev/null
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/utils/Tasks.java
@@ -0,0 +1,111 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.anjocaido.groupmanager.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.List;
+import org.anjocaido.groupmanager.data.Group;
+
+/**
+ *
+ * @author gabrielcouto
+ */
+public abstract class Tasks {
+
+ public static void copy(InputStream src, File dst) throws IOException {
+ InputStream in = src;
+ OutputStream out = new FileOutputStream(dst);
+
+ // Transfer bytes from in to out
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+ out.close();
+ try {
+ in.close();
+ } catch (Exception e) {
+ }
+ }
+
+ public static void copy(File src, File dst) throws IOException {
+ InputStream in = new FileInputStream(src);
+ copy(in, dst);
+ }
+
+ public static void removeOldFiles(File folder) {
+ if (folder.isDirectory()) {
+ long oldTime = System.currentTimeMillis() - 86400000L;
+ for (File olds : folder.listFiles()) {
+ if (olds.isFile()) {
+ if (olds.lastModified() < oldTime) {
+ try {
+ olds.delete();
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public static String getDateString() {
+ GregorianCalendar now = new GregorianCalendar();
+ String date = "";
+ date += now.get(GregorianCalendar.DAY_OF_MONTH);
+ date += "-";
+ date += now.get(GregorianCalendar.HOUR);
+ date += "-";
+ date += now.get(GregorianCalendar.MINUTE);
+ return date;
+ }
+ public static String getStringListInString(List<String> list){
+ if(list==null){
+ return "";
+ }
+ String result="";
+ for(int i=0;i<list.size();i++){
+ result+=list.get(i);
+ if(i<list.size()-1){
+ result+=", ";
+ }
+ }
+ return result;
+ }
+ public static String getStringArrayInString(String[] list){
+ if(list==null){
+ return "";
+ }
+ String result="";
+ for(int i=0;i<list.length;i++){
+ result+=list[i];
+ if(i<((list.length)-1)){
+ result+=", ";
+ }
+ }
+ return result;
+ }
+ public static String getGroupListInString(List<Group> list){
+ if(list==null){
+ return "";
+ }
+ String result="";
+ for(int i=0;i<list.size();i++){
+ result+=list.get(i).getName();
+ if(i<list.size()-1){
+ result+=", ";
+ }
+ }
+ return result;
+ }
+}
diff --git a/EssentialsGroupManager/src/plugin.yml b/EssentialsGroupManager/src/plugin.yml
new file mode 100644
index 000000000..497f15edb
--- /dev/null
+++ b/EssentialsGroupManager/src/plugin.yml
@@ -0,0 +1,165 @@
+name: GroupManager
+version: 1.0(alpha-5)
+main: org.anjocaido.groupmanager.GroupManager
+website: http://www.anjocaido.info/
+description: Provides on-the-fly system for Permission system created by Nijikokun. But all in memory, and with flat-file saving schedule.
+authors:
+ - AnjoCaido
+ - Gabriel Couto
+commands:
+ manuadd:
+ description: Move a player to desired group.(Adds to the file if not exists)
+ usage: /<command> <player> <group>
+ permission: groupmanager.manuadd
+ manudel:
+ description: Remove any user specific configuration. Make him default group.
+ usage: /<command> <player>
+ permission: groupmanager.manudel
+ manuaddsub:
+ description: Add a group to a player's subgroup list.
+ usage: /<command> <player> <group>
+ permission: groupmanager.manuaddsub
+ manudelsub:
+ description: Remove a group to a player's subgroup list.
+ usage: /<command> <player> <group>
+ permission: groupmanager.manudelsub
+ mangadd:
+ description: Add group to the system.
+ usage: /<command> <group>
+ permission: groupmanager.mangadd
+ mangdel:
+ description: Removes group from the system(all it's users become default)
+ usage: /<command> <group>
+ permission: groupmanager.mangdel
+ manuaddp:
+ description: Add permission diretly to the player.
+ usage: /<command> <player> <permission>
+ permission: groupmanager.manuaddp
+ manudelp:
+ description: Removes permission diretly from the player.
+ usage: /<command> <player> <permission>
+ permission: groupmanager.manudelp
+ manulistp:
+ description: List all permissions from a player.
+ usage: /<command> <player>
+ permission: groupmanager.manulistp
+ manucheckp:
+ description: Verify if user has a permission, and where it comes from.
+ usage: /<command> <player> <permission>
+ permission: groupmanager.manucheckp
+ mangaddp:
+ description: Add permission to a group.
+ usage: /<command> <group> <permission>
+ permission: groupmanager.mangaddp
+ mangdelp:
+ description: Removes permission from a group.
+ usage: /<command> <group> <permission>
+ permission: groupmanager.mangdelp
+ manglistp:
+ description: Lists all permissions from a group.
+ usage: /<command> <group>
+ permission: groupmanager.manglistp
+ mangcheckp:
+ description: Check if group has a permission, and where it comes from.
+ usage: /<command> <group> <permission>
+ permission: groupmanager.mangcheckp
+ mangaddi:
+ description: Add a group to another group inheritance list.
+ usage: /<command> <group1> <group2>
+ permission: groupmanager.mangaddi
+ mangdeli:
+ description: Remove a group from another group inheritance list.
+ usage: /<command> <group1> <group2>
+ permission: groupmanager.mangdeli
+ manuaddv:
+ description: Add, or replaces, a variable to a user (like prefix or suffix).
+ usage: /<command> <user> <variable> <value>
+ permission: groupmanager.manuaddv
+ manudelv:
+ description: Remove a variable from a user.
+ usage: /<command> <user> <variable>
+ permission: groupmanager.manudelv
+ manulistv:
+ description: List variables a user has (like prefix or suffix).
+ usage: /<command> <user>
+ permission: groupmanager.manulistv
+ manucheckv:
+ description: Verify a value of a variable of user, and where it comes from.
+ usage: /<command> <user> <variable>
+ permission: groupmanager.manucheckv
+ mangaddv:
+ description: Add, or replaces, a variable to a group (like prefix or suffix).
+ usage: /<command> <group> <variable> <value>
+ permission: groupmanager.mangaddv
+ mangdelv:
+ description: Remove a variable from a group.
+ usage: /<command> <group> <variable>
+ permission: groupmanager.mangdelv
+ manglistv:
+ description: List variables a group has (like prefix or suffix).
+ usage: /<command> <group>
+ permission: groupmanager.manglistv
+ mangcheckv:
+ description: Verify a value of a variable of group, and where it comes from.
+ usage: /<command> <group> <variable>
+ permission: groupmanager.mangckeckv
+ manwhois:
+ description: Tell the group that user belongs.
+ usage: /<command> <player>
+ permission: groupmanager.manwhois
+ tempadd:
+ description: Creates a temporary permission copy for that user.
+ usage: /<command> <player>
+ permission: groupmanager.tempadd
+ tempdel:
+ description: Remove the temporary permission copy for player.
+ usage: /<command> <player>
+ permission: groupmanager.tempdel
+ templist:
+ description: List players in overload-permissions mode made by /tempadd.
+ usage: /<command>
+ permission: groupmanager.templist
+ tempdelall:
+ description: Remove all overrides made by command /tempadd.
+ usage: /<command>
+ permission: groupmanager.tempdelall
+ mansave:
+ description: Save all permissions on file.
+ usage: /<command>
+ permission: groupmanager.mansave
+ manload:
+ description: Reload current world and config.yml. Or load given world.
+ usage: /<command> [world]
+ permission: groupmanager.manload
+ listgroups:
+ description: List the groups available.
+ usage: /<command>
+ permission: groupmanager.listgroups
+ manpromote:
+ description: Promote a player in the same heritage line to a higher rank.
+ usage: /<command> <player> <group>
+ permission: groupmanager.manpromote
+ mandemote:
+ description: Demote a player in the same heritage line to a lower rank.
+ usage: /<command> <player> <group>
+ permission: groupmanager.mandemote
+ mantogglevalidate:
+ description: Toggle on/off the validating if player is online.
+ usage: /<command>
+ permission: groupmanager.mantogglevalidate
+ mantogglesave:
+ description: Toggle on/ff the autosave.
+ usage: /<command>
+ permission: groupmanager.mantogglesave
+ manworld:
+ description: Prints the selected world name
+ usage: /<command>
+ permission: groupmanager.manworld
+ manselect:
+ description: Select a world to work with next commands.
+ usage: /<command> <world>
+ permission: groupmanager.manselect
+ manclear:
+ description: Clear world selection. Next commands will work on your world.
+ usage: /<command>
+ permission: groupmanager.manclear \ No newline at end of file
diff --git a/EssentialsGroupManager/src/users.yml b/EssentialsGroupManager/src/users.yml
new file mode 100644
index 000000000..5645c5d23
--- /dev/null
+++ b/EssentialsGroupManager/src/users.yml
@@ -0,0 +1,59 @@
+users:
+ aMiner:
+ subgroups:
+ - Miner
+ permissions: []
+ group: BlueFaction
+ info:
+ prefix: '&d'
+ suffix: Miner
+ gmcouto:
+ subgroups: []
+ permissions: []
+ group: SemiAdmin
+ tempRailer:
+ subgroups:
+ - Miner
+ - Railer
+ permissions: []
+ group: BlueFaction
+ info:
+ prefix: '&d'
+ suffix: Miner
+ anjocaido:
+ subgroups: []
+ permissions: []
+ group: Admin
+ info:
+ prefix: '&c'
+ suffix: King
+ aFarmer:
+ subgroups:
+ - Farmer
+ permissions: []
+ group: RedFaction
+ info:
+ prefix: '&d'
+ suffix: Farmer
+ zenexer:
+ subgroups: []
+ permissions:
+ - essentials.god
+ group: Moderator
+ Teste:
+ subgroups:
+ - Miner
+ - Railer
+ - SuperCart
+ - Fighter
+ - FlyingMan
+ permissions: []
+ group: BlueFaction
+ aHealer:
+ subgroups:
+ - Healer
+ permissions: []
+ group: RedFaction
+ info:
+ prefix: '&d'
+ suffix: Healer
diff --git a/EssentialsProtect/MANIFEST.MF b/EssentialsProtect/MANIFEST.MF
new file mode 100644
index 000000000..b43aa699e
--- /dev/null
+++ b/EssentialsProtect/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Class-Path: ../lib/mysql.jar ../lib/sqlite.jar
diff --git a/EssentialsProtect/build.xml b/EssentialsProtect/build.xml
new file mode 100644
index 000000000..e5e614e3e
--- /dev/null
+++ b/EssentialsProtect/build.xml
@@ -0,0 +1,86 @@
+<?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="EssentialsProtect" default="default" basedir=".">
+ <description>Builds, tests, and runs the project EssentialsProtect.</description>
+ <import file="nbproject/build-impl.xml"/>
+ <!--
+
+ 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="EssentialsProtect-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.
+
+ -->
+
+ <target name="-post-jar">
+ <jar jarfile="${dist.dir}/EssentialsProtect.jar">
+ <zipfileset src="${dist.jar}" excludes="META-INF/*" />
+ <zipfileset src="../lib/mysql.jar" excludes="META-INF/*" />
+ <zipfileset src="../lib/sqlite.jar" excludes="META-INF/*" />
+ <manifest>
+ <attribute name="Classpath" value="Essentials.jar"/>
+ </manifest>
+ </jar>
+ </target>
+</project>
diff --git a/EssentialsProtect/nbproject/build-impl.xml b/EssentialsProtect/nbproject/build-impl.xml
new file mode 100644
index 000000000..d284d9279
--- /dev/null
+++ b/EssentialsProtect/nbproject/build-impl.xml
@@ -0,0 +1,1072 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsProtect-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target name="-pre-init-libraries">
+ <property location="../lib\nblibraries.properties" name="libraries.path"/>
+ <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/>
+ <pathconvert dirsep="/" property="libraries.dir">
+ <path path="${libraries.dir.nativedirsep}"/>
+ </pathconvert>
+ <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/>
+ <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/>
+ </target>
+ <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: EssentialsProtect was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: EssentialsProtect was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/EssentialsProtect/nbproject/genfiles.properties b/EssentialsProtect/nbproject/genfiles.properties
new file mode 100644
index 000000000..3f48945cc
--- /dev/null
+++ b/EssentialsProtect/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=ff207988
+build.xml.script.CRC32=1ed11cc3
+build.xml.stylesheet.CRC32=28e38971@1.38.3.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=40644caa
+nbproject/build-impl.xml.script.CRC32=1d86f3b0
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
diff --git a/EssentialsProtect/nbproject/private/private.properties b/EssentialsProtect/nbproject/private/private.properties
new file mode 100644
index 000000000..94183418a
--- /dev/null
+++ b/EssentialsProtect/nbproject/private/private.properties
@@ -0,0 +1 @@
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/EssentialsProtect/nbproject/project.properties b/EssentialsProtect/nbproject/project.properties
new file mode 100644
index 000000000..3f2895ed5
--- /dev/null
+++ b/EssentialsProtect/nbproject/project.properties
@@ -0,0 +1,91 @@
+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=EssentialsProtect
+application.vendor=devhome
+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}/original-EssentialsProtect.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.c3p0-0.9.1.2.jar=..\\lib\\c3p0-0.9.1.2.jar
+file.reference.craftbukkit-0.0.1-SNAPSHOT.jar=..\\lib\\craftbukkit-0.0.1-SNAPSHOT.jar
+file.reference.mysql.jar=..\\lib\\mysql.jar
+file.reference.sqlite.jar=..\\lib\\sqlite.jar
+includes=**
+jar.archive.disabled=${jnlp.enabled}
+jar.compress=false
+jar.index=${jnlp.enabled}
+javac.classpath=\
+ ${reference.Essentials.jar}:\
+ ${file.reference.mysql.jar}:\
+ ${file.reference.sqlite.jar}:\
+ ${file.reference.craftbukkit-0.0.1-SNAPSHOT.jar}:\
+ ${file.reference.c3p0-0.9.1.2.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}:\
+ ${libs.junit.classpath}:\
+ ${libs.junit_4.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=
+jnlp.codebase.type=no.codebase
+jnlp.descriptor=application
+jnlp.enabled=false
+jnlp.mixed.code=defaut
+jnlp.offline-allowed=false
+jnlp.signed=false
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+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
diff --git a/EssentialsProtect/nbproject/project.xml b/EssentialsProtect/nbproject/project.xml
new file mode 100644
index 000000000..821d66672
--- /dev/null
+++ b/EssentialsProtect/nbproject/project.xml
@@ -0,0 +1,28 @@
+<?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>EssentialsProtect</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>
diff --git a/EssentialsProtect/src/README.TXT b/EssentialsProtect/src/README.TXT
new file mode 100644
index 000000000..4bb1b5c05
--- /dev/null
+++ b/EssentialsProtect/src/README.TXT
@@ -0,0 +1,30 @@
+EssentialsProtect:
+
+REQUIRED : Essentials.jar. Also sqlite.jar, mysql.jar in the bukkit lib folder.
+
+Config Settings in plugins/Essentials/config.yml
+
+protect:
+ datatype: 'sqlite' type of db, options sqlite or mysql
+ username: 'root' mysql username
+ pasword: 'root' mysql password
+ mysqlDb: 'jdbc:mysql://localhost:3306/minecraft' mysql database location
+ protectSigns: true
+ protectRails: true
+ protectBlockBelow: true
+ preventBlockOnRail: false prevents block placement on protected rails
+
+On startup creates a sqlite database under /plugins/essentials called EssentialsProtect.db
+
+Permissions:
+
+"essentials.protect" - allows protection
+"essentials.protect.admin" can delete protected blocks / query protection by right clicking a protected item.
+
+Usage:
+
+Place a sign or rail and they (plus optionally the block below) will be protected. Only the owners and those with admin permissions can destroy.
+
+
+
+
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java
new file mode 100644
index 000000000..d6869519b
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java
@@ -0,0 +1,154 @@
+package com.earth2me.essentials.protect;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.IConf;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.protect.data.IProtectedBlock;
+import com.earth2me.essentials.protect.data.ProtectedBlockMemory;
+import com.earth2me.essentials.protect.data.ProtectedBlockMySQL;
+import com.earth2me.essentials.protect.data.ProtectedBlockSQLite;
+import java.beans.PropertyVetoException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event.Priority;
+import org.bukkit.event.Event.Type;
+import org.bukkit.plugin.PluginManager;
+import org.bukkit.plugin.java.JavaPlugin;
+
+
+public class EssentialsProtect extends JavaPlugin implements IConf
+{
+ private EssentialsProtectBlockListener blockListener = null;
+ private EssentialsProtectPlayerListener playerListener = null;
+ private EssentialsProtectEntityListener entityListener = null;
+ public static final String AUTHORS = Essentials.AUTHORS;
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ public static HashMap<String, Boolean> genSettings = null;
+ public static HashMap<String, String> dataSettings = null;
+ public static HashMap<String, Boolean> guardSettings = null;
+ public static HashMap<String, Boolean> playerSettings = null;
+ public static ArrayList usageList = null;
+ public static ArrayList blackListPlace = null;
+ public static ArrayList breakBlackList = null;
+ public static ArrayList onPlaceAlert = null;
+ public static ArrayList onUseAlert = null;
+ public static ArrayList onBreakAlert = null;
+
+ private IProtectedBlock storage = null;
+ private static EssentialsProtect instance = null;
+
+ public EssentialsProtect()
+ {
+ }
+
+ public void onEnable()
+ {
+ PluginManager pm = this.getServer().getPluginManager();
+ Essentials ess = (Essentials)pm.getPlugin("Essentials");
+ if (!ess.isEnabled()) {
+ pm.enablePlugin(ess);
+ }
+
+ instance = this;
+ reloadConfig();
+
+ playerListener = new EssentialsProtectPlayerListener(this);
+ blockListener = new EssentialsProtectBlockListener(this);
+ entityListener = new EssentialsProtectEntityListener(this);
+ pm.registerEvent(Type.PLAYER_PICKUP_ITEM, playerListener, Priority.Low, this);
+ pm.registerEvent(Type.PLAYER_INTERACT, playerListener, Priority.Low, this);
+ pm.registerEvent(Type.BLOCK_PLACE, blockListener, Priority.Highest, this);
+ pm.registerEvent(Type.BLOCK_FROMTO, blockListener, Priority.Highest, this);
+ pm.registerEvent(Type.BLOCK_IGNITE, blockListener, Priority.Highest, this);
+ pm.registerEvent(Type.BLOCK_BURN, blockListener, Priority.Highest, this);
+ pm.registerEvent(Type.ENTITY_EXPLODE, entityListener, Priority.Highest, this);
+ pm.registerEvent(Type.ENTITY_DAMAGE, entityListener, Priority.Highest, this);
+ pm.registerEvent(Type.BLOCK_BREAK, blockListener, Priority.Highest, this);
+ pm.registerEvent(Type.CREATURE_SPAWN, entityListener, Priority.Highest, this);
+
+ if (!this.getDescription().getVersion().equals(Essentials.getStatic().getDescription().getVersion())) {
+ logger.log(Level.WARNING, "Version mismatch! Please update all Essentials jars to the same version.");
+ }
+ logger.info("Loaded " + this.getDescription().getName() + " build " + this.getDescription().getVersion() + " maintained by " + AUTHORS);
+ }
+
+ public static boolean checkProtectionItems(ArrayList itemList, int id)
+ {
+ return !itemList.isEmpty() && itemList.contains(String.valueOf(id));
+ }
+
+ @Override
+ public void onDisable()
+ {
+ genSettings.clear();
+ dataSettings.clear();
+
+ blockListener = null;
+ playerListener = null;
+ entityListener = null;
+ genSettings = null;
+ dataSettings = null;
+ guardSettings = null;
+ playerSettings = null;
+ usageList = null;
+ blackListPlace = null;
+ onPlaceAlert = null;
+ onUseAlert = null;
+ onBreakAlert = null;
+ }
+
+ public void alert(User user, String item, String type)
+ {
+ Location loc = user.getLocation();
+ for (Player p : this.getServer().getOnlinePlayers())
+ {
+ User alertUser = User.get(p);
+ if (alertUser.isAuthorized("essentials.protect.alerts"))
+ alertUser.sendMessage(ChatColor.DARK_AQUA + "[" + user.getName() + "] " + ChatColor.WHITE + type + ChatColor.GOLD + item + " at: " + formatCoords(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
+ }
+ }
+
+ public static String formatCoords(int x, int y, int z)
+ {
+ return x + "," + y + "," + z;
+ }
+
+ public void reloadConfig() {
+ dataSettings = Essentials.getSettings().getEpDBSettings();
+ genSettings = Essentials.getSettings().getEpSettings();
+ guardSettings = Essentials.getSettings().getEpGuardSettings();
+ usageList = Essentials.getSettings().epBlackListUsage();
+ blackListPlace = Essentials.getSettings().epBlackListPlacement();
+ breakBlackList = Essentials.getSettings().epBlockBreakingBlacklist();
+ onPlaceAlert = Essentials.getSettings().getEpAlertOnPlacement();
+ onUseAlert = Essentials.getSettings().getEpAlertOnUse();
+ onBreakAlert = Essentials.getSettings().getEpAlertOnBreak();
+ playerSettings = Essentials.getSettings().getEpPlayerSettings();
+
+ if (dataSettings.get("protect.datatype").equals("mysql")) {
+ try {
+ storage = new ProtectedBlockMySQL(dataSettings.get("protect.mysqlDb"), dataSettings.get("protect.username"), dataSettings.get("protect.password"));
+ } catch (PropertyVetoException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ } else {
+ try {
+ storage = new ProtectedBlockSQLite("jdbc:sqlite:plugins/Essentials/EssentialsProtect.db");
+ } catch (PropertyVetoException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (genSettings.get("protect.memstore")) {
+ storage = new ProtectedBlockMemory(storage);
+ }
+ }
+
+ public static IProtectedBlock getStorage() {
+ return EssentialsProtect.instance.storage;
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java
new file mode 100644
index 000000000..2028edf42
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java
@@ -0,0 +1,272 @@
+package com.earth2me.essentials.protect;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import java.util.ArrayList;
+import java.util.List;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.entity.Player;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockBurnEvent;
+import org.bukkit.event.block.BlockFromToEvent;
+import org.bukkit.event.block.BlockIgniteEvent;
+import org.bukkit.event.block.BlockListener;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.inventory.ItemStack;
+
+
+public class EssentialsProtectBlockListener extends BlockListener
+{
+ private EssentialsProtect parent;
+
+ public EssentialsProtectBlockListener(EssentialsProtect parent)
+ {
+ Essentials.loadClasses();
+ this.parent = parent;
+ }
+
+ @Override
+ public void onBlockPlace(BlockPlaceEvent event)
+ {
+ if (event.isCancelled()) return;
+ ItemStack item = event.getItemInHand();
+ User user = User.get(event.getPlayer());
+
+ if (EssentialsProtect.playerSettings.get("protect.disable.build") && !user.canBuild())
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ int id = event.getBlockPlaced().getTypeId();
+
+ if (EssentialsProtect.checkProtectionItems(EssentialsProtect.blackListPlace, id) && !user.isAuthorized("essentials.protect.exemptplacement"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if (!EssentialsProtect.onPlaceAlert.isEmpty() && EssentialsProtect.onPlaceAlert.contains(String.valueOf(item.getTypeId())))
+ {
+ parent.alert(user, item.getType().toString(), "placed: ");
+ }
+
+ Block blockPlaced = event.getBlockPlaced();
+ Block below = blockPlaced.getFace(BlockFace.DOWN);
+ if (below.getType() == Material.RAILS) {
+ if (EssentialsProtect.genSettings.get("protect.protect.prevent.block-on-rail"))
+ {
+ if (EssentialsProtect.getStorage().isProtected(below, user.getName())) {
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+
+ List<Block> protect = new ArrayList<Block>();
+ if (blockPlaced.getType() == Material.RAILS) {
+ if (EssentialsProtect.genSettings.get("protect.protect.rails"))
+ {
+ if (user.isAuthorized("essentials.protect"))
+ {
+ protect.add(blockPlaced);
+ if (EssentialsProtect.genSettings.get("protect.protect.block-below"))
+ {
+ protect.add(blockPlaced.getFace(BlockFace.DOWN));
+ }
+ }
+ }
+ }
+ if (blockPlaced.getType() == Material.SIGN_POST || blockPlaced.getType() == Material.WALL_SIGN) {
+ if (EssentialsProtect.genSettings.get("protect.protect.signs"))
+ {
+ if (user.isAuthorized("essentials.protect"))
+ {
+ protect.add(blockPlaced);
+ if (EssentialsProtect.genSettings.get("protect.protect.block-below"))
+ {
+ protect.add(event.getBlockAgainst());
+ }
+ }
+ }
+ }
+ for (Block block : protect) {
+ EssentialsProtect.getStorage().protectBlock(block, user.getName());
+ }
+ }
+
+ @Override
+ public void onBlockIgnite(BlockIgniteEvent event)
+ {
+ Block block = event.getBlock();
+ if (block.getType() == Material.RAILS && EssentialsProtect.genSettings.get("protect.protect.rails"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) && EssentialsProtect.genSettings.get("protect.protect.signs"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if ((event.getCause().equals(BlockIgniteEvent.IgniteCause.SPREAD)))
+ {
+ event.setCancelled(EssentialsProtect.guardSettings.get("protect.prevent.fire-spread"));
+ return;
+ }
+
+ if (event.getCause().equals(BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL))
+ {
+ event.setCancelled(EssentialsProtect.guardSettings.get("protect.prevent.flint-fire"));
+ return;
+ }
+
+ if (event.getCause().equals(BlockIgniteEvent.IgniteCause.LAVA))
+ {
+ event.setCancelled(EssentialsProtect.guardSettings.get("protect.prevent.lava-fire-spread"));
+ return;
+ }
+ }
+
+ @Override
+ public void onBlockFromTo(BlockFromToEvent event)
+ {
+ if (event.isCancelled()) return;
+ Block block = event.getBlock();
+ Block toBlock = event.getToBlock();
+ if (toBlock.getType() == Material.RAILS && EssentialsProtect.genSettings.get("protect.protect.rails"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if ((toBlock.getType() == Material.WALL_SIGN || toBlock.getType() == Material.SIGN_POST) && EssentialsProtect.genSettings.get("protect.protect.signs"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER)
+ {
+ event.setCancelled(EssentialsProtect.guardSettings.get("protect.prevent.water-flow"));
+ return;
+ }
+
+ if (block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA)
+ {
+ event.setCancelled(EssentialsProtect.guardSettings.get("protect.prevent.lava-flow"));
+ return;
+ }
+
+ if (block.getType() == Material.AIR)
+ {
+ event.setCancelled(EssentialsProtect.guardSettings.get("protect.prevent.water-bucket-flow"));
+ return;
+ }
+ }
+
+ @Override
+ public void onBlockBurn(BlockBurnEvent event)
+ {
+ Block block = event.getBlock();
+ if (block.getType() == Material.RAILS && EssentialsProtect.genSettings.get("protect.protect.rails"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if ((block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) && EssentialsProtect.genSettings.get("protect.protect.signs"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if (EssentialsProtect.guardSettings.get("protect.prevent.fire-spread"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ }
+
+ @Override
+ public void onBlockBreak(BlockBreakEvent event)
+ {
+ if (event.isCancelled()) return;
+ User user = User.get(event.getPlayer());
+ Block block = event.getBlock();
+ if (EssentialsProtect.playerSettings.get("protect.disable.build") && !user.canBuild())
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if(EssentialsProtect.breakBlackList.contains(String.valueOf(block.getTypeId())) && !user.isAuthorized("essentials.protect.exemptbreak"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if (!EssentialsProtect.onBreakAlert.isEmpty() && EssentialsProtect.onBreakAlert.contains(String.valueOf(block.getTypeId())))
+ {
+ parent.alert(user, block.getType().toString(), "broke: ");
+ }
+
+ if (user.isAuthorized("essentials.protect.admin"))
+ {
+ if (block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST || block.getType() == Material.RAILS)
+ {
+ EssentialsProtect.getStorage().unprotectBlock(block);
+ if (block.getType() == Material.RAILS || block.getType() == Material.SIGN_POST) {
+ Block below = block.getFace(BlockFace.DOWN);
+ EssentialsProtect.getStorage().unprotectBlock(below);
+ } else {
+ BlockFace[] faces = new BlockFace[] {
+ BlockFace.NORTH,
+ BlockFace.EAST,
+ BlockFace.SOUTH,
+ BlockFace.WEST
+ };
+ for (BlockFace blockFace : faces) {
+ Block against = block.getFace(blockFace);
+ EssentialsProtect.getStorage().unprotectBlock(against);
+ }
+ }
+ }
+ else
+ {
+ EssentialsProtect.getStorage().unprotectBlock(block);
+ }
+ return;
+ }
+ else
+ {
+
+ boolean isProtected = EssentialsProtect.getStorage().isProtected(block, user.getName());
+ if (!isProtected) {
+ if (block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST || block.getType() == Material.RAILS)
+ {
+ EssentialsProtect.getStorage().unprotectBlock(block);
+ if (block.getType() == Material.RAILS || block.getType() == Material.SIGN_POST) {
+ Block below = block.getFace(BlockFace.DOWN);
+ EssentialsProtect.getStorage().unprotectBlock(below);
+ } else {
+ BlockFace[] faces = new BlockFace[] {
+ BlockFace.NORTH,
+ BlockFace.EAST,
+ BlockFace.SOUTH,
+ BlockFace.WEST
+ };
+ for (BlockFace blockFace : faces) {
+ Block against = block.getFace(blockFace);
+ EssentialsProtect.getStorage().unprotectBlock(against);
+ }
+ }
+ }
+ else
+ {
+ EssentialsProtect.getStorage().unprotectBlock(block);
+ }
+ }
+ event.setCancelled(true);
+ return;
+ }
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectData.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectData.java
new file mode 100644
index 000000000..76b36d810
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectData.java
@@ -0,0 +1,533 @@
+package com.earth2me.essentials.protect;
+
+import com.earth2me.essentials.Essentials;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.block.Block;
+
+
+public class EssentialsProtectData
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private static final String mysqlDriver = "com.mysql.jdbc.Driver";
+ private static String mysqlUsername;
+ private static String mysqlPassword;
+ private static String mysqlDatabase;
+ private static String dataType;
+ private static final String sqlite = "jdbc:sqlite:plugins/Essentials/EssentialsProtect.db";
+ private static final String mysqlTable;
+ private static final String sqliteTable;
+ private static final String insertQuery;
+ private static final String countByLocationQuery;
+ private static final String countByPlayerLocationQuery;
+ private static final String playerByLocationQuery;
+ private static final String deleteByLocationQuery;
+
+ static
+ {
+ mysqlTable = EssentialsProtectSqlProperties.EssentialsProtect;
+ sqliteTable = EssentialsProtectSqlProperties.EssentialsProtect_sqlite;
+ insertQuery = EssentialsProtectSqlProperties.Insert;
+ countByLocationQuery = EssentialsProtectSqlProperties.CountByLocation;
+ countByPlayerLocationQuery = EssentialsProtectSqlProperties.CountByPLayerLocation;
+ playerByLocationQuery = EssentialsProtectSqlProperties.PlayerByLocation;
+ deleteByLocationQuery = EssentialsProtectSqlProperties.DeleteByLocation;
+ mysqlUsername = EssentialsProtect.dataSettings.get("protect.username");
+ mysqlPassword = EssentialsProtect.dataSettings.get("protect.password");
+ mysqlDatabase = EssentialsProtect.dataSettings.get("protect.mysqlDb");
+ dataType = EssentialsProtect.dataSettings.get("protect.datatype");
+ }
+
+ public EssentialsProtectData()
+ {
+ }
+
+ public static String formatCoords(int x, int y, int z)
+ {
+ return x + "," + y + "," + z;
+ }
+
+ public void insertProtectionIntoDb(String worldname, String playerName, int x, int y, int z)
+ {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try
+ {
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername, mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+ ps = conn.prepareStatement(insertQuery);
+ ps.setString(1, worldname);
+ ps.setString(2, playerName);
+ ps.setInt(3, x);
+ ps.setInt(4, y);
+ ps.setInt(5, z);
+ ps.executeUpdate();
+
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unable to add protection into SQL", ex);
+ }
+ catch (ClassNotFoundException e)
+ {
+ // TODO Auto-generated catch block
+ logger.log(Level.SEVERE, "[EssentialsProtect] Class not found", e);
+ }
+ finally
+ {
+ try
+ {
+ if (ps != null)
+ {
+ ps.close();
+ }
+ if (rs != null)
+ {
+ rs.close();
+ }
+ if (conn != null)
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Could not close connection to SQL", ex);
+ }
+ }
+ }
+
+ public boolean canDestroy(String worldName, String playerName, Block block)
+ {
+ int x = block.getX();
+ int y = block.getY();
+ int z = block.getZ();
+
+ int rowCount = 0;
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try
+ {
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername, mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+ conn.setAutoCommit(false);
+ ps = conn.prepareStatement(countByLocationQuery);
+ ps.setString(1, worldName);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ rs = ps.executeQuery();
+ rs.next();
+ rowCount = rs.getInt(1);
+ rs.close();
+ ps.close();
+
+ if (rowCount == 0)
+ {
+ return true;
+ }
+ else
+ {
+ ps = conn.prepareStatement(countByPlayerLocationQuery);
+ ps.setString(1, worldName);
+ ps.setString(2, playerName);
+ ps.setInt(3, x);
+ ps.setInt(4, y);
+ ps.setInt(5, z);
+ rs = ps.executeQuery();
+ rs.next();
+ rowCount = rs.getInt(1);
+
+ if (rowCount == 0)
+ {
+ return false;
+ }
+
+ }
+
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unable to query Protection", ex);
+ }
+ catch (Throwable e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unable to query Protection", e);
+ }
+ finally
+ {
+ try
+ {
+ if (ps != null)
+ {
+ ps.close();
+ }
+ if (rs != null)
+ {
+ rs.close();
+ }
+ if (conn != null)
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtection] Could not close connection to SQL", ex);
+ }
+ }
+ return true;
+ }
+
+ @SuppressWarnings("CallToThreadDumpStack")
+ public static void createSqlTable()
+ {
+ Connection conn = null;
+ Statement st = null;
+
+ try
+ {
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername, mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+
+ st = conn.createStatement();
+ st.executeUpdate(dataType.contentEquals("mysql") ? mysqlTable : sqliteTable);
+ }
+ catch (SQLException s)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Could not create table for " + dataType, s);
+
+ }
+ catch (ClassNotFoundException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Could not find driver for " + dataType, ex);
+
+ }
+ catch (Throwable e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unexpected error occured whilst creating table ", e);
+ }
+ finally
+ {
+ try
+ {
+ if (conn != null && !conn.isClosed())
+ {
+ try
+ {
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unexpected error occured whilst closing the connection", e);
+ }
+ }
+ }
+ catch (SQLException e)
+ {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public String getBlockOwner(String worldName, String playerName, Block block)
+ {
+ String returnPlayerName = null;
+ int x = block.getX();
+ int y = block.getY();
+ int z = block.getZ();
+
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try
+ {
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername, mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+ conn.setAutoCommit(false);
+ ps = conn.prepareStatement(playerByLocationQuery);
+
+ ps.setString(1, worldName);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ rs = ps.executeQuery();
+ while (rs.next())
+ {
+ returnPlayerName = rs.getString("playerName");
+ }
+ rs.close();
+ ps.close();
+
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unable to query EssentialsProtection", ex);
+ }
+ catch (Throwable e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unable to query EssentialsProtection", e);
+ }
+ finally
+ {
+ try
+ {
+ if (ps != null)
+ {
+ ps.close();
+ }
+ if (rs != null)
+ {
+ rs.close();
+ }
+ if (conn != null)
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtection] Could not close connection to SQL", ex);
+ }
+
+ }
+ return returnPlayerName;
+ }
+
+
+ public void removeProtectionFromDB(Block block)
+ {
+ try
+ {
+ Connection conn = null;
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername,
+ mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+ PreparedStatement ps = null;
+ try
+ {
+ ps = conn.prepareStatement(deleteByLocationQuery);
+ ps.setString(1, block.getWorld().getName());
+ ps.setInt(2, block.getX());
+ ps.setInt(3, block.getY());
+ ps.setInt(4, block.getZ());
+ ps.executeUpdate();
+
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.WARNING,
+ "[EssentialsProtect] Could not delete block data from database",
+ ex);
+ }
+ finally
+ {
+ if (conn != null && !conn.isClosed())
+ {
+ conn.close();
+ }
+ if (ps != null)
+ {
+ ps.close();
+ }
+ }
+
+ }
+ catch (Throwable e)
+ {
+ logger.log(Level.SEVERE, " [EssentialsProtect] Exception occured whilst trying to delete data from sql", e);
+ }
+
+ }
+
+ public void removeProtectionFromDB(Block block, boolean removeBelow)
+ {
+ try
+ {
+ Connection conn = null;
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername, mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+ PreparedStatement ps = null;
+ try
+ {
+ ps = conn.prepareStatement(deleteByLocationQuery);
+ ps.setString(1, block.getWorld().getName());
+ ps.setInt(2, block.getX());
+ ps.setInt(3, block.getY());
+ ps.setInt(4, block.getZ());
+ ps.executeUpdate();
+ if (removeBelow)
+ {
+ ps = conn.prepareStatement(deleteByLocationQuery);
+ ps.setString(1, block.getWorld().getName());
+ ps.setInt(2, block.getX());
+ ps.setInt(3, block.getY() - 1);
+ ps.setInt(4, block.getZ());
+ ps.executeUpdate();
+ }
+
+ }
+ catch (SQLException ex)
+ {
+ logger.log(Level.WARNING, "[EssentialsProtect] Could not delete block data from database", ex);
+ }
+ finally
+ {
+ if (conn != null && !conn.isClosed())
+ {
+ conn.close();
+ }
+ if (ps != null)
+ {
+ ps.close();
+ }
+ }
+
+ }
+ catch (Throwable e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Exception occured whilst trying to delete data from sql", e);
+ }
+
+ }
+
+ public boolean isBlockAboveProtectedRail(Block block)
+ {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ if (block.getTypeId() == 66)
+ {
+ try
+ {
+ if (dataType.contentEquals("mysql"))
+ {
+ Class.forName(mysqlDriver);
+ conn = DriverManager.getConnection(mysqlDatabase, mysqlUsername, mysqlPassword);
+ }
+ else
+ {
+ Class.forName("org.sqlite.JDBC");
+ conn = DriverManager.getConnection(sqlite);
+ }
+ int rowCount = 0;
+ conn.setAutoCommit(false);
+ ps = conn.prepareStatement(countByLocationQuery);
+ ps.setString(1, block.getWorld().getName());
+ ps.setInt(2, block.getX());
+ ps.setInt(3, block.getY());
+ ps.setInt(4, block.getZ());
+ rs = ps.executeQuery();
+ rs.next();
+ rowCount = rs.getInt(1);
+ rs.close();
+ ps.close();
+
+ if (rowCount == 0)
+ {
+
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ catch (SQLException s)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Could not query protection", s);
+
+ }
+ catch (ClassNotFoundException ex)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Could not find driver for " + dataType, ex);
+
+ }
+ catch (Throwable e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unexpected error occured whilst creating table", e);
+ }
+ finally
+ {
+ try
+ {
+ if (conn != null && !conn.isClosed())
+ {
+ try
+ {
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ logger.log(Level.SEVERE, "[EssentialsProtect] Unexpected error occured whilst closing the connection", e);
+ }
+
+ }
+ }
+ catch (SQLException e)
+ {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java
new file mode 100644
index 000000000..97b5c59e5
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java
@@ -0,0 +1,197 @@
+package com.earth2me.essentials.protect;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import net.minecraft.server.ChunkPosition;
+import net.minecraft.server.Packet60Explosion;
+import org.bukkit.Location;
+import org.bukkit.block.Block;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.Creeper;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Monster;
+import org.bukkit.entity.Player;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.bukkit.event.entity.EntityDamageByBlockEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDamageByProjectileEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
+import org.bukkit.event.entity.EntityExplodeEvent;
+import org.bukkit.event.entity.EntityListener;
+
+
+public class EssentialsProtectEntityListener extends EntityListener
+{
+ private EssentialsProtect parent;
+
+ public EssentialsProtectEntityListener(EssentialsProtect parent)
+ {
+ Essentials.loadClasses();
+ this.parent = parent;
+ }
+
+ @Override
+ public void onEntityDamage(EntityDamageEvent event)
+ {
+ if (event.isCancelled()) return;
+ if (event instanceof EntityDamageByBlockEvent)
+ {
+ DamageCause cause = event.getCause();
+
+ if (EssentialsProtect.playerSettings.get("protect.disable.contactdmg") && cause == DamageCause.CONTACT)
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if (EssentialsProtect.playerSettings.get("protect.disable.lavadmg") && cause == DamageCause.LAVA)
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if (EssentialsProtect.guardSettings.get("protect.prevent.tnt-explosion") && cause == DamageCause.BLOCK_EXPLOSION)
+ {
+ event.setCancelled(true);
+ return;
+ }
+ }
+
+ if (event instanceof EntityDamageByEntityEvent)
+ {
+ EntityDamageByEntityEvent edEvent = (EntityDamageByEntityEvent)event;
+ Entity eAttack = edEvent.getDamager();
+ Entity eDefend = edEvent.getEntity();
+
+ // PVP Settings
+ if (eDefend instanceof Player && eAttack instanceof Player)
+ {
+ if (EssentialsProtect.playerSettings.get("protect.disable.pvp"))
+ {
+ User defender = User.get(eDefend);
+ User attacker = User.get(eAttack);
+
+ if (!defender.isAuthorized("essentials.protect.pvp") || !attacker.isAuthorized("essentials.protect.pvp"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+ //Creeper explode prevention
+ if (eAttack != null && eAttack instanceof Monster)
+ {
+ if (eAttack instanceof Creeper && EssentialsProtect.guardSettings.get("protect.prevent.creeper-explosion"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if (eAttack instanceof Creeper && EssentialsProtect.guardSettings.get("protect.prevent.creeper-playerdamage"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+
+ if (event instanceof EntityDamageByProjectileEvent)
+ {
+ if (event.getEntity() instanceof Player)
+ {
+ event.setCancelled(EssentialsProtect.playerSettings.get("protect.disable.projectiles"));
+ return;
+ }
+ }
+
+ DamageCause cause = event.getCause();
+ Entity casualty = event.getEntity();
+ if (casualty instanceof Player)
+ {
+ if (EssentialsProtect.playerSettings.get("protect.disable.fall") && cause == DamageCause.FALL)
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if (EssentialsProtect.playerSettings.get("protect.disable.suffocate") && cause == DamageCause.SUFFOCATION)
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if (EssentialsProtect.playerSettings.get("protect.disable.firedmg") && (cause == DamageCause.FIRE
+ || cause == DamageCause.FIRE_TICK))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ if (EssentialsProtect.playerSettings.get("protect.disable.drown") && cause == DamageCause.DROWNING)
+ {
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void onEntityExplode(EntityExplodeEvent event)
+ {
+ if (event.isCancelled()) return;
+ if (event.getEntity() instanceof LivingEntity)
+ {
+ //Nicccccccccce plaaacccccccccce..
+ int maxHeight = Essentials.getSettings().getEpCreeperMaxHeight();
+ if ( EssentialsProtect.guardSettings.get("protect.prevent.creeper-explosion") ||
+ EssentialsProtect.guardSettings.get("protect.prevent.creeper-blockdamage") ||
+ (maxHeight >= 0 && event.getLocation().getBlockY() > maxHeight))
+ {
+ HashSet<ChunkPosition> set = new HashSet<ChunkPosition>(event.blockList().size());
+ Player[] players = parent.getServer().getOnlinePlayers();
+ List<ChunkPosition> blocksUnderPlayers = new ArrayList<ChunkPosition>(players.length);
+ Location loc = event.getLocation();
+ for (Player player : players) {
+ if (player.getWorld().equals(loc.getWorld())) {
+ blocksUnderPlayers.add(
+ new ChunkPosition(
+ player.getLocation().getBlockX(),
+ player.getLocation().getBlockY() - 1,
+ player.getLocation().getBlockZ()));
+ }
+ }
+ for (Block block : event.blockList()) {
+ ChunkPosition cp = new ChunkPosition(block.getX(), block.getY(), block.getZ());
+ if (!blocksUnderPlayers.contains(cp)) {
+ set.add(cp);
+ }
+ }
+
+ ((CraftServer)parent.getServer()).getServer().f.a(loc.getX(), loc.getY(), loc.getZ(), 64.0D,
+ new Packet60Explosion(loc.getX(), loc.getY(), loc.getZ(), 3.0f, set));
+ event.setCancelled(true);
+ return;
+ }
+ }
+ else
+ { //OH NOES TNT
+ if (EssentialsProtect.guardSettings.get("protect.prevent.tnt-explosion"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void onCreatureSpawn(CreatureSpawnEvent event) {
+ String creatureName = event.getCreatureType().toString().toLowerCase();
+ if (creatureName == null || creatureName.isEmpty()) {
+ return;
+ }
+ if (EssentialsProtect.guardSettings.get("protect.prevent.spawn."+creatureName)) {
+ event.setCancelled(true);
+ }
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java
new file mode 100644
index 000000000..2497a733d
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java
@@ -0,0 +1,70 @@
+package com.earth2me.essentials.protect;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import org.bukkit.ChatColor;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerListener;
+import org.bukkit.event.player.PlayerPickupItemEvent;
+import org.bukkit.inventory.ItemStack;
+
+
+public class EssentialsProtectPlayerListener extends PlayerListener
+{
+ private EssentialsProtect parent;
+
+ public EssentialsProtectPlayerListener(EssentialsProtect parent)
+ {
+ Essentials.loadClasses();
+ this.parent = parent;
+ }
+
+ @Override
+ public void onPlayerInteract(PlayerInteractEvent event)
+ {
+ if (event.isCancelled()) return;
+ User user = User.get(event.getPlayer());
+
+ if (EssentialsProtect.playerSettings.get("protect.disable.build") && !user.canBuild())
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if (user.isAuthorized("essentials.protect.admin"))
+ {
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (String owner : EssentialsProtect.getStorage().getOwners(event.getClickedBlock())) {
+ if (!first) {
+ sb.append(", ");
+ }
+ first = false;
+ sb.append(owner);
+ }
+ String ownerNames = sb.toString();
+ if (ownerNames != null)
+ {
+ user.sendMessage(ChatColor.GOLD + "[EssentialsProtect] Protection owners: " + ownerNames);
+ }
+ }
+ }
+
+ @Override
+ public void onPlayerPickupItem(PlayerPickupItemEvent event)
+ {
+ if(event.isCancelled()) return;
+ ItemStack item = event.getItem().getItemStack();
+ User user = User.get(event.getPlayer());
+ if (EssentialsProtect.checkProtectionItems(EssentialsProtect.usageList, item.getTypeId()) && !user.isAuthorized("essentials.protect.exemptusage"))
+ {
+ event.setCancelled(true);
+ return;
+ }
+
+ if (EssentialsProtect.onUseAlert.contains(String.valueOf(item.getTypeId())))
+ {
+ parent.alert(user, item.getType().toString(), "used: ");
+ }
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectRegions.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectRegions.java
new file mode 100644
index 000000000..6a640f3e1
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectRegions.java
@@ -0,0 +1,5 @@
+package com.earth2me.essentials.protect;
+
+public class EssentialsProtectRegions {
+
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectSqlProperties.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectSqlProperties.java
new file mode 100644
index 000000000..30b2a7032
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectSqlProperties.java
@@ -0,0 +1,12 @@
+package com.earth2me.essentials.protect;
+
+public class EssentialsProtectSqlProperties {
+
+ public static String EssentialsProtect="CREATE TABLE IF NOT EXISTS `EssentialsProtect` (`id` int(11) NOT NULL AUTO_INCREMENT, `worldName` varchar(150) NOT NULL, `playerName` varchar(150) NOT NULL, `x` int(11) NOT NULL, `y` int(11) NOT NULL, `z` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=205 DEFAULT CHARSET=latin1";
+ public static String EssentialsProtect_sqlite = "CREATE TABLE IF NOT EXISTS EssentialsProtect (id INTEGER PRIMARY KEY, worldName TEXT ,playerName TEXT, x NUMERIC, y NUMERIC, z NUMERIC)";
+ public static String CountByLocation="SELECT COUNT(*) from EssentialsProtect where worldName = ? and x = ? and y = ? and z = ? limit 10";
+ public static String CountByPLayerLocation="SELECT COUNT(*) from EssentialsProtect where worldName = ? and playerName =? and x = ? and y = ? and z = ? limit 10";
+ public static String DeleteByLocation="DELETE FROM EssentialsProtect WHERE worldName=? and x=? and y=? and z=?";
+ public static String Insert="INSERT INTO EssentialsProtect (worldName, playerName, x, y, z) VALUES (?,?,?,?,?)";
+ public static String PlayerByLocation="SELECT playerName FROM EssentialsProtect WHERE worldname = ? and x = ? and y = ? and z = ? LIMIT 10";
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java
new file mode 100644
index 000000000..28b7e425b
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/data/IProtectedBlock.java
@@ -0,0 +1,15 @@
+package com.earth2me.essentials.protect.data;
+
+import java.util.List;
+import java.util.Set;
+import org.bukkit.block.Block;
+
+public interface IProtectedBlock {
+ public void clearProtections();
+ public void importProtections(List<OwnedBlock> blocks);
+ public List<OwnedBlock> exportProtections();
+ public void protectBlock(Block block, String playerName);
+ public boolean isProtected(Block block, String playerName);
+ public List<String> getOwners(Block block);
+ public int unprotectBlock(Block block);
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java
new file mode 100644
index 000000000..b9b036798
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/data/OwnedBlock.java
@@ -0,0 +1,9 @@
+package com.earth2me.essentials.protect.data;
+
+public class OwnedBlock {
+ int x;
+ int y;
+ int z;
+ String world;
+ String playerName;
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java
new file mode 100644
index 000000000..dec0231b9
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockJDBC.java
@@ -0,0 +1,292 @@
+package com.earth2me.essentials.protect.data;
+
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import java.beans.PropertyVetoException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.block.Block;
+
+public abstract class ProtectedBlockJDBC implements IProtectedBlock {
+ protected static final Logger logger = Logger.getLogger("Minecraft");
+ protected ComboPooledDataSource cpds;
+
+ protected abstract PreparedStatement getStatementCreateTable(Connection conn) throws SQLException;
+ protected abstract PreparedStatement getStatementDeleteAll(Connection conn) throws SQLException;
+ protected abstract PreparedStatement getStatementInsert(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException;
+ protected abstract PreparedStatement getStatementPlayerCountByLocation(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException;
+ protected abstract PreparedStatement getStatementPlayersByLocation(Connection conn, String name, int x, int y, int z) throws SQLException;
+ protected abstract PreparedStatement getStatementDeleteByLocation(Connection conn, String world, int x, int y, int z) throws SQLException;
+ protected abstract PreparedStatement getStatementAllBlocks(Connection conn) throws SQLException;
+
+ public ProtectedBlockJDBC(String driver, String url) throws PropertyVetoException {
+ this(driver, url, null, null);
+ }
+
+ public ProtectedBlockJDBC(String driver, String url, String username, String password) throws PropertyVetoException {
+ cpds = new ComboPooledDataSource();
+ cpds.setDriverClass(driver);
+ cpds.setJdbcUrl(url);
+ if (username != null) {
+ cpds.setUser(username);
+ cpds.setPassword(password);
+ }
+ cpds.setMaxStatements(20);
+ createAndConvertTable();
+ }
+
+
+ private void createAndConvertTable() {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementCreateTable(conn);
+ ps.execute();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ } finally {
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ public void clearProtections() {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementDeleteAll(conn);
+ ps.executeUpdate();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ } finally {
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ public void importProtections(List<OwnedBlock> blocks) {
+ for (OwnedBlock ownedBlock : blocks) {
+ if (ownedBlock.playerName == null) {
+ continue;
+ }
+ protectBlock(ownedBlock.world, ownedBlock.x, ownedBlock.y, ownedBlock.z, ownedBlock.playerName);
+ }
+ }
+
+ public List<OwnedBlock> exportProtections() {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ List<OwnedBlock> blocks = new ArrayList<OwnedBlock>();
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementAllBlocks(conn);
+ rs = ps.executeQuery();
+ while (rs.next()) {
+ OwnedBlock ob = new OwnedBlock();
+ ob.world = rs.getString(1);
+ ob.x = rs.getInt(2);
+ ob.y = rs.getInt(3);
+ ob.z = rs.getInt(4);
+ ob.playerName = rs.getString(5);
+ blocks.add(ob);
+ }
+ return blocks;
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return blocks;
+ } finally {
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ public void protectBlock(Block block, String playerName) {
+ protectBlock(block.getWorld().getName(), block.getX(), block.getY(), block.getZ(), playerName);
+ }
+
+ private void protectBlock(String world, int x, int y, int z, String playerName) {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementInsert(conn, world, x, y, z, playerName);
+ ps.executeUpdate();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ } finally {
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ public boolean isProtected(Block block, String playerName) {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementPlayerCountByLocation(conn, block.getWorld().getName(), block.getX(), block.getY(), block.getZ(), playerName);
+ rs = ps.executeQuery();
+ rs.next();
+ return rs.getInt(1) > 0 && rs.getInt(2) == 0;
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return true;
+ } finally {
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ public List<String> getOwners(Block block) {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ List<String> owners = new ArrayList<String>();
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementPlayersByLocation(conn, block.getWorld().getName(), block.getX(), block.getY(), block.getZ());
+ rs = ps.executeQuery();
+ while (rs.next()) {
+ owners.add(rs.getString(1));
+ }
+ return owners;
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return owners;
+ } finally {
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ public int unprotectBlock(Block block) {
+ Connection conn = null;
+ PreparedStatement ps = null;
+ try {
+ conn = cpds.getConnection();
+ ps = getStatementDeleteByLocation(conn, block.getWorld().getName(), block.getX(), block.getY(), block.getZ());
+ return ps.executeUpdate();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return 0;
+ } finally {
+ if (ps != null) {
+ try {
+ ps.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java
new file mode 100644
index 000000000..53dee66d2
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMemory.java
@@ -0,0 +1,205 @@
+package com.earth2me.essentials.protect.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.plugin.Plugin;
+
+public class ProtectedBlockMemory implements IProtectedBlock {
+
+ List<String> worlds = new ArrayList<String>();
+ List<String> playerNames = new ArrayList<String>();
+ IProtectedBlock storage;
+ Plugin plugin;
+
+ class ProtectedLocation {
+
+ int x;
+ int y;
+ int z;
+ int w;
+
+ private ProtectedLocation(Block block, int worldId) {
+ this.x = block.getX();
+ this.y = block.getY();
+ this.z = block.getZ();
+ this.w = worldId;
+ }
+
+ private ProtectedLocation(OwnedBlock ownedBlock, int worldId) {
+ this.x = ownedBlock.x;
+ this.y = ownedBlock.y;
+ this.z = ownedBlock.z;
+ this.w = worldId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ProtectedLocation) {
+ ProtectedLocation pl = (ProtectedLocation) o;
+ return x == pl.x && y == pl.y && z == pl.z && w == pl.w;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return x ^ y ^ z ^ w;
+ }
+ }
+
+ class ProtectedBy {
+
+ private int playerId = -1;
+ private Set<Integer> playerIds;
+
+ private ProtectedBy() {
+ }
+
+ private void add(int playerId) {
+ if (this.playerId == -1 || this.playerId == playerId) {
+ this.playerId = playerId;
+ } else {
+ if (playerIds == null) {
+ playerIds = new HashSet<Integer>(4);
+ playerIds.add(this.playerId);
+ }
+ playerIds.add(playerId);
+ }
+ }
+
+ private boolean contains(int playerId) {
+ if (playerIds == null) {
+ return this.playerId == playerId;
+ }
+ return playerIds.contains(playerId);
+ }
+
+ private List<String> getPlayers(List<String> playerNames) {
+ if (playerIds == null) {
+ List<String> list = new ArrayList<String>(2);
+ list.add(playerNames.get(playerId));
+ return list;
+ }
+ List<String> list = new ArrayList<String>(playerIds.size());
+ for (Integer integer : playerIds) {
+ list.add(playerNames.get(integer));
+ }
+ return list;
+ }
+
+ private int size() {
+ if (playerIds == null) {
+ return 1;
+ }
+ return playerIds.size();
+ }
+ }
+ HashMap<ProtectedLocation, ProtectedBy> blocks = new HashMap<ProtectedLocation, ProtectedBy>();
+
+ public ProtectedBlockMemory(IProtectedBlock storage) {
+ this.storage = storage;
+ importProtections(storage.exportProtections());
+ }
+
+ public void clearProtections() {
+ blocks.clear();
+ }
+
+ public final void importProtections(List<OwnedBlock> blocks) {
+ for (OwnedBlock ownedBlock : blocks) {
+ ProtectedLocation pl = new ProtectedLocation(ownedBlock, getWorldId(ownedBlock.world));
+ if (ownedBlock.playerName == null) {
+ continue;
+ }
+ protectBlock(pl, ownedBlock.playerName);
+ }
+ }
+
+ public List<OwnedBlock> exportProtections() {
+ List<OwnedBlock> blockList = new ArrayList<OwnedBlock>(blocks.size());
+ for (Entry<ProtectedLocation, ProtectedBy> entry : blocks.entrySet()) {
+ for (String name : entry.getValue().getPlayers(playerNames)) {
+ OwnedBlock ob = new OwnedBlock();
+ ob.x = entry.getKey().x;
+ ob.y = entry.getKey().y;
+ ob.z = entry.getKey().z;
+ ob.world = worlds.get(entry.getKey().w);
+ ob.playerName = name;
+ blockList.add(ob);
+ }
+ }
+ return blockList;
+ }
+
+ public void protectBlock(final Block block, final String playerName) {
+ ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld()));
+ protectBlock(pl, playerName);
+ plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, new Runnable() {
+ public void run() {
+ storage.protectBlock(block, playerName);
+ }
+ });
+ }
+
+ private void protectBlock(ProtectedLocation pl, String playerName) {
+ int playerId = getPlayerId(playerName);
+ ProtectedBy pb = blocks.get(pl);
+ if (pb == null) {
+ pb = new ProtectedBy();
+ blocks.put(pl, pb);
+ }
+ pb.add(playerId);
+ }
+
+ public boolean isProtected(Block block, String playerName) {
+ int playerId = getPlayerId(playerName);
+ ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld()));
+ ProtectedBy pb = blocks.get(pl);
+ return !pb.contains(playerId);
+ }
+
+ public List<String> getOwners(Block block) {
+ ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld()));
+ ProtectedBy pb = blocks.get(pl);
+ return pb.getPlayers(playerNames);
+ }
+
+ public int unprotectBlock(final Block block) {
+ ProtectedLocation pl = new ProtectedLocation(block, getWorldId(block.getWorld()));
+ ProtectedBy pb = blocks.remove(pl);
+ plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, new Runnable() {
+ public void run() {
+ storage.unprotectBlock(block);
+ }
+ });
+ return pb.size();
+ }
+
+ private int getPlayerId(String playername) {
+ int id = playerNames.indexOf(playername);
+ if (id < 0) {
+ playerNames.add(playername);
+ id = playerNames.indexOf(playername);
+ }
+ return id;
+ }
+
+ private int getWorldId(World world) {
+ return getWorldId(world.getName());
+ }
+
+ private int getWorldId(String name) {
+ int id = worlds.indexOf(name);
+ if (id < 0) {
+ worlds.add(name);
+ id = worlds.indexOf(name);
+ }
+ return id;
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java
new file mode 100644
index 000000000..8824f4040
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockMySQL.java
@@ -0,0 +1,89 @@
+package com.earth2me.essentials.protect.data;
+
+import java.beans.PropertyVetoException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class ProtectedBlockMySQL extends ProtectedBlockJDBC {
+
+ public ProtectedBlockMySQL(String url, String username, String password) throws PropertyVetoException {
+ super("com.mysql.jdbc.Driver", url, username, password);
+ }
+
+ private static final String QueryCreateTable =
+ "CREATE TABLE IF NOT EXISTS `EssentialsProtectedBlocks` ("
+ + "`worldName` varchar(150) NOT NULL,"
+ + "`x` int(11) NOT NULL, `y` int(11) NOT NULL, `z` int(11) NOT NULL,"
+ + "`playerName` varchar(150) NOT NULL,"
+ + ") ENGINE=MyISAM DEFAULT CHARSET=utf8";
+
+ @Override
+ protected PreparedStatement getStatementCreateTable(Connection conn) throws SQLException {
+ return conn.prepareStatement(QueryCreateTable);
+ }
+ private static final String QueryDeleteAll = "DELETE FROM EssentialsProtectedBlocks;";
+
+ @Override
+ protected PreparedStatement getStatementDeleteAll(Connection conn) throws SQLException {
+ return conn.prepareStatement(QueryDeleteAll);
+ }
+ private static final String QueryInsert =
+ "INSERT INTO EssentialsProtectedBlocks (worldName, x, y, z, playerName) VALUES (?, ?, ?, ?, ?);";
+
+ @Override
+ protected PreparedStatement getStatementInsert(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryInsert);
+ ps.setString(1, world);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ ps.setString(5, playerName);
+ return ps;
+ }
+ private static final String QueryCountByPlayer =
+ "SELECT COUNT(playerName), SUM(playerName = ?) FROM EssentialsProtectedBlocks "
+ + "WHERE worldName = ? AND x = ? AND y = ? AND z = ? GROUP BY x;";
+
+ @Override
+ protected PreparedStatement getStatementPlayerCountByLocation(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryCountByPlayer);
+ ps.setString(1, playerName);
+ ps.setString(2, world);
+ ps.setInt(3, x);
+ ps.setInt(4, y);
+ ps.setInt(5, z);
+ return ps;
+ }
+ private static final String QueryPlayersByLocation =
+ "SELECT playerName FROM EssentialsProtectedBlocks WHERE worldname = ? AND x = ? AND y = ? AND z = ?;";
+
+ @Override
+ protected PreparedStatement getStatementPlayersByLocation(Connection conn, String world, int x, int y, int z) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryPlayersByLocation);
+ ps.setString(1, world);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ return ps;
+ }
+ private static final String QueryDeleteByLocation =
+ "DELETE FROM EssentialsProtectedBlocks WHERE worldName = ? AND x = ? AND y = ? AND z = ?;";
+
+ @Override
+ protected PreparedStatement getStatementDeleteByLocation(Connection conn, String world, int x, int y, int z) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryDeleteByLocation);
+ ps.setString(1, world);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ return ps;
+ }
+ private static final String QueryAllBlocks =
+ "SELECT worldName, x, y, z, playerName FROM EssentialsProtectedBlocks;";
+
+ @Override
+ protected PreparedStatement getStatementAllBlocks(Connection conn) throws SQLException {
+ return conn.prepareStatement(QueryAllBlocks);
+ }
+}
diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java
new file mode 100644
index 000000000..ff96a8952
--- /dev/null
+++ b/EssentialsProtect/src/com/earth2me/essentials/protect/data/ProtectedBlockSQLite.java
@@ -0,0 +1,87 @@
+package com.earth2me.essentials.protect.data;
+
+import java.beans.PropertyVetoException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class ProtectedBlockSQLite extends ProtectedBlockJDBC {
+
+ public ProtectedBlockSQLite(String url) throws PropertyVetoException {
+ super("org.sqlite.JDBC", url);
+ }
+
+ private static final String QueryCreateTable =
+ "CREATE TABLE IF NOT EXISTS EssentialsProtect ("
+ + "worldName TEXT ,playerName TEXT, "
+ + "x NUMERIC, y NUMERIC, z NUMERIC)";
+
+ @Override
+ protected PreparedStatement getStatementCreateTable(Connection conn) throws SQLException {
+ return conn.prepareStatement(QueryCreateTable);
+ }
+ private static final String QueryDeleteAll = "DELETE FROM EssentialsProtectedBlocks;";
+
+ @Override
+ protected PreparedStatement getStatementDeleteAll(Connection conn) throws SQLException {
+ return conn.prepareStatement(QueryDeleteAll);
+ }
+ private static final String QueryInsert =
+ "INSERT INTO EssentialsProtectedBlocks (worldName, x, y, z, playerName) VALUES (?, ?, ?, ?, ?);";
+
+ @Override
+ protected PreparedStatement getStatementInsert(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryInsert);
+ ps.setString(1, world);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ ps.setString(5, playerName);
+ return ps;
+ }
+ private static final String QueryPlayerCountByLocation =
+ "SELECT COUNT(playerName), SUM(playerName = ?) FROM EssentialsProtectedBlocks "
+ + "WHERE worldName = ? AND x = ? AND y = ? AND z = ? GROUP BY x;";
+
+ @Override
+ protected PreparedStatement getStatementPlayerCountByLocation(Connection conn, String world, int x, int y, int z, String playerName) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryPlayerCountByLocation);
+ ps.setString(1, playerName);
+ ps.setString(2, world);
+ ps.setInt(3, x);
+ ps.setInt(4, y);
+ ps.setInt(5, z);
+ return ps;
+ }
+ private static final String QueryPlayersByLocation =
+ "SELECT playerName FROM EssentialsProtectedBlocks WHERE worldname = ? AND x = ? AND y = ? AND z = ?;";
+
+ @Override
+ protected PreparedStatement getStatementPlayersByLocation(Connection conn, String world, int x, int y, int z) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryPlayersByLocation);
+ ps.setString(1, world);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ return ps;
+ }
+ private static final String QueryDeleteByLocation =
+ "DELETE FROM EssentialsProtectedBlocks WHERE worldName = ? AND x = ? AND y = ? AND z = ?;";
+
+ @Override
+ protected PreparedStatement getStatementDeleteByLocation(Connection conn, String world, int x, int y, int z) throws SQLException {
+ PreparedStatement ps = conn.prepareStatement(QueryDeleteByLocation);
+ ps.setString(1, world);
+ ps.setInt(2, x);
+ ps.setInt(3, y);
+ ps.setInt(4, z);
+ return ps;
+ }
+ private static final String QueryAllBlocks =
+ "SELECT worldName, x, y, z, playerName FROM EssentialsProtectedBlocks;";
+
+ @Override
+ protected PreparedStatement getStatementAllBlocks(Connection conn) throws SQLException {
+ return conn.prepareStatement(QueryAllBlocks);
+ }
+}
diff --git a/EssentialsProtect/src/plugin.yml b/EssentialsProtect/src/plugin.yml
new file mode 100644
index 000000000..c6f7830c1
--- /dev/null
+++ b/EssentialsProtect/src/plugin.yml
@@ -0,0 +1,8 @@
+# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
+name: EssentialsProtect
+main: com.earth2me.essentials.protect.EssentialsProtect
+# Note to developers: This next line cannot change, or the automatic versioning system will break.
+version: TeamCity
+website: http://www.earth2me.net:8001/
+description: Provides protection for various parts of the world.
+authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo] \ No newline at end of file
diff --git a/EssentialsSpawn/build.xml b/EssentialsSpawn/build.xml
new file mode 100644
index 000000000..7dfcbb707
--- /dev/null
+++ b/EssentialsSpawn/build.xml
@@ -0,0 +1,76 @@
+<?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>
diff --git a/EssentialsSpawn/nbproject/build-impl.xml b/EssentialsSpawn/nbproject/build-impl.xml
new file mode 100644
index 000000000..d343051e5
--- /dev/null
+++ b/EssentialsSpawn/nbproject/build-impl.xml
@@ -0,0 +1,1072 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT ***
+*** EDIT ../build.xml INSTEAD ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+ - initialization
+ - compilation
+ - jar
+ - execution
+ - debugging
+ - javadoc
+ - junit compilation
+ - junit execution
+ - junit debugging
+ - applet
+ - cleanup
+
+ -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsSpawn-impl">
+ <fail message="Please build using Ant 1.7.1 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.7.1"/>
+ </not>
+ </condition>
+ </fail>
+ <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+ <!--
+ ======================
+ INITIALIZATION SECTION
+ ======================
+ -->
+ <target name="-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init" name="-init-private">
+ <property file="nbproject/private/config.properties"/>
+ <property file="nbproject/private/configs/${config}.properties"/>
+ <property file="nbproject/private/private.properties"/>
+ </target>
+ <target name="-pre-init-libraries">
+ <property location="../lib\nblibraries.properties" name="libraries.path"/>
+ <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/>
+ <pathconvert dirsep="/" property="libraries.dir">
+ <path path="${libraries.dir.nativedirsep}"/>
+ </pathconvert>
+ <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/>
+ <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/>
+ </target>
+ <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries">
+ <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}">
+ <filterchain>
+ <replacestring from="$${base}" to="${libraries.dir}"/>
+ <escapeunicode/>
+ </filterchain>
+ </loadproperties>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries" name="-init-user">
+ <property file="${user.properties.file}"/>
+ <!-- The two properties below are usually overridden -->
+ <!-- by the active platform. Just a fallback. -->
+ <property name="default.javac.source" value="1.4"/>
+ <property name="default.javac.target" value="1.4"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project">
+ <property file="nbproject/configs/${config}.properties"/>
+ <property file="nbproject/project.properties"/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <available file="${manifest.file}" property="manifest.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
+ <condition property="main.class.available">
+ <and>
+ <isset property="main.class"/>
+ <not>
+ <equals arg1="${main.class}" arg2="" trim="true"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class">
+ <and>
+ <isset property="manifest.available"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ </and>
+ </condition>
+ <condition property="manifest.available+main.class+mkdist.available">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available">
+ <and>
+ <isset property="manifest.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+main.class.available">
+ <and>
+ <isset property="main.class.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+splashscreen.available">
+ <and>
+ <isset property="splashscreen.available"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="do.archive+manifest.available+main.class">
+ <and>
+ <istrue value="${manifest.available+main.class}"/>
+ <istrue value="${do.archive}"/>
+ </and>
+ </condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="have.tests">
+ <or>
+ <available file="${test.src.dir}"/>
+ </or>
+ </condition>
+ <condition property="have.sources">
+ <or>
+ <available file="${src.dir}"/>
+ </or>
+ </condition>
+ <condition property="netbeans.home+have.tests">
+ <and>
+ <isset property="netbeans.home"/>
+ <isset property="have.tests"/>
+ </and>
+ </condition>
+ <condition property="no.javadoc.preview">
+ <and>
+ <isset property="javadoc.preview"/>
+ <isfalse value="${javadoc.preview}"/>
+ </and>
+ </condition>
+ <property name="run.jvmargs" value=""/>
+ <property name="javac.compilerargs" value=""/>
+ <property name="work.dir" value="${basedir}"/>
+ <condition property="no.deps">
+ <and>
+ <istrue value="${no.dependencies}"/>
+ </and>
+ </condition>
+ <property name="javac.debug" value="true"/>
+ <property name="javadoc.preview" value="true"/>
+ <property name="application.args" value=""/>
+ <property name="source.encoding" value="${file.encoding}"/>
+ <property name="runtime.encoding" value="${source.encoding}"/>
+ <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+ <and>
+ <isset property="javadoc.encoding"/>
+ <not>
+ <equals arg1="${javadoc.encoding}" arg2=""/>
+ </not>
+ </and>
+ </condition>
+ <property name="javadoc.encoding.used" value="${source.encoding}"/>
+ <property name="includes" value="**"/>
+ <property name="excludes" value=""/>
+ <property name="do.depend" value="false"/>
+ <condition property="do.depend.true">
+ <istrue value="${do.depend}"/>
+ </condition>
+ <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+ <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+ <length length="0" string="${endorsed.classpath}" when="greater"/>
+ </condition>
+ <property name="javac.fork" value="false"/>
+ <property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
+ <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+ </target>
+ <target name="-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check">
+ <fail unless="src.dir">Must set src.dir</fail>
+ <fail unless="test.src.dir">Must set test.src.dir</fail>
+ <fail unless="build.dir">Must set build.dir</fail>
+ <fail unless="dist.dir">Must set dist.dir</fail>
+ <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+ <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+ <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+ <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+ <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+ <fail unless="dist.jar">Must set dist.jar</fail>
+ </target>
+ <target name="-init-macrodef-property">
+ <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${@{value}}"/>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <sequential>
+ <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </depend>
+ </sequential>
+ </macrodef>
+ <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <sequential>
+ <fail unless="javac.includes">Must set javac.includes</fail>
+ <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+ <path>
+ <filelist dir="@{destdir}" files="${javac.includes}"/>
+ </path>
+ <globmapper from="*.java" to="*.class"/>
+ </pathconvert>
+ <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+ <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+ <delete>
+ <files includesfile="${javac.includesfile.binary}"/>
+ </delete>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-junit">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <sequential>
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ </batchtest>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
+ <jvmarg line="${run.jvmargs}"/>
+ </junit>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+ <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <attribute default="" name="stopclassname"/>
+ <sequential>
+ <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ </nbjpdastart>
+ </sequential>
+ </macrodef>
+ <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${build.classes.dir}" name="dir"/>
+ <sequential>
+ <nbjpdareload>
+ <fileset dir="@{dir}" includes="${fix.classes}">
+ <include name="${fix.includes}*.class"/>
+ </fileset>
+ </nbjpdareload>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-debug-args">
+ <property name="version-output" value="java version &quot;${ant.java.version}"/>
+ <condition property="have-jdk-older-than-1.4">
+ <or>
+ <contains string="${version-output}" substring="java version &quot;1.0"/>
+ <contains string="${version-output}" substring="java version &quot;1.1"/>
+ <contains string="${version-output}" substring="java version &quot;1.2"/>
+ <contains string="${version-output}" substring="java version &quot;1.3"/>
+ </or>
+ </condition>
+ <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+ <istrue value="${have-jdk-older-than-1.4}"/>
+ </condition>
+ <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+ <os family="windows"/>
+ </condition>
+ <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+ <isset property="debug.transport"/>
+ </condition>
+ </target>
+ <target depends="-init-debug-args" name="-init-macrodef-debug">
+ <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg line="${debug-args-line}"/>
+ <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-java">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" fork="true">
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-macrodef-copylibs">
+ <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <pathconvert property="run.classpath.without.build.classes.dir">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to=""/>
+ </pathconvert>
+ <pathconvert pathsep=" " property="jar.classpath">
+ <path path="${run.classpath.without.build.classes.dir}"/>
+ <chainedmapper>
+ <flattenmapper/>
+ <globmapper from="*" to="lib/*"/>
+ </chainedmapper>
+ </pathconvert>
+ <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <fileset dir="${build.classes.dir}"/>
+ <manifest>
+ <attribute name="Class-Path" value="${jar.classpath}"/>
+ <customize/>
+ </manifest>
+ </copylibs>
+ </sequential>
+ </macrodef>
+ </target>
+ <target name="-init-presetdef-jar">
+ <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+ <j2seproject1:fileset dir="${build.classes.dir}"/>
+ </jar>
+ </presetdef>
+ </target>
+ <target name="-init-ap-cmdline-properties">
+ <property name="annotation.processing.enabled" value="true"/>
+ <property name="annotation.processing.processors.list" value=""/>
+ <property name="annotation.processing.processor.options" value=""/>
+ <property name="annotation.processing.run.all.processors" value="true"/>
+ <property name="javac.processorpath" value="${javac.classpath}"/>
+ <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+ <condition property="ap.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+ <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+ <isfalse value="${annotation.processing.run.all.processors}"/>
+ </condition>
+ <condition else="" property="ap.proc.none.internal" value="-proc:none">
+ <isfalse value="${annotation.processing.enabled}"/>
+ </condition>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+ <property name="ap.cmd.line.internal" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+ <!--
+ ===================
+ COMPILATION SECTION
+ ===================
+ -->
+ <target name="-deps-jar-init" unless="built-jar.properties">
+ <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+ <delete file="${built-jar.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+ <echo level="warn" message="Cycle detected: EssentialsSpawn was already built"/>
+ </target>
+ <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-jar.properties}" verbose="false"/>
+ <property file="${built-jar.properties}" prefix="already.built.jar."/>
+ <antcall target="-warn-already-built-jar"/>
+ <propertyfile file="${built-jar.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-jar.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="jar"/>
+ <param name="transfer.built-jar.properties" value="${built-jar.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+ <target depends="init" name="-check-automatic-build">
+ <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+ </target>
+ <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+ <antcall target="clean"/>
+ </target>
+ <target depends="init,deps-jar" name="-pre-pre-compile">
+ <mkdir dir="${build.classes.dir}"/>
+ </target>
+ <target name="-pre-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-depend">
+ <pathconvert property="build.generated.subdirs">
+ <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </pathconvert>
+ <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+ <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+ <copy todir="${build.classes.dir}">
+ <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target if="has.persistence.xml" name="-copy-persistence-xml">
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy todir="${build.classes.dir}/META-INF">
+ <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+ </copy>
+ </target>
+ <target name="-post-compile">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+ <target name="-pre-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ </target>
+ <target name="-post-compile-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+ <!--
+ ====================
+ JAR BUILDING SECTION
+ ====================
+ -->
+ <target depends="init" name="-pre-pre-jar">
+ <dirname file="${dist.jar}" property="dist.jar.dir"/>
+ <mkdir dir="${dist.jar.dir}"/>
+ </target>
+ <target name="-pre-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+ <j2seproject1:jar/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}"/>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+ <j2seproject1:jar manifest="${manifest.file}">
+ <j2seproject1:manifest>
+ <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+ </j2seproject1:manifest>
+ </j2seproject1:jar>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <pathconvert property="run.classpath.with.dist.jar">
+ <path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+ </pathconvert>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ </target>
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+ <basename file="${application.splash}" property="splashscreen.basename"/>
+ <mkdir dir="${build.classes.dir}/META-INF"/>
+ <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
+ <property location="${dist.jar}" name="dist.jar.resolved"/>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
+ </target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+ <target name="-post-jar">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ EXECUTION SECTION
+ =================
+ -->
+ <target depends="init,compile" description="Run a main class." name="run">
+ <j2seproject1:java>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <target name="-do-not-recompile">
+ <property name="javac.includes.binary" value=""/>
+ </target>
+ <target depends="init,compile-single" name="run-single">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}"/>
+ </target>
+ <target depends="init,compile-test-single" name="run-test-with-main">
+ <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+ <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+ </target>
+ <!--
+ =================
+ DEBUGGING SECTION
+ =================
+ -->
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+ <j2seproject1:nbjpdastart name="${debug.class}"/>
+ </target>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+ </target>
+ <target depends="init,compile" name="-debug-start-debuggee">
+ <j2seproject3:debug>
+ <customize>
+ <arg line="${application.args}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+ <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+ <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+ </target>
+ <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}"/>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+ <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+ <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+ <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+ <target depends="init" name="-pre-debug-fix">
+ <fail unless="fix.includes">Must set fix.includes</fail>
+ <property name="javac.includes" value="${fix.includes}.java"/>
+ </target>
+ <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+ <j2seproject1:nbjpdareload/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+ <!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
+ ===============
+ JAVADOC SECTION
+ ===============
+ -->
+ <target depends="init" if="have.sources" name="-javadoc-build">
+ <mkdir dir="${dist.javadoc.dir}"/>
+ <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+ <classpath>
+ <path path="${javac.classpath}"/>
+ </classpath>
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/*.java"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/*.java"/>
+ </fileset>
+ </javadoc>
+ <copy todir="${dist.javadoc.dir}">
+ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+ <filename name="**/doc-files/**"/>
+ </fileset>
+ <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+ <include name="**/doc-files/**"/>
+ </fileset>
+ </copy>
+ </target>
+ <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+ <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+ </target>
+ <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+ <!--
+ =========================
+ JUNIT COMPILATION SECTION
+ =========================
+ -->
+ <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+ <mkdir dir="${build.test.classes.dir}"/>
+ </target>
+ <target name="-pre-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target if="do.depend.true" name="-compile-test-depend">
+ <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+ <target name="-pre-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+ <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <copy todir="${build.test.classes.dir}">
+ <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+ </copy>
+ </target>
+ <target name="-post-compile-test-single">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+ <!--
+ =======================
+ JUNIT EXECUTION SECTION
+ =======================
+ -->
+ <target depends="init" if="have.tests" name="-pre-test-run">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <j2seproject3:junit testincludes="**/*Test.java"/>
+ </target>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init" if="have.tests" name="test-report"/>
+ <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+ <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+ <target depends="init" if="have.tests" name="-pre-test-run-single">
+ <mkdir dir="${build.test.results.dir}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+ <j2seproject3:junit excludes="" includes="${test.includes}"/>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+ <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+ </target>
+ <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <!--
+ =======================
+ JUNIT DEBUGGING SECTION
+ =======================
+ -->
+ <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+ <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+ <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+ <delete file="${test.report.file}"/>
+ <mkdir dir="${build.test.results.dir}"/>
+ <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+ <customize>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <arg value="${test.class}"/>
+ <arg value="showoutput=true"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+ <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+ <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+ </target>
+ <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+ <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+ </target>
+ <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+ <!--
+ =========================
+ APPLET EXECUTION SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" name="run-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject1:java classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject1:java>
+ </target>
+ <!--
+ =========================
+ APPLET DEBUGGING SECTION
+ =========================
+ -->
+ <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+ <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+ <j2seproject3:debug classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </j2seproject3:debug>
+ </target>
+ <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+ <!--
+ ===============
+ CLEANUP SECTION
+ ===============
+ -->
+ <target name="-deps-clean-init" unless="built-clean.properties">
+ <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+ <delete file="${built-clean.properties}" quiet="true"/>
+ </target>
+ <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+ <echo level="warn" message="Cycle detected: EssentialsSpawn was already built"/>
+ </target>
+ <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+ <mkdir dir="${build.dir}"/>
+ <touch file="${built-clean.properties}" verbose="false"/>
+ <property file="${built-clean.properties}" prefix="already.built.clean."/>
+ <antcall target="-warn-already-built-clean"/>
+ <propertyfile file="${built-clean.properties}">
+ <entry key="${basedir}" value=""/>
+ </propertyfile>
+ <antcall target="-maybe-call-dep">
+ <param name="call.built.properties" value="${built-clean.properties}"/>
+ <param location="${project.Essentials}" name="call.subproject"/>
+ <param location="${project.Essentials}/build.xml" name="call.script"/>
+ <param name="call.target" value="clean"/>
+ <param name="transfer.built-clean.properties" value="${built-clean.properties}"/>
+ </antcall>
+ </target>
+ <target depends="init" name="-do-clean">
+ <delete dir="${build.dir}"/>
+ <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+ </target>
+ <target name="-post-clean">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+ <target name="-check-call-dep">
+ <property file="${call.built.properties}" prefix="already.built."/>
+ <condition property="should.call.dep">
+ <not>
+ <isset property="already.built.${call.subproject}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+ <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+ <propertyset>
+ <propertyref prefix="transfer."/>
+ <mapper from="transfer.*" to="*" type="glob"/>
+ </propertyset>
+ </ant>
+ </target>
+</project>
diff --git a/EssentialsSpawn/nbproject/genfiles.properties b/EssentialsSpawn/nbproject/genfiles.properties
new file mode 100644
index 000000000..790af6977
--- /dev/null
+++ b/EssentialsSpawn/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+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=c9db80de
+nbproject/build-impl.xml.stylesheet.CRC32=19debb58@1.42.1.45
diff --git a/EssentialsSpawn/nbproject/private/private.properties b/EssentialsSpawn/nbproject/private/private.properties
new file mode 100644
index 000000000..94183418a
--- /dev/null
+++ b/EssentialsSpawn/nbproject/private/private.properties
@@ -0,0 +1 @@
+user.properties.file=C:\\Users\\Paul\\.netbeans\\7.0beta2\\build.properties
diff --git a/EssentialsSpawn/nbproject/project.properties b/EssentialsSpawn/nbproject/project.properties
new file mode 100644
index 000000000..1c4af9a9a
--- /dev/null
+++ b/EssentialsSpawn/nbproject/project.properties
@@ -0,0 +1,76 @@
+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=Paul
+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.craftbukkit-0.0.1-SNAPSHOT.jar=..\\lib\\craftbukkit-0.0.1-SNAPSHOT.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+ ${reference.Essentials.jar}:\
+ ${file.reference.craftbukkit-0.0.1-SNAPSHOT.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}:\
+ ${libs.junit.classpath}:\
+ ${libs.junit_4.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
+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
diff --git a/EssentialsSpawn/nbproject/project.xml b/EssentialsSpawn/nbproject/project.xml
new file mode 100644
index 000000000..8de247766
--- /dev/null
+++ b/EssentialsSpawn/nbproject/project.xml
@@ -0,0 +1,28 @@
+<?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>
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java
new file mode 100644
index 000000000..e64985737
--- /dev/null
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java
@@ -0,0 +1,24 @@
+package com.earth2me.essentials.spawn;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+
+
+public class Commandsetspawn extends EssentialsCommand
+{
+ public Commandsetspawn()
+ {
+ super("setspawn");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.charge(this);
+ String group = args.length > 0 ? getFinalArg(args, 0) : "default";
+ parent.spawn.setSpawn(user.getLocation(), group);
+ user.sendMessage("§7Spawn location set for group \"" + group + "\".");
+ }
+}
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java
new file mode 100644
index 000000000..c26cc9e37
--- /dev/null
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java
@@ -0,0 +1,23 @@
+package com.earth2me.essentials.spawn;
+
+import org.bukkit.Server;
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.commands.EssentialsCommand;
+
+
+public class Commandspawn extends EssentialsCommand
+{
+ public Commandspawn()
+ {
+ super("spawn");
+ }
+
+ @Override
+ public void run(Server server, Essentials parent, User user, String commandLabel, String[] args) throws Exception
+ {
+ user.canAfford(this);
+ user.teleportCooldown();
+ user.respawn(Essentials.getStatic().spawn, this.getName());
+ }
+}
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java
new file mode 100644
index 000000000..54e6bd198
--- /dev/null
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java
@@ -0,0 +1,65 @@
+package com.earth2me.essentials.spawn;
+
+import java.io.*;
+import java.util.logging.*;
+import com.earth2me.essentials.*;
+import org.bukkit.command.*;
+import org.bukkit.event.Event.Priority;
+import org.bukkit.event.Event.Type;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.java.*;
+
+
+public class EssentialsSpawn extends JavaPlugin
+{
+ public static final String AUTHORS = Essentials.AUTHORS;
+ private static final Logger logger = Logger.getLogger("Minecraft");
+
+ public EssentialsSpawn() throws IOException
+ {
+
+ }
+
+ @SuppressWarnings("LoggerStringConcat")
+ public void onEnable()
+ {
+ Plugin p = this.getServer().getPluginManager().getPlugin("Essentials");
+ if (p != null) {
+ if (!this.getServer().getPluginManager().isPluginEnabled(p)) {
+ this.getServer().getPluginManager().enablePlugin(p);
+ }
+ }
+ EssentialsSpawnPlayerListener playerListener = new EssentialsSpawnPlayerListener();
+ getServer().getPluginManager().registerEvent(Type.PLAYER_RESPAWN, playerListener, Priority.Low, this);
+ getServer().getPluginManager().registerEvent(Type.PLAYER_JOIN, playerListener, Priority.Low, this);
+
+ if (!this.getDescription().getVersion().equals(Essentials.getStatic().getDescription().getVersion())) {
+ logger.log(Level.WARNING, "Version mismatch! Please update all Essentials jars to the same version.");
+ }
+ logger.info("Loaded " + this.getDescription().getName() + " build " + this.getDescription().getVersion() + " maintained by " + AUTHORS);
+ }
+
+ public void onDisable()
+ {
+ }
+
+ @SuppressWarnings(
+ {
+ "LoggerStringConcat", "CallToThreadDumpStack"
+ })
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args)
+ {
+ try
+ {
+ Essentials.loadClasses();
+ Essentials.previewCommand(sender, command, commandLabel, args);
+ return EssentialsSpawnWorker.onCommand(sender, command, commandLabel, args);
+ }
+ catch (Throwable ex)
+ {
+ ex.printStackTrace();
+ return true;
+ }
+ }
+}
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java
new file mode 100644
index 000000000..697939daa
--- /dev/null
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java
@@ -0,0 +1,51 @@
+package com.earth2me.essentials.spawn;
+
+import com.earth2me.essentials.Essentials;
+import com.earth2me.essentials.User;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerListener;
+import org.bukkit.event.player.PlayerRespawnEvent;
+
+
+public class EssentialsSpawnPlayerListener extends PlayerListener
+{
+ @Override
+ public void onPlayerRespawn(PlayerRespawnEvent event)
+ {
+ Essentials.loadClasses();
+ User user = User.get(event.getPlayer());
+
+ try
+ {
+ if (Essentials.getSettings().getRespawnAtHome())
+ {
+ event.setRespawnLocation(user.getHome());
+ return;
+ }
+ }
+ catch (Throwable ex)
+ {
+ }
+ event.setRespawnLocation(Essentials.getStatic().spawn.getSpawn(user.getGroup()));
+ }
+
+ @Override
+ public void onPlayerJoin(PlayerJoinEvent event)
+ {
+ Essentials.loadClasses();
+ User user = User.get(event.getPlayer());
+
+ if (!user.isNew()) return;
+ user.clearNewFlag();
+ try {
+ user.teleportToNow(Essentials.getStatic().spawn.getSpawn(Essentials.getSettings().getNewbieSpawn()));
+ } catch (Exception ex) {
+ Logger.getLogger("Minecraft").log(Level.WARNING, "Failed to teleport new player", ex);
+ }
+
+ if (Essentials.getSettings().getAnnounceNewPlayers())
+ Essentials.getStatic().getServer().broadcastMessage(Essentials.getSettings().getAnnounceNewPlayerFormat(user));
+ }
+}
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnWorker.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnWorker.java
new file mode 100644
index 000000000..d6e34db55
--- /dev/null
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnWorker.java
@@ -0,0 +1,56 @@
+package com.earth2me.essentials.spawn;
+
+import java.util.logging.*;
+import com.earth2me.essentials.*;
+import com.earth2me.essentials.commands.IEssentialsCommand;
+import org.bukkit.command.*;
+
+
+public class EssentialsSpawnWorker
+{
+ private static final Logger logger = Logger.getLogger("Minecraft");
+
+ @SuppressWarnings(
+ {
+ "LoggerStringConcat", "CallToThreadDumpStack"
+ })
+ public static boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args)
+ {
+ User user = User.get(sender);
+
+ IEssentialsCommand cmd;
+ try
+ {
+ cmd = (IEssentialsCommand)EssentialsSpawn.class.getClassLoader().loadClass("com.earth2me.essentials.spawn.Command" + command.getName()).newInstance();
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage("§cThat command is improperly loaded.");
+ ex.printStackTrace();
+ return true;
+ }
+
+ // Check authorization
+ if (user != null && !user.isAuthorized(cmd))
+ {
+ logger.warning(user.getName() + " was denied access to command.");
+ user.sendMessage("§cYou do not have access to that command.");
+ return true;
+ }
+
+ // Run the command
+ try
+ {
+ if (user == null)
+ cmd.run(Essentials.getStatic().getServer(), Essentials.getStatic(), sender, commandLabel, command, args);
+ else
+ cmd.run(Essentials.getStatic().getServer(), Essentials.getStatic(), user, commandLabel, command, args);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ sender.sendMessage((user == null ? "" : "§c") + "Error: " + ex.getMessage());
+ return true;
+ }
+ }
+}
diff --git a/EssentialsSpawn/src/plugin.yml b/EssentialsSpawn/src/plugin.yml
new file mode 100644
index 000000000..de4e39b15
--- /dev/null
+++ b/EssentialsSpawn/src/plugin.yml
@@ -0,0 +1,15 @@
+# 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://www.earth2me.net:8001/
+description: Provides spawn control commands, utilizing Essentials.
+authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo]
+commands:
+ setspawn:
+ description: Set the spawnpoint to your current position.
+ usage: /<command> <group>
+ spawn:
+ description: Teleport to the spawnpoint.
+ usage: /<command> \ No newline at end of file
diff --git a/build.inc.xml b/build.inc.xml
new file mode 100644
index 000000000..2d6c69944
--- /dev/null
+++ b/build.inc.xml
@@ -0,0 +1,7 @@
+<target name="-post-jar">
+ <jar destfile="${dist.jar}" update="true">
+ <manifest>
+ <attribute name="Classpath" value="Essentials.jar"/>
+ </manifest>
+ </jar>
+</target>
diff --git a/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar
new file mode 100644
index 000000000..5ee71d2e3
--- /dev/null
+++ b/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar
Binary files differ
diff --git a/lib/Permissions.jar b/lib/Permissions.jar
new file mode 100644
index 000000000..e2aa6520b
--- /dev/null
+++ b/lib/Permissions.jar
Binary files differ
diff --git a/lib/c3p0-0.9.1.2.jar b/lib/c3p0-0.9.1.2.jar
new file mode 100644
index 000000000..0f42d60e3
--- /dev/null
+++ b/lib/c3p0-0.9.1.2.jar
Binary files differ
diff --git a/lib/craftbukkit-0.0.1-SNAPSHOT.jar b/lib/craftbukkit-0.0.1-SNAPSHOT.jar
new file mode 100644
index 000000000..747976e87
--- /dev/null
+++ b/lib/craftbukkit-0.0.1-SNAPSHOT.jar
Binary files differ
diff --git a/lib/gson.jar b/lib/gson.jar
new file mode 100644
index 000000000..4f7970541
--- /dev/null
+++ b/lib/gson.jar
Binary files differ
diff --git a/lib/iConomy.jar b/lib/iConomy.jar
new file mode 100644
index 000000000..12c6785c7
--- /dev/null
+++ b/lib/iConomy.jar
Binary files differ
diff --git a/lib/junit/junit-3.8.2-api.zip b/lib/junit/junit-3.8.2-api.zip
new file mode 100644
index 000000000..6d792fdaa
--- /dev/null
+++ b/lib/junit/junit-3.8.2-api.zip
Binary files differ
diff --git a/lib/junit/junit-3.8.2.jar b/lib/junit/junit-3.8.2.jar
new file mode 100644
index 000000000..d83587261
--- /dev/null
+++ b/lib/junit/junit-3.8.2.jar
Binary files differ
diff --git a/lib/junit_4/junit-4.5-api.zip b/lib/junit_4/junit-4.5-api.zip
new file mode 100644
index 000000000..5748c444d
--- /dev/null
+++ b/lib/junit_4/junit-4.5-api.zip
Binary files differ
diff --git a/lib/junit_4/junit-4.5-src.jar b/lib/junit_4/junit-4.5-src.jar
new file mode 100644
index 000000000..18774a573
--- /dev/null
+++ b/lib/junit_4/junit-4.5-src.jar
Binary files differ
diff --git a/lib/junit_4/junit-4.5.jar b/lib/junit_4/junit-4.5.jar
new file mode 100644
index 000000000..83f8bc793
--- /dev/null
+++ b/lib/junit_4/junit-4.5.jar
Binary files differ
diff --git a/lib/mysql.jar b/lib/mysql.jar
new file mode 100644
index 000000000..0539039f7
--- /dev/null
+++ b/lib/mysql.jar
Binary files differ
diff --git a/lib/nblibraries.properties b/lib/nblibraries.properties
new file mode 100644
index 000000000..c3c14c09e
--- /dev/null
+++ b/lib/nblibraries.properties
@@ -0,0 +1,12 @@
+libs.CopyLibs.classpath=\
+ ${base}/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar
+libs.junit.classpath=\
+ ${base}/junit/junit-3.8.2.jar
+libs.junit.javadoc=\
+ ${base}/junit/junit-3.8.2-api.zip
+libs.junit_4.classpath=\
+ ${base}/junit_4/junit-4.5.jar
+libs.junit_4.javadoc=\
+ ${base}/junit_4/junit-4.5-api.zip
+libs.junit_4.src=\
+ ${base}/junit_4/junit-4.5-src.jar
diff --git a/lib/sqlite.jar b/lib/sqlite.jar
new file mode 100644
index 000000000..0b47e2cf9
--- /dev/null
+++ b/lib/sqlite.jar
Binary files differ