[Archive] Serveur JoL / Sangrifeld [Fév. 11]

Fil fermé
Partager Rechercher
Est-il possible d'avoir la liste des commandes accessibles au joueur lambda ?

Les pages d'aide IG en oublient certaines (je n'y ai pas vu le /nick par exemple) et mentionnent celles réservées aux modérateurs.
premier vrai problème d'instabilité sur mon serveur, maintenant corrigé. (normalement)

Par contre on a du manger un (tout petit) rollback pour la première fois depuis la création du serveur du coup.

Historique:
  • entre 18h et 19h, le jeu essuie régulièrement des crashs, on ne comprend pas pourquoi.
  • 19h: les crashs s'intensifiant, je décide de tester une sauvegarde de 17h00.
  • je vide mon dossier world, mais n'arrive pas à mettre mes fichiers du dossier backup dedans. (message disque plein, alors que non)
  • Je désactive le ramdisk, pour tourner dans un dossier normal du RAID.
  • Je relance le serveur sur la map de 17h. (donc avec 2h de rollback)
  • après enquête j'ai enfin compris que le problème semblait venir des inodes (il en fallait plus!), du coup je reformate tout comme il faut.
  • serveur réouvre, et reste stable.

Enfin voilà, désolé pour ceux qui ont joués pendant ces deux heures.
Salut,

J'ai une foule de questions, je vais commencer par celle ci:

Comment savoir si une zone est libre de construction?
Comment devenir "propriétaire"?
Y a t-il un système économique mis en place?
Citation :
Publié par Masterkynes
Salut,

J'ai une foule de questions, je vais commencer par celle ci:

Comment savoir si une zone est libre de construction?
Comment devenir "propriétaire"?
Y a t-il un système économique mis en place?
Tu demandes à un administrateur ou un modérateur (enfin ça a un autre nom actuellement)
Il faut faire valider ton /sethome.
Pas actuellement.

Ne jouant plus énormément sur le serveur, mes réponses sont sûrement inexactes.

EDIT : Après quelques tests, sans succès, d'Ethann, Sang & Cam, je ne peux pas devenir Comte à cause de mon pseudo. J'ai fouillé un peu dans Bukkit & dans Permissions, je n'ai trouvé qu'une méthode validate() avec un regexp sur le nom du joueur, malheureusement celui-ci est juste avec mon pseudo... alors je n'ai vraiment aucune idée d'où vient le problème.

Code:
public class Test {
    public static void main(String args[]){
        System.out.println(this.validate("Bobby_.")); // return true
    }
    
    public static boolean validate(String name) {
        return name.matches("([0-9a-zA-Z._-]+)");
    }
}
Citation :
Publié par Menace.
...
Je dis peut-être une connerie vu que je connais ni java ni les regex, mais si Validate() renvoie true avec ton pseudo, ça signifie que c'est à la lecture du fichier contenant le nom des utilisateurs que ça merde, comme je le pensais au début. Je suis pratiquement sûr qu'il récupère et test "Bobby" au lieu de "Bobby_." (et que du coup si quelqu'un se connecte avec le pseudo "Bobby", il aura les droits).

Il faudrait que tu regarde comment ça se passe de ce côté là. Cherche à quels endroits il y a une référence à "config.yml", tu devrais trouver assez rapidement.

Ou sinon on reporte le bug
Citation :
Publié par Camélia
...
Je crois avoir trouvé. Malheureusement, si je m'aventure dans une refonte de la configuration elle ne sera plus compatible à la prochaine mise à jour (si l'auteur la change), et même, ça risque de complétement niquer le système de config si je fais une couille.

Le problème se trouve, à mon avis, dans com.nijiko.permissions.Control.java
Code:
package com.nijiko.permissions;

import com.nijiko.Messaging;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.bukkit.entity.Player;
import org.bukkit.util.config.Configuration;

public class Control extends PermissionHandler
{
  private Map<String, Set<String>> UserPermissions;
  private Map<String, String> UserGroups;
  private Map<String, Set<String>> Groups;
  private Map<String, Object[]> GroupsData;
  private Map<String, Set<String>> GroupsInheritance;
  private Map<String, Boolean> Cached;
  private String base = "";
  private Configuration config;

