summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKHobbits <rob@khobbits.co.uk>2012-01-28 13:33:09 +0000
committerKHobbits <rob@khobbits.co.uk>2012-01-28 13:33:09 +0000
commit047f3736314c48387b80c51bc993f20e7cfab32f (patch)
tree4f3f4c964dbd6093234faeb3b46ff802c2d8cb85
parent72ed86e0dd030f24e67fe29ebb9eb471e206e0d0 (diff)
parentc6aa34076aeeab5e63ccee1102826fa9557753e9 (diff)
downloadEssentials-047f3736314c48387b80c51bc993f20e7cfab32f.tar
Essentials-047f3736314c48387b80c51bc993f20e7cfab32f.tar.gz
Essentials-047f3736314c48387b80c51bc993f20e7cfab32f.tar.lz
Essentials-047f3736314c48387b80c51bc993f20e7cfab32f.tar.xz
Essentials-047f3736314c48387b80c51bc993f20e7cfab32f.zip
Merge branch 'master' into 3.0
Conflicts: Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java Essentials/src/com/earth2me/essentials/commands/Commandhome.java Essentials/src/com/earth2me/essentials/commands/Commandsethome.java Essentials/src/messages_fr.properties EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java
-rw-r--r--Essentials/src/com/earth2me/essentials/Essentials.java2
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java13
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandhome.java13
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandnuke.java3
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandsethome.java6
-rw-r--r--Essentials/src/messages.properties1
-rw-r--r--Essentials/src/messages_da.properties1
-rw-r--r--Essentials/src/messages_de.properties1
-rw-r--r--Essentials/src/messages_en.properties1
-rw-r--r--Essentials/src/messages_es.properties1
-rw-r--r--Essentials/src/messages_fr.properties221
-rw-r--r--Essentials/src/messages_nl.properties1
-rw-r--r--EssentialsGroupManager/src/Changelog.txt18
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java6
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java7
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java41
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java2
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java92
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java17
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java17
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java17
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java42
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java2
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java85
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java158
-rw-r--r--EssentialsGroupManager/src/plugin.yml2
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java11
-rw-r--r--lib/bukkit.jarbin4707726 -> 4716477 bytes
-rw-r--r--lib/craftbukkit.jarbin10707001 -> 10722858 bytes
29 files changed, 428 insertions, 353 deletions
diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java
index 7a331c3d0..ac080af78 100644
--- a/Essentials/src/com/earth2me/essentials/Essentials.java
+++ b/Essentials/src/com/earth2me/essentials/Essentials.java
@@ -54,7 +54,7 @@ import org.yaml.snakeyaml.error.YAMLException;
public class Essentials extends JavaPlugin implements IEssentials
{
- public static final int BUKKIT_VERSION = 1791;
+ public static final int BUKKIT_VERSION = 1818;
private static final Logger LOGGER = Logger.getLogger("Minecraft");
private transient ISettings settings;
private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this);
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java
index 92df03637..5e7438721 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java
@@ -21,7 +21,18 @@ public class Commanddelhome extends EssentialsCommand
@Cleanup
IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null;
String name;
- final String[] expandedArg = args[0].split(":");
+ String[] expandedArg;
+
+ //Allowing both formats /sethome khobbits house | /sethome khobbits:house
+ final String[] nameParts = args[0].split(":");
+ if (nameParts[0].length() != args[0].length())
+ {
+ expandedArg = nameParts;
+ }
+ else
+ {
+ expandedArg = args;
+ }
if (expandedArg.length > 1 && (user == null || user.isAuthorized("essentials.delhome.others")))
{
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java
index 6fe74335c..17ac098e5 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java
@@ -7,6 +7,8 @@ import com.earth2me.essentials.api.IUser;
import java.util.List;
import java.util.Locale;
import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.Server;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
@@ -51,10 +53,14 @@ public class Commandhome extends EssentialsCommand
}
catch (NotEnoughArgumentsException e)
{
+ Location bed = player.getBedSpawnLocation();
+ if (bed != null && bed.getBlock().getType() != Material.BED_BLOCK)
+ {
+ bed = null;
+ }
final List<String> homes = player.getHomes();
if (homes.isEmpty() && player.equals(user))
{
- final Location bed = player.getBedSpawnLocation();
if (bed != null)
{
user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND);
@@ -73,7 +79,10 @@ public class Commandhome extends EssentialsCommand
}
else
{
- homes.add("bed");
+ if (bed != null)
+ {
+ homes.add("bed");
+ }
user.sendMessage(_("homes", Util.joinList(homes)));
}
}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnuke.java b/Essentials/src/com/earth2me/essentials/commands/Commandnuke.java
index 20bdc140a..d1b560191 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commandnuke.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandnuke.java
@@ -1,5 +1,6 @@
package com.earth2me.essentials.commands;
+import static com.earth2me.essentials.I18n._;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -37,7 +38,7 @@ public class Commandnuke extends EssentialsCommand
{
continue;
}
- player.sendMessage("May death rain upon them");
+ player.sendMessage(_("nuke"));
final Location loc = player.getLocation();
final World world = loc.getWorld();
for (int x = -10; x <= 10; x += 5)
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java
index c92c24dab..02d1a916f 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java
@@ -26,6 +26,9 @@ public class Commandsethome extends EssentialsCommand
{
if (user.isAuthorized("essentials.sethome.multiple"))
{
+ if ("bed".equals(args[0].toLowerCase(Locale.ENGLISH))) {
+ throw new NotEnoughArgumentsException();
+ }
if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getGroups().getHomeLimit(user))
|| (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH))))
{
@@ -62,6 +65,9 @@ public class Commandsethome extends EssentialsCommand
{
name = "home";
}
+ if ("bed".equals(name.toLowerCase(Locale.ENGLISH))) {
+ throw new NotEnoughArgumentsException();
+ }
usersHome.acquireWriteLock();
if (usersHome.getData().getHomes() == null)
diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties
index 1bf1ffca7..e43e32c6e 100644
--- a/Essentials/src/messages.properties
+++ b/Essentials/src/messages.properties
@@ -238,6 +238,7 @@ notRecommendedBukkit= * ! * Bukkit version is not the recommended build for Esse
notSupportedYet=Not supported yet.
nothingInHand = \u00a7cYou have nothing in your hand.
now=now
+nuke=May death rain upon them
numberRequired=A number goes there, silly.
onlyDayNight=/time only supports day/night.
onlyPlayers=Only in-game players can use {0}.
diff --git a/Essentials/src/messages_da.properties b/Essentials/src/messages_da.properties
index bef1683a7..a4703d033 100644
--- a/Essentials/src/messages_da.properties
+++ b/Essentials/src/messages_da.properties
@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * Bukkit version er ikke den anbefalede build til Essen
notSupportedYet=Ikke underst\u00f8ttet endnu.
nothingInHand = \u00a7cDu har intet i din h\u00c3\u00a5nd.
now=nu
+nuke=May death rain upon them
numberRequired=Et nummer skal v\u00e6re, din tardo.
onlyDayNight=/time underst\u00f8tter kun day/night.
onlyPlayers=Kun in-game spillere kan bruge {0}.
diff --git a/Essentials/src/messages_de.properties b/Essentials/src/messages_de.properties
index 6431f6f94..17dbb7d6c 100644
--- a/Essentials/src/messages_de.properties
+++ b/Essentials/src/messages_de.properties
@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * Die verwendete Bukkit-Version ist nicht f\u00fcr Esse
notSupportedYet=Noch nicht verf\u00fcgbar.
nothingInHand = \u00a7cYou have nothing in your hand.
now=jetzt
+nuke=May death rain upon them
numberRequired=Ein Zahl wird ben\u00f6tigt.
onlyDayNight=/time unterst\u00fctzt nur day und night.
onlyPlayers=Nur Spieler k\u00f6nnen {0} benutzen.
diff --git a/Essentials/src/messages_en.properties b/Essentials/src/messages_en.properties
index 551d97348..f72743e3b 100644
--- a/Essentials/src/messages_en.properties
+++ b/Essentials/src/messages_en.properties
@@ -238,6 +238,7 @@ notRecommendedBukkit= * ! * Bukkit version is not the recommended build for Esse
notSupportedYet=Not supported yet.
nothingInHand = \u00a7cYou have nothing in your hand.
now=now
+nuke=May death rain upon them
numberRequired=A number goes there, silly.
onlyDayNight=/time only supports day/night.
onlyPlayers=Only in-game players can use {0}.
diff --git a/Essentials/src/messages_es.properties b/Essentials/src/messages_es.properties
index 1f58b9840..c1c201a3e 100644
--- a/Essentials/src/messages_es.properties
+++ b/Essentials/src/messages_es.properties
@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * La version de bukkit no es la recomendada para esta v
notSupportedYet=No esta soportado aun.
nothingInHand = \u00a7cYou have nothing in your hand.
now=ahora
+nuke=May death rain upon them
numberRequired=Un numero es necesario, amigo.
onlyDayNight=/time solo soporta day/night. (dia/noche)
onlyPlayers=Solo los jugadores conectados pueden usar {0}.
diff --git a/Essentials/src/messages_fr.properties b/Essentials/src/messages_fr.properties
index da56fedce..71496574d 100644
--- a/Essentials/src/messages_fr.properties
+++ b/Essentials/src/messages_fr.properties
@@ -1,7 +1,7 @@
#version: TeamCity
# Single quotes have to be doubled: ''
# Translations start here
-# by:
+# by: L\u00e9a Gris
action=* {0} {1}
addedToAccount=\u00a7a{0} a \u00e9t\u00e9 rajout\u00e9 \u00e0 votre compte.
addedToOthersAccount=\u00a7a{0} a \u00e9t\u00e9 ajout\u00e9 \u00e0 {1} compte.
@@ -13,24 +13,24 @@ autoAfkKickReason=Vous avez \u00e9t\u00e9 \u00e9ject\u00e9 pour inactivit\u00e9e
backAfterDeath=\u00a77Utilisez la commande /back pour retourner \u00e0 l''endroit ou vous \u00eates mort.
backUsageMsg=\u00a77Retour \u00e0 votre emplacement pr\u00e9c\u00c3\u00a8dent.
backupFinished=Sauvegarde termin\u00e9
-backupStarted=D\u00e9but de la sauvegarde
+backupStarted=D\u00e9but de la sauvegarde...
balance=\u00a77Solde : {0}
-balanceTop=\u00a77 Meilleurs soldes ({0})
+balanceTop=\u00a77 Meilleurs soldes au ({0})
banExempt=\u00a77Vous ne pouvez pas bannir ce joueur.
-banIpAddress=\u00a77Adresse IP bannie
+banIpAddress=\u00a77Adresse IP bannie.
bannedIpsFileError=Erreur de lecture de banned-ips.txt
bannedIpsFileNotFound=Fichier banned-ips.txt introuvable
bannedPlayersFileError=Erreur lors de la lecture de banned-players.txt
bannedPlayersFileNotFound=banned-players.txt introuvable.
-bigTreeFailure=\u00a7c\u00c9chec de la g\u00e9n\u00e9ration du gros arbre. Essayez de nouveau sur de la terre ou de l''herbe.
+bigTreeFailure=\u00a7c\u00c9chec de la g\u00e9n\u00e9ration du gros arbre. Essayez de nouveau sur de la terre ou de l'herbe.
bigTreeSuccess=\u00a77Gros arbre cr\u00e9e.
blockList=Essentials relayed the following commands to another plugin:
broadcast=[\u00a7cMessage\u00a7f]\u00a7a {0}
-buildAlert=\u00a7cVous n''avez pas la permission de construire.
+buildAlert=\u00a7cVous n'avez pas la permission de construire.
bukkitFormatChanged=Le format de la version de Bukkit a \u00e9t\u00e9 chang\u00e9. La version n''a pas \u00e9t\u00e9 v\u00e9rifi\u00e9e.
burnMsg=\u00a77Vous avez enflamm\u00e9 {0} pour {1} seconde(s).
canTalkAgain=\u00a77Vous pouvez de nouveau parler.
-cantFindGeoIpDB=N''arrive pas \u00e0 trouver la base de donn\u00e9es GeoIP!
+cantFindGeoIpDB=N'arrive pas \u00e0 trouver la base de donn\u00e9es GeoIP!
cantReadGeoIpDB=Echec de la lecture de la base de donn\u00e9es GeoIP!
cantSpawnItem=\u00a7cVous n''avez pas le droit de faire appara\u00c3\u00aetre {0}
chatTypeLocal=[L]
@@ -39,10 +39,10 @@ commandFailed=\u00c9chec de la commande {0} :
commandHelpFailedForPlugin=Erreur d''obtention d''aide pour : {0}
commandNotLoaded=\u00a7cLa commande {0} a \u00e9t\u00e9 mal charg\u00e9e.
compassBearing=\u00a77Orientation : {0} ({1} degr\u00e9s).
-configFileMoveError=\u00c9chec du d\u00e9placement de config.yml vers l''emplacement de sauvegarde.
+configFileMoveError=\u00c9chec du d\u00e9placement de config.yml vers l'emplacement de sauvegarde.
configFileRenameError=\u00c9chec du changement de nom du fichier temporaire de config.yml
connectedPlayers=Joueurs connect\u00e9s :
-connectionFailed=\u00c9chec de l''ouverture de la connexion.
+connectionFailed=\u00c9chec de l'ouverture de la connexion.
cooldownWithMessage=\u00a7cR\u00e9utilisation : {0}
corruptNodeInConfig=\u00a74Annonce : Votre fichier de configuration a un {0} n\u0153ud corrompu.
couldNotFindTemplate=Le mod\u00c3\u00a8le {0} est introuvable
@@ -59,7 +59,7 @@ deleteWarp=\u00a77Warp {0} supprim\u00e9.
deniedAccessCommand=L''acc\u00c3\u00a8s \u00e0 la commande a \u00e9t\u00e9 refus\u00e9 pour {0}.
dependancyDownloaded=[Essentials] Fichier {0} correctement t\u00e9l\u00e9charg\u00e9.
dependancyException=[Essentials] Une erreur est survenue lors de la tentative de t\u00e9l\u00e9chargement.
-dependancyNotFound=[Essentials] Une d\u00e9pendance requise n''a pas \u00e9t\u00e9 trouv\u00e9e, t\u00e9l\u00e9chargement en cours.
+dependancyNotFound=[Essentials] Une d\u00e9pendance requise n'a pas \u00e9t\u00e9 trouv\u00e9e, t\u00e9l\u00e9chargement en cours.
depth=\u00a77Vous \u00eates au niveau de la mer.
depthAboveSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) au-dessus du niveau de la mer.
depthBelowSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) en-dessous du niveau de la mer.
@@ -68,7 +68,7 @@ disableUnlimited=\u00a77D\u00e9sactivation du placement illimit\u00e9 de {0} pou
disabled=d\u00e9sactiv\u00e9
disabledToSpawnMob=Spawning this mob was disabled in the config file.
dontMoveMessage=\u00a77La t\u00e9l\u00e9portation commence dans {0}. Ne bougez pas.
-downloadingGeoIp=T\u00e9l\u00e9chargement de la base de donn\u00e9es GeoIP ... Cela peut prendre un moment (campagne : 0.6 Mo, ville : 20Mo)
+downloadingGeoIp=T\u00e9l\u00e9chargement de la base de donn\u00e9es GeoIP ... Cela peut prendre un moment (Pays : 0.6 Mo, villes : 20Mo)
duplicatedUserdata=Donn\u00e9e utilisateur dupliqu\u00e9e : {0} et {1}
enableUnlimited=\u00a77Quantit\u00e9 illimit\u00e9e de {0} \u00e0 {1}.
enabled=activ\u00e9
@@ -79,17 +79,17 @@ enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item
enchantments = \u00a77Enchantments : {0}
errorCallingCommand=Erreur en appelant la commande /{0}
errorWithMessage=\u00a7cErreur : {0}
-essentialsHelp1=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, go to http://tiny.cc/EssentialsChat
-essentialsHelp2=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, either type /essentialshelp in game or go to http://tiny.cc/EssentialsChat
-essentialsReload=\u00a77Essentials Recharg\u00e9 {0}
+essentialsHelp1=Le fichier est corrompuet Essentials ne peut l'ouvrir. Essentials est maintenant d\u00e9sactiv\u00e9. Si vous ne pouvez corriger vous-m\u00eame, aller \u00e0 http://tiny.cc/EssentialsChat
+essentialsHelp2=Le fichier est corrompuet Essentials ne peut l'ouvrir. Essentials est maintenant d\u00e9sactiv\u00e9. Si vous ne pouvez corriger vous-m\u00eame, tapez /essentialshelp ou aller \u00e0 http://tiny.cc/EssentialsChat
+essentialsReload=\u00a77Essentials {0} a \u00e9t\u00e9 recharg\u00e9.
extinguish=\u00a77Vous cessez de br\u00fbler.
extinguishOthers=\u00a77Vous avez \u00e9teint la combustion de {0}.
failedToCloseConfig=Echec de la fermeture de la configuration {0}
failedToCreateConfig=Echec de la cr\u00e9ation de la configuration {0}
failedToWriteConfig=\u00c9chec de l''\u00e9criture de la configuration {0}
-false=faux
-feed=\u00a77Your appetite was sated.
-feedOther=\u00a77Satisfied {0}.
+false=non
+feed=\u00a77Vous avez \u00e9t\u00e9 rassasi\u00e9.
+feedOther=\u00a77 est rassasi\u00e9 {0}.
fileRenameError=Echec du changement de nom de {0}
foreverAlone=\u00a7cVous n''avez personne \u00e0 qui r\u00e9pondre
freedMemory=A lib\u00e9r\u00e9 {0} Mo.
@@ -109,7 +109,7 @@ haveBeenReleased=\u00a77Vous avez \u00e9t\u00e9 lib\u00e9r\u00e9.
heal=\u00a77Vous avez \u00e9t\u00e9 soign\u00e9.
healOther=\u00a77{0} a \u00e9t\u00e9 soign\u00e9.
helpConsole=Pour voir l''aide tapez ?
-helpOp=\u00a7c[Aide Admin]\u00a7f \u00a77{0}:\u00a7f {1}
+helpOp=\u00a7c[Aide Admin]\u00a7f \u00a77{0} : \u00a7f {1}
helpPages=Page \u00a7c{0}\u00a7f sur \u00a7c{1}\u00a7f.
holeInFloor=Trou dans le Sol.
homeSet=\u00a77R\u00e9sidence d\u00e9finie.
@@ -121,15 +121,15 @@ ignorePlayer=Vous ignorez d\u00e9sormais {0}.
illegalDate=Format de date ill\u00e9gal.
infoChapter=S\u00e9lectionnez le chapitre :
infoChapterPages=Chapitre {0}, page \u00a7c{1}\u00a7f sur \u00a7c{2}\u00a7f:
-infoFileDoesNotExist=Le fichier info.txt n''existe pas. Le fichier est en cours de cr\u00e9ation pour vous.
+infoFileDoesNotExist=Le fichier info.txt n'existe pas. Le fichier est en cours de cr\u00e9ation pour vous.
infoPages=Page \u00a7c{0}\u00a7f de \u00a7c{1}\u00a7f.
infoUnknownChapter=Chapitre inconnu.
invBigger=Les inventaires des autres joueurs sont plus gros que le v\u00f4tre.
invRestored=Votre inventaire vous a \u00e9t\u00e9 rendu.
invSee=Vous voyez l''inventaire de {0}.
-invSeeHelp=Utilisez /invsee pour voir l''inventaire de quelqu''un.
+invSeeHelp=Utilisez /invsee pour revenir \u00e0 votre inventaire.
invalidCharge=\u00a7cCharge invalide.
-invalidMob=Mauvias type de monstre.
+invalidMob=Mauvias type de cr\u00e9ature.
invalidServer=Serveur non valide.
invalidSignLine=La ligne {0} du panneau est invalide.
invalidWorld=\u00a7cMonde invalide.
@@ -138,46 +138,46 @@ inventoryClearedOthers=\u00a77L''inventaire de \u00a7c{0}\u00a77 a \u00e9t\u00e9
is=est
itemCannotBeSold=Cet objet ne peut \u00eatre vendu au serveur.
itemMustBeStacked=Cet objet doit \u00eatre vendu par 64. Une quantit\u00e9 de 2 serait deux fois 64.
-itemNotEnough1=\u00a7cVous n''avez pas assez de cet objet pour le vendre.
-itemNotEnough2=\u00a77Si vous voulez vendre l''int\u00e9gralit\u00e9 de vos objets de ce type l\u00e0, utilisez /sell nomObjet
+itemNotEnough1=\u00a7cVous n'avez pas assez de cet objet pour le vendre.
+itemNotEnough2=\u00a77Si vous voulez vendre l'int\u00e9gralit\u00e9 de vos objets de ce type l\u00e0, utilisez /sell nomObjet
itemNotEnough3=\u00a77/sell nomObjet -1 vendra tout sauf un objet, etc.
-itemSellAir=Vouliez-vous vraiment vendre de l''air ? Mettez un objet dans votre main.
+itemSellAir=Vouliez-vous vraiment vendre de l'air ? Mettez un objet dans votre main.
itemSold=\u00a77Vendu pour \u00a7c{0} \u00a77({1} {2} \u00e0 {3} chacun)
itemSoldConsole={0} vendu {1} pour \u00a77{2} \u00a77({3} objet(s) \u00e0 {4} chacun)
itemSpawn=\u00a77Donne {0} de {1}
-itemsCsvNotLoaded=N''a pas pu charger items.csv.
+itemsCsvNotLoaded=N'a pas pu charger items.csv.
jailAlreadyIncarcerated=\u00a7cJoueur d\u00e9j\u00e0 emprisonn\u00e9 : {0}
jailMessage=\u00a7cVous avez commis un crime, vous en payez le prix.
-jailNotExist=Cette prison n''existe pas.
+jailNotExist=Cette prison n'existe pas.
jailReleased=\u00a77Joueur \u00a7e{0}\u00a77 lib\u00e9r\u00e9.
jailReleasedPlayerNotify=\u00a77Vous avez \u00e9t\u00e9 lib\u00e9r\u00e9 !
jailSentenceExtended=Dur\u00e9e d''emprisonnement rallong\u00e9e de : {0)
jailSet=\u00a77La prison {0} a \u00e9t\u00e9 cr\u00e9\u00e9.
jumpError=\u00c7a aurait pu faire mal au cerveau de votre ordinateur.
-kickDefault=Kick\u00e9 du serveur
-kickExempt=\u00a77Vous ne pouvez pas lancer ce joueur.
+kickDefault=\u00c9ject\u00e9 du serveur
+kickExempt=\u00a77Vous ne pouvez pas \u00e9jecter ce joueur.
kill=\u00a77Tu\u00e9 {0}.
-kitError2=\u00a7cCe kit n''existe pas ou a \u00e9t\u00e9 mal d\u00e9fini.
-kitError=\u00a7cIl n''y a pas de kits valides.
-kitErrorHelp=\u00a7cPeut-\u00eatre qu''un objet manque d''une quantit\u00e9 dans la configuration ?
+kitError2=\u00a7cCe kit n'existe pas ou a \u00e9t\u00e9 mal d\u00e9fini.
+kitError=\u00a7cIl n'y a pas de kits valides.
+kitErrorHelp=\u00a7cPeut-\u00eatre qu'un objet manque d'une quantit\u00e9 dans la configuration ?
kitGive=\u00a77Donner le kit {0}.
InvFull=\u00a7cYour inventory was full, dropping items on the floor
kitTimed=\u00a7cVous ne pouvez pas utiliser ce kit pendant encore {0}.
kits=\u00a77Kits :{0}
-lightningSmited=\u00a77Vous venez d''\u00eatre foudroy\u00e9.
+lightningSmited=\u00a77Vous venez d'\u00eatre foudroy\u00e9.
lightningUse=\u00a77{0} a \u00e9t\u00e9 foudroy\u00e9.
listAfkTag = \u00a77[AFK]\u00a7f
listAmount = \u00a79Il y a \u00a7c{0}\u00a79 joueurs en ligne sur \u00a7c{1}\u00a79 au total.
listAmountHidden = \u00a79Il y a \u00a7c{0}\u00a77/{1}\u00a79 sur un maximum de \u00a7c{2}\u00a79 joueurs en ligne.
listHiddenTag = \u00a77[MASQU\u00c9]\u00a7f
-loadWarpError=\u00c9chec du chargement du raccourci {0}
-localFormat=Locale :<{0}> {1}
+loadWarpError=\u00c9chec du chargement du point de t\u00e9l\u00e9portation {0}.
+localFormat=Locale : <{0}> {1}
mailClear=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear
mailCleared=\u00a77Courrier supprim\u00e9 !
mailSent=\u00a77Courrier envoy\u00e9 !
markMailAsRead=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear
markedAsAway=\u00a77Vous \u00eates d\u00e9sormais AFK.
-markedAsNotAway=\u00a77Vous n''\u00eates d\u00e9sormais plus AFK.
+markedAsNotAway=\u00a77Vous n'\u00eates d\u00e9sormais plus AFK.
maxHomes=Vous ne pouvez pas cr\u00e9er plus de {0} r\u00e9sidences.
mayNotJail=\u00a7cVous ne pouvez pas emprisonner cette personne.
me=moi
@@ -185,68 +185,69 @@ minute=minute
minutes=minutes
missingItems=Vous n''avez pas {0} x {1}.
missingPrefixSuffix=Pr\u00e9fixe ou Suffixe manquant pour {0}
-mobSpawnError=Erreur lors du changement du g\u00e9n\u00e9rateur de monstres.
-mobSpawnLimit=Quantit\u00e9 de monstres limit\u00e9 \u00e0 au maximum du serveur.
-mobSpawnTarget=Le bloc cible doit \u00eatre un g\u00e9n\u00e9rateur de monstres.
-mobsAvailable=\u00a77Monstres : {0}
+mobSpawnError=Erreur lors du changement du g\u00e9n\u00e9rateur de cr\u00e9atures.
+mobSpawnLimit=Quantit\u00e9 de cr\u00e9atures limit\u00e9 \u00e0 au maximum du serveur.
+mobSpawnTarget=Le bloc cible doit \u00eatre un g\u00e9n\u00e9rateur de cr\u00e9atures.
+mobsAvailable=\u00a77cr\u00e9atures : {0}
moneyRecievedFrom=\u00a7a{0} a \u00e9t\u00e9 re\u00e7u de {1}
moneySentTo=\u00a7a{0} a \u00e9t\u00e9 envoy\u00e9 \u00e0 {1}
-moneyTaken={0} pr\u00e9lev\u00e9(s) de votre compte bancaire.
+moneyTaken={0} pr\u00e9lev\u00e9(s) de votre compte.
month=mois
months=mois
-moreThanZero=Les Quantit\u00e9s doivent \u00eatre sup\u00e9rieures \u00e0 z\u00e9ro.
+moreThanZero=Les quantit\u00e9s doivent \u00eatre sup\u00e9rieures \u00e0 z\u00e9ro.
msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2}
muteExempt=\u00a7cVous ne pouvez pas r\u00e9duire ce joueur au silence.
mutedPlayer=Le joueur {0} est d\u00e9sormais muet.
mutedPlayerFor={0} a \u00e9t\u00e9 muet pour {1}.
mutedUserSpeaks={0} a essay\u00e9 de parler mais est muet.
-nearbyPlayers=Players nearby: {0}
-needTpohere=Vous avez besoin de l''acc\u00c3\u00a8s \u00e0 /tpohere pour t\u00e9l\u00e9porter d''autres joueurs.
-negativeBalanceError=L''utilisateur n''est pas autoris\u00e9 \u00e0 avoir un solde n\u00e9gatif.
+nearbyPlayers=Joueurs dans les environs : {0}
+needTpohere=Vous avez besoin de l'acc\u00c3\u00a8s \u00e0 /tpohere pour t\u00e9l\u00e9porter d'autres joueurs.
+negativeBalanceError=L'utilisateur n'est pas autoris\u00e9 \u00e0 avoir un solde n\u00e9gatif.
nickChanged=surnom modifi\u00e9.
nickDisplayName=\u00a77Vous devez activer change-displayname dans la configuration Essentials.
nickInUse=\u00a7cCe nom est d\u00e9j\u00e0 utilis\u00e9.
nickNamesAlpha=\u00a7cLes surnoms doivent \u00eatre alphanum\u00e9riques.
-nickNoMore=\u00a7Vous n''avez plus de surnom.
-nickOthersPermission=\u00a7cVous n''avez pas la permission de changer le surnom des autres.
+nickNoMore=\u00a7 Vous n'avez plus de surnom.
+nickOthersPermission=\u00a7cVous n'avez pas la permission de changer le surnom des autres.
nickSet=\u00a77Votre surnom est maintenant \u00a7c{0}
-noAccessCommand=\u00a7cVous n''avez pas acc\u00c3\u00a8s \u00e0 cette commande.
+noAccessCommand=\u00a7cVous n'avez pas acc\u00c3\u00a8s \u00e0 cette commande.
noAccessPermission=\u00a7cVous n''avez pas la permissions d''acc\u00e9der \u00e0 cette {0}
noDestroyPermission=\u00a7cVous n''avez pas la permission de d\u00e9truire ce {0}.
noGodWorldWarning=\u00a7cWarning! Le mode Dieu est d\u00e9sactiv\u00e9 dans ce monde.
noHelpFound=\u00a7cAucune commande correspondante.
-noHomeSet=Vous n''avez pas d\u00e9fini de r\u00e9sidence.
-noHomeSetPlayer=Le joueur n''a pas d\u00e9fini sa r\u00e9sidence.
+noHomeSet=Vous n'avez pas d\u00e9fini de r\u00e9sidence.
+noHomeSetPlayer=Le joueur n'a pas d\u00e9fini sa r\u00e9sidence.
noKitPermission=\u00a7cVous avez besoin de la permission \u00a7c{0}\u00a7c pour utiliser ce kit.
-noKits=\u00a77Il n''y a pas encore de kits disponibles.
-noMail=Vous n''avez pas de courrier
-noMotd=\u00a7cIl n''y a pas de message su jour.
-noNewMail=\u00a77Vous n''avez pas de courrier.
-noPendingRequest=Vous n''avez pas de requ\u00eate non lue.
+noKits=\u00a77Il n'y a pas encore de kits disponibles.
+noMail=Vous n'avez pas de courrier
+noMotd=\u00a7cIl n'y a pas de message su jour.
+noNewMail=\u00a77Vous n'avez pas de courrier.
+noPendingRequest=Vous n'avez pas de requ\u00eate non lue.
noPerm=\u00a7cVous n''avez pas la permission \u00a7f{0}\u00a7c.
-noPermToSpawnMob=\u00a7cYou don''t have permission to spawn this mob.
-noPlacePermission=\u00a7cVous n''avez pas la permission de placer un bloc pr\u00c3\u00a8 de cette pancarte.
-noPowerTools=Vous n''avez pas d''outil automatique associ\u00e9.
-noRules=\u00a7cIl n''y a pas encore de r\u00c3\u00a8gles d\u00e9finies.
-noWarpsDefined=Aucun raccourci d\u00e9fini.
+noPermToSpawnMob=\u00a7cVous n'avez pas la permission d'invoquer cette cr\u00e9ature.
+noPlacePermission=\u00a7cVous n'avez pas la permission de placer un bloc pr\u00c3\u00a8 de cette pancarte.
+noPowerTools=Vous n'avez pas d'outil macro associ\u00e9.
+noRules=\u00a7cIl n'y a pas encore de r\u00e8gles d\u00e9finies.
+noWarpsDefined=Aucun point de t\u00e9l\u00e9portation d\u00e9fini.
none=aucun
-notAllowedToQuestion=\u00a7cVous n''\u00eates pas autoris\u00e9 \u00e0 poser des questions.
-notAllowedToShout=\u00a7cVous n''\u00eates pas autoris\u00e9 \u00e0 crier.
-notEnoughExperience=You do not have enough experience.
-notEnoughMoney=Vous n''avez pas les fonds n\u00e9cessaires.
-notRecommendedBukkit=* ! * La version de Bukkit n''est pas celle qui est recommand\u00e9 pour cette version de Essentials.
+notAllowedToQuestion=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 poser des questions.
+notAllowedToShout=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 crier.
+notEnoughExperience=Vous n'avez pas assez d'exp\u00e9rience.
+notEnoughMoney=Vous n'avez pas les fonds n\u00e9cessaires.
+notRecommendedBukkit=* ! * La version de Bukkit n'est pas celle qui est recommand\u00e9 pour cette version de Essentials.
notSupportedYet=Pas encore pris en charge.
-nothingInHand = \u00a7cVous n''avez rien en main.
+nothingInHand = \u00a7cVous n'avez rien en main.
now=maintenant
+nuke=Que la mort s'abatte sur eux !
numberRequired=Il faut fournir un nombre ici.
onlyDayNight=/time ne supporte que (jour) day/night (nuit).
onlyPlayers=Seulement les joueurs en jeu peuvent utiliser {0}.
onlySunStorm=/weather ne supporte que (soleil) sun/storm (temp\u00eate).
-orderBalances=Ordering balances of {0} users, please wait ...
-pTimeCurrent=\u00a7e{0}''s\u00a7f l''heure est {1}.
-pTimeCurrentFixed=\u00a7e{0}''s\u00a7f l''heure est fix\u00e9e \u00e0 {1}.
-pTimeNormal=\u00a7e{0}''s\u00a7f l''heure est normale et correspond au server.
-pTimeOthersPermission=\u00a7cVous n''etes pas autoris\u00e9 \u00e0 changer l''heure des autres joueurs.
+orderBalances=Classement des balance de {0} utilisateurs, patientez ...
+pTimeCurrent=Pour \u00a7e{0}\u00a7f l''heure est {1}.
+pTimeCurrentFixed=L''heure de \u00a7e{0}\u00a7f est fix\u00e9e \u00e0 {1}.
+pTimeNormal=\u00a7fPour \u00a7e{0}\u00a7f l'heure est normale et correspond au server.
+pTimeOthersPermission=\u00a7cVous n'etes pas autoris\u00e9 \u00e0 changer l'heure des autres joueurs.
pTimePlayers=Ces joueurs ont leur propre horraire :
pTimeReset=l''heure a \u00e9t\u00e9 r\u00e9initialis\u00e9e \u00e0 : \u00a7e{0}
pTimeSet=l''heure du joueur a \u00e9t\u00e9 r\u00e9egl\u00e9ee \u00e0 \u00a73{0}\u00a7f pour : \u00a7e{1}
@@ -258,7 +259,7 @@ playerBanned=\u00a7cJoueur {0} banni {1} pour {2}
playerInJail=\u00a7cLe joueur est d\u00e9j\u00e0 dans la prison {0}.
playerJailed=\u00a77Le joueur {0} a \u00e9t\u00e9 emprisonn\u00e9.
playerJailedFor=\u00a77{0} a \u00e9t\u00e9 emprisonn\u00e9 pour {1}.
-playerKicked=\u00a7cPlayer {0} kicked {1} for {2}
+playerKicked=\u00a7c{0} a \u00e9t\u00e9 \u00e9ject\u00e9 {1} pour {2}.
playerMuted=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence.
playerMutedFor=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence pour {0}
playerNeverOnServer=\u00a7cLe joueur {0} n''a jamais \u00e9t\u00e9 sur le serveur.
@@ -266,35 +267,35 @@ playerNotFound=\u00a7cLe joueur est introuvable.
playerUnmuted=\u00a77Vous avez de nouveau la parole.
pong=Pong !
possibleWorlds=\u00a77Les mondes possibles sont les nombres de 0 \u00e0 {0}.
-powerToolAir=La commande ne peut pas \u00eatre assign\u00e9e \u00e0 l''air.
+powerToolAir=La commande ne peut pas \u00eatre assign\u00e9e \u00e0 l'air.
powerToolAlreadySet=La commande \u00a7c{0}\u00a7f est d\u00e9j\u00e0 assign\u00e9e \u00e0 {1}.
powerToolAttach=Commande \u00a7c{0}\u00a7f assign\u00e9e \u00e0 {1}.
powerToolClearAll=Toutes les commandes assign\u00e9es ont \u00e9et\u00e9e retir\u00e9ees.
powerToolList={1} assign\u00e9s aux commandes : \u00a7c{0}\u00a7f.
-powerToolListEmpty={0} n''a pas de commande assign\u00e9e.
+powerToolListEmpty={0} n'a pas de commande assign\u00e9e.
powerToolNoSuchCommandAssigned=La commande \u00a7c{0}\u00a7f n''a pas \u00e9t\u00e9 assign\u00e9e \u00e0 {1}.
-powerToolRemove=Command \u00a7c{0}\u00a7f retir\u00e9e de {1}.
+powerToolRemove=Commande \u00a7c{0}\u00a7f retir\u00e9e de {1}.
powerToolRemoveAll=Toutes les commandes retir\u00e9es de {0}.
powerToolsDisabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 retir\u00e9es.
powerToolsEnabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 activ\u00e9es.
protectionOwner=\u00a76[EssentialsProtect] Propri\u00e9taire de la protection : {0}
questionFormat=\u00a77[Question]\u00a7f {0}
-readNextPage=Type /{0} {1} to read the next page
+readNextPage=Utilisez /{0} {1} pour lire la page suivante.
reloadAllPlugins=\u00a77Toutes les extensions ont \u00e9t\u00e9 recharg\u00e9es.
-removed=\u00a77Removed {0} entities.
+removed=\u00a77{0} entit\u00e9s supprim\u00e9es.
repair=Vous avez r\u00e9par\u00e9 votre : \u00a7e{0}.
-repairAlreadyFixed=\u00a77Cet objet n''a pas besoin de r\u00e9paration.
-repairEnchanted=\u00a77You are not allowed to repair enchanted items.
+repairAlreadyFixed=\u00a77Cet objet n'a pas besoin de r\u00e9paration.
+repairEnchanted=\u00a77Vous n'\u00eates pas autoris\u00e9 \u00e0 r\u00e9parer les objets enchant\u00e9s.
repairInvalidType=\u00a7cCet objet ne peut \u00eatre r\u00e9par\u00e9.
-repairNone=Aucun objet n''a besoin d''\u00eatre r\u00e9par\u00e9.
+repairNone=Aucun objet n'a besoin d'u00eatre r\u00e9par\u00e9.
requestAccepted=\u00a77Demande de t\u00e9l\u00e9portation accept\u00e9e.
requestAcceptedFrom=\u00a77{0} a accept\u00e9 votre demande de t\u00e9l\u00e9portation.
requestDenied=\u00a77Demande de t\u00e9l\u00e9portation refus\u00e9e.
requestDeniedFrom=\u00a77{0} a refus\u00e9 votre demande de t\u00e9l\u00e9portation.
requestSent=\u00a77Requ\u00eate envoy\u00e9e \u00e0 {0}\u00a77.
-requestTimedOut=\u00a7cTeleport request has timed out
-requiredBukkit=* ! * You need atleast build {0} of CraftBukkit, download it from http://ci.bukkit.org.
-returnPlayerToJailError=Erreur survenue lors de la tentative d''emprisonner de nouveau un joueur.
+requestTimedOut=\u00a7cLa de mande de t\u00e9l\u00e9portation a expir\u00e9.
+requiredBukkit=* ! * Vous avez besoin au moins de la version {0} de CraftBukkit. T\u00e9l\u00e9chargez-la ici http://ci.bukkit.org.
+returnPlayerToJailError=Erreur survenue lors de la tentative d'emprisonner de nouveau un joueur.
second=seconde
seconds=secondes
seenBanReason=Reason: {0}
@@ -307,14 +308,14 @@ shoutFormat=\u00a77[Crie]\u00a7f {0}
signFormatFail=\u00a74[{0}]
signFormatSuccess=\u00a71[{0}]
signFormatTemplate=[{0}]
-signProtectInvalidLocation=\u00a74Vous n''avez pas l''autorisation de cr\u00e9er une pancarte ici.
-similarWarpExist=Un raccourci avec un nom similaire existe d\u00e9j\u00e0.
+signProtectInvalidLocation=\u00a74Vous n'avez pas l'autorisation de cr\u00e9er une pancarte ici.
+similarWarpExist=Un point de t\u00e9l\u00e9portation avec un nom similaire existe d\u00e9j\u00e0.
slimeMalformedSize=Taille mal form\u00e9e.
-soloMob=Ce monstre aime \u00eatre seul.
-spawnSet=\u00a77Le point de spawn a \u00e9t\u00e9 d\u00e9fini pour le groupe {0}.
+soloMob=Ce cr\u00e9ature aime \u00eatre seul.
+spawnSet=\u00a77Le point de d\u00e9part a \u00e9t\u00e9 d\u00e9fini pour le groupe {0}.
spawned=invoqu\u00e9(s)
suicideMessage=\u00a77Au revoir monde cruel...
-suicideSuccess=\u00a77{0} s''est suiscid\u00e9.
+suicideSuccess=\u00a77{0} s''est suicid\u00e9.
survival=survie
takenFromAccount=\u00a7c{0} ont \u00e9t\u00e9 retir\u00e9 de votre compte.
takenFromOthersAccount=\u00a7c{0} a \u00e9t\u00e9 r\u00e9tir\u00e9 du compte de {1}.
@@ -326,7 +327,7 @@ teleportHereRequest=\u00a7c{0}\u00a7c Vous a demand\u00e9 de vous t\u00e9l\u00e9
teleportNewPlayerError=\u00c9chec de la t\u00e9l\u00e9portation du nouveau joueur.
teleportRequest=\u00a7c{0}\u00a7c vous demande s''il peut se t\u00e9l\u00e9porter vers vous.
teleportRequestsCancelledWorldChange=\u00a77Pending teleport requests have been cancelled on world change.
-teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds.
+teleportRequestTimeoutInfo=\u00a77Cette demande de t\u00e9l\u00e9portation expirera dans {0} secondes.
teleportTop=\u00a77T\u00e9l\u00e9portation vers le haut.
teleportationCommencing=\u00a77D\u00e9but de la t\u00e9l\u00e9portation...
teleportationDisabled=\u00a77T\u00e9l\u00e9poration d\u00e9sactiv\u00e9.
@@ -342,19 +343,19 @@ timeBeforeTeleport=Temps avant prochaine t\u00e9l\u00e9portation {0}
timeFormat=\u00a73{0}\u00a7f ou \u00a73{1}\u00a7f ou \u00a73{2}\u00a7f
timePattern=(?:([0-9]+)\\\\s*[ya][a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*mo[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*(?:sem|w)[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*[dj][a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*h[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*m[a-z]*[,\\\\s]*)?(?:([0-9]+)\\\\s*(?:s[a-z]*)?)?
timeSet=Heure r\u00e9gl\u00e9e dans tous les mondes.
-timeSetPermission=\u00a7cVous n''\u00eates pas autoris\u00e9 \u00e0 r\u00e9gler l''heure.
+timeSetPermission=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 r\u00e9gler l'heure.
timeWorldCurrent=Il est \u00a73{1}\u00a77 dans \u00a7c{0}.
timeWorldSet=L''heure a \u00e9t\u00e9 r\u00e9gl\u00e9e \u00e0 {0} dans : \u00a7c{1}
tradeCompleted=\u00a77\u00c9change termin\u00e9.
-tradeSignEmpty=Le panneau de vente n''as pas encore assez de stock.
-tradeSignEmptyOwner=Il n''y a rien \u00e0 collecter de cette pancarte d''\u00e9change commercial.
-treeFailure=\u00a7cEchec de la g\u00e9n\u00e9ration de l''arbre. Essayez de nouveau sur de l''herbe ou de la terre.
+tradeSignEmpty=Le panneau de vente n'as pas encore assez de stock.
+tradeSignEmptyOwner=Il n'y a rien \u00e0 collecter de cette pancarte d'\u00e9change commercial.
+treeFailure=\u00a7cEchec de la g\u00e9n\u00e9ration de l'arbre. Essayez de nouveau sur de l'herbe ou de la terre.
treeSpawned=\u00a77Arbre cr\u00e9\u00e9.
-true=vrai
-typeTpaccept=\u00a77Pour le t\u00e9l\u00e9porter, tapez \u00a7c/tpaccept\u00a77.
-typeTpdeny=\u00a77Pour d\u00e9cliner cette demande, entrez \u00a7c/tpdeny\u00a77.
-typeWorldName=\u00a77Vous pouvez aussi taper le nom d''un monde sp\u00e9cifique.
-unableToSpawnMob=Incapable d''invoquer un monstre.
+true=oui
+typeTpaccept=\u00a77Pour le t\u00e9l\u00e9porter, utilisez \u00a7c/tpaccept\u00a77.
+typeTpdeny=\u00a77Pour d\u00e9cliner cette demande, utilisez \u00a7c/tpdeny\u00a77.
+typeWorldName=\u00a77Vous pouvez aussi taper le nom d'un monde sp\u00e9cifique.
+unableToSpawnMob=Incapable d'invoquer un cr\u00e9ature.
unbannedIP=Adresse IP d\u00e9bannie.
unbannedPlayer=Joueur d\u00e9banni.
unignorePlayer=Vous n''ignorez plus {0}.
@@ -366,34 +367,34 @@ unlimitedItems=Objets illimit\u00e9s:
unmutedPlayer=Le joueur {0} n''est plus muet.
upgradingFilesError=Erreur durant la mise \u00e0 jour des fichiers.
userDoesNotExist=L''utilisateur {0} n''existe pas.
-userIsAway={0} s''est mis en AFK
-userIsNotAway={0} n''est plus inactif
-userJailed=\u00a77Vous avez \u00e9t\u00e9 emprisonn\u00e9
+userIsAway={0} s'est mis en AFK
+userIsNotAway={0} n'est plus AFK
+userJailed=\u00a77Vous avez \u00e9t\u00e9 emprisonn\u00e9.
userUsedPortal={0} a utilis\u00e9 un portail existant.
userdataMoveBackError=Echec du d\u00e9placement de userdata/{0}.tmp vers userdata/{1}
userdataMoveError=Echec du d\u00e9placement de userdata/{0} vers userdata/{1}.tmp
usingTempFolderForTesting=Utilise un fichier temporaire pour un test.
versionMismatch=Versions diff\u00e9rentes ! Mettez s''il vous plait {0} \u00e0 la m\u00eame version.
-versionMismatchAll=Mauvaise version ! S''il vous plait mettez des jars Essentials de version identique.
+versionMismatchAll=Mauvaise version ! S'il vous plait mettez des jars Essentials de version identique.
voiceSilenced=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duit au silence.
warpDeleteError=Probl\u00c3\u00a8me concernant la suppression du fichier warp.
-warpListPermission=\u00a7cVous n''avez pas la permission d''afficher la liste des warps.
-warpNotExist=Ce raccourci n''existe pas.
-warpSet=\u00a77Le raccourci {0} a \u00e9t\u00e9 cr\u00e9\u00e9.
-warpUsePermission=\u00a7cVous n''avez pas la permission d''utiliser ce warp.
-warpingTo=\u00a77T\u00e9l\u00e9portation au warp {0}.
-warps=Raccourcis : {0}
-warpsCount=\u00a77Il y a {0} raccourcis. Page {1} sur {2}.
+warpListPermission=\u00a7cVous n'avez pas la permission d'afficher la liste des points de t\u00e9l\u00e9portation.
+warpNotExist=Ce point de t\u00e9l\u00e9portation n'existe pas.
+warpSet=\u00a77Le point de t\u00e9l\u00e9portation {0} a \u00e9t\u00e9 cr\u00e9\u00e9.
+warpUsePermission=\u00a7cVous n'avez pas la permission d'utiliser ce point de t\u00e9l\u00e9portation.
+warpingTo=\u00a77T\u00e9l\u00e9portation vers {0}.
+warps=point de t\u00e9l\u00e9portations : {0}
+warpsCount=\u00a77Il y a {0} points de t\u00e9l\u00e9portations. Page {1} sur {2}.
warpOverwrite=\u00a7cYou cannot overwrite that warp.
weatherStorm=\u00a77Vous avez programm\u00e9 l''orage dans {0}
weatherStormFor=\u00a77Vous avez programm\u00e9 l''orage dans {0} pour {1} secondes.
weatherSun=\u00a77Vous avez programm\u00e9 le beau temps dans {0}
weatherSunFor=\u00a77Vous avez programm\u00e9 le beau temps dans {0} pour {1} secondes.
-whoisBanned=\u00a79 - Banned: {0}
+whoisBanned=\u00a79 - Banni : {0}
whoisGamemode=\u00a79 - Mode de jeu : {0}
whoisGeoLocation=\u00a79 - Emplacement : {0}
whoisGod=\u00a79 - Mode Dieu : {0}
-whoisHealth=\u00a79 - Vie : {0} / 20
+whoisHealth=\u00a79 - Sant\u00e9 : {0} / 20
whoisIPAddress=\u00a79 - Adresse IP : {0}
whoisIs={0} est {1}
whoisLocation=\u00a79 - Emplacement : ({0}, {1}, {2}, {3})
diff --git a/Essentials/src/messages_nl.properties b/Essentials/src/messages_nl.properties
index 0bedee060..969bf5da6 100644
--- a/Essentials/src/messages_nl.properties
+++ b/Essentials/src/messages_nl.properties
@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * De Bukkit versie is niet de aangeraden build voor Ess
notSupportedYet=Nog niet ondersteund.
nothingInHand = \u00a7cYou have nothing in your hand.
now=nu
+nuke=May death rain upon them
numberRequired=Er moet daar een nummer, grapjas.
onlyDayNight=/time ondersteund alleen day/night.
onlyPlayers=Alleen in-game spelers kunnen {0} gebruiken.
diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt
index 456283c63..ef9a3a408 100644
--- a/EssentialsGroupManager/src/Changelog.txt
+++ b/EssentialsGroupManager/src/Changelog.txt
@@ -108,4 +108,20 @@ v 1.9:
- Better optimize assembling of a players permissions and allow the * node to populate all registered superperms.
- Fixed text when adding a subgroup to not say the player was moved.
- Update to new Bukkit Event system.
- - Update GroupManagerBridge for new event system. \ No newline at end of file
+ - Update GroupManagerBridge for new event system.
+ - Fixed a random null error upon a player portaling.
+ - Fixed infinite loop error on player join.
+ - Optimized code to only update the player logging in instead of all players online.
+ - Added recursive loop detection for World mirroring (you may not set the main world as a mirror of another).
+ - Fixed fetching world data so it no longer returns the mirrored world for groups. Each world data holder now points to the correct data set, so can be returned as an object.
+ - Changed addSubGroup() to only add the group if it doesn't already exist (no need to update an already existing group).
+ - addSubGroup now returns a boolean for success/failure.
+ - '/manuaddsub' now correctly reports if it was able to add the sub group.
+ - Allow negation to the * permission node when populating superperms.
+ - Fix trying to modify an unmodifiable collection breaking superperms.
+ - Fixed subgroups (I broke earlier).
+ - Check for a null player object in the PlayerTeleportEvent.
+ - Trap errors in fetching the mirrors map.
+ - Fixed an infinite loop error when using '/manudel' on a logged in player. It caused setDefaultGroup to trigger a bukkit update when no GM User existed yet.
+ - do not allow inherited permissions to negate higher perms.
+ - Fixed a bug when pushing superperms in the wrong order. \ No newline at end of file
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java
index 591afe3fa..d830696e7 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java
@@ -66,10 +66,12 @@ public class GMConfiguration {
public Map<String, Object> getMirrorsMap() {
// Try to fetch the old mirror path first
- if (GMconfig.isConfigurationSection("settings.permission.world.mirror"))
+ if (GMconfig.isConfigurationSection("settings.permission.world.mirror")) {
return (Map<String, Object>) GMconfig.getConfigurationSection("settings.permission.world.mirror").getValues(false);
- else
+ } else if (GMconfig.isConfigurationSection("settings.mirrors")){
return (Map<String, Object>) GMconfig.getConfigurationSection("settings.mirrors").getValues(false);
+ }
+ return null;
}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java
index db2e60fda..c0ed77adc 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java
@@ -26,7 +26,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder;
import org.anjocaido.groupmanager.events.GMWorldListener;
-import org.anjocaido.groupmanager.events.GroupManagerEvent;
import org.anjocaido.groupmanager.utils.GMLoggerHandler;
import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.anjocaido.groupmanager.utils.Tasks;
@@ -490,8 +489,10 @@ public class GroupManager extends JavaPlugin {
return false;
}
// PARECE OK
- auxUser.addSubGroup(auxGroup);
- sender.sendMessage(ChatColor.YELLOW + "You added subgroup '" + auxGroup.getName() + "' to player '" + auxUser.getName() + "'.");
+ if (auxUser.addSubGroup(auxGroup))
+ sender.sendMessage(ChatColor.YELLOW + "You added subgroup '" + auxGroup.getName() + "' to player '" + auxUser.getName() + "'.");
+ else
+ sender.sendMessage(ChatColor.RED + "The subgroup '" + auxGroup.getName() + "' is already available to '" + auxUser.getName() + "'.");
targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null)
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
index d41f96b0d..980b0846c 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
@@ -114,7 +114,7 @@ public class User extends DataUnit implements Cloneable {
flagAsChanged();
if (GroupManager.isLoaded())
if (!GroupManager.BukkitPermissions.isPlayer_join())
- GroupManager.BukkitPermissions.updateAllPlayers();
+ GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
}
/**
@@ -122,6 +122,15 @@ public class User extends DataUnit implements Cloneable {
* the group to set
*/
public void setGroup(Group group) {
+ setGroup(group, true);
+ }
+
+ /**
+ * @param group the group to set
+ * @param updatePerms if we are to trigger a superperms update.
+ *
+ */
+ public void setGroup(Group group, Boolean updatePerms) {
if (!this.getDataSource().groupExists(group.getName())) {
getDataSource().addGroup(group);
}
@@ -129,9 +138,9 @@ public class User extends DataUnit implements Cloneable {
String oldGroup = this.group;
this.group = group.getName();
flagAsChanged();
- if (GroupManager.isLoaded()) {
+ if (GroupManager.isLoaded() && (updatePerms)) {
if (!GroupManager.BukkitPermissions.isPlayer_join())
- GroupManager.BukkitPermissions.updateAllPlayers();
+ GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
// Do we notify of the group change?
String defaultGroupName = getDataSource().getDefaultGroup().getName();
@@ -147,22 +156,32 @@ public class User extends DataUnit implements Cloneable {
}
}
- public void addSubGroup(Group subGroup) {
+ public boolean addSubGroup(Group subGroup) {
+ // Don't allow adding a subgroup if it's already set as the primary.
if (this.group.equalsIgnoreCase(subGroup.getName())) {
- return;
+ return false;
}
+ // User already has this subgroup
+ if (containsSubGroup(subGroup))
+ return false;
+
+ // If the group doesn't exists add it
if (!this.getDataSource().groupExists(subGroup.getName())) {
getDataSource().addGroup(subGroup);
}
- subGroup = getDataSource().getGroup(subGroup.getName());
- removeSubGroup(subGroup);
+
subGroups.add(subGroup.getName());
flagAsChanged();
if (GroupManager.isLoaded()) {
if (!GroupManager.BukkitPermissions.isPlayer_join())
- GroupManager.BukkitPermissions.updateAllPlayers();
+ GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED);
}
+ return true;
+
+ //subGroup = getDataSource().getGroup(subGroup.getName());
+ //removeSubGroup(subGroup);
+ //subGroups.add(subGroup.getName());
}
public int subGroupsSize() {
@@ -183,7 +202,7 @@ public class User extends DataUnit implements Cloneable {
flagAsChanged();
if (GroupManager.isLoaded())
if (!GroupManager.BukkitPermissions.isPlayer_join())
- GroupManager.BukkitPermissions.updateAllPlayers();
+ GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED);
return true;
}
@@ -229,8 +248,8 @@ public class User extends DataUnit implements Cloneable {
}
flagAsChanged();
if (GroupManager.isLoaded()) {
- if (!GroupManager.BukkitPermissions.isPlayer_join())
- GroupManager.BukkitPermissions.updateAllPlayers();
+ //if (!GroupManager.BukkitPermissions.isPlayer_join())
+ // GroupManager.BukkitPermissions.updatePlayer(this.getName());
GroupManagerEventHandler.callEvent(this, Action.USER_INFO_CHANGED);
}
}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java
index c9c1d2b64..3cbfbd50b 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java
@@ -245,7 +245,7 @@ public class WorldDataHolder {
return null;
}
User newUser = new User(this, userName);
- newUser.setGroup(groups.getDefaultGroup());
+ newUser.setGroup(groups.getDefaultGroup(), false);
addUser(newUser);
setUsersChanged(true);
return newUser;
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
index 1a765c7b4..686a5495d 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java
@@ -116,7 +116,8 @@ public class WorldsHolder {
public void mirrorSetUp() {
mirrorsGroup.clear();
mirrorsUser.clear();
- Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap();
+ Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap();
+
if (mirrorsMap != null) {
for (String source : mirrorsMap.keySet()) {
// Make sure all non mirrored worlds have a set of data files.
@@ -130,41 +131,48 @@ public class WorldsHolder {
// These worlds fully mirror their parent
for (Object o : mirrorList) {
- try {
- mirrorsGroup.remove(o.toString().toLowerCase());
- mirrorsUser.remove(o.toString().toLowerCase());
- } catch (Exception e) {
- }
- mirrorsGroup.put(o.toString().toLowerCase(), getWorldData(source).getName());
- mirrorsUser.put(o.toString().toLowerCase(), getWorldData(source).getName());
+ String world = o.toString().toLowerCase();
+ if (world != serverDefaultWorldName) {
+ try {
+ mirrorsGroup.remove(world);
+ mirrorsUser.remove(world);
+ } catch (Exception e) {
+ }
+ mirrorsGroup.put(world, getWorldData(source).getName());
+ mirrorsUser.put(world, getWorldData(source).getName());
+ } else
+ GroupManager.logger.log(Level.WARNING, "Mirroring error with " + o.toString() + ". Recursive loop detected!");
}
} else if (mirrorsMap.get(source) instanceof MemorySection) {
MemorySection subSection = (MemorySection) mirrorsMap.get(source);
for (String key : subSection.getKeys(true)) {
- //System.out.print("Key - " + key);
- if (subSection.get(key) instanceof ArrayList) {
- ArrayList mirrorList = (ArrayList) subSection.get(key);
-
- // These worlds have defined mirroring
- for (Object o : mirrorList) {
- String type = o.toString().toLowerCase();
- try {
- if (type.equals("groups"))
- mirrorsGroup.remove(key.toLowerCase());
-
- if (type.equals("users"))
- mirrorsUser.remove(key.toLowerCase());
-
- } catch (Exception e) {
- }
- if (type.equals("groups"))
- mirrorsGroup.put(key.toLowerCase(), getWorldData(source).getName());
-
- if (type.equals("users"))
- mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName());
- }
+ if (key.toLowerCase() != serverDefaultWorldName) {
+
+ if (subSection.get(key) instanceof ArrayList) {
+ ArrayList mirrorList = (ArrayList) subSection.get(key);
+
+ // These worlds have defined mirroring
+ for (Object o : mirrorList) {
+ String type = o.toString().toLowerCase();
+ try {
+ if (type.equals("groups"))
+ mirrorsGroup.remove(key.toLowerCase());
+
+ if (type.equals("users"))
+ mirrorsUser.remove(key.toLowerCase());
+
+ } catch (Exception e) {
+ }
+ if (type.equals("groups"))
+ mirrorsGroup.put(key.toLowerCase(), getWorldData(source).getName());
+
+ if (type.equals("users"))
+ mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName());
+ }
+ } else
+ GroupManager.logger.log(Level.WARNING, "Mirroring error with " + key + ". Recursive loop detected!");
@@ -312,27 +320,19 @@ public class WorldsHolder {
* 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.
+ * Mirrors return original world data.
*
* @param worldName
* @return OverloadedWorldHolder
*/
public OverloadedWorldHolder getWorldData(String worldName) {
String worldNameLowered = worldName.toLowerCase();
- // If a mirror change to the real world to load.
- if (mirrorsGroup.containsKey(worldNameLowered)) {
- worldNameLowered = mirrorsGroup.get(worldNameLowered);
- }
- OverloadedWorldHolder data = worldsData.get(worldNameLowered);
+
+ if (worldsData.containsKey(worldNameLowered))
+ return worldsData.get(worldNameLowered);
- if (data == null) {
- GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world...");
- data = getDefaultWorld();
- }
- return data;
+ GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world...");
+ return getDefaultWorld();
}
/**
@@ -541,7 +541,7 @@ public class WorldsHolder {
* @return true if world is loaded or mirrored. false if not listed
*/
public boolean isInList(String worldName) {
- if (worldsData.containsKey(worldName.toLowerCase()) || mirrorsGroup.containsKey(worldName.toLowerCase())) {
+ if (worldsData.containsKey(worldName.toLowerCase()) || mirrorsGroup.containsKey(worldName.toLowerCase()) || mirrorsUser.containsKey(worldName.toLowerCase())) {
return true;
}
return false;
@@ -554,7 +554,7 @@ public class WorldsHolder {
* @return true if it has its own holder. false if not.
*/
public boolean hasOwnData(String worldName) {
- if (worldsData.containsKey(worldName.toLowerCase())) {
+ if (worldsData.containsKey(worldName.toLowerCase()) && (!mirrorsGroup.containsKey(worldName.toLowerCase()) || !mirrorsUser.containsKey(worldName.toLowerCase()))) {
return true;
}
return false;
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java
index 4482f3d9e..fdb740646 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMGroupEvent.java
@@ -1,6 +1,9 @@
package org.anjocaido.groupmanager.events;
+import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.data.Group;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
@@ -8,7 +11,7 @@ import org.bukkit.event.HandlerList;
* @author ElgarL
*
*/
-public class GMGroupEvent extends GroupManagerEvent {
+public class GMGroupEvent extends Event {
/**
*
@@ -67,4 +70,16 @@ public class GMGroupEvent extends GroupManagerEvent {
GROUP_ADDED,
GROUP_REMOVED,
}
+
+ public void schedule(final GMGroupEvent event) {
+
+ if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
+
+ @Override
+ public void run() {
+ Bukkit.getServer().getPluginManager().callEvent(event);
+ }
+ }, 1) == -1)
+ GroupManager.logger.warning("Could not schedule GM Event.");
+ }
} \ No newline at end of file
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java
index eb4b95c03..1ff605d5c 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMSystemEvent.java
@@ -1,5 +1,8 @@
package org.anjocaido.groupmanager.events;
+import org.anjocaido.groupmanager.GroupManager;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
@@ -7,7 +10,7 @@ import org.bukkit.event.HandlerList;
* @author ElgarL
*
*/
-public class GMSystemEvent extends GroupManagerEvent {
+public class GMSystemEvent extends Event {
/**
*
@@ -44,4 +47,16 @@ public class GMSystemEvent extends GroupManagerEvent {
DEFAULT_GROUP_CHANGED,
VALIDATE_TOGGLE,
}
+
+ public void schedule(final GMSystemEvent event) {
+
+ if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
+
+ @Override
+ public void run() {
+ Bukkit.getServer().getPluginManager().callEvent(event);
+ }
+ }, 1) == -1)
+ GroupManager.logger.warning("Could not schedule GM Event.");
+ }
} \ No newline at end of file
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java
index efa591562..d40a7d63e 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMUserEvent.java
@@ -1,6 +1,9 @@
package org.anjocaido.groupmanager.events;
+import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.data.User;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
@@ -8,7 +11,7 @@ import org.bukkit.event.HandlerList;
* @author ElgarL
*
*/
-public class GMUserEvent extends GroupManagerEvent {
+public class GMUserEvent extends Event {
/**
*
@@ -69,4 +72,16 @@ public class GMUserEvent extends GroupManagerEvent {
USER_ADDED,
USER_REMOVED,
}
+
+ public void schedule(final GMUserEvent event) {
+
+ if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
+
+ @Override
+ public void run() {
+ Bukkit.getServer().getPluginManager().callEvent(event);
+ }
+ }, 1) == -1)
+ GroupManager.logger.warning("Could not schedule GM Event.");
+ }
} \ No newline at end of file
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java
deleted file mode 100644
index 0834b3ada..000000000
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.anjocaido.groupmanager.events;
-
-
-import org.anjocaido.groupmanager.GroupManager;
-import org.bukkit.Bukkit;
-import org.bukkit.event.Event;
-
-/**
- * @author ElgarL
- *
- */
-public abstract class GroupManagerEvent extends Event {
-
- /**
- *
- */
- private static final long serialVersionUID = 8790362185329926951L;
-
- protected GroupManagerEvent(String name) {
- super(name);
- }
-
- /**
- * Triggers all GroupManager events for other plugins to see.
- * Schedules events for 1 tick later to allow GM to finish populating super perms.
- *
- * @param event
- */
- public void schedule(final GroupManagerEvent event) {
-
- if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
-
- @Override
- public void run() {
- Bukkit.getServer().getPluginManager().callEvent(event);
- }
- }, 1) == -1)
- GroupManager.logger.warning("Could not schedule GM Event.");
- }
-
-
-} \ No newline at end of file
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java
index 3c077b6c6..3a4d8d266 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java
@@ -6,6 +6,8 @@ import org.anjocaido.groupmanager.data.User;
/**
* @author ElgarL
+ *
+ * Handles all Event generation.
*
*/
public class GroupManagerEventHandler {
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java
index 51c6dded5..2e008e223 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java
@@ -134,14 +134,18 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
groupPermArray = populatePerms(ph.getGroup(group).getPermissionList(), includeChildren);
}
- // Add all group permissions, unless negated by direct player perms.
- for (String perm : groupPermArray)
- if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm)))
+ // Add all group permissions, unless negated by earlier permissions.
+ for (String perm : groupPermArray) {
+ boolean negated = (perm.startsWith("-"));
+ // Perm doesn't already exists and there is no negation for it
+ // or It's a negated perm where a normal perm doesn't exists (don't allow inheritance to negate higher perms)
+ if ((!negated && !playerPermArray.contains(perm) && !playerPermArray.contains("-" + perm))
+ || (negated && !playerPermArray.contains(perm.substring(1))))
playerPermArray.add(perm);
+ }
}
- // Collections.sort(playerPermArray,
- // StringPermissionComparator.getInstance());
+ // Collections.sort(playerPermArray, StringPermissionComparator.getInstance());
return playerPermArray;
}
@@ -150,42 +154,45 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
Set<String> permArray = new HashSet<String>();
- for (String perm : perms) {
-
- // Allow * node to populate ALL perms in Bukkit.
- if (perm.equalsIgnoreCase("*"))
- permArray.addAll(GroupManager.BukkitPermissions.getAllRegisteredPermissions(includeChildren));
-
- boolean negated = false;
- if (perm.startsWith("-"))
- negated = true;
+ // Allow * node to populate ALL perms in Bukkit.
+ if (perms.contains("*")) {
+ permArray.addAll(GroupManager.BukkitPermissions.getAllRegisteredPermissions(includeChildren));
+ }
- if (!permArray.contains(perm)) {
- permArray.add(perm);
-
- if ((negated) && (permArray.contains(perm.substring(1))))
- permArray.remove(perm.substring(1));
-
- if (includeChildren) {
-
- Map<String, Boolean> children = GroupManager.BukkitPermissions.getAllChildren((negated ? perm.substring(1) : perm), new HashSet<String>());
-
- if (children != null) {
- if (negated) {
-
- // Remove children of negated nodes
- for (String child : children.keySet())
- if (children.get(child))
- if (permArray.contains(child))
- permArray.remove(child);
-
- } else {
+ for (String perm : perms) {
- // Add child nodes
- for (String child : children.keySet())
- if (children.get(child))
- if ((!permArray.contains(child)) && (!permArray.contains("-" + child)))
- permArray.add(child);
+ if (!perm.equalsIgnoreCase("*")) {
+ boolean negated = false;
+ if (perm.startsWith("-"))
+ negated = true;
+
+ if (!permArray.contains(perm)) {
+ permArray.add(perm);
+
+ if ((negated) && (permArray.contains(perm.substring(1))))
+ permArray.remove(perm.substring(1));
+
+ if (includeChildren) {
+
+ Map<String, Boolean> children = GroupManager.BukkitPermissions.getAllChildren((negated ? perm.substring(1) : perm), new HashSet<String>());
+
+ if (children != null) {
+ if (negated) {
+
+ // Remove children of negated nodes
+ for (String child : children.keySet())
+ if (children.get(child))
+ if (permArray.contains(child))
+ permArray.remove(child);
+
+ } else {
+
+ // Add child nodes
+ for (String child : children.keySet())
+ if (children.get(child))
+ if ((!permArray.contains(child)) && (!permArray.contains("-" + child)))
+ permArray.add(child);
+ }
}
}
}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java
index f9363e04d..396b49583 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java
@@ -20,15 +20,15 @@ import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import org.anjocaido.groupmanager.GroupManager;
-//import org.anjocaido.groupmanager.data.User;
import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
-//import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -46,7 +46,6 @@ import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
-//import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginManager;
@@ -54,12 +53,12 @@ import org.bukkit.plugin.PluginManager;
*
* BukkitPermissions overrides to force GM reponses to Superperms
*
- * @author ElgarL, originally based upon PermissionsEX implementation
+ * @author ElgarL
*/
public class BukkitPermissions {
protected Map<Player, PermissionAttachment> attachments = new HashMap<Player, PermissionAttachment>();
- protected LinkedList<Permission> registeredPermissions = new LinkedList<Permission>();
+ protected LinkedHashMap<String, Permission> registeredPermissions = new LinkedHashMap<String, Permission>();
protected GroupManager plugin;
protected boolean dumpAllPermissions = true;
protected boolean dumpMatchedPermissions = true;
@@ -112,17 +111,12 @@ public class BukkitPermissions {
public void collectPermissions() {
registeredPermissions.clear();
- /*
- for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) {
- for (Permission permission : bukkitPlugin.getDescription().getPermissions())
- registeredPermissions.push(permission);
+
+ for (Permission perm : Bukkit.getPluginManager().getPermissions()) {
+ registeredPermissions.put(perm.getName().toLowerCase(), perm);
}
- */
-
- registeredPermissions = new LinkedList<Permission>(Bukkit.getPluginManager().getPermissions());
}
-
public void updatePermissions(Player player) {
this.updatePermissions(player, null);
@@ -156,73 +150,22 @@ public class BukkitPermissions {
OverloadedWorldHolder worldData = plugin.getWorldsHolder().getWorldData(world);
Boolean value = false;
- //User user = worldData.getUser(player.getName());
-
- /*
- // clear permissions
- for (String permission : attachment.getPermissions().keySet())
- attachment.unsetPermission(permission);
- */
-
- /*
- * find matching permissions
- *
- * and base bukkit perms if we are set to allow bukkit permissions to
- * override.
- */
-
- /*
- for (Permission permission : registeredPermissions) {
-
- PermissionCheckResult result = worldData.getPermissionsHandler().checkFullGMPermission(user, permission.getName(), false);
-
- // Only check bukkit override IF we don't have the permission
- // directly.
- if (result.resultType == PermissionCheckResult.Type.NOTFOUND) {
- PermissionDefault permDefault = permission.getDefault();
-
- if ((plugin.getGMConfig().isBukkitPermsOverride()) && ((permDefault == PermissionDefault.TRUE)
- || ((permDefault == PermissionDefault.NOT_OP) && !player.isOp())
- || ((permDefault == PermissionDefault.OP) && player.isOp()))) {
- value = true;
- } else {
- value = false;
- }
- } else if (result.resultType == PermissionCheckResult.Type.NEGATION) {
- value = false;
- } else {
- value = true;
- }
-
- // Set the root permission
- if ((value == true) || (result.resultType == PermissionCheckResult.Type.NEGATION)) {
- attachment.setPermission(permission, value);
- }
- }
- */
// Add all permissions for this player (GM only)
// child nodes will be calculated by Bukkit.
- Set<String> playerPermArray = worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName(), false);
- Map<String, Boolean> newPerms = new HashMap<String, Boolean>();
-
- //Set<String> hash = new HashSet<String>();
- //for (String permission : playerPermArray)
- // hash.add(permission);
-
+ List<String> playerPermArray = new ArrayList<String>(worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName(), false));
+ LinkedHashMap<String, Boolean> newPerms = new LinkedHashMap<String, Boolean>();
+
+ // Sort the perm list by parent/child, so it will push to superperms correctly.
+ playerPermArray = sort(playerPermArray);
+
for (String permission : playerPermArray) {
value = (!permission.startsWith("-"));
- /*
- if (!attachment.getPermissions().containsKey(permission)) {
- attachment.setPermission(permission, value);
- }
- */
+
newPerms.put((value? permission : permission.substring(1)), value);
}
-
- //player.recalculatePermissions();
-
+
/**
* This is put in place until such a time as Bukkit pull 466 is implemented
* https://github.com/Bukkit/Bukkit/pull/466
@@ -242,6 +185,42 @@ public class BukkitPermissions {
e.printStackTrace();
}
}
+
+ /**
+ * Sort a permission node list by parent/child
+ *
+ * @param permList
+ * @return List sorted for priority
+ */
+ private List<String> sort(List<String> permList) {
+
+ List<String> result = new ArrayList<String>();
+
+ for (String key : permList) {
+ String a = key.charAt(0) == '-'? key.substring(1):key;
+ Map<String, Boolean> allchildren = GroupManager.BukkitPermissions.getAllChildren(a, new HashSet<String>());
+ if (allchildren != null) {
+
+ ListIterator<String> itr = result.listIterator();
+
+ while (itr.hasNext()){
+ String node = (String) itr.next();
+ String b = node.charAt(0) == '-'? node.substring(1):node;
+
+ // Insert the parent node before the child
+ if (allchildren.containsKey(b)) {
+ itr.set(key);
+ itr.add(node);
+ break;
+ }
+ }
+ }
+ if (!result.contains(key))
+ result.add(key);
+ }
+
+ return result;
+ }
/**
@@ -255,13 +234,12 @@ public class BukkitPermissions {
List<String> perms = new ArrayList<String>();
- for (Permission permission : registeredPermissions) {
- String name = permission.getName();
- if (!perms.contains(name)) {
- perms.add(name);
+ for (String key : registeredPermissions.keySet()) {
+ if (!perms.contains(key)) {
+ perms.add(key);
if (includeChildren) {
- Map<String, Boolean> children = getAllChildren(name, new HashSet<String>());
+ Map<String, Boolean> children = getAllChildren(key, new HashSet<String>());
if (children != null) {
for (String node : children.keySet())
if (!perms.contains(node))
@@ -317,13 +295,13 @@ public class BukkitPermissions {
* @return Map of child permissions
*/
public Map<String, Boolean> getChildren(String node) {
- for (Permission permission : registeredPermissions) {
- if (permission.getName().equalsIgnoreCase(node)) {
- return permission.getChildren();
- }
- }
- return null;
+ Permission perm = registeredPermissions.get(node.toLowerCase());
+ if (perm == null)
+ return null;
+
+ return perm.getChildren();
+
}
/**
@@ -361,6 +339,14 @@ public class BukkitPermissions {
updatePermissions(player);
}
}
+
+ /**
+ * force Bukkit to update this Players permissions.
+ */
+ public void updatePlayer(Player player) {
+ if (player != null)
+ this.updatePermissions(player, null);
+ }
protected class PlayerEvents implements Listener {
@@ -370,7 +356,7 @@ public class BukkitPermissions {
Player player = event.getPlayer();
// force GM to create the player if they are not already listed.
if (plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()) != null) {
- //setPlayer_join(false);
+ setPlayer_join(false);
updatePermissions(event.getPlayer());
}
setPlayer_join(false);
@@ -378,7 +364,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerPortal(PlayerPortalEvent event) { // will portal into another world
- if (event.getTo() != null && !event.getFrom().getWorld().equals(event.getTo().getWorld())) { // only if world actually changed
+ if ((event.getTo() != null) && (!event.getFrom().getWorld().equals(event.getTo().getWorld()))) { // only if world actually changed
updatePermissions(event.getPlayer(), event.getTo().getWorld().getName());
}
}
@@ -390,7 +376,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerTeleport(PlayerTeleportEvent event) { // can be teleported into another world
- if (event.getTo() != null && !event.getFrom().getWorld().equals(event.getTo().getWorld())) { // only if world actually changed
+ if ((event.getTo() != null) && (event.getPlayer() != null) && (!event.getFrom().getWorld().equals(event.getTo().getWorld()))) { // only if world actually changed
updatePermissions(event.getPlayer(), event.getTo().getWorld().getName());
}
}
diff --git a/EssentialsGroupManager/src/plugin.yml b/EssentialsGroupManager/src/plugin.yml
index dc9b4c29c..65a5d4e95 100644
--- a/EssentialsGroupManager/src/plugin.yml
+++ b/EssentialsGroupManager/src/plugin.yml
@@ -1,7 +1,7 @@
name: GroupManager
version: GMBuildVer (Phoenix)
main: org.anjocaido.groupmanager.GroupManager
-website: http://www.anjocaido.info/
+website: http://ess.khhq.net/wiki/Group_Manager
description: Provides on-the-fly system for permissions system created by Nijikokun. But all in memory, and with flat-file saving schedule.
authors:
- AnjoCaido
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java
index de58d86ed..248ac15b7 100644
--- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java
@@ -43,10 +43,15 @@ public class EssentialsSpawnPlayerListener implements Listener
}
if (respawnAtHome)
{
- Location home = user.getHome(user.getLocation());
- if (home == null)
+ Location home;
+ final Location bed = user.getBedSpawnLocation();
+ if (bed != null && bed.getBlock().getType() == Material.BED_BLOCK)
{
- home = user.getBedSpawnLocation();
+ home = bed;
+ }
+ else
+ {
+ home = user.getHome(user.getLocation());
}
if (home != null)
{
diff --git a/lib/bukkit.jar b/lib/bukkit.jar
index 14f2e6e0b..394d5b667 100644
--- a/lib/bukkit.jar
+++ b/lib/bukkit.jar
Binary files differ
diff --git a/lib/craftbukkit.jar b/lib/craftbukkit.jar
index f22af8eca..52bda3246 100644
--- a/lib/craftbukkit.jar
+++ b/lib/craftbukkit.jar
Binary files differ