1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-08-18 04:21:31 +02:00

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
This commit is contained in:
KHobbits
2012-01-28 13:33:09 +00:00
29 changed files with 428 additions and 353 deletions

View File

@@ -54,7 +54,7 @@ import org.yaml.snakeyaml.error.YAMLException;
public class Essentials extends JavaPlugin implements IEssentials 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 static final Logger LOGGER = Logger.getLogger("Minecraft");
private transient ISettings settings; private transient ISettings settings;
private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this); private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this);

View File

@@ -21,7 +21,18 @@ public class Commanddelhome extends EssentialsCommand
@Cleanup @Cleanup
IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null; IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null;
String name; 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"))) if (expandedArg.length > 1 && (user == null || user.isAuthorized("essentials.delhome.others")))
{ {

View File

@@ -7,6 +7,8 @@ import com.earth2me.essentials.api.IUser;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
@@ -51,10 +53,14 @@ public class Commandhome extends EssentialsCommand
} }
catch (NotEnoughArgumentsException e) catch (NotEnoughArgumentsException e)
{ {
Location bed = player.getBedSpawnLocation();
if (bed != null && bed.getBlock().getType() != Material.BED_BLOCK)
{
bed = null;
}
final List<String> homes = player.getHomes(); final List<String> homes = player.getHomes();
if (homes.isEmpty() && player.equals(user)) if (homes.isEmpty() && player.equals(user))
{ {
final Location bed = player.getBedSpawnLocation();
if (bed != null) if (bed != null)
{ {
user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND); user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND);
@@ -73,7 +79,10 @@ public class Commandhome extends EssentialsCommand
} }
else else
{ {
homes.add("bed"); if (bed != null)
{
homes.add("bed");
}
user.sendMessage(_("homes", Util.joinList(homes))); user.sendMessage(_("homes", Util.joinList(homes)));
} }
} }

View File

@@ -1,5 +1,6 @@
package com.earth2me.essentials.commands; package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -37,7 +38,7 @@ public class Commandnuke extends EssentialsCommand
{ {
continue; continue;
} }
player.sendMessage("May death rain upon them"); player.sendMessage(_("nuke"));
final Location loc = player.getLocation(); final Location loc = player.getLocation();
final World world = loc.getWorld(); final World world = loc.getWorld();
for (int x = -10; x <= 10; x += 5) for (int x = -10; x <= 10; x += 5)

View File