  public Control(Configuration config)
  {
    this.config = config;
  }

  public void load()
  {
    this.UserPermissions = new HashMap();
    this.UserGroups = new HashMap();
    this.Groups = new HashMap();
    this.GroupsData = new HashMap();
    this.GroupsInheritance = new HashMap();
    this.Cached = new HashMap();

    List userKeys = this.config.getKeys("users");
    List groupKeys = this.config.getKeys("groups");

    Set Permissions = new HashSet();
    Set Inheritance = new HashSet();

    if (groupKeys != null) {
      for (String key : groupKeys) {
        Inheritance = new HashSet();
        Permissions = new HashSet();

        List inheritance = this.config.getStringList("groups." + key + ".inheritance", null);
        List permissions = this.config.getStringList("groups." + key + ".permissions", null);
        boolean Default = this.config.getBoolean("groups." + key + ".default", false);
        String prefix = this.config.getString("groups." + key + ".info.prefix", null);
        String suffix = this.config.getString("groups." + key + ".info.suffix", null);
        boolean build = this.config.getBoolean("groups." + key + ".info.build", false);

        if ((Default) && (this.base == null ? "" == null : this.base.equals(""))) {
          this.base = key.toLowerCase();
        }

        if (inheritance.size() > 0) {
          Inheritance.addAll(inheritance);
        }

        if (permissions.size() > 0) {
          Permissions.addAll(permissions);
        }

        this.Groups.put(key.toLowerCase(), Permissions);
        this.GroupsData.put(key.toLowerCase(), new Object[] { key, prefix, suffix, Boolean.valueOf(build) });

        if (Inheritance.size() > 0) {
          this.GroupsInheritance.put(key.toLowerCase(), Inheritance);
        }
      }
    }

    if (userKeys != null)
      for (String key : userKeys) {
        Permissions = new HashSet();

        List permissions = this.config.getStringList("users." + key + ".permissions", null);
        String group = this.config.getString("users." + key + ".group");

        if (group != null) {
          if (!group.isEmpty())
            this.UserGroups.put(key.toLowerCase(), group);
        }
        else {
          this.UserGroups.put(key.toLowerCase(), this.base);
        }

        if (permissions.size() > 0) {
          Permissions.addAll(permissions);
        }

        this.UserPermissions.put(key.toLowerCase(), Permissions);
      }
  }

  private String toArrayListString(Collection variable)
  {
    return new ArrayList(variable).toString();
  }

  public boolean has(Player player, String permission)
  {
    return permission(player, permission);
  }

  public boolean permission(Player player, String permission)
  {
    Set Permissions = new HashSet();
    Set GroupPermissions = new HashSet();
    Set GroupInheritedPermissions = new HashSet();
    String group = "";
    String name = player.getName().toLowerCase();

    if (this.Cached.containsKey(name + "," + permission)) {
      return ((Boolean)this.Cached.get(name + "," + permission)).booleanValue();
    }

    if (this.UserPermissions.containsKey(name)) {
      Permissions = (Set)this.UserPermissions.get(name);
      group = ((String)this.UserGroups.get(name)).toLowerCase();

      if ((!this.Groups.isEmpty()) || (this.Groups != null)) {
        if (this.Groups.containsKey(group)) {
          GroupPermissions = (Set)this.Groups.get(group);
        }

        if (this.GroupsInheritance.containsKey(group))
          GroupInheritedPermissions = getInheritancePermissions(group);
      }
      else {
        this.Cached.put(name + "," + permission, Boolean.valueOf(false));
        return false;
      }
    } else {
      if (this.base == null ? "" == null : this.base.equals("")) {
        this.Cached.put(name + "," + permission, Boolean.valueOf(false));
        return false;
      }

      group = this.base.toLowerCase();

      if ((!this.Groups.isEmpty()) || (this.Groups != null)) {
        if (this.Groups.containsKey(group)) {
          GroupPermissions = (Set)this.Groups.get(group);
        }

        if (this.GroupsInheritance.containsKey(group))
          GroupInheritedPermissions = getInheritancePermissions(group);
      }
      else {
        this.Cached.put(name + "," + permission, Boolean.valueOf(false));
        return false;
      }
    }

    StringTokenizer globalized = new StringTokenizer(permission, ".");

    if (GroupInheritedPermissions.size() > 0) {
      GroupPermissions.addAll(GroupInheritedPermissions);
    }

    if ((Permissions == null) || (GroupPermissions == null)) {
      this.Cached.put(name + "," + permission, Boolean.valueOf(false));
      return false;
    }

    if ((GroupPermissions.contains("*")) || (Permissions.contains("*"))) {
      this.Cached.put(name + "," + permission, Boolean.valueOf(true));
      return true;
    }

    if ((GroupPermissions.contains(permission)) || (Permissions.contains(permission))) {
      this.Cached.put(name + "," + permission, Boolean.valueOf(true));
      return true;
    }

    if (permission.contains(".")) {
      String setting = "";
      String node = "";

      while (globalized.hasMoreElements()) {
        setting = setting + globalized.nextToken() + ".";
        node = setting + "*";

        if ((GroupPermissions.contains(node)) || (Permissions.contains(node))) {
          this.Cached.put(name + "," + permission, Boolean.valueOf(true));
          return true;
        }

      }

    }

    this.Cached.put(name + "," + permission, Boolean.valueOf(false));
    return false;
  }

