2016-06-29 8 views
3

私はHitDistanceRatiosと呼ばれるクラスを持っています。それはを実装しています。MainClassで呼び出され、ConfigGetsを除いてJavaPluginを呼び出す唯一のクラスです。 EventHandlerという別のクラスもあります。プレーヤーがヒットするたびにダメージのUUIDがマルチマップのhitMapに追加され、ヒットの距離が値としてDoubleとして保存されます。また、知らなければならないもう一つのクラスがHitDistanceであり、これは実際にhitMapを受け取ることができます。 HitDistanceHitDistanceRatiosの違いは、コマンドを実行するためにMainClassで呼び出されるHitDistanceRatiosです。Bukkit - マルチマップが渡されないのはなぜですか?

基本的に私が抱えている問題は、HitDistanceRatiosは他のクラスから何も取っていないということです。私はhitMapHitEventから取得する方法を複数試してみましたが、試みるには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の内部でどのように相互作用するかとは何かを持っているような気が?

+0

Minecraftタイプの質問は、通常、StackOverflowの話題にはなりません。なぜタグがまだここにあるのか分かりません。彼らは私たちが再現することは不可能です。 – redFIVE

+0

@redFIVE私は知っている:/私はすでにそこに行ってみました。私はちょうどこれが人々がJavaで全面的に持っていた問題であることを望んでいた。 – Kaelinator

+0

しようとしているコードは何ですか?または、むしろ、コードで何をしたいのですか? –

答えて

0

これは複雑なものです。少し読んだだけで、アクセス修飾子を指定しないと、デフォルトでは「プライベートパッケージ」になっています。私は完全にこれが何を意味するのか分からないが、私はあなたがこれにHitEventで行を変更した場合を考える:

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

それはそのようなものであればそれは動作するはずです。その理由は、アクセス修飾子「プライベートパッケージ」は、その特定のパッケージ内のクラスにしかアクセスできないからです。アクセスしようとしているクラスがパッケージに含まれていない場合、そのクラスにはアクセス権がありません。

関連する問題