私はHitDistanceRatios
と呼ばれるクラスを持っています。それはを実装しています。MainClass
で呼び出され、ConfigGets
を除いてJavaPlugin
を呼び出す唯一のクラスです。 EventHandler
という別のクラスもあります。プレーヤーがヒットするたびにダメージのUUIDがマルチマップのhitMap
に追加され、ヒットの距離が値としてDoubleとして保存されます。また、知らなければならないもう一つのクラスがHitDistance
であり、これは実際にhitMap
を受け取ることができます。 HitDistance
とHitDistanceRatios
の違いは、コマンドを実行するためにMainClass
で呼び出されるHitDistanceRatios
です。Bukkit - マルチマップが渡されないのはなぜですか?
基本的に私が抱えている問題は、HitDistanceRatios
は他のクラスから何も取っていないということです。私はhitMap
をHitEvent
から取得する方法を複数試してみましたが、試みるにはHitDistance
まで行っていますが、その方法を見つけることはできません。クラスはHitDistance
に取り、そこからのカップルのハッシュマップを取得しようとしている、ここで
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;
}
}
}
HitEvent
にゲッターを使用する場合、私は同じ結果を得る:ここで
はHitDistanceRatios
ですクラス。ここで
は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;
}
}
あなたが見ることができるように、私は私が使用するゲッターを持って、コレクションすることとするために使用このゲッターがヒット距離のコレクションを返します与えられたUUID。別のクラスからHitDistanceRatio
に入ったものは、nullを返し、エラーを引き起こします。
はここ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);
}
}
を繰り返しますが、私はUUID与えられたハッシュマップから値を取得するカップルゲッターを持って見ることができるように。しかし、驚かされないように、すべてがnullを返します。 HitDistance
はhitMapにアクセスできますが、HitDistanceRatios
は何もアクセスできないため、これは私にとって非常に混乱しています。
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));
}
}
MainClass
の内部でどのように相互作用するかとは何かを持っているような気が?
Minecraftタイプの質問は、通常、StackOverflowの話題にはなりません。なぜタグがまだここにあるのか分かりません。彼らは私たちが再現することは不可能です。 – redFIVE
@redFIVE私は知っている:/私はすでにそこに行ってみました。私はちょうどこれが人々がJavaで全面的に持っていた問題であることを望んでいた。 – Kaelinator
しようとしているコードは何ですか?または、むしろ、コードで何をしたいのですか? –