  private Set<String> getInheritance(String group) {
    if (this.GroupsInheritance.containsKey(group)) {
      if (this.GroupsInheritance.size() > 0) {
        return (Set)this.GroupsInheritance.get(group);
      }
      return new HashSet();
    }

    return new HashSet();
  }

  private Object[] getInheritancePermissions(Set<String> Permissions, Set<String> Inheritance, Set<String> Checked, String group) {
    group = group.toLowerCase();

    if (Inheritance.size() > 0) {
      for (String inherited : Inheritance) {
        inherited = inherited.toLowerCase();
        Set GroupPermissions = (Set)this.Groups.get(inherited.toLowerCase());
        Set GottenInheritance = getInheritance(inherited);

        if (GroupPermissions == null)
        {
          continue;
        }
        if (GroupPermissions.size() > 0) {
          Permissions.addAll(GroupPermissions);
        }

        if (!Checked.contains(inherited)) {
          Checked.add(inherited);
          Object[] InheritedPermissions = getInheritancePermissions(Permissions, GottenInheritance, Checked, inherited);

          if (((Set)InheritedPermissions[0]).size() > 0)
            Permissions.addAll((Set)InheritedPermissions[0]);
        }
      }
    }
    else {
      Set GroupPermissions = (Set)this.Groups.get(group);

      if (GroupPermissions.size() > 0) {
        Permissions.addAll(GroupPermissions);
      }
    }

    return new Object[] { Permissions, Checked };
  }

  private Set<String> getInheritancePermissions(String group) {
    group = group.toLowerCase();

    Set Permissions = new HashSet();
    Set Inheritance = getInheritance(group);
    Set Checked = new HashSet();

    if ((Inheritance.size() > 0) && (!Inheritance.isEmpty())) {
      for (String inherited : Inheritance) {
        inherited = inherited.toLowerCase();
        Set GroupPermissions = (Set)this.Groups.get(inherited);

        if (GroupPermissions.size() > 0) {
          Permissions.addAll(GroupPermissions);
        }

        if ((getInheritance(inherited).size() > 0) && (!Checked.contains(inherited))) {
          Checked.add(inherited);
          Object[] InheritedPermissions = getInheritancePermissions(Permissions, getInheritance(inherited), Checked, inherited);

          if (((Set)InheritedPermissions[0]).size() > 0) {
            Permissions.addAll((Set)InheritedPermissions[0]);
          }
        }
      }
    }

    return Permissions;
  }

  public boolean inGroup(String name, String group) {
    name = name.toLowerCase();
    group = group.toLowerCase();

    if (this.UserPermissions.containsKey(name)) {
      String Group = (String)this.UserGroups.get(name);
      Set Inherited = getInheritance(Group);

      if ((Inherited.contains(group)) || (Group.equalsIgnoreCase(group))) {
        return true;
      }
    }

    return false;
  }