@@ -26,6 +26,9 @@ public class Commandsethome extends EssentialsCommand
{ {
if (user.isAuthorized("essentials.sethome.multiple")) 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)) if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getGroups().getHomeLimit(user))
|| (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH)))) || (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH))))
{ {
@@ -62,6 +65,9 @@ public class Commandsethome extends EssentialsCommand
{ {
name = "home"; name = "home";
} }
if ("bed".equals(name.toLowerCase(Locale.ENGLISH))) {
throw new NotEnoughArgumentsException();
}
usersHome.acquireWriteLock(); usersHome.acquireWriteLock();
if (usersHome.getData().getHomes() == null) if (usersHome.getData().getHomes() == null)

View File

@@ -238,6 +238,7 @@ notRecommendedBukkit= * ! * Bukkit version is not the recommended build for Esse
notSupportedYet=Not supported yet. notSupportedYet=Not supported yet.
nothingInHand = \u00a7cYou have nothing in your hand. nothingInHand = \u00a7cYou have nothing in your hand.
now=now now=now
nuke=May death rain upon them
numberRequired=A number goes there, silly. numberRequired=A number goes there, silly.
onlyDayNight=/time only supports day/night. onlyDayNight=/time only supports day/night.
onlyPlayers=Only in-game players can use {0}. onlyPlayers=Only in-game players can use {0}.

View File

@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * Bukkit version er ikke den anbefalede build til Essen
notSupportedYet=Ikke underst\u00f8ttet endnu. notSupportedYet=Ikke underst\u00f8ttet endnu.
nothingInHand = \u00a7cDu har intet i din h\u00c3\u00a5nd. nothingInHand = \u00a7cDu har intet i din h\u00c3\u00a5nd.
now=nu now=nu
nuke=May death rain upon them
numberRequired=Et nummer skal v\u00e6re, din tardo. numberRequired=Et nummer skal v\u00e6re, din tardo.
onlyDayNight=/time underst\u00f8tter kun day/night. onlyDayNight=/time underst\u00f8tter kun day/night.
onlyPlayers=Kun in-game spillere kan bruge {0}. onlyPlayers=Kun in-game spillere kan bruge {0}.

View File

@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * Die verwendete Bukkit-Version ist nicht f\u00fcr Esse
notSupportedYet=Noch nicht verf\u00fcgbar. notSupportedYet=Noch nicht verf\u00fcgbar.
nothingInHand = \u00a7cYou have nothing in your hand. nothingInHand = \u00a7cYou have nothing in your hand.
now=jetzt now=jetzt
nuke=May death rain upon them
numberRequired=Ein Zahl wird ben\u00f6tigt. numberRequired=Ein Zahl wird ben\u00f6tigt.
onlyDayNight=/time unterst\u00fctzt nur day und night. onlyDayNight=/time unterst\u00fctzt nur day und night.
onlyPlayers=Nur Spieler k\u00f6nnen {0} benutzen. onlyPlayers=Nur Spieler k\u00f6nnen {0} benutzen.

View File

@@ -238,6 +238,7 @@ notRecommendedBukkit= * ! * Bukkit version is not the recommended build for Esse
notSupportedYet=Not supported yet. notSupportedYet=Not supported yet.
nothingInHand = \u00a7cYou have nothing in your hand. nothingInHand = \u00a7cYou have nothing in your hand.
now=now now=now
nuke=May death rain upon them
numberRequired=A number goes there, silly. numberRequired=A number goes there, silly.
onlyDayNight=/time only supports day/night. onlyDayNight=/time only supports day/night.
onlyPlayers=Only in-game players can use {0}. onlyPlayers=Only in-game players can use {0}.

View File

@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * La version de bukkit no es la recomendada para esta v
notSupportedYet=No esta soportado aun. notSupportedYet=No esta soportado aun.
nothingInHand = \u00a7cYou have nothing in your hand. nothingInHand = \u00a7cYou have nothing in your hand.
now=ahora now=ahora
nuke=May death rain upon them
numberRequired=Un numero es necesario, amigo. numberRequired=Un numero es necesario, amigo.
onlyDayNight=/time solo soporta day/night. (dia/noche) onlyDayNight=/time solo soporta day/night. (dia/noche)
onlyPlayers=Solo los jugadores conectados pueden usar {0}. onlyPlayers=Solo los jugadores conectados pueden usar {0}.

View File

@@ -1,7 +1,7 @@
#version: TeamCity #version: TeamCity
# Single quotes have to be doubled: '' # Single quotes have to be doubled: ''
# Translations start here # Translations start here
# by: # by: L\u00e9a Gris
action=* {0} {1} action=* {0} {1}
addedToAccount=\u00a7a{0} a \u00e9t\u00e9 rajout\u00e9 \u00e0 votre compte. addedToAccount=\u00a7a{0} a \u00e9t\u00e9 rajout\u00e9 \u00e0 votre compte.
addedToOthersAccount=\u00a7a{0} a \u00e9t\u00e9 ajout\u00e9 \u00e0 {1} 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. backAfterDeath=\u00a77Utilisez la commande /back pour retourner \u00e0 l''endroit ou vous \u00eates mort.
backUsageMsg=\u00a77Retour \u00e0 votre emplacement pr\u00e9c\u00c3\u00a8dent. backUsageMsg=\u00a77Retour \u00e0 votre emplacement pr\u00e9c\u00c3\u00a8dent.
backupFinished=Sauvegarde termin\u00e9 backupFinished=Sauvegarde termin\u00e9
backupStarted=D\u00e9but de la sauvegarde backupStarted=D\u00e9but de la sauvegarde...
balance=\u00a77Solde : {0} balance=\u00a77Solde : {0}
balanceTop=\u00a77 Meilleurs soldes ({0}) balanceTop=\u00a77 Meilleurs soldes au ({0})
banExempt=\u00a77Vous ne pouvez pas bannir ce joueur. banExempt=\u00a77Vous ne pouvez pas bannir ce joueur.
banIpAddress=\u00a77Adresse IP bannie banIpAddress=\u00a77Adresse IP bannie.
bannedIpsFileError=Erreur de lecture de banned-ips.txt bannedIpsFileError=Erreur de lecture de banned-ips.txt
bannedIpsFileNotFound=Fichier banned-ips.txt introuvable bannedIpsFileNotFound=Fichier banned-ips.txt introuvable
bannedPlayersFileError=Erreur lors de la lecture de banned-players.txt bannedPlayersFileError=Erreur lors de la lecture de banned-players.txt
bannedPlayersFileNotFound=banned-players.txt introuvable. 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. bigTreeSuccess=\u00a77Gros arbre cr\u00e9e.
blockList=Essentials relayed the following commands to another plugin: blockList=Essentials relayed the following commands to another plugin:
broadcast=[\u00a7cMessage\u00a7f]\u00a7a {0} 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. 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). burnMsg=\u00a77Vous avez enflamm\u00e9 {0} pour {1} seconde(s).
canTalkAgain=\u00a77Vous pouvez de nouveau parler. 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! 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} cantSpawnItem=\u00a7cVous n''avez pas le droit de faire appara\u00c3\u00aetre {0}
chatTypeLocal=[L] chatTypeLocal=[L]
@@ -39,10 +39,10 @@ commandFailed=\u00c9chec de la commande {0} :
commandHelpFailedForPlugin=Erreur d''obtention d''aide pour : {0} commandHelpFailedForPlugin=Erreur d''obtention d''aide pour : {0}
commandNotLoaded=\u00a7cLa commande {0} a \u00e9t\u00e9 mal charg\u00e9e. commandNotLoaded=\u00a7cLa commande {0} a \u00e9t\u00e9 mal charg\u00e9e.
compassBearing=\u00a77Orientation : {0} ({1} degr\u00e9s). 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 configFileRenameError=\u00c9chec du changement de nom du fichier temporaire de config.yml
connectedPlayers=Joueurs connect\u00e9s : connectedPlayers=Joueurs connect\u00e9s :
connectionFailed=\u00c9chec de l''ouverture de la connexion. connectionFailed=\u00c9chec de l'ouverture de la connexion.
cooldownWithMessage=\u00a7cR\u00e9utilisation : {0} cooldownWithMessage=\u00a7cR\u00e9utilisation : {0}
corruptNodeInConfig=\u00a74Annonce : Votre fichier de configuration a un {0} n\u0153ud corrompu. corruptNodeInConfig=\u00a74Annonce : Votre fichier de configuration a un {0} n\u0153ud corrompu.
couldNotFindTemplate=Le mod\u00c3\u00a8le {0} est introuvable 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}. deniedAccessCommand=L''acc\u00c3\u00a8s \u00e0 la commande a \u00e9t\u00e9 refus\u00e9 pour {0}.
dependancyDownloaded=[Essentials] Fichier {0} correctement t\u00e9l\u00e9charg\u00e9. dependancyDownloaded=[Essentials] Fichier {0} correctement t\u00e9l\u00e9charg\u00e9.
dependancyException=[Essentials] Une erreur est survenue lors de la tentative de t\u00e9l\u00e9chargement. 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. depth=\u00a77Vous \u00eates au niveau de la mer.
depthAboveSea=\u00a77Vous \u00eates \u00e0 {0} bloc(s) au-dessus du 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. 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 disabled=d\u00e9sactiv\u00e9
disabledToSpawnMob=Spawning this mob was disabled in the config file. disabledToSpawnMob=Spawning this mob was disabled in the config file.
dontMoveMessage=\u00a77La t\u00e9l\u00e9portation commence dans {0}. Ne bougez pas. 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} duplicatedUserdata=Donn\u00e9e utilisateur dupliqu\u00e9e : {0} et {1}
enableUnlimited=\u00a77Quantit\u00e9 illimit\u00e9e de {0} \u00e0 {1}. enableUnlimited=\u00a77Quantit\u00e9 illimit\u00e9e de {0} \u00e0 {1}.
enabled=activ\u00e9 enabled=activ\u00e9
@@ -79,17 +79,17 @@ enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item
enchantments = \u00a77Enchantments : {0} enchantments = \u00a77Enchantments : {0}
errorCallingCommand=Erreur en appelant la commande /{0} errorCallingCommand=Erreur en appelant la commande /{0}
errorWithMessage=\u00a7cErreur : {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 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=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 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 Recharg\u00e9 {0} essentialsReload=\u00a77Essentials {0} a \u00e9t\u00e9 recharg\u00e9.
extinguish=\u00a77Vous cessez de br\u00fbler. extinguish=\u00a77Vous cessez de br\u00fbler.
extinguishOthers=\u00a77Vous avez \u00e9teint la combustion de {0}. extinguishOthers=\u00a77Vous avez \u00e9teint la combustion de {0}.
failedToCloseConfig=Echec de la fermeture de la configuration {0} failedToCloseConfig=Echec de la fermeture de la configuration {0}
failedToCreateConfig=Echec de la cr\u00e9ation de la configuration {0} failedToCreateConfig=Echec de la cr\u00e9ation de la configuration {0}
failedToWriteConfig=\u00c9chec de l''\u00e9criture de la configuration {0} failedToWriteConfig=\u00c9chec de l''\u00e9criture de la configuration {0}
false=faux false=non
feed=\u00a77Your appetite was sated. feed=\u00a77Vous avez \u00e9t\u00e9 rassasi\u00e9.
feedOther=\u00a77Satisfied {0}. feedOther=\u00a77 est rassasi\u00e9 {0}.
fileRenameError=Echec du changement de nom de {0} fileRenameError=Echec du changement de nom de {0}
foreverAlone=\u00a7cVous n''avez personne \u00e0 qui r\u00e9pondre foreverAlone=\u00a7cVous n''avez personne \u00e0 qui r\u00e9pondre
freedMemory=A lib\u00e9r\u00e9 {0} Mo. 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. heal=\u00a77Vous avez \u00e9t\u00e9 soign\u00e9.
healOther=\u00a77{0} a \u00e9t\u00e9 soign\u00e9. healOther=\u00a77{0} a \u00e9t\u00e9 soign\u00e9.
helpConsole=Pour voir l''aide tapez ? 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. helpPages=Page \u00a7c{0}\u00a7f sur \u00a7c{1}\u00a7f.
holeInFloor=Trou dans le Sol. holeInFloor=Trou dans le Sol.
homeSet=\u00a77R\u00e9sidence d\u00e9finie. homeSet=\u00a77R\u00e9sidence d\u00e9finie.
@@ -121,15 +121,15 @@ ignorePlayer=Vous ignorez d\u00e9sormais {0}.
illegalDate=Format de date ill\u00e9gal. illegalDate=Format de date ill\u00e9gal.
infoChapter=S\u00e9lectionnez le chapitre : infoChapter=S\u00e9lectionnez le chapitre :
infoChapterPages=Chapitre {0}, page \u00a7c{1}\u00a7f sur \u00a7c{2}\u00a7f: 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. infoPages=Page \u00a7c{0}\u00a7f de \u00a7c{1}\u00a7f.
infoUnknownChapter=Chapitre inconnu. infoUnknownChapter=Chapitre inconnu.
invBigger=Les inventaires des autres joueurs sont plus gros que le v\u00f4tre. invBigger=Les inventaires des autres joueurs sont plus gros que le v\u00f4tre.
invRestored=Votre inventaire vous a \u00e9t\u00e9 rendu. invRestored=Votre inventaire vous a \u00e9t\u00e9 rendu.
invSee=Vous voyez l''inventaire de {0}. 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. invalidCharge=\u00a7cCharge invalide.
invalidMob=Mauvias type de monstre. invalidMob=Mauvias type de cr\u00e9ature.
invalidServer=Serveur non valide. invalidServer=Serveur non valide.
invalidSignLine=La ligne {0} du panneau est invalide. invalidSignLine=La ligne {0} du panneau est invalide.
invalidWorld=\u00a7cMonde invalide. invalidWorld=\u00a7cMonde invalide.
@@ -138,46 +138,46 @@ inventoryClearedOthers=\u00a77L''inventaire de \u00a7c{0}\u00a77 a \u00e9t\u00e9
is=est is=est
itemCannotBeSold=Cet objet ne peut \u00eatre vendu au serveur. 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. 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. 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 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. 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) 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) itemSoldConsole={0} vendu {1} pour \u00a77{2} \u00a77({3} objet(s) \u00e0 {4} chacun)
itemSpawn=\u00a77Donne {0} de {1} 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} jailAlreadyIncarcerated=\u00a7cJoueur d\u00e9j\u00e0 emprisonn\u00e9 : {0}
jailMessage=\u00a7cVous avez commis un crime, vous en payez le prix. 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. jailReleased=\u00a77Joueur \u00a7e{0}\u00a77 lib\u00e9r\u00e9.
jailReleasedPlayerNotify=\u00a77Vous avez \u00e9t\u00e9 lib\u00e9r\u00e9 ! jailReleasedPlayerNotify=\u00a77Vous avez \u00e9t\u00e9 lib\u00e9r\u00e9 !
jailSentenceExtended=Dur\u00e9e d''emprisonnement rallong\u00e9e de : {0) jailSentenceExtended=Dur\u00e9e d''emprisonnement rallong\u00e9e de : {0)
jailSet=\u00a77La prison {0} a \u00e9t\u00e9 cr\u00e9\u00e9. jailSet=\u00a77La prison {0} a \u00e9t\u00e9 cr\u00e9\u00e9.
jumpError=\u00c7a aurait pu faire mal au cerveau de votre ordinateur. jumpError=\u00c7a aurait pu faire mal au cerveau de votre ordinateur.
kickDefault=Kick\u00e9 du serveur kickDefault=\u00c9ject\u00e9 du serveur
kickExempt=\u00a77Vous ne pouvez pas lancer ce joueur. kickExempt=\u00a77Vous ne pouvez pas \u00e9jecter ce joueur.
kill=\u00a77Tu\u00e9 {0}. kill=\u00a77Tu\u00e9 {0}.
kitError2=\u00a7cCe kit n''existe pas ou a \u00e9t\u00e9 mal d\u00e9fini. kitError2=\u00a7cCe kit n'existe pas ou a \u00e9t\u00e9 mal d\u00e9fini.
kitError=\u00a7cIl n''y a pas de kits valides. kitError=\u00a7cIl n'y a pas de kits valides.
kitErrorHelp=\u00a7cPeut-\u00eatre qu''un objet manque d''une quantit\u00e9 dans la configuration ? kitErrorHelp=\u00a7cPeut-\u00eatre qu'un objet manque d'une quantit\u00e9 dans la configuration ?
kitGive=\u00a77Donner le kit {0}. kitGive=\u00a77Donner le kit {0}.
InvFull=\u00a7cYour inventory was full, dropping items on the floor InvFull=\u00a7cYour inventory was full, dropping items on the floor
kitTimed=\u00a7cVous ne pouvez pas utiliser ce kit pendant encore {0}. kitTimed=\u00a7cVous ne pouvez pas utiliser ce kit pendant encore {0}.
kits=\u00a77Kits :{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. lightningUse=\u00a77{0} a \u00e9t\u00e9 foudroy\u00e9.
listAfkTag = \u00a77[AFK]\u00a7f listAfkTag = \u00a77[AFK]\u00a7f
listAmount = \u00a79Il y a \u00a7c{0}\u00a79 joueurs en ligne sur \u00a7c{1}\u00a79 au total. 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. listAmountHidden = \u00a79Il y a \u00a7c{0}\u00a77/{1}\u00a79 sur un maximum de \u00a7c{2}\u00a79 joueurs en ligne.
listHiddenTag = \u00a77[MASQU\u00c9]\u00a7f listHiddenTag = \u00a77[MASQU\u00c9]\u00a7f
loadWarpError=\u00c9chec du chargement du raccourci {0} loadWarpError=\u00c9chec du chargement du point de t\u00e9l\u00e9portation {0}.
localFormat=Locale :<{0}> {1} localFormat=Locale : <{0}> {1}
mailClear=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear mailClear=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear
mailCleared=\u00a77Courrier supprim\u00e9 ! mailCleared=\u00a77Courrier supprim\u00e9 !
mailSent=\u00a77Courrier envoy\u00e9 ! mailSent=\u00a77Courrier envoy\u00e9 !
markMailAsRead=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear markMailAsRead=\u00a7cPour marquer votre courrier en tant que lu, entrez /mail clear
markedAsAway=\u00a77Vous \u00eates d\u00e9sormais AFK. 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. maxHomes=Vous ne pouvez pas cr\u00e9er plus de {0} r\u00e9sidences.
mayNotJail=\u00a7cVous ne pouvez pas emprisonner cette personne. mayNotJail=\u00a7cVous ne pouvez pas emprisonner cette personne.
me=moi me=moi
@@ -185,68 +185,69 @@ minute=minute
minutes=minutes minutes=minutes
missingItems=Vous n''avez pas {0} x {1}. missingItems=Vous n''avez pas {0} x {1}.
missingPrefixSuffix=Pr\u00e9fixe ou Suffixe manquant pour {0} missingPrefixSuffix=Pr\u00e9fixe ou Suffixe manquant pour {0}
mobSpawnError=Erreur lors du changement du g\u00e9n\u00e9rateur de monstres. mobSpawnError=Erreur lors du changement du g\u00e9n\u00e9rateur de cr\u00e9atures.
mobSpawnLimit=Quantit\u00e9 de monstres limit\u00e9 \u00e0 au maximum du serveur. mobSpawnLimit=Quantit\u00e9 de cr\u00e9atures limit\u00e9 \u00e0 au maximum du serveur.
mobSpawnTarget=Le bloc cible doit \u00eatre un g\u00e9n\u00e9rateur de monstres. mobSpawnTarget=Le bloc cible doit \u00eatre un g\u00e9n\u00e9rateur de cr\u00e9atures.
mobsAvailable=\u00a77Monstres : {0} mobsAvailable=\u00a77cr\u00e9atures : {0}
moneyRecievedFrom=\u00a7a{0} a \u00e9t\u00e9 re\u00e7u de {1} moneyRecievedFrom=\u00a7a{0} a \u00e9t\u00e9 re\u00e7u de {1}
moneySentTo=\u00a7a{0} a \u00e9t\u00e9 envoy\u00e9 \u00e0 {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 month=mois
months=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} msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2}
muteExempt=\u00a7cVous ne pouvez pas r\u00e9duire ce joueur au silence. muteExempt=\u00a7cVous ne pouvez pas r\u00e9duire ce joueur au silence.
mutedPlayer=Le joueur {0} est d\u00e9sormais muet. mutedPlayer=Le joueur {0} est d\u00e9sormais muet.
mutedPlayerFor={0} a \u00e9t\u00e9 muet pour {1}. mutedPlayerFor={0} a \u00e9t\u00e9 muet pour {1}.
mutedUserSpeaks={0} a essay\u00e9 de parler mais est muet. mutedUserSpeaks={0} a essay\u00e9 de parler mais est muet.
nearbyPlayers=Players nearby: {0} nearbyPlayers=Joueurs dans les environs : {0}
needTpohere=Vous avez besoin de l''acc\u00c3\u00a8s \u00e0 /tpohere pour t\u00e9l\u00e9porter d''autres joueurs. 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. negativeBalanceError=L'utilisateur n'est pas autoris\u00e9 \u00e0 avoir un solde n\u00e9gatif.
nickChanged=surnom modifi\u00e9. nickChanged=surnom modifi\u00e9.
nickDisplayName=\u00a77Vous devez activer change-displayname dans la configuration Essentials. nickDisplayName=\u00a77Vous devez activer change-displayname dans la configuration Essentials.
nickInUse=\u00a7cCe nom est d\u00e9j\u00e0 utilis\u00e9. nickInUse=\u00a7cCe nom est d\u00e9j\u00e0 utilis\u00e9.
nickNamesAlpha=\u00a7cLes surnoms doivent \u00eatre alphanum\u00e9riques. nickNamesAlpha=\u00a7cLes surnoms doivent \u00eatre alphanum\u00e9riques.
nickNoMore=\u00a7Vous n''avez plus de surnom. nickNoMore=\u00a7 Vous n'avez plus de surnom.
nickOthersPermission=\u00a7cVous n''avez pas la permission de changer le surnom des autres. nickOthersPermission=\u00a7cVous n'avez pas la permission de changer le surnom des autres.
nickSet=\u00a77Votre surnom est maintenant \u00a7c{0} 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} 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}. noDestroyPermission=\u00a7cVous n''avez pas la permission de d\u00e9truire ce {0}.
noGodWorldWarning=\u00a7cWarning! Le mode Dieu est d\u00e9sactiv\u00e9 dans ce monde. noGodWorldWarning=\u00a7cWarning! Le mode Dieu est d\u00e9sactiv\u00e9 dans ce monde.
noHelpFound=\u00a7cAucune commande correspondante. noHelpFound=\u00a7cAucune commande correspondante.
noHomeSet=Vous n''avez pas d\u00e9fini de r\u00e9sidence. noHomeSet=Vous n'avez pas d\u00e9fini de r\u00e9sidence.
noHomeSetPlayer=Le joueur n''a pas d\u00e9fini sa 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. noKitPermission=\u00a7cVous avez besoin de la permission \u00a7c{0}\u00a7c pour utiliser ce kit.
noKits=\u00a77Il n''y a pas encore de kits disponibles. noKits=\u00a77Il n'y a pas encore de kits disponibles.
noMail=Vous n''avez pas de courrier noMail=Vous n'avez pas de courrier
noMotd=\u00a7cIl n''y a pas de message su jour. noMotd=\u00a7cIl n'y a pas de message su jour.
noNewMail=\u00a77Vous n''avez pas de courrier. noNewMail=\u00a77Vous n'avez pas de courrier.
noPendingRequest=Vous n''avez pas de requ\u00eate non lue. noPendingRequest=Vous n'avez pas de requ\u00eate non lue.
noPerm=\u00a7cVous n''avez pas la permission \u00a7f{0}\u00a7c. noPerm=\u00a7cVous n''avez pas la permission \u00a7f{0}\u00a7c.
noPermToSpawnMob=\u00a7cYou don''t have permission to spawn this mob. 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. 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. noPowerTools=Vous n'avez pas d'outil macro associ\u00e9.
noRules=\u00a7cIl n''y a pas encore de r\u00c3\u00a8gles d\u00e9finies. noRules=\u00a7cIl n'y a pas encore de r\u00e8gles d\u00e9finies.
noWarpsDefined=Aucun raccourci d\u00e9fini. noWarpsDefined=Aucun point de t\u00e9l\u00e9portation d\u00e9fini.
none=aucun none=aucun
notAllowedToQuestion=\u00a7cVous n''\u00eates pas autoris\u00e9 \u00e0 poser des questions. notAllowedToQuestion=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 poser des questions.
notAllowedToShout=\u00a7cVous n''\u00eates pas autoris\u00e9 \u00e0 crier. notAllowedToShout=\u00a7cVous n'\u00eates pas autoris\u00e9 \u00e0 crier.
notEnoughExperience=You do not have enough experience. notEnoughExperience=Vous n'avez pas assez d'exp\u00e9rience.
notEnoughMoney=Vous n''avez pas les fonds n\u00e9cessaires. 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. notRecommendedBukkit=* ! * La version de Bukkit n'est pas celle qui est recommand\u00e9 pour cette version de Essentials.
notSupportedYet=Pas encore pris en charge. notSupportedYet=Pas encore pris en charge.
nothingInHand = \u00a7cVous n''avez rien en main. nothingInHand = \u00a7cVous n'avez rien en main.
now=maintenant now=maintenant
nuke=Que la mort s'abatte sur eux !
numberRequired=Il faut fournir un nombre ici. numberRequired=Il faut fournir un nombre ici.
onlyDayNight=/time ne supporte que (jour) day/night (nuit). onlyDayNight=/time ne supporte que (jour) day/night (nuit).
onlyPlayers=Seulement les joueurs en jeu peuvent utiliser {0}. onlyPlayers=Seulement les joueurs en jeu peuvent utiliser {0}.
onlySunStorm=/weather ne supporte que (soleil) sun/storm (temp\u00eate). onlySunStorm=/weather ne supporte que (soleil) sun/storm (temp\u00eate).
orderBalances=Ordering balances of {0} users, please wait ... orderBalances=Classement des balance de {0} utilisateurs, patientez ...
pTimeCurrent=\u00a7e{0}''s\u00a7f l''heure est {1}. pTimeCurrent=Pour \u00a7e{0}\u00a7f l''heure est {1}.
pTimeCurrentFixed=\u00a7e{0}''s\u00a7f l''heure est fix\u00e9e \u00e0 {1}. pTimeCurrentFixed=L''heure de \u00a7e{0}\u00a7f est fix\u00e9e \u00e0 {1}.
pTimeNormal=\u00a7e{0}''s\u00a7f l''heure est normale et correspond au server. 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. pTimeOthersPermission=\u00a7cVous n'etes pas autoris\u00e9 \u00e0 changer l'heure des autres joueurs.
pTimePlayers=Ces joueurs ont leur propre horraire : pTimePlayers=Ces joueurs ont leur propre horraire :
pTimeReset=l''heure a \u00e9t\u00e9 r\u00e9initialis\u00e9e \u00e0 : \u00a7e{0} 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} 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}. playerInJail=\u00a7cLe joueur est d\u00e9j\u00e0 dans la prison {0}.
playerJailed=\u00a77Le joueur {0} a \u00e9t\u00e9 emprisonn\u00e9. playerJailed=\u00a77Le joueur {0} a \u00e9t\u00e9 emprisonn\u00e9.
playerJailedFor=\u00a77{0} a \u00e9t\u00e9 emprisonn\u00e9 pour {1}. 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. playerMuted=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence.
playerMutedFor=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence pour {0} playerMutedFor=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duis au silence pour {0}
playerNeverOnServer=\u00a7cLe joueur {0} n''a jamais \u00e9t\u00e9 sur le serveur. 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. playerUnmuted=\u00a77Vous avez de nouveau la parole.
pong=Pong ! pong=Pong !
possibleWorlds=\u00a77Les mondes possibles sont les nombres de 0 \u00e0 {0}. 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}. powerToolAlreadySet=La commande \u00a7c{0}\u00a7f est d\u00e9j\u00e0 assign\u00e9e \u00e0 {1}.
powerToolAttach=Commande \u00a7c{0}\u00a7f assign\u00e9e \u00e0 {1}. powerToolAttach=Commande \u00a7c{0}\u00a7f assign\u00e9e \u00e0 {1}.
powerToolClearAll=Toutes les commandes assign\u00e9es ont \u00e9et\u00e9e retir\u00e9ees. powerToolClearAll=Toutes les commandes assign\u00e9es ont \u00e9et\u00e9e retir\u00e9ees.
powerToolList={1} assign\u00e9s aux commandes : \u00a7c{0}\u00a7f. 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}. 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}. powerToolRemoveAll=Toutes les commandes retir\u00e9es de {0}.
powerToolsDisabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 retir\u00e9es. powerToolsDisabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 retir\u00e9es.
powerToolsEnabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 activ\u00e9es. powerToolsEnabled=Toutes vos commandes assign\u00e9es ont \u00e9t\u00e9 activ\u00e9es.
protectionOwner=\u00a76[EssentialsProtect] Propri\u00e9taire de la protection : {0} protectionOwner=\u00a76[EssentialsProtect] Propri\u00e9taire de la protection : {0}
questionFormat=\u00a77[Question]\u00a7f {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. 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}. repair=Vous avez r\u00e9par\u00e9 votre : \u00a7e{0}.
repairAlreadyFixed=\u00a77Cet objet n''a pas besoin de r\u00e9paration. repairAlreadyFixed=\u00a77Cet objet n'a pas besoin de r\u00e9paration.
repairEnchanted=\u00a77You are not allowed to repair enchanted items. repairEnchanted=\u00a77Vous n'\u00eates pas autoris\u00e9 \u00e0 r\u00e9parer les objets enchant\u00e9s.
repairInvalidType=\u00a7cCet objet ne peut \u00eatre r\u00e9par\u00e9. 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. requestAccepted=\u00a77Demande de t\u00e9l\u00e9portation accept\u00e9e.
requestAcceptedFrom=\u00a77{0} a accept\u00e9 votre demande de t\u00e9l\u00e9portation. requestAcceptedFrom=\u00a77{0} a accept\u00e9 votre demande de t\u00e9l\u00e9portation.
requestDenied=\u00a77Demande de t\u00e9l\u00e9portation refus\u00e9e. requestDenied=\u00a77Demande de t\u00e9l\u00e9portation refus\u00e9e.
requestDeniedFrom=\u00a77{0} a refus\u00e9 votre demande de t\u00e9l\u00e9portation. requestDeniedFrom=\u00a77{0} a refus\u00e9 votre demande de t\u00e9l\u00e9portation.
requestSent=\u00a77Requ\u00eate envoy\u00e9e \u00e0 {0}\u00a77. requestSent=\u00a77Requ\u00eate envoy\u00e9e \u00e0 {0}\u00a77.
requestTimedOut=\u00a7cTeleport request has timed out requestTimedOut=\u00a7cLa de mande de t\u00e9l\u00e9portation a expir\u00e9.
requiredBukkit=* ! * You need atleast build {0} of CraftBukkit, download it from http://ci.bukkit.org. 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. returnPlayerToJailError=Erreur survenue lors de la tentative d'emprisonner de nouveau un joueur.
second=seconde second=seconde
seconds=secondes seconds=secondes
seenBanReason=Reason: {0} seenBanReason=Reason: {0}
@@ -307,14 +308,14 @@ shoutFormat=\u00a77[Crie]\u00a7f {0}
signFormatFail=\u00a74[{0}] signFormatFail=\u00a74[{0}]
signFormatSuccess=\u00a71[{0}] signFormatSuccess=\u00a71[{0}]
signFormatTemplate=[{0}] signFormatTemplate=[{0}]
signProtectInvalidLocation=\u00a74Vous n''avez pas l''autorisation de cr\u00e9er une pancarte ici. signProtectInvalidLocation=\u00a74Vous n'avez pas l'autorisation de cr\u00e9er une pancarte ici.
similarWarpExist=Un raccourci avec un nom similaire existe d\u00e9j\u00e0. similarWarpExist=Un point de t\u00e9l\u00e9portation avec un nom similaire existe d\u00e9j\u00e0.
slimeMalformedSize=Taille mal form\u00e9e. slimeMalformedSize=Taille mal form\u00e9e.
soloMob=Ce monstre aime \u00eatre seul. soloMob=Ce cr\u00e9ature aime \u00eatre seul.
spawnSet=\u00a77Le point de spawn a \u00e9t\u00e9 d\u00e9fini pour le groupe {0}. spawnSet=\u00a77Le point de d\u00e9part a \u00e9t\u00e9 d\u00e9fini pour le groupe {0}.
spawned=invoqu\u00e9(s) spawned=invoqu\u00e9(s)
suicideMessage=\u00a77Au revoir monde cruel... suicideMessage=\u00a77Au revoir monde cruel...
suicideSuccess=\u00a77{0} s''est suiscid\u00e9. suicideSuccess=\u00a77{0} s''est suicid\u00e9.
survival=survie survival=survie
takenFromAccount=\u00a7c{0} ont \u00e9t\u00e9 retir\u00e9 de votre compte. takenFromAccount=\u00a7c{0} ont \u00e9t\u00e9 retir\u00e9 de votre compte.
takenFromOthersAccount=\u00a7c{0} a \u00e9t\u00e9 r\u00e9tir\u00e9 du compte de {1}. 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. 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. 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. 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. teleportTop=\u00a77T\u00e9l\u00e9portation vers le haut.
teleportationCommencing=\u00a77D\u00e9but de la t\u00e9l\u00e9portation... teleportationCommencing=\u00a77D\u00e9but de la t\u00e9l\u00e9portation...
teleportationDisabled=\u00a77T\u00e9l\u00e9poration d\u00e9sactiv\u00e9. 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 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]*)?)? 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. 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}. timeWorldCurrent=Il est \u00a73{1}\u00a77 dans \u00a7c{0}.
timeWorldSet=L''heure a \u00e9t\u00e9 r\u00e9gl\u00e9e \u00e0 {0} dans : \u00a7c{1} timeWorldSet=L''heure a \u00e9t\u00e9 r\u00e9gl\u00e9e \u00e0 {0} dans : \u00a7c{1}
tradeCompleted=\u00a77\u00c9change termin\u00e9. tradeCompleted=\u00a77\u00c9change termin\u00e9.
tradeSignEmpty=Le panneau de vente n''as pas encore assez de stock. 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. 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. 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. treeSpawned=\u00a77Arbre cr\u00e9\u00e9.
true=vrai true=oui
typeTpaccept=\u00a77Pour le t\u00e9l\u00e9porter, tapez \u00a7c/tpaccept\u00a77. typeTpaccept=\u00a77Pour le t\u00e9l\u00e9porter, utilisez \u00a7c/tpaccept\u00a77.
typeTpdeny=\u00a77Pour d\u00e9cliner cette demande, entrez \u00a7c/tpdeny\u00a77. typeTpdeny=\u00a77Pour d\u00e9cliner cette demande, utilisez \u00a7c/tpdeny\u00a77.
typeWorldName=\u00a77Vous pouvez aussi taper le nom d''un monde sp\u00e9cifique. typeWorldName=\u00a77Vous pouvez aussi taper le nom d'un monde sp\u00e9cifique.
unableToSpawnMob=Incapable d''invoquer un monstre. unableToSpawnMob=Incapable d'invoquer un cr\u00e9ature.
unbannedIP=Adresse IP d\u00e9bannie. unbannedIP=Adresse IP d\u00e9bannie.
unbannedPlayer=Joueur d\u00e9banni. unbannedPlayer=Joueur d\u00e9banni.
unignorePlayer=Vous n''ignorez plus {0}. unignorePlayer=Vous n''ignorez plus {0}.
@@ -366,34 +367,34 @@ unlimitedItems=Objets illimit\u00e9s:
unmutedPlayer=Le joueur {0} n''est plus muet. unmutedPlayer=Le joueur {0} n''est plus muet.
upgradingFilesError=Erreur durant la mise \u00e0 jour des fichiers. upgradingFilesError=Erreur durant la mise \u00e0 jour des fichiers.
userDoesNotExist=L''utilisateur {0} n''existe pas. userDoesNotExist=L''utilisateur {0} n''existe pas.
userIsAway={0} s''est mis en AFK userIsAway={0} s'est mis en AFK
userIsNotAway={0} n''est plus inactif userIsNotAway={0} n'est plus AFK
userJailed=\u00a77Vous avez \u00e9t\u00e9 emprisonn\u00e9 userJailed=\u00a77Vous avez \u00e9t\u00e9 emprisonn\u00e9.
userUsedPortal={0} a utilis\u00e9 un portail existant. userUsedPortal={0} a utilis\u00e9 un portail existant.
userdataMoveBackError=Echec du d\u00e9placement de userdata/{0}.tmp vers userdata/{1} userdataMoveBackError=Echec du d\u00e9placement de userdata/{0}.tmp vers userdata/{1}
userdataMoveError=Echec du d\u00e9placement de userdata/{0} vers userdata/{1}.tmp userdataMoveError=Echec du d\u00e9placement de userdata/{0} vers userdata/{1}.tmp
usingTempFolderForTesting=Utilise un fichier temporaire pour un test. usingTempFolderForTesting=Utilise un fichier temporaire pour un test.
versionMismatch=Versions diff\u00e9rentes ! Mettez s''il vous plait {0} \u00e0 la m\u00eame version. 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. voiceSilenced=\u00a77Vous avez \u00e9t\u00e9 r\u00e9duit au silence.
warpDeleteError=Probl\u00c3\u00a8me concernant la suppression du fichier warp. warpDeleteError=Probl\u00c3\u00a8me concernant la suppression du fichier warp.
warpListPermission=\u00a7cVous n''avez pas la permission d''afficher la liste des warps. warpListPermission=\u00a7cVous n'avez pas la permission d'afficher la liste des points de t\u00e9l\u00e9portation.
warpNotExist=Ce raccourci n''existe pas. warpNotExist=Ce point de t\u00e9l\u00e9portation n'existe pas.
warpSet=\u00a77Le raccourci {0} a \u00e9t\u00e9 cr\u00e9\u00e9. warpSet=\u00a77Le point de t\u00e9l\u00e9portation {0} a \u00e9t\u00e9 cr\u00e9\u00e9.
warpUsePermission=\u00a7cVous n''avez pas la permission d''utiliser ce warp. warpUsePermission=\u00a7cVous n'avez pas la permission d'utiliser ce point de t\u00e9l\u00e9portation.
warpingTo=\u00a77T\u00e9l\u00e9portation au warp {0}. warpingTo=\u00a77T\u00e9l\u00e9portation vers {0}.
warps=Raccourcis : {0} warps=point de t\u00e9l\u00e9portations : {0}
warpsCount=\u00a77Il y a {0} raccourcis. Page {1} sur {2}. warpsCount=\u00a77Il y a {0} points de t\u00e9l\u00e9portations. Page {1} sur {2}.
warpOverwrite=\u00a7cYou cannot overwrite that warp. warpOverwrite=\u00a7cYou cannot overwrite that warp.
weatherStorm=\u00a77Vous avez programm\u00e9 l''orage dans {0} weatherStorm=\u00a77Vous avez programm\u00e9 l''orage dans {0}
weatherStormFor=\u00a77Vous avez programm\u00e9 l''orage dans {0} pour {1} secondes. weatherStormFor=\u00a77Vous avez programm\u00e9 l''orage dans {0} pour {1} secondes.
weatherSun=\u00a77Vous avez programm\u00e9 le beau temps dans {0} weatherSun=\u00a77Vous avez programm\u00e9 le beau temps dans {0}
weatherSunFor=\u00a77Vous avez programm\u00e9 le beau temps dans {0} pour {1} secondes. 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} whoisGamemode=\u00a79 - Mode de jeu : {0}
whoisGeoLocation=\u00a79 - Emplacement : {0} whoisGeoLocation=\u00a79 - Emplacement : {0}
whoisGod=\u00a79 - Mode Dieu : {0} whoisGod=\u00a79 - Mode Dieu : {0}
whoisHealth=\u00a79 - Vie : {0} / 20 whoisHealth=\u00a79 - Sant\u00e9 : {0} / 20
whoisIPAddress=\u00a79 - Adresse IP : {0} whoisIPAddress=\u00a79 - Adresse IP : {0}
whoisIs={0} est {1} whoisIs={0} est {1}
whoisLocation=\u00a79 - Emplacement : ({0}, {1}, {2}, {3}) whoisLocation=\u00a79 - Emplacement : ({0}, {1}, {2}, {3})

