2016-06-29 24 views
3

Also, ich habe eine Klasse namens HitDistanceRatios, implementiert es CommandExecutor, es heißt MainClass, die die einzige Klasse ist, die JavaPlugin mit Ausnahme von ConfigGets aufruft. Ich habe auch eine andere Klasse namens HitEvent, die eine EventHandler ist, jedes Mal, wenn ein Spieler getroffen wird, wird die UUID des Schadens zu einer Multimap, hitMap hinzugefügt, wobei die Abstände der Treffer als Werte gespeichert werden, ein Double. Es gibt auch eine weitere Klasse, die bekannt sein sollte HitDistance, die tatsächlich die hitMap empfangen kann. Der Unterschied zwischen und HitDistanceRatios besteht darin, dass HitDistanceRatios in MainClass aufgerufen wird, um einen Befehl auszuführen.Bukkit - Warum wird meine Multimap nicht weitergegeben?

Grundsätzlich ist das Problem, dass HitDistanceRatios nichts aus einer anderen Klasse nimmt. Ich habe mehrere Möglichkeiten ausprobiert, um die hitMap von HitEvent zu bekommen, und sogar durch HitDistance zu gehen, um es zu versuchen, aber ich kann einen Weg nicht finden, der funktioniert.

Hier ist HitDistanceRatios:

package yt.Kaelinator.commands; 
 

 
import java.text.DecimalFormat; 
 

 
import org.bukkit.Bukkit; 
 
import org.bukkit.ChatColor; 
 
import org.bukkit.command.Command; 
 
import org.bukkit.command.CommandExecutor; 
 
import org.bukkit.command.CommandSender; 
 
import org.bukkit.entity.Player; 
 

 
import yt.Kaelinator.ConfigGets; 
 
import yt.Kaelinator.MainClass; 
 
import yt.Kaelinator.calculations.HitDistance; 
 

 
public class HitDistanceRatios implements CommandExecutor { 
 

 
    public HitDistanceRatios(MainClass instance) {} 
 

 
    @ 
 
    Override 
 
    public boolean onCommand(CommandSender sender, Command command, String cmd, String[] args) { 
 
    if (!(sender instanceof Player)) 
 
     return false; 
 
    Player player = (Player) sender; 
 

 
    if (args.length == 0) { 
 

 
     DecimalFormat numberFormat = new DecimalFormat("#.00"); 
 
     HitDistance hd = new HitDistance(null); 
 

 
     player.sendMessage(ConfigGets.prefix + ChatColor.BLUE + player.getName() + ": " + ChatColor.RED + numberFormat.format(hd.getFourMap(player.getUniqueId())) + ChatColor.BLUE + "% of hits are over 4 blocks, " + ChatColor.RED + numberFormat.format(hd.getThreeHalfMap(player.getUniqueId())) + ChatColor.BLUE + "% are over 3.5 blocks."); 
 
     return true; 
 
    } else {@ 
 
     SuppressWarnings("deprecation") 
 
     Player target = Bukkit.getPlayer(args[0]); 
 

 
     if (target == null) { 
 
     player.sendMessage(ConfigGets.prefix + "Player " + args[0] + " couldn't be found."); 
 
     return true; 
 

 
     } else { 
 

 
     DecimalFormat numberFormat = new DecimalFormat("#.00"); 
 
     HitDistance hd = new HitDistance(null); 
 

 
     player.sendMessage(ConfigGets.prefix + ChatColor.BLUE + target.getName() + ": " + ChatColor.RED + numberFormat.format(hd.getFourMap(target.getUniqueId())) + ChatColor.BLUE + "% of hits are over 4 blocks, " + ChatColor.RED + numberFormat.format(hd.getThreeHalfMap(target.getUniqueId())) + ChatColor.BLUE + "% are over 3.5 blocks."); 
 
     } 
 
     return true; 
 
    } 
 
    } 
 
}
Hier wird die Klasse in HitDistance nehmen und versuchen, von dort ein paar HashMaps zu bekommen, aber ich habe das gleiche Ergebnis, wenn ich einen Getter in der HitEvent verwenden Klasse.

Hier ist HitEvent:

package yt.Kaelinator.events; 
 

 
import java.util.UUID; 
 

 
import org.bukkit.Bukkit; 
 
import org.bukkit.ChatColor; 
 
import org.bukkit.Location; 
 
import org.bukkit.entity.Player; 
 
import org.bukkit.event.EventHandler; 
 
import org.bukkit.event.Listener; 
 
