Yo les gens !
@DiscowZombie toi qui connait le contexte de mon code xD Tu es + convié, mais toutes personne qui a un avis est bien évidemment la bienvenue.
Je cherche donc à savoir si un joueur est dans une zone lorsqu'il pose un block. Ces zones en questions je les définies par une commande et les coordonnées des extrémités de cette zone (x1, x2, z1, z2) sont stockées dans un fichier .yml. Quand mon plugin s'allume, je charge ces données dans une HashMap :
HashMap en question :
Voilà vous avez donc les éléments nécéssaires à la compréhension de ma demande.
Donc, ce que je cherche à faire, c'est que quand un joueur pose un block, le plugin regarde si le joueur est dans l'une des zones contenues dans le fichier.yml donc dans la HashMap. J'ai donc essayé le code suivant, qui ne me sort pas d'erreur mais qui ne fonctionne pas. Je tient à dire que j'ai essayé plusieurs syntaxe dont la même que contient le onEnable mais j'avais une erreur. Donc si vous voyez des erreurs, si vous avez des suggestions de modif à faire ou même des questions,
N'hésitez pas !!!
AlexFatta
@DiscowZombie toi qui connait le contexte de mon code xD Tu es + convié, mais toutes personne qui a un avis est bien évidemment la bienvenue.
Je cherche donc à savoir si un joueur est dans une zone lorsqu'il pose un block. Ces zones en questions je les définies par une commande et les coordonnées des extrémités de cette zone (x1, x2, z1, z2) sont stockées dans un fichier .yml. Quand mon plugin s'allume, je charge ces données dans une HashMap :
Code:
Bases:
rouge:
world: world
x1: 183
x2: 213
z1: 269
z2: 299
Code:
@Override
public void onEnable() {
saveDefaultConfig();
for (String s : getConfig().getStringList("Bases")) {
new LocationManager(s).add(getConfig().getString("Bases."+s+".world"), getConfig().getInt("Bases."+s+".x1"),
getConfig().getInt("Bases."+s+".x2"), getConfig().getInt("Bases."+s+".z1"), getConfig().getInt("Bases."+s+".z2"));
}
}
HashMap en question :
Code:
private static HashMap<String, LocSaver> bases = new HashMap<>();
Code:
package fr.alexfatta.fallenkingdoms.getDataBases;
public class LocSaver {
private String worldname;
private int x1, x2, z1, z2;
public LocSaver(String worldname, int x1, int x2, int z1, int z2){
this.worldname = worldname;
this.x1 = x1;
this.x2 = x2;
this.z1 = z1;
this.z2 = z2;
}
Code:
package fr.alexfatta.fallenkingdoms.getDataBases;
import java.util.HashMap;
public class LocationManager {
private static HashMap<String, LocSaver> bases = new HashMap<>();
private String name;
public LocationManager(String name) {
this.name = name;
}
public void add(String worldname, int x1, int x2, int z1, int z2) {
getBases().put(name, new LocSaver(worldname, x1, x2, z1, z2));
}
public static HashMap<String, LocSaver> getBases() {
return bases;
}
public static void setBases(HashMap<String, LocSaver> bases) {
LocationManager.bases = bases;
}
}
Voilà vous avez donc les éléments nécéssaires à la compréhension de ma demande.
Donc, ce que je cherche à faire, c'est que quand un joueur pose un block, le plugin regarde si le joueur est dans l'une des zones contenues dans le fichier.yml donc dans la HashMap. J'ai donc essayé le code suivant, qui ne me sort pas d'erreur mais qui ne fonctionne pas. Je tient à dire que j'ai essayé plusieurs syntaxe dont la même que contient le onEnable mais j'avais une erreur. Donc si vous voyez des erreurs, si vous avez des suggestions de modif à faire ou même des questions,
Code:
package fr.alexfatta.fallenkingdoms.managers;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.EquipmentSlot;
import fr.alexfatta.fallenkingdoms.main;
import fr.alexfatta.fallenkingdoms.getDataBases.LocationManager;
public class BlockPlaceManager implements Listener {
@EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onBlockPlace(BlockPlaceEvent event) {
final Player player = event.getPlayer();
Block block_to_replace = event.getBlockPlaced();
if (playerInArea(player) == false) {
if (event.getHand() == EquipmentSlot.HAND) {
if (player.getInventory().getItemInMainHand().getType() == Material.TORCH ||
player.getInventory().getItemInMainHand().getType() == Material.TNT ||
player.getInventory().getItemInMainHand().getType() == Material.REDSTONE_TORCH_ON ||
player.getInventory().getItemInMainHand().getType() == Material.WATER_BUCKET ||
player.getInventory().getItemInMainHand().getType() == Material.ENDER_CHEST ||
player.getInventory().getItemInMainHand().getType() == Material.SIGN) {
} else {
block_to_replace.setType(Material.AIR);
}
}
}
}
public main main;
public boolean playerInArea(Player player) {
int x1, x2, z1, z2;
String world;
//Object myKey = statusName.keySet().toArray()[0];
for (int k = 0; k < LocationManager.getBases().size(); k++) {
x1 = main.getConfig().getInt("Bases."+LocationManager.getBases().get(k)+".x1");
x2 = main.getConfig().getInt("Bases."+LocationManager.getBases().get(k)+".x2");
z1 = main.getConfig().getInt("Bases."+LocationManager.getBases().get(k)+".z1");
z2 = main.getConfig().getInt("Bases."+LocationManager.getBases().get(k)+".z2");
world = main.getConfig().getString("Bases."+LocationManager.getBases().get(k)+".world");
if (!(player.getLocation().getX() > x1) && !(player.getLocation().getX() < x2) &&
!(player.getLocation().getZ() > z1) && !(player.getLocation().getZ() < z2) && !(player.getWorld().getName() == world)) {
player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() +
ChatColor.RED + "Erreur : tu ne peux pas poser ce block !");
return false;
}
}
return true;
}
}
AlexFatta