ServerPlugin Regions abbauen vermeiden

Dieses Thema im Forum "Programmierung" wurde erstellt von ThrustLP, 7. April 2014.

  1. ThrustLP
    Offline

    ThrustLP

    Registriert seit:
    3. April 2013
    Beiträge:
    35
    Ich weiß einen ähnlichen Thread hatte ich bereits, aber dieser hier ist aufgeräumter. Der andere Beitrag kann gelöscht werden (wenn nötig)! Also:

    Ich habe die HashMap:

    Code (Text):
    1.  
    2. public HashMap<String, Region> regions = new HashMap<String, Region>();
    3.  
    In dieser sind Regionen gespeichert die im onEnable Teil aus einer Yaml Datei geladen werden. Hier mal mein onEnable:

    Code (Text):
    1.  
    2.     @Override
    3.     public void onEnable(){
    4.         System.out.println("[Jumper] GELADEN");
    5.         this.getCommand("jumper").setExecutor(new InfoCommand());
    6.         this.getCommand("jarena").setExecutor(new RegionCommand(this));
    7.        
    8.         PluginManager pm = this.getServer().getPluginManager();
    9.         pm.registerEvents(new RegionListener(this), this);
    10.        
    11.        
    12.        
    13.         File file = new File("plugins/Jumper", "arenas.yml");
    14.         FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
    15.         for(String region : cfg.getConfigurationSection("").getKeys(false)){
    16.            
    17.             this.getConfig().addDefault("allgemein.consolemessagestart", new String[]{
    18.                     "§aGELADEN"
    19.                    
    20.             });
    21.             this.getConfig().options().copyDefaults(true);
    22.             this.saveConfig();
    23.            
    24.             String world = cfg.getString(region + ".world");
    25.            
    26.             World w = Bukkit.getWorld(world);
    27.            
    28.             if(w != null){
    29.                
    30.                 int minx = cfg.getInt(region + ".minx");
    31.                 int miny = cfg.getInt(region + ".miny");
    32.                 int minz = cfg.getInt(region + ".minz");
    33.                
    34.                 int maxx = cfg.getInt(region + ".maxx");
    35.                 int maxy = cfg.getInt(region + ".maxy");
    36.                 int maxz = cfg.getInt(region + ".maxz");
    37.            
    38.                 this.regions.put(region.toLowerCase(), new Region(new Location(w, minx, miny, minz), new Location(w, maxx, maxy, maxz)));
    39.             }
    40.            
    41.            
    42.            
    43.         }
    44.     }
    45.  
    Nun möchte ich in einem BlockBreakEvent folgendes:

    Wenn ein Player einen Block der sich innerhalb einer dieser Regionen befindet abbaut soll die Aktion zurückgesetzt werden. Achtung: Auch wenn er außerhalb der Region steht soll er die Blöcke innen nicht abbauen können.

    Kann mir jemand einen Code dazu geben? Ich bin noch Anfänger, und habe mir da wohl etwas zu viel vorgenommen, aber den weitern Teil des Plugins schaffe ich dann wieder ;)

    Vielen Dank!

    Hier meine Klasse Region:

    Code (Text):
    1.  
    2. package me.thrustlp.jumper.region;
    3.  
    4. import java.util.HashMap;
    5. import java.util.Map;
    6.  
    7. import org.bukkit.Location;
    8. import org.bukkit.World;
    9. import org.bukkit.configuration.serialization.ConfigurationSerializable;
    10.  
    11. public class Region implements ConfigurationSerializable{
    12.  
    13.     private int minx, miny, minz;
    14.     private int maxx, maxy, maxz;
    15.     private World world;
    16.     public Region(Location loc1, Location loc2){
    17.        
    18.         this.minx = Math.min(loc1.getBlockX(), loc2.getBlockX());
    19.         this.miny = Math.min(loc1.getBlockY(), loc2.getBlockY());
    20.         this.minz = Math.min(loc1.getBlockZ(), loc2.getBlockZ());
    21.        
    22.         this.maxx = Math.max(loc1.getBlockX(), loc2.getBlockX());
    23.         this.maxy = Math.max(loc1.getBlockY(), loc2.getBlockY());
    24.         this.maxz = Math.max(loc1.getBlockZ(), loc2.getBlockZ());
    25.        
    26.         this.world = loc1.getWorld();
    27.        
    28.     }
    29.     public boolean isInside(Location loc){
    30.         if(loc.getWorld() != this.world){
    31.             return false;
    32.         }
    33.         if(loc.getBlockX() < this.minx || loc.getBlockX() > this.maxx || loc.getBlockY() < this.miny || loc.getBlockY() > this.maxy || loc.getBlockZ() < this.minz || loc.getBlockZ() > this.maxz){
    34.             return false;
    35.         }
    36.        
    37.         return true;
    38.     }
    39.    
    40.     @Override
    41.     public Map<String, Object> serialize() {
    42.         Map<String, Object> o = new HashMap<String, Object>();
    43.        
    44.         o.put("minx", this.minx);
    45.         o.put("miny", this.miny);
    46.         o.put("minz", this.minz);
    47.        
    48.         o.put("maxx", this.maxx);
    49.         o.put("maxy", this.maxy);
    50.         o.put("maxz", this.maxz);
    51.        
    52.         o.put("world", this.world.getName());
    53.         return o;
    54.     }
    55.    
    56.    
    57.    
    58. }
    59.  
    60.  
     
    #1
  2. ThrustLP
    Offline

    ThrustLP

    Registriert seit:
    3. April 2013
    Beiträge:
    35
    Hat keiner ne Idee?D:
     
    #2
  3. Wo ist das Problem zu überprüfen, ob der Block in einer der Regionen ist, wenn ja dann soll er entsprechend nicht abgebaut werden. Das ganze kann man dann noch im Block cachen.
     
    #3
  4. ThrustLP
    Offline

    ThrustLP

    Registriert seit:
    3. April 2013
    Beiträge:
    35
    Und wie mache ich das?
     
    #4
  5. games6471
    Online

    games6471

    Bukkit bietet doch so schöne Methoden.

    Code (Text):
    1.     public boolean isInside(Location loc) {
    2.         if (!loc.getWorld().getUID().equals(worldUUID)) {
    3.             return false;
    4.         }
    5.  
    6.         return loc.toVector().isInAABB(minVec, maxVec);
    7.     }
     
    #5