import org.bukkit.event.entity.EntityDamageByEntityEvent; 
 

 
import com.google.common.collect.ArrayListMultimap; 
 
import com.google.common.collect.Multimap; 
 

 
import yt.Kaelinator.ConfigGets; 
 
import yt.Kaelinator.MainClass; 
 
import yt.Kaelinator.calculations.HitDistance; 
 
import yt.Kaelinator.calculations.Lag; 
 

 
public class HitEvent implements Listener { 
 

 
    Multimap < UUID, Double > hitMap = ArrayListMultimap.create(); 
 

 
    public HitEvent(MainClass instance) {} 
 

 
    @ 
 
    EventHandler 
 
    public void onPlayerHit(EntityDamageByEntityEvent event) { 
 

 
    // make sure they are all players 
 
    if (!(event.getEntity() instanceof Player) | !(event.getDamager() instanceof Player)) 
 
     return; 
 

 
    // get the event's players 
 
    Player damaged = (Player) event.getEntity(); 
 
    Player damager = (Player) event.getDamager(); 
 

 
    // get the locations 
 
    Location damagedLocation = damaged.getLocation(); 
 
    Location damagerLocation = damager.getLocation(); 
 

 
    // calculate the distance 
 
    double distance = damagedLocation.distance(damagerLocation); 
 

 
    // broadcast it to everyone 
 
    ClickEvent ce = new ClickEvent(); 
 
    boolean displayHits = ConfigGets.DisplayDistances; 
 
    if (displayHits) { 
 
     for (Player p: Bukkit.getOnlinePlayers()) { 
 
     p.sendMessage(ChatColor.translateAlternateColorCodes('&', 
 
      ConfigGets.prefix + 
 
      "&f" + damager.getDisplayName() + "&3 damaged &f" + damaged.getDisplayName() + "&3 Distance: &4" + distance + " &7&l" + ce.checkForLag(damager.getUniqueId()) + " " + ce.checkForLag(damaged.getUniqueId()) + " " + Math.ceil(Lag.getTPS()))); 
 
     } 
 
    } 
 

 
    if (!ce.checkForLag(damager.getUniqueId()) & !ce.checkForLag(damaged.getUniqueId()) & !(Math.ceil(Lag.getTPS()) < 20)) { 
 
     hitMap.put(damager.getUniqueId(), distance); 
 
    } 
 

 
    UUID playerUUID = damager.getUniqueId(); 
 
    int hitAmount = hitMap.get(playerUUID).size(); 
 

 
    if ((hitAmount % 5 == 0) & hitAmount >= 20) { 
 

 
     HitDistance hd = new HitDistance(null); 
 
     hd.hasReach(hitMap.get(playerUUID), playerUUID); 
 
    } 
 
    } 
 

 
    public Multimap < UUID, Double > getHitMap() { 
 
    return hitMap; 
 
    } 
 
}

Wie Sie sehen können, habe ich einen Getter, die ich verwenden würde, diese Getter verwendet, um eine Sammlung zu sein und würde die Sammlung von Hit-Strecken zurückkehren eine UUID gegeben. Alles, was von einer anderen Klasse in HitDistanceRatio erhalten wurde, gibt null zurück und verursacht Fehler.

Hier HitDistance:

package yt.Kaelinator.calculations; 
 

 
import java.util.Collection; 
 
import java.util.HashMap; 
 
import java.util.UUID; 
 

 
import org.bukkit.Bukkit; 
 

 
import yt.Kaelinator.ConfigGets; 
 
import yt.Kaelinator.MainClass; 
 
import yt.Kaelinator.events.HitEvent; 
 

 
public class HitDistance { 
 

 
    public HitDistance(MainClass instance) {} 
 

 
    public HashMap < UUID, Double > mapFourOverTotal = new HashMap < UUID, Double >(); 
 
