Re
Après avoir réfléchis au code à tête reposé, je me suis rendu compte qu'il y avait plein de problème et d’incohérence un peu partout ! Voici du coup un code qui fonctionne à la perfection (Il reste quelques optimisations possible, notamment au niveau des boucles for()). Je précise également que le code ne prends pas en compte le Y (les régions sont définit par défaut de 0 à 255), mais c'est très simple à ajouter si tu le souhaites !
Voici donc les 5 class :
Pour mon exemple, j'ai fait le code pour le BlockBreak. Mais, si ce qui t'intéresse c'est d’empêcher le placement de bloc, tu as juste à changer BlockBreakEvent par BlockPlaceEvent.
Je n'explique pas le code car je l'ai juste remastériser, et que tu devrait assez facilement le comprendre ; mais si tu veut des explications sur un point précis, n’hésite pas
En espérant que ce soit bon cette fois,
Amicalement, Mathéo.
Après avoir réfléchis au code à tête reposé, je me suis rendu compte qu'il y avait plein de problème et d’incohérence un peu partout ! Voici du coup un code qui fonctionne à la perfection (Il reste quelques optimisations possible, notamment au niveau des boucles for()). Je précise également que le code ne prends pas en compte le Y (les régions sont définit par défaut de 0 à 255), mais c'est très simple à ajouter si tu le souhaites !
Voici donc les 5 class :
Code:
package fr.discowzombie.axelfatta;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.plugin.java.JavaPlugin;
import fr.discowzombie.axelfatta.events.BlockBreak;
public class Main extends JavaPlugin {
@Override
public void onEnable() {
//Moi je boss avec la config par default (config.yml) mais toi, n'oublie pas de changer :D
for (String s : getConfig().getConfigurationSection("Bases").getValues(false).keySet()) {
if ((s != null) && (Bukkit.getWorld(getConfig().getString("Bases."+s+".world")) != null)) {
new LocationManager(s).add(
new Location(Bukkit.getWorld(getConfig().getString("Bases."+s+".world")), getConfig().getInt("Bases."+s+".x1"), 0, getConfig().getInt("Bases."+s+".z1")),
new Location(Bukkit.getWorld(getConfig().getString("Bases."+s+".world")), getConfig().getInt("Bases."+s+".x2"), 255, getConfig().getInt("Bases."+s+".z2")));
}
}
Bukkit.getServer().getPluginManager().registerEvents(new BlockBreak(), this);
super.onEnable();
}
}
Code:
package fr.discowzombie.axelfatta;
import org.bukkit.Location;
public class LocSaver {
private Location loc1, loc2;
public LocSaver(Location loc1, Location loc2){
this.setLoc1(loc1);
this.setLoc2(loc2);
}
public Location getLoc1() {
return loc1;
}
public void setLoc1(Location loc1) {
this.loc1 = loc1;
}
public Location getLoc2() {
return loc2;
}
public void setLoc2(Location loc2) {
this.loc2 = loc2;
}
}
Code:
package fr.discowzombie.axelfatta;
import java.util.HashMap;
import org.bukkit.Location;
public class LocationManager {
private static HashMap<String, LocSaver> bases = null;
private String name;
public LocationManager(String name){
this.name = name;
}
public void add(Location loc1, Location loc2){
if(bases == null || bases.size() == 0){
bases = new HashMap<>();
}
bases.put(name, new LocSaver(loc1, loc2));
}
public LocSaver get(){
if(bases.containsKey(name)){
return bases.get(name);
}
return null;
}
public static HashMap<String, LocSaver> getRegions(){
return bases;
}
}
Code:
package fr.discowzombie.axelfatta;
import org.bukkit.Location;
import org.bukkit.block.Block;
public class CuboidManager {
private int maxX, maxY, maxZ, minX, minY, minZ;
public CuboidManager(Location l, Location l2) {
if(l.getBlockX() > l2.getBlockX()){
maxX = l.getBlockX();
minX = l2.getBlockX();
}else{
maxX = l2.getBlockX();
minX = l.getBlockX();
}
if(l.getBlockY() > l2.getBlockY()){
maxY = l.getBlockY();
minY = l2.getBlockY();
}else{
maxY = l2.getBlockY();
minY = l.getBlockY();
}
if(l.getBlockZ() > l2.getBlockZ()){
maxZ = l.getBlockZ();
minZ = l2.getBlockZ();
}else{
maxZ = l2.getBlockZ();
minZ = l.getBlockZ();
}
}
public boolean isInCube(Location l) {
Block b = l.getBlock();
if (
(b.getX() <= maxX) && (b.getX() >= minX) &&
(b.getY() <= maxY) && (b.getY() >= minY) &&
(b.getZ() <= maxZ) && (b.getZ() >= minZ))
return true;
return false;
}
}
Pour mon exemple, j'ai fait le code pour le BlockBreak. Mais, si ce qui t'intéresse c'est d’empêcher le placement de bloc, tu as juste à changer BlockBreakEvent par BlockPlaceEvent.
Code:
package fr.discowzombie.axelfatta.events;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import fr.discowzombie.axelfatta.CuboidManager;
import fr.discowzombie.axelfatta.LocSaver;
import fr.discowzombie.axelfatta.LocationManager;
public class BlockBreak implements Listener {
//Ajoute ici les blocks qui ne sont pas soumis aux regions
Material[] bypass = { Material.TORCH, Material.LEVER };
//J'ai fait le code pour le BlockBreak mais si tu veut que les gens ne puissent pas posser de block, change le BlockBreakEvent par BlockPlaceEvent.
@EventHandler
public void onBreak(BlockBreakEvent e){
Location l = e.getBlock().getLocation();
for(Material m : bypass){
if(m.equals(e.getBlock().getType())){
System.out.println("Ok -> bypass");
return;
}
}
for(LocSaver ls : LocationManager.getRegions().values()){
if(!new CuboidManager(ls.getLoc1(), ls.getLoc2()).isInCube(l)){
System.out.println("Hors d'un cuboid -> desctruction interdite");
e.setCancelled(true);
break;
}
}
}
}
Je n'explique pas le code car je l'ai juste remastériser, et que tu devrait assez facilement le comprendre ; mais si tu veut des explications sur un point précis, n’hésite pas
En espérant que ce soit bon cette fois,
Amicalement, Mathéo.
Dernière édition: