-2

I am trying to make a player not able to be damaged if they have right clicked a nether star. Then they will be not able to take damaged for as long as the int damagetime. Here is my code:

public class MineSurvival extends JavaPlugin implements Listener{

private HashMap<String, Long> lastUsage = new HashMap<String, Long>();
private HashMap<String, Integer> daysMap = new HashMap<>();
private HashMap<String, Long> damage = new HashMap<>();
private HashMap<String, Boolean> killable = new HashMap<>();
private final int cdtime = 10;
private final int damagetime = 10;
@Override
public void onEnable(){
getServer().getPluginManager().registerEvents(this, this);
getConfig();
for(String str:getConfig().getKeys(true)) {
int p = getConfig().getInt(str);
daysMap.put(str, p);
}
saveConfig();
}

@Override
public void onDisable(){
for(Entry<String, Integer> pointstostore: daysMap.entrySet()) {
getConfig().set(pointstostore.getKey(), pointstostore.getValue());
}
saveConfig();
}

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
    final Player player = (Player) sender;
    Integer days = this.daysMap.get(player.getName());
    PermissionUser user = PermissionsEx.getUser(player);
if(commandLabel.equalsIgnoreCase("days")){
    if(player.hasPermission("minesurvival.days") || player.hasPermission("minesurvival.hcdays")){
    long lastUsed = 0;
    if(lastUsage.containsKey(player.getName())){
        lastUsed = lastUsage.get(player.getName());
    }

    long cdmillis = System.currentTimeMillis() + (cdtime * 1000);;

    if(System.currentTimeMillis()-lastUsed>=cdmillis){
        if(daysMap.containsKey(player.getName())){
            days++;
            this.daysMap.put(player.getName(), days);
            player.sendMessage(ChatColor.RED + "You have stayed alive for " + ChatColor.BLUE + days + ChatColor.RED + " days!");
            getServer().dispatchCommand(getServer().getConsoleSender(), "pex user " + player.getName() + " prefix &c[&b" + days + "&c]");
        lastUsage.put(player.getName(), System.currentTimeMillis());

        }
        else if(daysMap.containsKey(player.getName())){
            if(days==10 || days==99){
            days++;
            this.daysMap.put(player.getName(), days);
            Bukkit.broadcastMessage(ChatColor.GREEN +(player.getDisplayName() + ChatColor.RED + "Has survived" + ChatColor.BLUE + days + ChatColor.RED + "!"));
            lastUsage.put(player.getName(), System.currentTimeMillis());
        }
        }
        else if(!daysMap.containsKey(player.getName())){
            daysMap.put(player.getName(), 0);
        }
    }
    else{
        int timeLeft = (int) (cdtime-((System.currentTimeMillis()-lastUsed)/1000));
        player.sendMessage(ChatColor.RED + "It hasn't been a day yet " + ChatColor.GREEN + timeLeft + ChatColor.RED + " seconds left");
        return true;
    }


}
    else if(!player.hasPermission("minesurvival.days")){
        player.sendMessage(ChatColor.RED + "No permission");
    }
}
if(commandLabel.equalsIgnoreCase("hardcore")){
    if(!player.hasPermission("minesurvival.normal")){
        user.addPermission("minesurvival.hardcore");
    player.sendMessage(ChatColor.RED + "You are now playing hardcore");
}
    else if(player.hasPermission("minesurvival.normal")){
        player.sendMessage(ChatColor.RED + "You cannot switch from normal to hardcore!");
    }
}
if(commandLabel.equalsIgnoreCase("normal")){
    if(!player.hasPermission("minesurvival.hardcore")){
        user.addPermission("minesurvival.normal");
    player.sendMessage(ChatColor.RED + "You are now playing normal");
    }
    else if(player.hasPermission("minesurvival.hardcore")){
        player.sendMessage(ChatColor.RED + "You cannot switch from hardcore to normal!");
    }
}
if(commandLabel.equalsIgnoreCase("timeleft")){
    if(damage.containsKey(player.getName())){
            damage.put(player.getName(), System.currentTimeMillis());

            }
        }
return false;

}
@EventHandler
public void onPlayerDeathEvent(PlayerDeathEvent event){
    Player player = (Player) event.getEntity();
    PermissionUser user = PermissionsEx.getUser(player);
    if(player instanceof Player){
        Integer daysdeath = this.daysMap.get(player.getName());
        if(player.hasPermission("minesurvival.normal")){
            Integer death = (int) Math.round((daysdeath-((daysdeath*20)/100)));
            this.daysMap.put(player.getName(), death);
            user.removePermission("minesurvival.normal");
            player.sendMessage(ChatColor.RED + "Because you were playing normal, your days have been reset to " + ChatColor.GREEN + death);
        }
        else if(player.hasPermission("minesurvival.hardcore")){
            Integer hcdeath = (int) Math.round((daysdeath-((daysdeath*80)/100)));
            this.daysMap.put(player.getName(), hcdeath);
            user.removePermission("minesurvival.hardcore");
            player.sendMessage(ChatColor.RED + "Because you were playing hardcore, your days have been reset to " + ChatColor.GREEN + hcdeath);
        }
        else{
            return;
        }
    }
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
    ItemStack is = event.getItem();
    Player player = event.getPlayer();
    long dmgmillis = System.currentTimeMillis() + (damagetime * 1000);
    long DamageUsed = 0;
    if (is.getType() == Material.NETHER_STAR) {
        player.sendMessage("4");
        damage.put(player.getName(), (long) 1);
        player.getInventory().remove(Material.NETHER_STAR);
        player.sendMessage(ChatColor.GREEN + "You have activated your 10 second powerup!");
        DamageUsed = damage.get(player.getName());
        if(System.currentTimeMillis()-DamageUsed>=dmgmillis){
            player.sendMessage("3");
            killable.put(player.getName(), true);
        }
}
    else{
        return;
    }
}
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event){
    Entity damagedE = event.getEntity();
    Entity damagerE = event.getDamager();
    if(!(damagedE instanceof Player)) return;
    if(!(damagerE instanceof Player)) return;

    Player damaged = (Player) event.getEntity();
    if(damaged instanceof Player){
        damaged.sendMessage("2");
    if(killable.get(damaged.getName())){
        damaged.sendMessage("1");
        event.setCancelled(true);
    }
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    Player player = event.getPlayer();
    killable.put(player.getName(), false);
}
}

