그래서, 나는 그것이 ConfigGets
을 제외하고 JavaPlugin
를 호출하는 유일한 클래스는 MainClass
에라고, HitDistanceRatios
라는 클래스, 그것은 CommandExecutor
를 구현해야합니다. 또한 EventHandler
인 HitEvent
이라는 또 다른 클래스가 있습니다. 플레이어가 공격을받을 때마다 피해자의 UUID가 hitMap
인 Multimap에 추가됩니다. 여기에서 히트 거리가 Double 값으로 저장됩니다. 또한 hitMap
을 실제로 수신 할 수있는 HitDistance
이라는 또 하나의 클래스가 있습니다. HitDistance
과 HitDistanceRatios
의 차이점은 MainClass
에서 HitDistanceRatios
이 호출되어 명령을 실행한다는 것입니다.Bukkit - Multimap이 전달되지 않는 이유는 무엇입니까?
기본적으로 내가 가지고있는 문제는 HitDistanceRatios
이 다른 클래스에서 아무것도 가져 오지 않는다는 것입니다. HitEvent
에서 hitMap
을 가져 오는 여러 가지 방법을 시도해 보았습니다. 시도해 보려면 HitDistance
까지 시도했지만 작동하는 방법을 찾지 못했습니다. 클래스가 HitDistance
에 복용하고 거기에서 몇 HashMaps을 얻을려고, 여기에
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
입니다 수업. 당신이 볼 수 있듯이
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;
}
}
, 나는 내가 사용하는 것 게터를 컬렉션으로 사용이 getter 및 히트 거리의 컬렉션을 반환 : 여기
는 HitEvent
입니다 주어진 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
의 내부 상호 작용하는 방법을 느낌?
미니 크래프트 유형 질문은 일반적으로 StackOverflow의 주제와 관련이 없습니다. 왜 태그가 아직 여기에 있는지 잘 모르겠다. 그들은 우리가 재현 할 수없는 옆에 있습니다. – redFIVE
@redFIVE 나는 알고있다./나는 이미 거기에 가려고했다. 나는 사람들이 자바를 가지고이 문제를 해결할 수 있기를 바라고 있었다. – Kaelinator
시도하는 코드는 무엇입니까? 아니면, 코드에서 원하는 것은 무엇입니까? –