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!