  public String getGroup(String name)
  {
    name = name.toLowerCase();

    if ((this.UserPermissions.containsKey(name)) && (this.UserGroups.containsKey(name))) {
      String group = (String)((Object[])(Object[])this.GroupsData.get(((String)this.UserGroups.get(name)).toLowerCase()))[0];
      return group == null ? null : group;
    }
    if (this.base.equals("")) {
      return null;
    }
    String group = (String)((Object[])(Object[])this.GroupsData.get(this.base))[0];
    return group == null ? null : group;
  }

  public String getGroupPrefix(String group)
  {
    group = group.toLowerCase();

    if (this.Groups.containsKey(group)) {
      String prefix = (String)((Object[])(Object[])this.GroupsData.get(group))[1];
      return prefix == null ? null : Messaging.parse(prefix);
    }
    return null;
  }

  public String getGroupSuffix(String group)
  {
    group = group.toLowerCase();

    if (this.Groups.containsKey(group)) {
      String suffix = (String)((Object[])(Object[])this.GroupsData.get(group))[2];
      return suffix == null ? null : Messaging.parse(suffix);
    }
    return null;
  }

  public boolean canGroupBuild(String group)
  {
    group = group.toLowerCase();

    if (this.Groups.containsKey(group)) {
      return ((Boolean)((Object[])(Object[])this.GroupsData.get(group))[3]).booleanValue();
    }
    if (this.base.equals("")) {
      return false;
    }
    return ((Boolean)((Object[])(Object[])this.GroupsData.get(this.base))[3]).booleanValue();
  }

  public String[] getGroups(String name)
  {
    String Group = (String)this.UserGroups.get(name.toLowerCase());
    Set Inherited = getInheritance(Group.toLowerCase());
    Inherited.add(Group.toLowerCase());

    return (String[])Inherited.toArray(new String[0]);
  }

  public String getGroupPermissionString(String group, String permission) {
    return this.config.getString("groups." + group + ".permissions." + permission) == null ? "" : this.config.getString("groups." + group + ".permissions." + permission);
  }

  public int getGroupPermissionInteger(String group, String permission)
  {
    return this.config.getInt("groups." + group + ".permissions." + permission, -1);
  }

  public boolean getGroupPermissionBoolean(String group, String permission) {
    return this.config.getBoolean("groups." + group + ".permissions." + permission, false);
  }

  public double getGroupPermissionDouble(String group, String permission) {
    return this.config.getDouble("groups." + group + ".permissions." + permission, -1.0D);
  }

  public String getUserPermissionString(String name, String permission) {
    return this.config.getString("users." + name + ".permissions." + permission) == null ? "" : this.config.getString("users." + name + ".permissions." + permission);
  }

  public int getUserPermissionInteger(String name, String permission)
  {
    return this.config.getInt("users." + name + ".permissions." + permission, -1);
  }

  public boolean getUserPermissionBoolean(String name, String permission) {
    return this.config.getBoolean("users." + name + ".permissions." + permission, false);
  }

  public double getUserPermissionDouble(String name, String permission) {
    return this.config.getDouble("users." + name + ".permissions." + permission, -1.0D);
  }

  public String getPermissionString(String name, String permission) {
    String group = getGroup(name);
    String userPermission = getUserPermissionString(name, permission);
    String userGroupPermission = "";

    if ((group != null) || (!group.isEmpty())) {
      userGroupPermission = getGroupPermissionString(group, permission);
    }

    if (!userPermission.equalsIgnoreCase("")) {
      return userPermission;
    }

    return userGroupPermission;
  }

  public boolean getPermissionBoolean(String name, String permission)
  {
    String group = getGroup(name);
    boolean userPermission = getUserPermissionBoolean(name, permission);
    boolean userGroupPermission = false;

    if ((group != null) || (!group.isEmpty())) {
      userGroupPermission = getGroupPermissionBoolean(group, permission);
    }

    if (userPermission) {
      return userPermission;
    }

    return userGroupPermission;
  }

