1

so I've been coding a small minigame in for Minecraft in 1.16. It all worked fine but now I keep getting weird errors where I can't figure out where they're coming from.

My game is built up like this:

  • You wait in a Lobby for enough players to join

  • If enough players are there you get a random team assigned

  • you get 30 Seconds of Buy Time before you get teleported into the arena

  • first team to place their 9 Wool blocks in the middle wins the round

  • first team to kill the opposing team wins the round

After either team wins the round the inventories get cleared, everybody gets their starter equipment and the game goes into the Buy-Time again.

I haven't had any problems so far but now a weird error occures if the game is over because of a player death. (Unfortunately I can only test with 2 Accounts right now)

If a player (Lava, Bow, Crossbow, Melee Fight) I'm getting an error.

This is the Error I'm getting:

[21:06:40 FATAL]: Error executing task on Server
java.lang.NullPointerException: null
    at net.minecraft.server.v1_16_R1.ChunkMapDistance.b(ChunkMapDistance.java:244) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.PlayerChunkMap.movePlayer(PlayerChunkMap.java:956) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.ChunkProviderServer.movePlayer(ChunkProviderServer.java:482) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.PlayerConnection.a(PlayerConnection.java:1040) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.PacketPlayInFlying.a(SourceFile:122) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.PacketPlayInFlying$PacketPlayInPosition.a(SourceFile:56) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.TickTask.run(SourceFile:18) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.IAsyncTaskHandler.executeTask(SourceFile:144) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.IAsyncTaskHandler.executeNext(SourceFile:118) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.MinecraftServer.aZ(MinecraftServer.java:943) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.MinecraftServer.executeNext(MinecraftServer.java:936) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.IAsyncTaskHandler.awaitTasks(SourceFile:127) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.MinecraftServer.sleepForTick(MinecraftServer.java:920) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.MinecraftServer.v(MinecraftServer.java:852) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at net.minecraft.server.v1_16_R1.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[spigot-1.16.1.jar:git-Spigot-ccb012a-4309566]
    at java.lang.Thread.run(Thread.java:835) [?:?]

I suppose it has something todo with packets im sending since each team has a NPC in their Base where they can buy items from. Although I think I figured out where the error might be coming from I still can't point out where exactly I made a mistake.

This is my Packet Reader Class:

package main;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;

import events.CustomNPCEvent;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import net.minecraft.server.v1_16_R1.EntityPlayer;
import net.minecraft.server.v1_16_R1.Packet;
import net.minecraft.server.v1_16_R1.PacketPlayInUseEntity;

public class PacketReader {
    Channel channel;
    public static Map<UUID, Channel> channels = new HashMap<UUID, Channel>();

    Brawler plugin;

    public PacketReader(Brawler plugin) {
        this.plugin = plugin;
    }

    public void inject(Player player) {
        CraftPlayer craftPlayer = (CraftPlayer) player;
        channel = craftPlayer.getHandle().playerConnection.networkManager.channel;
        channels.put(player.getUniqueId(), channel);

        if (channel.pipeline().get("PacketInjector") != null) {
            return;
        }

        channel.pipeline().addAfter("decoder", "PacketInjector", new MessageToMessageDecoder<PacketPlayInUseEntity>() {
            @Override
            protected void decode(ChannelHandlerContext channel, PacketPlayInUseEntity packet, List<Object> arg)
                    throws Exception {
                arg.add(packet);
                readPacket(player, packet);             
            }
        });

    }

    public void eject(Player p) {
        channel = channels.get(p.getUniqueId());

        if (channel.pipeline().get("PacketInjector") != null) {
            channel.pipeline().remove("PacketInjector");
        }
    }