View File

@@ -238,6 +238,7 @@ notRecommendedBukkit=* ! * De Bukkit versie is niet de aangeraden build voor Ess
notSupportedYet=Nog niet ondersteund. notSupportedYet=Nog niet ondersteund.
nothingInHand = \u00a7cYou have nothing in your hand. nothingInHand = \u00a7cYou have nothing in your hand.
now=nu now=nu
nuke=May death rain upon them
numberRequired=Er moet daar een nummer, grapjas. numberRequired=Er moet daar een nummer, grapjas.
onlyDayNight=/time ondersteund alleen day/night. onlyDayNight=/time ondersteund alleen day/night.
onlyPlayers=Alleen in-game spelers kunnen {0} gebruiken. onlyPlayers=Alleen in-game spelers kunnen {0} gebruiken.

View File

@@ -109,3 +109,19 @@ v 1.9:
- Fixed text when adding a subgroup to not say the player was moved. - Fixed text when adding a subgroup to not say the player was moved.
- Update to new Bukkit Event system. - Update to new Bukkit Event system.
- Update GroupManagerBridge for new event system. - 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.

View File

@@ -66,10 +66,12 @@ public class GMConfiguration {
public Map<String, Object> getMirrorsMap() { public Map<String, Object> getMirrorsMap() {
// Try to fetch the old mirror path first // 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); 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 (Map<String, Object>) GMconfig.getConfigurationSection("settings.mirrors").getValues(false);
}
return null;
} }

