[Gelöst] Kollision zwischen Block und Spieler

Wenn ihr bei eurem Plugin nicht weiter kommt, könnt ihr hier euer Problem beschreiben und um Hilfe bitten.

Re: Kollision zwischen Block und Spieler

Beitragvon PostCrafter » Mo 3. Mär 2014, 15:19

Bussymann hat geschrieben:Die collide() Methode wird aufgerufen sobald ein Spieler mit einem Tier kollidiert.

Da sie sich in Entity und nicht nur in EntityPlayer befindet, wird sie bei jeglicher Entitykollision aufgerufen.
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: Kollision zwischen Block und Spieler

Beitragvon Bussymann » Mo 3. Mär 2014, 16:44

Ich weiß :) Ich versuche mal zu machen das Spectator keine Pfeile abblocken können.....
Benutzeravatar
Bussymann
 
Beiträge: 67
Registriert: Mi 25. Sep 2013, 16:00

Re: Kollision zwischen Block und Spieler

Beitragvon TroublePlaying » Mo 3. Mär 2014, 21:07

Ich habe einen Lösungsweg, der meiner Meinung nach funktionieren sollte, gefunden. Leider funktioniert er nur in der Theorie :(

Hauptklasse:
Code: Alles auswählen
  1. import java.util.List;
  2. import org.bukkit.Bukkit;
  3. import org.bukkit.Location;
  4. import org.bukkit.Material;
  5. import org.bukkit.World;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.event.EventHandler;
  8. import org.bukkit.event.Listener;
  9. import org.bukkit.event.player.PlayerMoveEvent;
  10. import org.bukkit.plugin.java.JavaPlugin;
  11. public class Main extends JavaPlugin implements Listener {
  12.    @Override
  13.    public void onEnable() {
  14.       Bukkit.getPluginManager().registerEvents(this, this);
  15.    }
  16.    @EventHandler
  17.    public void onMove(PlayerMoveEvent e) {
  18.       Player p = e.getPlayer();
  19.       
  20.       World world = p.getWorld();
  21.       
  22.       int minX = p.getLocation().getBlockX() - 1;
  23.       int minY = p.getLocation().getBlockY();
  24.       int minZ = p.getLocation().getBlockZ() - 1;
  25.       int maxX = p.getLocation().getBlockX() + 1;
  26.       int maxY = p.getLocation().getBlockY() + 2;
  27.       int maxZ = p.getLocation().getBlockZ() + 1;
  28.       
  29.       List<Location> locs = Region.getBlocks(world, minX, minY, minZ, maxX, maxY, maxZ);
  30.       boolean collision = false;
  31.       
  32.       for(Location loc : locs) {
  33.          if(isBlock(loc.getBlock().getType())){
  34.             Location loc1 = new Location(p.getWorld(), p.getLocation().getBlockX(), p.getLocation().getBlockY() + 1, p.getLocation().getBlockZ());
  35.             Location loc2 = new Location(p.getWorld(), p.getLocation().getBlockX(), p.getLocation().getBlockY() + 2, p.getLocation().getBlockZ());
  36.             
  37.             if(loc1.distance(loc) < 1.0D || loc2.distance(loc) < 1.0D){
  38.                collision = true;
  39.                break;
  40.             }
  41.          }
  42.       }
  43.       
  44.       if(collision){
  45.          p.sendMessage("!!! TOT - KOLLISION !!!");
  46.       }
  47.    }
  48.    
  49.    private boolean isBlock(Material material){
  50.       Material b = material;
  51.       
  52.       if(b == Material.AIR) return false;
  53.       if(b == Material.LONG_GRASS) return false;
  54.       if(b == Material.BROWN_MUSHROOM) return false;
  55.       if(b == Material.RED_MUSHROOM) return false;
  56.       if(b == Material.RED_ROSE) return false;
  57.       if(b == Material.YELLOW_FLOWER) return false;
  58.       if(b == Material.SEEDS) return false;
  59.       if(b == Material.VINE) return false;
  60.       if(b == Material.MELON_SEEDS) return false;
  61.       if(b == Material.POTATO) return false;
  62.       if(b == Material.CARROT) return false;
  63.       if(b == Material.PUMPKIN_SEEDS) return false;
  64.       if(b == Material.CARPET) return false;
  65.       if(b == Material.DEAD_BUSH) return false;
  66.       if(b == Material.DETECTOR_RAIL) return false;
  67.       if(b == Material.ACTIVATOR_RAIL) return false;
  68.       if(b == Material.LEVER) return false;
  69.       if(b == Material.POWERED_RAIL) return false;
  70.       if(b == Material.RAILS) return false;
  71.       if(b == Material.REDSTONE_WIRE) return false;
  72.       if(b == Material.REDSTONE_COMPARATOR) return false;
  73.       if(b == Material.REDSTONE_COMPARATOR_OFF) return false;
  74.       if(b == Material.REDSTONE_COMPARATOR_ON) return false;
  75.       if(b == Material.REDSTONE_TORCH_OFF) return false;
  76.       if(b == Material.REDSTONE_TORCH_ON) return false;
  77.       if(b == Material.TORCH) return false;
  78.       if(b == Material.SAPLING) return false;
  79.       if(b == Material.WALL_SIGN) return false;
  80.       if(b == Material.SIGN_POST) return false;
  81.       if(b == Material.PAINTING) return false;
  82.       if(b == Material.ITEM_FRAME) return false;
  83.       if(b == Material.SUGAR_CANE_BLOCK) return false;
  84.       if(b == Material.TRIPWIRE) return false;
  85.       if(b == Material.TRIPWIRE_HOOK) return false;
  86.       if(b == Material.WATER_LILY) return false;
  87.       if(b == Material.WEB) return false;
  88.       if(b == Material.CROPS) return false;
  89.       if(b == Material.WOOD_BUTTON) return false;
  90.       if(b == Material.STONE_BUTTON) return false;
  91.       if(b == Material.LADDER) return false;
  92.       if(b == Material.WOOD_PLATE) return false;
  93.       if(b == Material.STONE_PLATE) return false;
  94.       if(b == Material.COCOA) return false;
  95.       if(b == Material.DOUBLE_PLANT) return false;
  96.       
  97.       return true;
  98.    }
  99. }


Klasse: Region
Code: Alles auswählen
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import org.bukkit.Location;
  4. import org.bukkit.World;
  5. import org.bukkit.block.Block;
  6. public class Region {
  7.    
  8.    public static List<Location> getBlocks(World world, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) {
  9.       List<Location> blocks = new ArrayList<Location>();
  10.       
  11.       for(int x = minX; x <= maxX; x++){
  12.          for(int y = minY; x <= maxY; x++){
  13.             for(int z = minZ; x <= maxZ; x++){
  14.                Block b = world.getBlockAt(x, y, z);
  15.                blocks.add(b.getLocation());
  16.             }
  17.          }
  18.       }
  19.       
  20.       return blocks;
  21.    }
  22. }


Ich habe keine Ahnung, wieso dieser Code nicht funktioniert.

Ich verwende die Spigot-Bibliotheken der Version 1.7.2.-R0.3-SNAPSHOT
Benutzeravatar
TroublePlaying
 
Beiträge: 133
Registriert: Di 6. Aug 2013, 22:56

Re: Kollision zwischen Block und Spieler

Beitragvon PostCrafter » Mo 3. Mär 2014, 21:20

Wieso verwendest du jetzt Regionen und nicht den von mir vorgeschlagenen Weg?

Außerdem könntest du für deine isBlock-Methode auch einfach die isSolid-Methode von Material verwenden.
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: Kollision zwischen Block und Spieler

Beitragvon TroublePlaying » Mo 3. Mär 2014, 21:23

PostCrafter hat geschrieben:Wieso verwendest du jetzt Regionen und nicht den von mir vorgeschlagenen Weg?

Ich habs nicht hinbekommen ;D

PostCrafter hat geschrieben:Außerdem könntest du für deine isBlock-Methode auch einfach die isSolid-Methode von Material verwenden.

Danke :)
Benutzeravatar
TroublePlaying
 
