Coding mit Java | Java-basierten APIs

  • Ersteller Ersteller ij9F_i0FaF-d9lrDSDDpDbfo
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
Hab da mal ne Frage:

Gibt es vllt eine Methode/Klasse
die eine Hilfestellung anbieten um die Distanz zwischen zwei Blöcken/Spielern zu errechnen?

lg Sandwich
 
Hab da mal ne Frage:

Gibt es vllt eine Methode/Klasse
die eine Hilfestellung anbieten um die Distanz zwischen zwei Blöcken/Spielern zu errechnen?

lg Sandwich

Ja, dafür gibt es die Locations der Spieler/Blöcke (via getLocation()).
Die Locations haben zwei Funktionen, die dir hier helfen können.
Code:
distance(Location otherLocation)
distanceSquared(Location otherLocation)

Nun, was ist der Unterschied?
distance() ist ziemlich offensichtlich: Es gibt dir die genaue Distanz zurück.
distanceSquared() dagegen, gibt dir die Distanz im Quadrat (d.h. Distanz * Distanz) zurück.
Das klingt zwar zunächst ziemlich umständlich, dafür ist die distanceSquared() Methode um ein kleines bisschen schneller performanceweise als distance(), was einfach daran liegt, dass die distance() Methode zur Berechnung der genauen Distanz noch zusätzlich eine Quadratwurzelfunktion benutzt, die vergleichsweise ziemlich lahm ist.^^

Worauf ich hinaus will:
Wann immer du die Distanz genau brauchst, musst du natürlich distance() benutzen, zum Beispiel wenn du einem Spieler EnderGames-like die Distanz zum nächsten Spieler im Chat verraten musst, da du da nicht um die Quadratwurzel drum herum kommst. Aber wann immer du die Funktion intern benutzt, solltest du distanceSquared() benutzen und die Vergleichsgröße vorher einmal quadrieren. Beispiel:
Ein Spieler muss in der nähe einer bestimmten Location sein, damit etwas passiert.
Normal schreibst du dann mit distance():
Code:
if (playerLocation.distance(otherLocation) <= 4)
{
	doStuff();
}
Mit distanceSquared() sieht das dann so aus:
Code:
if (playerLocation.distanceSquared(otherLocation) <= 16)
{
	doStuff();
}

Das ist performanceweise zwar nur eine minimale Verbesserung, aber solche Dinge summieren sich auf. Besonders, wenn man es oft aufrufen muss. :)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Dosenwerfer
WoW. Vielen Dank für die ausführliche Antwort!
Wollte ich schon immer wissen.

thx und lg
Sandwich
 
Mal eine Frage.. kennt sich hier jemand mit BungeeCord und ArenenSysteme aus? ;)
 
Ich hab ein Problem mit meinem Player respawn event. Ich hab gemacht das der spieler nach einem respawn random in der Welt spawnt. Aber immer wenn ein Spieler repsawn kommt ein riesen fehler: Hit ist der code:
Code:
package me.elimenator1999.Listeners;

import java.io.File;
import java.util.Random;

import me.elimenator1999.SurivalGames.Main;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerRespawnEvent;

public class PlayerRespawnListener implements Listener {
    private Main plugin;
   
    public PlayerRespawnListener(Main plugin){
        this.plugin = plugin;
    }
   
    @EventHandler
    public void onRespawn(PlayerRespawnEvent e) {
        File file = new File("plugins/SurivalGames", "spawns.yml");
        FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
       
        int radius = 2;
       
        String world = cfg.getString("SurivalGames.Spawns.world");
        double x = cfg.getDouble("SurivalGames.Spawn.X");
        double y = cfg.getDouble("SurivalGames.Spawn.Y");
        double z = cfg.getDouble("SurivalGames.Spawn.Z");
        Location loc = new Location(Bukkit.getWorld(world), x, y ,z);
       
        Random r = new Random();
        int z1 = r.nextInt(radius);
        int z2 = r.nextInt(radius);
       
        int zf = r.nextInt(2);
        switch(zf) {
        case 0:
            loc.setX(x + z1);
            break;
        case 1:
            loc.setX(x - z1);
            break;
        }
       
        int zf2 = r.nextInt(2);
        switch(zf2) {
        case 0:
            loc.setZ(z + z2);
            break;
        case 1:
            loc.setZ(z - z2);
            break;
        }
       
        loc.setY(Bukkit.getWorld(world).getHighestBlockYAt(loc));
       
        e.getPlayer().teleport(loc);
               
    }
   
   
   