View File

@@ -26,7 +26,6 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder; import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder;
import org.anjocaido.groupmanager.events.GMWorldListener; import org.anjocaido.groupmanager.events.GMWorldListener;
import org.anjocaido.groupmanager.events.GroupManagerEvent;
import org.anjocaido.groupmanager.utils.GMLoggerHandler; import org.anjocaido.groupmanager.utils.GMLoggerHandler;
import org.anjocaido.groupmanager.utils.PermissionCheckResult; import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.anjocaido.groupmanager.utils.Tasks; import org.anjocaido.groupmanager.utils.Tasks;
@@ -490,8 +489,10 @@ public class GroupManager extends JavaPlugin {
return false; return false;
} }
// PARECE OK // PARECE OK
auxUser.addSubGroup(auxGroup); if (auxUser.addSubGroup(auxGroup))
sender.sendMessage(ChatColor.YELLOW + "You added subgroup '" + auxGroup.getName() + "' to player '" + auxUser.getName() + "'."); 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()); targetPlayer = this.getServer().getPlayer(auxUser.getName());
if (targetPlayer != null) if (targetPlayer != null)

View File

@@ -114,7 +114,7 @@ public class User extends DataUnit implements Cloneable {
flagAsChanged(); flagAsChanged();
if (GroupManager.isLoaded()) if (GroupManager.isLoaded())
if (!GroupManager.BukkitPermissions.isPlayer_join()) 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 * the group to set
*/ */
public void setGroup(Group group) { 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())) { if (!this.getDataSource().groupExists(group.getName())) {
getDataSource().addGroup(group); getDataSource().addGroup(group);
} }
@@ -129,9 +138,9 @@ public class User extends DataUnit implements Cloneable {
String oldGroup = this.group; String oldGroup = this.group;
this.group = group.getName(); this.group = group.getName();
flagAsChanged(); flagAsChanged();
if (GroupManager.isLoaded()) { if (GroupManager.isLoaded() && (updatePerms)) {
if (!GroupManager.BukkitPermissions.isPlayer_join()) if (!GroupManager.BukkitPermissions.isPlayer_join())
GroupManager.BukkitPermissions.updateAllPlayers(); GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
// Do we notify of the group change? // Do we notify of the group change?
String defaultGroupName = getDataSource().getDefaultGroup().getName(); 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())) { 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())) { if (!this.getDataSource().groupExists(subGroup.getName())) {
getDataSource().addGroup(subGroup); getDataSource().addGroup(subGroup);
} }
subGroup = getDataSource().getGroup(subGroup.getName());
removeSubGroup(subGroup);
subGroups.add(subGroup.getName()); subGroups.add(subGroup.getName());
flagAsChanged(); flagAsChanged();
if (GroupManager.isLoaded()) { if (GroupManager.isLoaded()) {
if (!GroupManager.BukkitPermissions.isPlayer_join()) if (!GroupManager.BukkitPermissions.isPlayer_join())
GroupManager.BukkitPermissions.updateAllPlayers(); GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED); GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED);
} }
return true;
//subGroup = getDataSource().getGroup(subGroup.getName());
//removeSubGroup(subGroup);
//subGroups.add(subGroup.getName());
} }
public int subGroupsSize() { public int subGroupsSize() {
@@ -183,7 +202,7 @@ public class User extends DataUnit implements Cloneable {
flagAsChanged(); flagAsChanged();
if (GroupManager.isLoaded()) if (GroupManager.isLoaded())
if (!GroupManager.BukkitPermissions.isPlayer_join()) if (!GroupManager.BukkitPermissions.isPlayer_join())
GroupManager.BukkitPermissions.updateAllPlayers(); GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED); GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED);
return true; return true;
} }
@@ -229,8 +248,8 @@ public class User extends DataUnit implements Cloneable {
} }
flagAsChanged(); flagAsChanged();
if (GroupManager.isLoaded()) { if (GroupManager.isLoaded()) {
if (!GroupManager.BukkitPermissions.isPlayer_join()) //if (!GroupManager.BukkitPermissions.isPlayer_join())
GroupManager.BukkitPermissions.updateAllPlayers(); // GroupManager.BukkitPermissions.updatePlayer(this.getName());
GroupManagerEventHandler.callEvent(this, Action.USER_INFO_CHANGED); GroupManagerEventHandler.callEvent(this, Action.USER_INFO_CHANGED);
} }
} }