Beiträge: 133
Registriert: Di 6. Aug 2013, 22:56

Re: Kollision zwischen Block und Spieler

Beitragvon tahu98 » Mo 3. Mär 2014, 21:48

@Bussymann
Ich hatte letztens die Idee den Spieler in eine Art "Serverseitigen Freecammodus" zu versetzen, das heißt eigentlich steht der Spieler in einem Raum, aber der Client bekommt ander Packets gesendet und denkt deshalb das er sich an einer anderen Stelle befindet. So kann der Spieler über die Map fliegen, kann aber Pfeilen etc nicht in die Quere kommen.
Bild
Benutzeravatar
tahu98
 
Beiträge: 231
Registriert: Mo 2. Sep 2013, 13:46

Re: Kollision zwischen Block und Spieler

Beitragvon TroublePlaying » Di 4. Mär 2014, 15:42

Hat jemand eine Idee, wieso mein Code nicht funktioniert?
Benutzeravatar
TroublePlaying
 
Beiträge: 133
Registriert: Di 6. Aug 2013, 22:56

Re: Kollision zwischen Block und Spieler

Beitragvon TroublePlaying » Mi 5. Mär 2014, 17:35

#push
Benutzeravatar
TroublePlaying
 
Beiträge: 133
Registriert: Di 6. Aug 2013, 22:56

