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.
Bussymann hat geschrieben:Die collide() Methode wird aufgerufen sobald ein Spieler mit einem Tier kollidiert.
- import java.util.List;
- import org.bukkit.Bukkit;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import org.bukkit.World;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.player.PlayerMoveEvent;
- import org.bukkit.plugin.java.JavaPlugin;
- public class Main extends JavaPlugin implements Listener {
- @Override
- public void onEnable() {
- Bukkit.getPluginManager().registerEvents(this, this);
- }
- @EventHandler
- public void onMove(PlayerMoveEvent e) {
- Player p = e.getPlayer();
-
- World world = p.getWorld();
-
- int minX = p.getLocation().getBlockX() - 1;
- int minY = p.getLocation().getBlockY();
- int minZ = p.getLocation().getBlockZ() - 1;
- int maxX = p.getLocation().getBlockX() + 1;
- int maxY = p.getLocation().getBlockY() + 2;
- int maxZ = p.getLocation().getBlockZ() + 1;
-
- List<Location> locs = Region.getBlocks(world, minX, minY, minZ, maxX, maxY, maxZ);
- boolean collision = false;
-
- for(Location loc : locs) {
- if(isBlock(loc.getBlock().getType())){
- Location loc1 = new Location(p.getWorld(), p.getLocation().getBlockX(), p.getLocation().getBlockY() + 1, p.getLocation().getBlockZ());
- Location loc2 = new Location(p.getWorld(), p.getLocation().getBlockX(), p.getLocation().getBlockY() + 2, p.getLocation().getBlockZ());
-
- if(loc1.distance(loc) < 1.0D || loc2.distance(loc) < 1.0D){
- collision = true;
- break;
- }
- }
- }
-
- if(collision){
- p.sendMessage("!!! TOT - KOLLISION !!!");
- }
- }
-
- private boolean isBlock(Material material){
- Material b = material;
-
- if(b == Material.AIR) return false;
- if(b == Material.LONG_GRASS) return false;
- if(b == Material.BROWN_MUSHROOM) return false;
- if(b == Material.RED_MUSHROOM) return false;
- if(b == Material.RED_ROSE) return false;
- if(b == Material.YELLOW_FLOWER) return false;
- if(b == Material.SEEDS) return false;
- if(b == Material.VINE) return false;
- if(b == Material.MELON_SEEDS) return false;
- if(b == Material.POTATO) return false;
- if(b == Material.CARROT) return false;
- if(b == Material.PUMPKIN_SEEDS) return false;
- if(b == Material.CARPET) return false;
- if(b == Material.DEAD_BUSH) return false;
- if(b == Material.DETECTOR_RAIL) return false;
- if(b == Material.ACTIVATOR_RAIL) return false;
- if(b == Material.LEVER) return false;
- if(b == Material.POWERED_RAIL) return false;
- if(b == Material.RAILS) return false;
- if(b == Material.REDSTONE_WIRE) return false;
- if(b == Material.REDSTONE_COMPARATOR) return false;
- if(b == Material.REDSTONE_COMPARATOR_OFF) return false;
- if(b == Material.REDSTONE_COMPARATOR_ON) return false;
- if(b == Material.REDSTONE_TORCH_OFF) return false;
- if(b == Material.REDSTONE_TORCH_ON) return false;
- if(b == Material.TORCH) return false;
- if(b == Material.SAPLING) return false;
- if(b == Material.WALL_SIGN) return false;
- if(b == Material.SIGN_POST) return false;
- if(b == Material.PAINTING) return false;
- if(b == Material.ITEM_FRAME) return false;
- if(b == Material.SUGAR_CANE_BLOCK) return false;
- if(b == Material.TRIPWIRE) return false;
- if(b == Material.TRIPWIRE_HOOK) return false;
- if(b == Material.WATER_LILY) return false;
- if(b == Material.WEB) return false;
- if(b == Material.CROPS) return false;
- if(b == Material.WOOD_BUTTON) return false;
- if(b == Material.STONE_BUTTON) return false;
- if(b == Material.LADDER) return false;
- if(b == Material.WOOD_PLATE) return false;
- if(b == Material.STONE_PLATE) return false;
- if(b == Material.COCOA) return false;
- if(b == Material.DOUBLE_PLANT) return false;
-
- return true;
- }
- }
- import java.util.ArrayList;
- import java.util.List;
- import org.bukkit.Location;
- import org.bukkit.World;
- import org.bukkit.block.Block;
- public class Region {
-
- public static List<Location> getBlocks(World world, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) {
- List<Location> blocks = new ArrayList<Location>();
-
- for(int x = minX; x <= maxX; x++){
- for(int y = minY; x <= maxY; x++){
- for(int z = minZ; x <= maxZ; x++){
- Block b = world.getBlockAt(x, y, z);
- blocks.add(b.getLocation());
- }
- }
- }
-
- return blocks;
- }
- }
PostCrafter hat geschrieben:Wieso verwendest du jetzt Regionen und nicht den von mir vorgeschlagenen Weg?
PostCrafter hat geschrieben:Außerdem könntest du für deine isBlock-Methode auch einfach die isSolid-Methode von Material verwenden.
- Player p = e.getPlayer();
- double distance = 1.5D;
- boolean collision = false;
-
- Location playerloc1 = p.getLocation();
- Location playerloc2 = p.getLocation();
- playerloc2.setY(playerloc2.getY() + 1.0D);
-
- for(int i = 0; i <= 3; i++) {
- Location loc = p.getWorld().getBlockAt(p.getLocation().getBlockX(), p.getLocation().getBlockY() - 1, p.getLocation().getBlockZ()).getLocation();
- loc.setY(loc.getBlockY() + i);
-
- if(loc.getBlock().getType().isSolid()) {
- if(loc.distance(playerloc1) < distance || loc.distance(playerloc2) < distance) {
- collision = true;
- }
- }
-
- for (BlockFace face : new BlockFace[] { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, }) {
- if(loc.getBlock().getRelative(face).getType().isSolid()) {
- if(loc.getBlock().getRelative(face).getLocation().distance(playerloc1) < distance || loc.getBlock().getRelative(face).getLocation().distance(playerloc2) < distance) {
- collision = true;
- break;
- }
- }
- }
-
- if(collision) {
- break;
- }
- }
-
- if(collision) {
- //Hier einfügen, was bei einer Kollision geschehen soll.
- }
Mitglieder in diesem Forum: MSN [Bot] und 21 Gäste