    public HashMap < UUID, Double > mapThreeHalfOverTotal = new HashMap < UUID, Double >(); 
 

 
    HitEvent he = new HitEvent(null); 
 

 
    public void hasReach(Collection <Double> collection, UUID uuid) { 
 

 
    int length = collection.size(); 
 

 
    Double[] distances = collection.toArray(new Double[length]); 
 

 
    int overThreeHalf = 0; 
 
    int overFour = 0; 
 
    int rep = 0; 
 
    for (int i = 0; i < distances.length; i++) { 
 
     if (distances[i] > 4.0) { 
 
     overFour++; 
 
     if (i >= 5) { 
 
      if (distances[i - 1] > 4.0) 
 
      rep++; 
 
      if (distances[i - 2] > 4.05) 
 
      rep += 2; 
 
      if (distances[i - 3] > 4.1) 
 
      rep += 3; 
 
     } 
 
     } else if (distances[i] > 3.5) { 
 
     overThreeHalf++; 
 
     if (i >= 5) { 
 
      if (distances[i - 1] > 3.6) 
 
      rep++; 
 
      if (distances[i - 2] > 3.7) 
 
      rep += 2; 
 
      if (distances[i - 3] > 3.8) 
 
      rep += 3; 
 
     } 
 
     } 
 
    } 
 

 
    double fourOverTotal = overFour/distances.length; 
 
    double threeHalfOverTotal = overThreeHalf/distances.length; 
 

 
    mapFourOverTotal.put(uuid, fourOverTotal); 
 
    mapThreeHalfOverTotal.put(uuid, threeHalfOverTotal); 
 

 
    if (fourOverTotal >= 1/3) { 
 
     rep += 10; 
 
    } 
 

 
    if (threeHalfOverTotal/distances.length >= 2/5) { 
 
     rep += 10; 
 
    } 
 

 

 

 
    if (rep >= 30) { 
 
     Bukkit.getPlayer(uuid).kickPlayer(ConfigGets.prefix + 
 
     ConfigGets.kickForReach); 
 
    } 
 
    } 
 

 
    public double getFourMap(UUID uuid) { 
 
    return mapFourOverTotal.get(uuid); 
 
    } 
 

 
    public double getThreeHalfMap(UUID uuid) { 
 
    return mapThreeHalfOverTotal.get(uuid); 
 
    } 
 
}

Auch hier, wie Sie Ich habe ein paar Getter sehen können, dass die Werte aus einer hashmap gegeben ein UUID erhalten. Aber keine Überraschung, alles ist null. Das ist sehr verwirrend für mich, weil auf hitMap zugreifen kann, aber HitDistanceRatios kann nichts zugreifen. Ich fühle mich wie das hat etwas zu tun, wie sie im Inneren von MainClass interagieren:

package yt.Kaelinator; 
 

 
import org.bukkit.Bukkit; 
 
import org.bukkit.plugin.PluginManager; 
 
import org.bukkit.plugin.java.JavaPlugin; 
 

 
import yt.Kaelinator.calculations.Lag; 
 
import yt.Kaelinator.commands.HitDistanceRatios; 
 
import yt.Kaelinator.events.ClickEvent; 
 
import yt.Kaelinator.events.HitEvent; 
 

 
public class MainClass extends JavaPlugin { 
 

 
    public static MainClass instance = null; 
 

 
    public void onEnable() { 
 
    registerEvents(); 
 
    registerConfig(); 
 
    registerCommands(); 
 
    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Lag(), 100L, 1L); 
 
    } 
 

 
    public void registerEvents() { 
 
    PluginManager pm = getServer().getPluginManager(); 
 
    pm.registerEvents(new HitEvent(null), this); 
 
    pm.registerEvents(new ClickEvent(), this); 
 
    } 
 

 
    private void registerConfig() { 
 
    getConfig().options().copyDefaults(true); 
 
    saveConfig(); 
 
    } 
 

 
    private void registerCommands() { 
 
    getCommand("hitdistanceratio").setExecutor(new HitDistanceRatios(this)); 
 
    } 
 

 
}
Irgendwelche Vorschläge?

+0

minecraft Typ Fragen sind in der Regel off-topic für StackOverflow. Nicht sicher, warum die Tags noch da sind. Sie sind für uns fast unmöglich zu reproduzieren. – redFIVE

+0

@redFIVE Ich weiß:/Ich habe schon versucht, dorthin zu gehen. Ich hatte nur gehofft, dass dies ein Problem war, das die Leute mit Java überall hatten. – Kaelinator

+0

Was versucht der Code zu tun? Oder was wollten Sie eigentlich von dem Code? –

Antwort

0

Dies ist ein komplizierter. Von ein wenig Lesen, sah ich, dass, wenn Sie keinen Zugriffsmodifizierer angeben, es standardmäßig ein "privates Paket" ist. Ich weiß nicht ganz, was das bedeutet, aber ich denke, wenn man die Linie in HitEvent Um dies zu ändern:

public Multimap < UUID, Double > hitMap = ArrayListMultimap.create(); 

Es sollte funktionieren, wenn es so ist. Der Zugriffsmodifikator "privates Paket" lässt nur die Klassen in diesem Paket darauf zugreifen. Wenn die Klasse, die versucht, darauf zuzugreifen, nicht in ihrem Paket ist, hat sie keinen Zugriff.