  public int getPermissionInteger(String name, String permission) {
    String group = getGroup(name);
    int userPermission = getUserPermissionInteger(name, permission);
    int userGroupPermission = -1;

    if ((group != null) || (!group.isEmpty())) {
      userGroupPermission = getGroupPermissionInteger(group, permission);
    }

    if (userPermission != -1) {
      return userPermission;
    }

    return userGroupPermission;
  }

  public double getPermissionDouble(String name, String permission) {
    String group = getGroup(name);
    double userPermission = getUserPermissionDouble(name, permission);
    double userGroupPermission = -1.0D;

    if ((group != null) || (!group.isEmpty())) {
      userGroupPermission = getGroupPermissionDouble(group, permission);
    }

    if (userPermission != -1.0D) {
      return userPermission;
    }

    return userGroupPermission;
  }
}
Le problème se situe à ce niveau là (toujours, à mon avis), étant donné qu'il traite ses chaînes de caractères avec comme séparateur un point, ce qui fait que pour chaque opération mon pseudo fait qu'il y a x+1 d'arguments demandés (dont une chaîne de caractères vide) au lieu de x.
Code:
StringTokenizer globalized = new StringTokenizer(permission, ".");
Faut être positif, on a pu identifier et corriger le problème de corruption des sauvegardes. (Sachant que les messages d'erreur ne disaient rien... )
Exemple des erreurs que j'ai eu hier:

Citation :
2011-02-01 18:11:03 [SEVERE] Unexpected exception
java.lang.ArrayIndexOutOfBoundsException: -1
at net.minecraft.server.ChunkCache.a(SourceFile:38)
at net.minecraft.server.ChunkCache.c(SourceFile:103)
at net.minecraft.server.Pathfinder.a(SourceFile:158)
at net.minecraft.server.Pathfinder.a(SourceFile:120)
at net.minecraft.server.Pathfinder.b(SourceFile:96)
at net.minecraft.server.Pathfinder.a(SourceFile:64)
at net.minecraft.server.Pathfinder.a(SourceFile:37)
at net.minecraft.server.Pathfinder.a(SourceFile:22)
at net.minecraft.server.World.a(SourceFile:1707)
at net.minecraft.server.EntityCreature.d(EntityCreature.java:49)
at net.minecraft.server.EntityLiving.o(EntityLiving.java:590)
at net.minecraft.server.EntityMobs.o(EntityMobs.java:37)
at net.minecraft.server.EntityLiving.b_(EntityLiving.java:225)
at net.minecraft.server.EntityMobs.b_(EntityMobs.java:41)
at net.minecraft.server.World.a(SourceFile:1116)
at net.minecraft.server.WorldServer.a(WorldServer.java:41)
at net.minecraft.server.World.f(SourceFile:1092)
at net.minecraft.server.World.c(SourceFile:1071)
at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:264)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:201)
at net.minecraft.server.ThreadServerApplication.run(SourceFile:512)


Strictement aucun crash à déplorer depuis hier maintenant, et on tourne à nouveau bien sur le ramdisk et ses 150 000 fichiers qui prennent ½Go. (sisi )


PS: J'aurais aussi pu ne pas avoir de backup.
Salut Sang' et les Sanguiens !

Je vais surement revenir sur le serveur (j'avais "oublié" que Minecraft avait des chances de passer sur mon PC fixe -_-'), de temps en temps !

Par contre, je cherche le mod de radar qu'on utilisait avant, quelqu'un a son adresse ? il marche toujours (dernières versions du jeu, tout ça ...) ?