Re: Kollision zwischen Block und Spieler

Beitragvon TroublePlaying » Mi 5. Mär 2014, 21:24

Habs jetzt anders gelöst ...
Wer den Code möchte:

Code: Alles auswählen
  1. Player p = e.getPlayer();
  2. double distance = 1.5D;
  3. boolean collision = false;
  4.       
  5. Location playerloc1 = p.getLocation();
  6. Location playerloc2 = p.getLocation();
  7. playerloc2.setY(playerloc2.getY() + 1.0D);
  8.    
  9. for(int i = 0; i <= 3; i++) {
  10.    Location loc = p.getWorld().getBlockAt(p.getLocation().getBlockX(), p.getLocation().getBlockY() - 1, p.getLocation().getBlockZ()).getLocation();
  11.    loc.setY(loc.getBlockY() + i);
  12.       
  13.    if(loc.getBlock().getType().isSolid()) {
  14.       if(loc.distance(playerloc1) < distance || loc.distance(playerloc2) < distance) {
  15.          collision = true;
  16.       }
  17.    }
  18.       
  19.    for (BlockFace face : new BlockFace[] { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, }) {
  20.       if(loc.getBlock().getRelative(face).getType().isSolid()) {
  21.          if(loc.getBlock().getRelative(face).getLocation().distance(playerloc1) < distance || loc.getBlock().getRelative(face).getLocation().distance(playerloc2) < distance) {
  22.             collision = true;
  23.             break;
  24.          }
  25.       }
  26.    }
  27.    
  28.    if(collision) {
  29.       break;
  30.    }
  31. }
  32.    
  33. if(collision) {
  34.    //Hier einfügen, was bei einer Kollision geschehen soll.
  35. }
Benutzeravatar
TroublePlaying
 
Beiträge: 133
Registriert: Di 6. Aug 2013, 22:56

Re: [Gelöst] Kollision zwischen Block und Spieler

Beitragvon DerPulk » So 18. Sep 2016, 15:37

Und wie bekommt man die Blöcke, die zerstört werden sollen?
Benutzeravatar
DerPulk
 
Beiträge: 4
Registriert: Mo 1. Jun 2015, 18:52

Vorherige

Zurück zu Hilfe und Support

Wer ist online?

Mitglieder in diesem Forum: MSN [Bot] und 21 Gäste

cron