Here is the error that I get:

And here is the error: http://hastebin.com/ujawequtik.avrasm

Jojodmo
  • 23,357
  • 13
  • 65
  • 107
timlampen
  • 21
  • 4

2 Answers2

1

The problem is on line 172 in your code:

at com.minetendo.minesurvival.MineSurvival.onPlayerDamage(MineSurvival.java:172)

which seems like it's this line in your code:

if(killable.get(damaged.getName())){

This is because your killable HashMap does not contain the name of the damaged player. To fix this, you should check if killable.contains(damaged.getName())

So, your event should look something like this:

@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event){
  Entity damagedE = event.getEntity();
  Entity damagerE = event.getDamager();
  if(!(damagedE instanceof Player)) return;
  if(!(damagerE instanceof Player)) return;

  Player damaged = (Player) event.getEntity();
  if(damaged instanceof Player){
    damaged.sendMessage("2");
    if(killable.contains(damaged.getName())){//check if killable contains the damaged player's name
      if(killable.get(damaged.getName())){
        damaged.sendMessage("1");
        event.setCancelled(true);
      }
    }
  }
}
Jojodmo
  • 23,357
  • 13
  • 65
  • 107
0

On line 181 you should check for a null pointer:

if(killable.get(damaged.getName()) != null)

See e.g. this question for details why your version results in an exception.

Community
  • 1
  • 1
Akos Bannerth
  • 1,964
  • 18
  • 14