    public void readPacket(Player player, Packet<?> packet) {
//      System.out.println("PACKET >> " + packet);
        if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) {
            if (getValue(packet, "action").toString().equalsIgnoreCase("ATTACK")) {
                return;
            }
            if (getValue(packet, "d").toString().equalsIgnoreCase("OFF_HAND")) {
                return;
            }
            if (getValue(packet, "action").toString().equalsIgnoreCase("INTERACT_AT")) {
                return;
            }

            int id = (int) getValue(packet, "a");

            if (getValue(packet, "action").toString().equalsIgnoreCase("INTERACT")) {
                for (EntityPlayer npc : plugin.bm.npcs.getNPCs()) {
                    if (npc.getId() == id) {
                        Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {

                            @Override
                            public void run() {
                                Bukkit.getPluginManager().callEvent(new CustomNPCEvent(player, npc));
                            }
                        }, 0);
                    }
                }

            }
        }
    }

    private Object getValue(Object instance, String name) {
        Object result = null;
        try {
            Field field = instance.getClass().getDeclaredField(name);

            field.setAccessible(true);

            result = field.get(instance);

            field.setAccessible(false);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

This is my PlayerJoinEvent Class:

package events;

import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

import helper.BrawlPlayer;
import helper.NPC;
import main.Brawler;
import main.PacketReader;
import net.md_5.bungee.api.ChatColor;
import scoreboards.FastBoard;

public class JoinEvent implements Listener {

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Brawler plugin = Brawler.getPlugin(Brawler.class);

        // Setting Join Message
        e.setJoinMessage("§6§lBRAWL > §e" + e.getPlayer().getName() + "§f want's to brawl.");

        // Adding Player to Playerlist
        plugin.bm.players.put(e.getPlayer(), new BrawlPlayer(e.getPlayer()));

        e.getPlayer().teleport(plugin.bm.lobby);

        // Create NPC's for joining player
        NPC.createNPC(plugin.bm.redShop, e.getPlayer());
        NPC.createNPC(plugin.bm.greenShop, e.getPlayer());

        // Inject Player
        PacketReader reader = new PacketReader(plugin);
        reader.inject(e.getPlayer());
        Bukkit.getPlayer(e.getPlayer().getName()).setGameMode(GameMode.ADVENTURE);

        // Set Players Base Stats
        e.getPlayer().setHealth(20);
        e.getPlayer().setFoodLevel(20);
        e.getPlayer().getInventory().clear();

        // Create Scoreboard for Player
        FastBoard board = new FastBoard(e.getPlayer());
        board.updateTitle(ChatColor.GOLD + "" + ChatColor.BOLD + "Brawl");
        plugin.boards.put(e.getPlayer().getUniqueId(), board);
        
    }

}

And this is my DeathEvent Class.

package events;

import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerRespawnEvent;

import enums.Teams;
import main.Brawler;

public class DeathEvent implements Listener {

    @EventHandler
    public void death(EntityDeathEvent e) {
        Brawler plugin = Brawler.getPlugin(Brawler.class);
        if (e.getEntity() instanceof Player && e.getEntity().getKiller() instanceof Player) {
            Player victim = (Player) e.getEntity();
            Player killer = e.getEntity().getKiller();
            victim.getInventory().clear();

            plugin.bm.players.get(victim).setAlive(false);
            plugin.bm.players.get(killer).addCoins(50);
            plugin.bm.players.get(killer).addKill();
            plugin.bm.players.get(victim).addDeath();
            killer.playSound(killer.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 100, 1);
            victim.spigot().respawn();
        } else {
            Player p = (Player) e.getEntity();
            plugin.bm.players.get(p).setAlive(false);
            p.spigot().respawn();
        }
    }

    @EventHandler
    public void onRespawn(PlayerRespawnEvent e) {
        Brawler plugin = Brawler.getPlugin(Brawler.class);
        if (plugin.bm.players.get(e.getPlayer()).getTeam() == Teams.GREEN) {
            e.getPlayer().teleport(plugin.bm.greenTeam);
        } else if (plugin.bm.players.get(e.getPlayer()).getTeam() == Teams.RED) {
            e.getPlayer().teleport(plugin.bm.redTeam);
        }
    }
}

I appreciate every help I can get, if you should need more information let me know, I will post it here. Thank You!

Philip Dz
  • 91
  • 1
  • 11
  • 2
    Does this answer your question? [What is a NullPointerException, and how do I fix it?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – pppery Jul 17 '20 at 03:29
  • Could you post the complete error message? I don't think what you posted is enough to go off of. – TheKingElessar Jul 17 '20 at 16:40

0 Answers0