View File

@@ -245,7 +245,7 @@ public class WorldDataHolder {
return null; return null;
} }
User newUser = new User(this, userName); User newUser = new User(this, userName);
newUser.setGroup(groups.getDefaultGroup()); newUser.setGroup(groups.getDefaultGroup(), false);
addUser(newUser); addUser(newUser);
setUsersChanged(true); setUsersChanged(true);
return newUser; return newUser;

View File

@@ -116,7 +116,8 @@ public class WorldsHolder {
public void mirrorSetUp() { public void mirrorSetUp() {
mirrorsGroup.clear(); mirrorsGroup.clear();
mirrorsUser.clear(); mirrorsUser.clear();
Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap(); Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap();
if (mirrorsMap != null) { if (mirrorsMap != null) {
for (String source : mirrorsMap.keySet()) { for (String source : mirrorsMap.keySet()) {
// Make sure all non mirrored worlds have a set of data files. // 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 // These worlds fully mirror their parent
for (Object o : mirrorList) { for (Object o : mirrorList) {
try { String world = o.toString().toLowerCase();
mirrorsGroup.remove(o.toString().toLowerCase()); if (world != serverDefaultWorldName) {
mirrorsUser.remove(o.toString().toLowerCase()); try {
} catch (Exception e) { mirrorsGroup.remove(world);
} mirrorsUser.remove(world);
mirrorsGroup.put(o.toString().toLowerCase(), getWorldData(source).getName()); } catch (Exception e) {
mirrorsUser.put(o.toString().toLowerCase(), getWorldData(source).getName()); }
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) { } else if (mirrorsMap.get(source) instanceof MemorySection) {
MemorySection subSection = (MemorySection) mirrorsMap.get(source); MemorySection subSection = (MemorySection) mirrorsMap.get(source);
for (String key : subSection.getKeys(true)) { for (String key : subSection.getKeys(true)) {
//System.out.print("Key - " + key);
if (subSection.get(key) instanceof ArrayList) { if (key.toLowerCase() != serverDefaultWorldName) {
ArrayList mirrorList = (ArrayList) subSection.get(key);
// These worlds have defined mirroring if (subSection.get(key) instanceof ArrayList) {
for (Object o : mirrorList) { ArrayList mirrorList = (ArrayList) subSection.get(key);
String type = o.toString().toLowerCase();
try {
if (type.equals("groups"))
mirrorsGroup.remove(key.toLowerCase());
if (type.equals("users")) // These worlds have defined mirroring
mirrorsUser.remove(key.toLowerCase()); for (Object o : mirrorList) {
String type = o.toString().toLowerCase();
try {
if (type.equals("groups"))
mirrorsGroup.remove(key.toLowerCase());
} catch (Exception e) { if (type.equals("users"))
} mirrorsUser.remove(key.toLowerCase());
if (type.equals("groups"))
mirrorsGroup.put(key.toLowerCase(), getWorldData(source).getName());
if (type.equals("users")) } catch (Exception e) {
mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName()); }
} 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 * If the world is not on the worlds list, returns the default world
* holder. * holder.
* *
* (WHEN A WORLD IS CONFIGURED TO MIRROR, IT WILL BE ON THE LIST, BUT * Mirrors return original world data.
* POINTING TO ANOTHER WORLD HOLDER)
*
* Mirrors prevails original data.
* *
* @param worldName * @param worldName
* @return OverloadedWorldHolder * @return OverloadedWorldHolder
*/ */
public OverloadedWorldHolder getWorldData(String worldName) { public OverloadedWorldHolder getWorldData(String worldName) {
String worldNameLowered = worldName.toLowerCase(); 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 (data == null) { if (worldsData.containsKey(worldNameLowered))
GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world..."); return worldsData.get(worldNameLowered);
data = getDefaultWorld();
} GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world...");
return data; return getDefaultWorld();
} }
/** /**
@@ -541,7 +541,7 @@ public class WorldsHolder {
* @return true if world is loaded or mirrored. false if not listed * @return true if world is loaded or mirrored. false if not listed
*/ */
public boolean isInList(String worldName) { 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 true;
} }
return false; return false;
@@ -554,7 +554,7 @@ public class WorldsHolder {
* @return true if it has its own holder. false if not. * @return true if it has its own holder. false if not.
*/ */
public boolean hasOwnData(String worldName) { 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 true;
} }
return false; return false;

View File

@@ -1,6 +1,9 @@
package org.anjocaido.groupmanager.events; package org.anjocaido.groupmanager.events;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.data.Group; import org.anjocaido.groupmanager.data.Group;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@@ -8,7 +11,7 @@ import org.bukkit.event.HandlerList;
* @author ElgarL * @author ElgarL
* *
*/ */
public class GMGroupEvent extends GroupManagerEvent { public class GMGroupEvent extends Event {
/** /**
* *
@@ -67,4 +70,16 @@ public class GMGroupEvent extends GroupManagerEvent {
GROUP_ADDED, GROUP_ADDED,
GROUP_REMOVED, 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.");
}
} }

View File

@@ -1,5 +1,8 @@
package org.anjocaido.groupmanager.events; package org.anjocaido.groupmanager.events;
import org.anjocaido.groupmanager.GroupManager;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@@ -7,7 +10,7 @@ import org.bukkit.event.HandlerList;
* @author ElgarL * @author ElgarL
* *
*/ */
public class GMSystemEvent extends GroupManagerEvent { public class GMSystemEvent extends Event {
/** /**
* *
@@ -44,4 +47,16 @@ public class GMSystemEvent extends GroupManagerEvent {
DEFAULT_GROUP_CHANGED, DEFAULT_GROUP_CHANGED,
VALIDATE_TOGGLE, 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.");
}
} }

View File

@@ -1,6 +1,9 @@
package org.anjocaido.groupmanager.events; package org.anjocaido.groupmanager.events;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.data.User; import org.anjocaido.groupmanager.data.User;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@@ -8,7 +11,7 @@ import org.bukkit.event.HandlerList;
* @author ElgarL * @author ElgarL
* *
*/ */
public class GMUserEvent extends GroupManagerEvent { public class GMUserEvent extends Event {
/** /**
* *
@@ -69,4 +72,16 @@ public class GMUserEvent extends GroupManagerEvent {
USER_ADDED, USER_ADDED,
USER_REMOVED, 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.");
}
} }

View File

@@ -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.");
}
}

View File

@@ -7,6 +7,8 @@ import org.anjocaido.groupmanager.data.User;
/** /**
* @author ElgarL * @author ElgarL
* *
* Handles all Event generation.
*
*/ */
public class GroupManagerEventHandler { public class GroupManagerEventHandler {

View File

@@ -134,14 +134,18 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
groupPermArray = populatePerms(ph.getGroup(group).getPermissionList(), includeChildren); groupPermArray = populatePerms(ph.getGroup(group).getPermissionList(), includeChildren);
} }
// Add all group permissions, unless negated by direct player perms. // Add all group permissions, unless negated by earlier permissions.
for (String perm : groupPermArray) for (String perm : groupPermArray) {
if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) 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); playerPermArray.add(perm);
}
} }
// Collections.sort(playerPermArray, // Collections.sort(playerPermArray, StringPermissionComparator.getInstance());
// StringPermissionComparator.getInstance());
return playerPermArray; return playerPermArray;
} }
@@ -150,42 +154,45 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
Set<String> permArray = new HashSet<String>(); Set<String> permArray = new HashSet<String>();
// Allow * node to populate ALL perms in Bukkit.
if (perms.contains("*")) {
permArray.addAll(GroupManager.BukkitPermissions.getAllRegisteredPermissions(includeChildren));
}
for (String perm : perms) { for (String perm : perms) {
// Allow * node to populate ALL perms in Bukkit. if (!perm.equalsIgnoreCase("*")) {
if (perm.equalsIgnoreCase("*")) boolean negated = false;
permArray.addAll(GroupManager.BukkitPermissions.getAllRegisteredPermissions(includeChildren)); if (perm.startsWith("-"))
negated = true;
boolean negated = false; if (!permArray.contains(perm)) {
if (perm.startsWith("-")) permArray.add(perm);
negated = true;
if (!permArray.contains(perm)) { if ((negated) && (permArray.contains(perm.substring(1))))
permArray.add(perm); permArray.remove(perm.substring(1));
if ((negated) && (permArray.contains(perm.substring(1)))) if (includeChildren) {
permArray.remove(perm.substring(1));
if (includeChildren) { Map<String, Boolean> children = GroupManager.BukkitPermissions.getAllChildren((negated ? perm.substring(1) : perm), new HashSet<String>());
Map<String, Boolean> children = GroupManager.BukkitPermissions.getAllChildren((negated ? perm.substring(1) : perm), new HashSet<String>()); if (children != null) {
if (negated) {
if (children != null) { // Remove children of negated nodes
if (negated) { for (String child : children.keySet())
if (children.get(child))
if (permArray.contains(child))
permArray.remove(child);
// Remove children of negated nodes } else {
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())
// Add child nodes if (children.get(child))
for (String child : children.keySet()) if ((!permArray.contains(child)) && (!permArray.contains("-" + child)))
if (children.get(child)) permArray.add(child);
if ((!permArray.contains(child)) && (!permArray.contains("-" + child))) }
permArray.add(child);
} }
} }
} }

View File

@@ -20,15 +20,15 @@ import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.GroupManager;
//import org.anjocaido.groupmanager.data.User;
import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder; import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
//import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -46,7 +46,6 @@ import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.permissions.Permission; import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.permissions.PermissionAttachmentInfo;
//import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
@@ -54,12 +53,12 @@ import org.bukkit.plugin.PluginManager;
* *
* BukkitPermissions overrides to force GM reponses to Superperms * BukkitPermissions overrides to force GM reponses to Superperms
* *
* @author ElgarL, originally based upon PermissionsEX implementation * @author ElgarL
*/ */
public class BukkitPermissions { public class BukkitPermissions {
protected Map<Player, PermissionAttachment> attachments = new HashMap<Player, PermissionAttachment>(); 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 GroupManager plugin;
protected boolean dumpAllPermissions = true; protected boolean dumpAllPermissions = true;
protected boolean dumpMatchedPermissions = true; protected boolean dumpMatchedPermissions = true;
@@ -112,18 +111,13 @@ public class BukkitPermissions {
public void collectPermissions() { public void collectPermissions() {
registeredPermissions.clear(); registeredPermissions.clear();
/*
for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) {
for (Permission permission : bukkitPlugin.getDescription().getPermissions())
registeredPermissions.push(permission);
}
*/
registeredPermissions = new LinkedList<Permission>(Bukkit.getPluginManager().getPermissions()); for (Permission perm : Bukkit.getPluginManager().getPermissions()) {
registeredPermissions.put(perm.getName().toLowerCase(), perm);
}
} }
public void updatePermissions(Player player) { public void updatePermissions(Player player) {
this.updatePermissions(player, null); this.updatePermissions(player, null);
} }
@@ -156,73 +150,22 @@ public class BukkitPermissions {
OverloadedWorldHolder worldData = plugin.getWorldsHolder().getWorldData(world); OverloadedWorldHolder worldData = plugin.getWorldsHolder().getWorldData(world);
Boolean value = false; 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) // Add all permissions for this player (GM only)
// child nodes will be calculated by Bukkit. // child nodes will be calculated by Bukkit.
Set<String> playerPermArray = worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName(), false); List<String> playerPermArray = new ArrayList<String>(worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName(), false));
Map<String, Boolean> newPerms = new HashMap<String, Boolean>(); LinkedHashMap<String, Boolean> newPerms = new LinkedHashMap<String, Boolean>();
//Set<String> hash = new HashSet<String>(); // Sort the perm list by parent/child, so it will push to superperms correctly.
//for (String permission : playerPermArray) playerPermArray = sort(playerPermArray);
// hash.add(permission);
for (String permission : playerPermArray) { for (String permission : playerPermArray) {
value = (!permission.startsWith("-")); value = (!permission.startsWith("-"));
/*
if (!attachment.getPermissions().containsKey(permission)) {
attachment.setPermission(permission, value);
}
*/
newPerms.put((value? permission : permission.substring(1)), 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 * This is put in place until such a time as Bukkit pull 466 is implemented
* https://github.com/Bukkit/Bukkit/pull/466 * https://github.com/Bukkit/Bukkit/pull/466
@@ -243,6 +186,42 @@ public class BukkitPermissions {
} }
} }
/**
* 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;
}
/** /**
* Fetch all permissions which are registered with superperms. * Fetch all permissions which are registered with superperms.
@@ -255,13 +234,12 @@ public class BukkitPermissions {
List<String> perms = new ArrayList<String>(); List<String> perms = new ArrayList<String>();
for (Permission permission : registeredPermissions) { for (String key : registeredPermissions.keySet()) {
String name = permission.getName(); if (!perms.contains(key)) {
if (!perms.contains(name)) { perms.add(key);
perms.add(name);
if (includeChildren) { if (includeChildren) {
Map<String, Boolean> children = getAllChildren(name, new HashSet<String>()); Map<String, Boolean> children = getAllChildren(key, new HashSet<String>());
if (children != null) { if (children != null) {
for (String node : children.keySet()) for (String node : children.keySet())
if (!perms.contains(node)) if (!perms.contains(node))
@@ -317,13 +295,13 @@ public class BukkitPermissions {
* @return Map of child permissions * @return Map of child permissions
*/ */
public Map<String, Boolean> getChildren(String node) { 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();
} }
/** /**
@@ -362,6 +340,14 @@ public class BukkitPermissions {
} }
} }
/**
* force Bukkit to update this Players permissions.
*/
public void updatePlayer(Player player) {
if (player != null)
this.updatePermissions(player, null);
}
protected class PlayerEvents implements Listener { protected class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
@@ -370,7 +356,7 @@ public class BukkitPermissions {
Player player = event.getPlayer(); Player player = event.getPlayer();
// force GM to create the player if they are not already listed. // force GM to create the player if they are not already listed.
if (plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()) != null) { if (plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()) != null) {
//setPlayer_join(false); setPlayer_join(false);
updatePermissions(event.getPlayer()); updatePermissions(event.getPlayer());
} }
setPlayer_join(false); setPlayer_join(false);
@@ -378,7 +364,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerPortal(PlayerPortalEvent event) { // will portal into another world 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()); updatePermissions(event.getPlayer(), event.getTo().getWorld().getName());
} }
} }
@@ -390,7 +376,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerTeleport(PlayerTeleportEvent event) { // can be teleported into another world 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()); updatePermissions(event.getPlayer(), event.getTo().getWorld().getName());
} }
} }

View File

@@ -1,7 +1,7 @@
name: GroupManager name: GroupManager
version: GMBuildVer (Phoenix) version: GMBuildVer (Phoenix)
main: org.anjocaido.groupmanager.GroupManager 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. description: Provides on-the-fly system for permissions system created by Nijikokun. But all in memory, and with flat-file saving schedule.
authors: authors:
- AnjoCaido - AnjoCaido

View File

@@ -43,10 +43,15 @@ public class EssentialsSpawnPlayerListener implements Listener
} }
if (respawnAtHome) if (respawnAtHome)
{ {
Location home = user.getHome(user.getLocation()); Location home;
if (home == null) 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) if (home != null)
{ {

Binary file not shown.

Binary file not shown.