    public static Location getRandomSpawnInSquard(Player player, int radius) {
       
        File file = new File("plugins/SurivalGames", "spawns.yml");
        FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
       
        String world = cfg.getString("SurivalGames.Spawns.world");
        double x = cfg.getDouble("SurivalGames.Spawn.X");
        double y = cfg.getDouble("SurivalGames.Spawn.Y");
        double z = cfg.getDouble("SurivalGames.Spawn.Z");
        Location loc = new Location(Bukkit.getWorld(world), x, y ,z);
       
        Random r = new Random();
        int z1 = r.nextInt(radius);
        int z2 = r.nextInt(radius);
       
        int zf = r.nextInt(2);
        switch(zf) {
        case 0:
            loc.setX(x + z1);
            break;
        case 1:
            loc.setX(x - z1);
            break;
        }
       
        int zf2 = r.nextInt(2);
        switch(zf2) {
        case 0:
            loc.setZ(z + z2);
            break;
        case 1:
            loc.setZ(z - z2);
            break;
        }
       
        loc.setY(Bukkit.getWorld(world).getHighestBlockYAt(loc));
       
        player.teleport(loc);
       
        return loc;
    }
}

und hir die Fehler meldung:

Code:
[18:15:49 ERROR]: Could not pass event PlayerRespawnEvent to SurivalGames v0.5
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:320) ~[craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
a:62) ~[craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredLi
stener.java:30) ~[craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
ava:487) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
ava:472) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.PlayerList.moveToWorld(PlayerList.java:4
81) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.PlayerList.moveToWorld(PlayerList.java:4
20) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java
:1180) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.PacketPlayInClientCommand.a(SourceFile:5
0) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.PacketPlayInClientCommand.handle(SourceF
ile:8) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:147
) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.ServerConnection.c(ServerConnection.java
:77) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:7
00) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:2
73) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:5
62) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java
:469) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:6
17) [craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
Caused by: java.lang.IllegalArgumentException: Name cannot be null
        at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[craftbu
kkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at org.bukkit.craftbukkit.v1_7_R1.CraftServer.getWorld(CraftServer.java:
1045) ~[craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        at org.bukkit.Bukkit.getWorld(Bukkit.java:249) ~[craftbukkit.jar:git-Spi
got-1.7.2-R0.3-122-gb58e277]
        at me.elimenator1999.Listeners.PlayerRespawnListener.onRespawn(PlayerRes
pawnListener.java:36) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0
_60]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0
_60]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1
.7.0_60]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_60]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:318) ~[craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
        ... 16 more

Ich hoffe ihr könnt mir helfen.

MFG
elimenator1999
 
Du solltest dir mal deine Exceptions genauer durchlesen. ;)
In der Mitte der Exception:
Code:
Caused by: java.lang.IllegalArgumentException: Name cannot be null
at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[craftbu
kkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]
at org.bukkit.craftbukkit.v1_7_R1.CraftServer.getWorld(CraftServer.java:
1045) ~[craftbukkit.jar:git-Spigot-1.7.2-R0.3-122-gb58e277]

Hier erkennst du:
  1. Ein Name ist null
  2. Es hängt mit der getWorld()-Funktion zusammen
Daran kann man erkennen, dass es vermutlich an dieser Zeile liegt, da der Weltenname null ist, und dieser hier geladen wird:
Code:
String world = cfg.getString("SurivalGames.Spawns.world");

Das kann unteranderem auch an Groß-/Kleinschreibung oder sonstigen Schreibfehlern liegen. Mir fällt zum Beispiel auf, dass "Spawns" nur in dieser Zeile am Ende mit "s" geschrieben wurde. ;)
 
Hehe, ne, falls du dich in einem bestimmten Bereich gut auskennst, kannst du mich gerne mal per Unterhaltung anschreiben :) 1 Platz ist noch frei :P
 
HI :(
Ich hab ein pl gemacht, dass wenn man rechtsklick auf ein NamTag macht , dass sich ein inv öffnet (dieser Teil geht) aber wenn ich auf das Item klicke (in dem inv) Kommt eine Fehler meldung von InventoryClickEvent :( Hier ein paar screens:

upload_2014-9-16_17-41-28.png






upload_2014-9-16_17-41-28.png
 
Status
Für weitere Antworten geschlossen.

Soziale Medien

  • X
  • TikTok

Über uns

  • GommeHD.net ist einer der größten Minecraft-Server der Welt. Dir gefällt unser Server? Dann unterstütze uns durch einen Kauf im Shop!
  • Shop