Seite 2 von 2

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mo 3. Mär 2014, 15:19
von PostCrafter
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.

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mo 3. Mär 2014, 16:44
von Bussymann
Ich weiß :) Ich versuche mal zu machen das Spectator keine Pfeile abblocken können.....

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mo 3. Mär 2014, 21:07
von TroublePlaying
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

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mo 3. Mär 2014, 21:20
von PostCrafter
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.

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mo 3. Mär 2014, 21:23
von TroublePlaying
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 :)

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mo 3. Mär 2014, 21:48
von tahu98
@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.

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Di 4. Mär 2014, 15:42
von TroublePlaying
Hat jemand eine Idee, wieso mein Code nicht funktioniert?

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mi 5. Mär 2014, 17:35
von TroublePlaying
#push

Re: Kollision zwischen Block und Spieler

BeitragVerfasst: Mi 5. Mär 2014, 21:24
von TroublePlaying
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. }

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

BeitragVerfasst: So 18. Sep 2016, 15:37
von DerPulk
Und wie bekommt man die Blöcke, die zerstört werden sollen?