Sinon, je vais surement me faire une "ile flottante" à moitié volante, et je voudrais m'installer assez près du spawn ... ça dérange du monde si je me fous au dessus du plan d'eau au dessus du spawn sur la GoogleMap (qui doit être au sud, vu qu'elle est pas logique) ?
Ya vraiment quelqu'un qui a sa maison en terre sur la petite ile sur ce plan d'eau ?
Ça dérange du mode si je rajoute des canaux/rivières entre le spawn et les différentes mers du monde ?


Au fait, vous avez un petit conseil pour un texture pack "léger" (les 64*64 vont me faire ramer, à mon avis), qui ne dénature pas le jeu mais qui soit plus sympa pour l'œil ?

@+!


PS: ça m'étonne qu'il n'y ai pas de section du site / wiki sur le forum qui parle des texture pack ...
Je vais bientôt arriver moi aussi dans cet univers et pour préparer mon débarquement j'ai quelques questions :


  • Si j'arrive la nuit que se passe-t-il ? Je meurs en boucle ?
  • J'ai vu qu'il faut demander l'autorisation pour s'installer, peut-on tout de même faire une caverne comme indiqué sur le tuto pour passer la 1ère nuit ?
  • La carte est immense : tous les voyages se font-il à pied ?
  • Sur la carte on voit des structures : sont-elles toutes créées par les joueurs avec leur petites mains ou sont-elles d'origines ?
Bah je pense que ce sera tout pour le moment ^^ Merci d'avance
Citation :
Publié par Iguane
Je vais bientôt arriver moi aussi dans cet univers et pour préparer mon débarquement j'ai quelques questions :


  • Si j'arrive la nuit que se passe-t-il ? Je meurs en boucle ?
  • J'ai vu qu'il faut demander l'autorisation pour s'installer, peut-on tout de même faire une caverne comme indiqué sur le tuto pour passer la 1ère nuit ?
  • La carte est immense : tous les voyages se font-il à pied ?
  • Sur la carte on voit des structures : sont-elles toutes créées par les joueurs avec leur petites mains ou sont-elles d'origines ?
Bah je pense que ce sera tout pour le moment ^^ Merci d'avance
Coucou !

- Si tu arrives dans la nuit pour la toute première fois, tu atterriras dans un endroit bien protégé : il s'agit du métro, un Château très élégant et peu de chances de te faire tuer ! Tu n'atterris donc pas dans la jungle !

- L'idéal est de se chercher un abri bien à soi pour éviter de dégrader le territoire d'une autre personne : tu pourras passer la première nuit dans le petit "village", c'est-à-dire la zone tout autour du spawn !

- Il existe, comme je le disais plus haut, un métro en construction. Il dessert de nombreux endroits (en fait, de 500 cases en 500 cases; le chemin est parcouru en moins de cinq minutes, ce qui à pied est bien plus long et moins sécurisé !). Par contre, les territoires les plus éloignés ne sont accessibles qu'avec tes petits pieds.

- Ce sont les joueurs qui sont les véritables acteurs du milieu : toutes les constructions, grandes ou petites, n'ont pas été générées avec la map mais construites par des gens. Le terrain en lui-même a été agencé de la façon dont tu le vois sur Google Map, voire modifié par les joueurs eux-mêmes pour que celui-ci convienne à leurs attentes. Mais tous les "monuments" et "domaines" sont bel et bien issus de la patte créative des joueurs du serveur !

J'espère t'avoir été dans ta quête de savoir pour ce serveur ! Néanmoins, toutes mes réponses ne sont peut être pas vraiment complètes, et je ne crois pas être le mieux placé pour répondre à toutes tes interrogations !
Deuxième série de questions noob :

Je suis connecté j'arrive dans un mega chateau qui se révèle être une station de métro. J'aimerais euh comment dire "jouer", me trouver un coin, découvrir le jeu, tester des constructions, me faire une cabane ...

Mais je suis complètement perdu, je ne sais pas où aller, je comprends rien aux coordonnées sur les panneaux et j'aimerais pas casser des choses qui existe.

Donc le noob il va où ? (non non me répondez pas en 3 lettres svp )
Message supprimé par son auteur.
certaines personnes arrivent à se connecter en insistant, mais effectivement beaucoup d'échecs de connexion.

Le problème n'est pas lié à mon serveur mais à minecraft.net qui est instable.

(Je vérifie systématiquement l'authenticité de chaque compte via minecraft.net, d'où les difficultés de connexion quand le site bug et/ou est vraiment lent)
Je vous ai rejoins ce soir j'explore pour me trouver un petit coin dans ce monde immense, mais le jeu semble planter de temps en temps et il est difficile de se reconnecter, donc je verrais demain matin si j'ai plus de chance

A bientôt in game.
Fil fermé

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés