2016-06-29 3 views
3

그래서, 나는 그것이 ConfigGets을 제외하고 JavaPlugin를 호출하는 유일한 클래스는 MainClass에라고, HitDistanceRatios라는 클래스, 그것은 CommandExecutor를 구현해야합니다. 또한 EventHandlerHitEvent이라는 또 다른 클래스가 있습니다. 플레이어가 공격을받을 때마다 피해자의 UUID가 hitMap 인 Multimap에 추가됩니다. 여기에서 히트 거리가 Double 값으로 저장됩니다. 또한 hitMap을 실제로 수신 할 수있는 HitDistance이라는 또 하나의 클래스가 있습니다. HitDistanceHitDistanceRatios의 차이점은 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의 내부 상호 작용하는 방법을 느낌?

+0

미니 크래프트 유형 질문은 일반적으로 StackOverflow의 주제와 관련이 없습니다. 왜 태그가 아직 여기에 있는지 잘 모르겠다. 그들은 우리가 재현 할 수없는 옆에 있습니다. – redFIVE

+0

@redFIVE 나는 알고있다./나는 이미 거기에 가려고했다. 나는 사람들이 자바를 가지고이 문제를 해결할 수 있기를 바라고 있었다. – Kaelinator

+0

시도하는 코드는 무엇입니까? 아니면, 코드에서 원하는 것은 무엇입니까? –

답변

0

이것은 복잡한 문제입니다. 약간의 독서에서 접근 수정자를 지정하지 않으면 기본적으로 "개인 패키지"라는 것을 알았습니다. 나는 완전히이 무엇을 의미하는지 모르겠지만,이에 HitEvent의 라인을 변경하면 내 생각 : 그것은 그런 경우

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

그것은 작동합니다. 액세스 수정자인 "개인 패키지"는 해당 특정 패키지의 클래스 만 액세스 할 수 있기 때문입니다. 액세스하려고하는 클래스가 패키지에 없으면 액세스 할 수 없습니다.