FastCraft

FastCraft

138k Downloads

Server hangs on shutdown

Sodies opened this issue ยท 8 comments

commented

Temporary Fix

I (Ben) created a temporary fix on the v2/crashfix branch. It removes the code that closes GUIs when the plugin disabled (which is where the issue lies), so the /reload command should not be used with this build. If it is, the GUI inventory won't be closed, and players will be able to take items from it.

Here's the latest v2/crashfix build (based on v2.0.2): FastCraft-2.x-18919b2.jar
I'm not actively updating this, so let me know you'd like me to. ๐Ÿ˜„
- Ben

Issue

Description

Sometimes server crash

Reproduction

  • Install Plugin
  • Play
  • ...

Output/Files

09.01 16:29:19 [Server] ERROR The server has stopped responding!
09.01 16:29:19 [Server] ERROR Please report this to http://www.spigotmc.org/
09.01 16:29:19 [Server] ERROR Be sure to include ALL relevant console errors and Minecraft crash reports
09.01 16:29:19 [Server] ERROR Spigot version: git-Spigot-549c1fa-8c37e2e (MC: 1.12.2)
09.01 16:29:19 [Server] ERROR ------------------------------
09.01 16:29:19 [Server] ERROR Server thread dump (Look for plugins here before reporting to Spigot!):
09.01 16:29:19 [Server] ERROR ------------------------------
09.01 16:29:19 [Server] ERROR Current Thread: Server thread
09.01 16:29:19 [Server] ERROR PID: 38 | Suspended: false | Native: false | State: RUNNABLE
09.01 16:29:19 [Server] ERROR Stack:
09.01 16:29:19 [Server] ERROR java.lang.System.identityHashCode(Native Method)
09.01 16:29:19 [Server] ERROR com.google.common.base.Equivalence$Identity.doHash(Equivalence.java:372)
09.01 16:29:19 [Server] ERROR com.google.common.base.Equivalence.hash(Equivalence.java:117)
09.01 16:29:19 [Server] ERROR com.google.common.collect.MapMakerInternalMap.hash(MapMakerInternalMap.java:908)
09.01 16:29:19 [Server] ERROR com.google.common.collect.MapMakerInternalMap.get(MapMakerInternalMap.java:2123)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.ChannelInjector.getMarker(ChannelInjector.java:746)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.ChannelInjector.processSending(ChannelInjector.java:398)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.ChannelInjector.access$500(ChannelInjector.java:78)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.ChannelInjector$5.handleScheduled(ChannelInjector.java:364)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.ChannelInjector$5.onMessageScheduled(ChannelInjector.java:332)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.ChannelProxy$2.schedulingRunnable(ChannelProxy.java:127)
09.01 16:29:19 [Server] ERROR com.comphenix.protocol.injector.netty.EventLoopProxy.execute(EventLoopProxy.java:95)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:194)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.NetworkManager.sendPacket(NetworkManager.java:143)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PlayerConnection.sendPacket(PlayerConnection.java:1138)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.EntityPlayer.closeInventory(EntityPlayer.java:929)
09.01 16:29:19 [Server] ERROR org.bukkit.craftbukkit.v1_12_R1.entity.CraftHumanEntity.closeInventory(CraftHumanEntity.java:404)
09.01 16:29:19 [Server] ERROR co.kepler.fastcraft.api.gui.GUI.dispose(GUI.java:107)
09.01 16:29:19 [Server] ERROR co.kepler.fastcraft.api.gui.GUI.dispose(GUI.java:96)
09.01 16:29:19 [Server] ERROR co.kepler.fastcraft.craftgui.GUIFastCraft.dispose(GUIFastCraft.java:84)
09.01 16:29:19 [Server] ERROR co.kepler.fastcraft.craftgui.GUIFastCraft$GUIListener.blockRemoved(GUIFastCraft.java:220)
09.01 16:29:19 [Server] ERROR co.kepler.fastcraft.craftgui.GUIFastCraft$GUIListener.onBlockBreak(GUIFastCraft.java:199)
09.01 16:29:19 [Server] ERROR sun.reflect.GeneratedMethodAccessor392.invoke(Unknown Source)
09.01 16:29:19 [Server] ERROR sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
09.01 16:29:19 [Server] ERROR java.lang.reflect.Method.invoke(Method.java:498)
09.01 16:29:19 [Server] ERROR org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
09.01 16:29:19 [Server] ERROR org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
09.01 16:29:19 [Server] ERROR org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500)
09.01 16:29:19 [Server] ERROR org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PlayerInteractManager.breakBlock(PlayerInteractManager.java:290)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PlayerInteractManager.a(PlayerInteractManager.java:217)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:889)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PacketPlayInBlockDig.a(SourceFile:40)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PacketPlayInBlockDig.a(SourceFile:10)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
09.01 16:29:19 [Server] ERROR java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
09.01 16:29:19 [Server] ERROR java.util.concurrent.FutureTask.run(FutureTask.java:266)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
09.01 16:29:19 [Server] ERROR net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)

Server Details

  • FastCraft Version: 2.0.2
  • 1.12.2 spigot
commented

This might be an issue with ProtocolLib. What version are you using, what is its config.yml, and do you have this issue without ProtocolLib on the server?

commented

Source:
(Executed line marked with <-----)

java.lang.System.identityHashCode(Native Method) (Native Method)
com.google.common.base.Equivalence$Identity.doHash(Equivalence.java:372)
protected int doHash(Object o) {
  return System.identityHashCode(o); // <-----
}
com.google.common.base.Equivalence.hash(Equivalence.java:117)
public final int hash(@Nullable T t) {
  if (t == null) {
    return 0;
  }
  return doHash(t); // <-----
}
com.google.common.collect.MapMakerInternalMap.hash(MapMakerInternalMap.java:908)
int hash(Object key) {
  int h = this.keyEquivalence.hash(key);
  return rehash(h); // <-----
}
com.google.common.collect.MapMakerInternalMap.get(MapMakerInternalMap.java:2123)
public V get(@Nullable Object key) {
  if (key == null) {
    return null;
  }
  int hash = hash(key); // <-----
  return (V)segmentFor(hash).get(key, hash);
}
com.comphenix.protocol.injector.netty.ChannelInjector.getMarker(ChannelInjector.java:746)
@Override
public NetworkMarker getMarker(Object packet) {
    return packetMarker.get(packet); // <-----
}
com.comphenix.protocol.injector.netty.ChannelInjector.processSending(ChannelInjector.java:398)
/**
 * Process a given message on the packet listeners.
 * @param message - the message/packet.
 * @return The resulting message/packet.
 */
private PacketEvent processSending(Object message) {
    return channelListener.onPacketSending(ChannelInjector.this, message, getMarker(message)); // <-----
}
com.comphenix.protocol.injector.netty.ChannelInjector.access$500(ChannelInjector.java:78) (Synthetic method)
com.comphenix.protocol.injector.netty.ChannelInjector$5.handleScheduled(ChannelInjector.java:364)
protected PacketEvent handleScheduled(Object instance, FieldAccessor accessor) {
    // Let the filters handle this packet
    Object original = accessor.get(instance);

    // See if we've been instructed not to process packets
    if (!scheduleProcessPackets.get()) {
        NetworkMarker marker = getMarker(original);

        if (marker != null)    {
            PacketEvent result = new PacketEvent(ChannelInjector.class);
            result.setNetworkMarker(marker);
            return result;
        } else {
            return BYPASSED_PACKET;
        }
    }
    PacketEvent event = processSending(original); // <-----

    if (event != null && !event.isCancelled()) {
        Object changed = event.getPacket().getHandle();

        // Change packet to be scheduled
        if (original != changed)
            accessor.set(instance, changed);
    };
    return event != null ? event : BYPASSED_PACKET;
}
com.comphenix.protocol.injector.netty.ChannelInjector$5.onMessageScheduled(ChannelInjector.java:332)
@Override
protected Runnable onMessageScheduled(final Runnable runnable, FieldAccessor packetAccessor) {
    final PacketEvent event = handleScheduled(runnable, packetAccessor); // <-----

    // Handle cancelled events
    if (event != null && event.isCancelled())
        return null;

    return new Runnable() {
        @Override
        public void run() {
            currentEvent = event;
            runnable.run();
            currentEvent = null;
        }
    };
}
com.comphenix.protocol.injector.netty.ChannelProxy$2.schedulingRunnable(ChannelProxy.java:127)
@Override
protected Runnable schedulingRunnable(final Runnable runnable) {
    final FieldAccessor accessor = getMessageAccessor(runnable);

    if (accessor != null) {
        Runnable result = onMessageScheduled(runnable, accessor);; // <-----
        return result != null ? result : getEmptyRunnable();
    }
    return runnable;
}
com.comphenix.protocol.injector.netty.EventLoopProxy.execute(EventLoopProxy.java:95)
@Override
public void execute(Runnable command) {
    getDelegate().execute(schedulingRunnable(command)); // <-----
}
net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:194)
private void a(final Packet<?> packet, @Nullable final GenericFutureListener<? extends Future<? super Void>>[] agenericfuturelistener)
{
  final EnumProtocol enumprotocol = EnumProtocol.a(packet);
  final EnumProtocol enumprotocol1 = (EnumProtocol)this.channel.attr(c).get();
  if (enumprotocol1 != enumprotocol)
  {
    g.debug("Disabled auto read");
    this.channel.config().setAutoRead(false);
  }
  if (this.channel.eventLoop().inEventLoop())
  {
    if (enumprotocol != enumprotocol1) {
      setProtocol(enumprotocol);
    }
    ChannelFuture channelfuture = this.channel.writeAndFlush(packet);
    if (agenericfuturelistener != null) {
      channelfuture.addListeners(agenericfuturelistener);
    }
    channelfuture.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
  }
  else
  {
    this.channel.eventLoop().execute(new Runnable() // <-----
    {
      public void run()
      {
        if (enumprotocol != enumprotocol1) {
          NetworkManager.this.setProtocol(enumprotocol);
        }
        ChannelFuture channelfuture = NetworkManager.this.channel.writeAndFlush(packet);
        if (agenericfuturelistener != null) {
          channelfuture.addListeners(agenericfuturelistener);
        }
        channelfuture.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
      }
    });
  }
}
net.minecraft.server.v1_12_R1.NetworkManager.sendPacket(NetworkManager.java:143)
public void sendPacket(Packet<?> packet) {
  if (isConnected()) {
    m();
    a(packet, null); // <-----
  } else {
    j.writeLock().lock();
    try
    {
      i.add(new QueuedPacket(packet, new GenericFutureListener[0]));
    } finally {
      j.writeLock().unlock();
    }
  }
}
net.minecraft.server.v1_12_R1.PlayerConnection.sendPacket(PlayerConnection.java:1138)
public void sendPacket(final Packet<?> packet)
{
  if ((packet instanceof PacketPlayOutChat))
  {
    PacketPlayOutChat packetplayoutchat = (PacketPlayOutChat)packet;
    EntityHuman.EnumChatVisibility entityhuman_enumchatvisibility = this.player.getChatFlags();
    if ((entityhuman_enumchatvisibility == EntityHuman.EnumChatVisibility.HIDDEN) && (packetplayoutchat.c() != ChatMessageType.GAME_INFO)) {
      return;
    }
    if ((entityhuman_enumchatvisibility == EntityHuman.EnumChatVisibility.SYSTEM) && (!packetplayoutchat.b())) {
      return;
    }
  }
  if (packet == null) {
    return;
  }
  if ((packet instanceof PacketPlayOutSpawnPosition))
  {
    PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition)packet;
    this.player.compassTarget = new Location(getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ());
  }
  try
  {
    this.networkManager.sendPacket(packet); // <-----
  }
  catch (Throwable throwable)
  {
    CrashReport crashreport = CrashReport.a(throwable, "Sending packet");
    CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Packet being sent");
    
    crashreportsystemdetails.a("Packet class", new CrashReportCallable()
    {
      public String a()
        throws Exception
      {
        return packet.getClass().getCanonicalName();
      }
      
      public Object call()
        throws Exception
      {
        return a();
      }
    });
    throw new ReportedException(crashreport);
  }
}
net.minecraft.server.v1_12_R1.EntityPlayer.closeInventory(EntityPlayer.java:929)
public void closeInventory()
{
  CraftEventFactory.handleInventoryCloseEvent(this);
  playerConnection.sendPacket(new PacketPlayOutCloseWindow(activeContainer.windowId)); // <-----
  r();
}
org.bukkit.craftbukkit.v1_12_R1.entity.CraftHumanEntity.closeInventory(CraftHumanEntity.java:404)
public void closeInventory()
{
  getHandle().closeInventory(); // <-----
}
co.kepler.fastcraft.api.gui.GUI.dispose(GUI.java:107)
/**
 * Close the GUI.
 *
 * @param removeFromGuis Whether the GUI should be removed from the server.
 */
private void dispose(boolean removeFromGuis) {
    // Close the GUI for all viewers.
    while (!inv.getViewers().isEmpty()) {
        inv.getViewers().get(0).closeInventory(); // <-----
    }
    if (removeFromGuis) {
        guis.remove(this);
    }
}
co.kepler.fastcraft.api.gui.GUI.dispose(GUI.java:96)
/**
 * Close the GUI, and remove it from the server.
 */
public void dispose() {
    dispose(true); // <-----
}
co.kepler.fastcraft.craftgui.GUIFastCraft.dispose(GUIFastCraft.java:84)
@Override
public void dispose() {
    super.dispose(); // <-----
    guis.remove(player.getUniqueId());
    guis.remove(location);
}
co.kepler.fastcraft.craftgui.GUIFastCraft$GUIListener.blockRemoved(GUIFastCraft.java:220)
private void blockRemoved(Block b) {
    if (b.getType() != Material.WORKBENCH) return;
    GUIFastCraft gui = guis.get(b.getLocation());
    if (gui != null) {
        gui.dispose(); // <-----
    }
}
co.kepler.fastcraft.craftgui.GUIFastCraft$GUIListener.onBlockBreak(GUIFastCraft.java:199)
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockBreak(BlockBreakEvent e) {
	if (e.isCancelled()) return;
	blockRemoved(e.getBlock()); // <-----
}
org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
public void execute(Listener listener, Event event)
  throws EventException
{
  try
  {
    if (!eventClass.isAssignableFrom(event.getClass())) {
      return;
    }
    method.invoke(listener, new Object[] { event }); // <-----
  }
  catch (InvocationTargetException ex)
  {
    throw new EventException(ex.getCause());
  }
  catch (Throwable t)
  {
    throw new EventException(t);
  }
}
org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
public void callEvent(Event event)
  throws EventException
{
  if (((event instanceof Cancellable)) && 
    (((Cancellable)event).isCancelled()) && (isIgnoringCancelled())) {
    return;
  }
  this.executor.execute(this.listener, event); // <-----
}
org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500)
private void fireEvent(Event event)
{
  HandlerList handlers = event.getHandlers();
  RegisteredListener[] listeners = handlers.getRegisteredListeners();
  RegisteredListener[] arrayOfRegisteredListener1;
  int j = (arrayOfRegisteredListener1 = listeners).length;
  for (int i = 0; i < j; i++)
  {
    RegisteredListener registration = arrayOfRegisteredListener1[i];
    if (registration.getPlugin().isEnabled()) {
      try
      {
        registration.callEvent(event); // <-----
      }
      catch (AuthorNagException ex)
      {
        Plugin plugin = registration.getPlugin();
        if (plugin.isNaggable())
        {
          plugin.setNaggable(false);
          
          this.server.getLogger().log(Level.SEVERE, String.format(
            "Nag author(s): '%s' of '%s' about the following: %s", new Object[] {
            plugin.getDescription().getAuthors(), 
            plugin.getDescription().getFullName(), 
            ex.getMessage() }));
        }
      }
      catch (Throwable ex)
      {
        this.server.getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getFullName(), ex);
      }
    }
  }
}
org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485)
public void callEvent(Event event)
{
  if (event.isAsynchronous())
  {
    if (Thread.holdsLock(this)) {
      throw new IllegalStateException(event.getEventName() + " cannot be triggered asynchronously from inside synchronized code.");
    }
    if (this.server.isPrimaryThread()) {
      throw new IllegalStateException(event.getEventName() + " cannot be triggered asynchronously from primary server thread.");
    }
    fireEvent(event);
  }
  else
  {
    synchronized (this)
    {
      fireEvent(event); // <-----
    }
  }
}
net.minecraft.server.v1_12_R1.PlayerInteractManager.breakBlock(PlayerInteractManager.java:290)
public boolean breakBlock(BlockPosition blockposition)
{
  BlockBreakEvent event = null;
  TileEntity tileentity;
  if ((this.player instanceof EntityPlayer))
  {
    org.bukkit.block.Block block = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
    
    boolean isSwordNoBreak = (this.gamemode.isCreative()) && (!this.player.getItemInMainHand().isEmpty()) && ((this.player.getItemInMainHand().getItem() instanceof ItemSword));
    if ((this.world.getTileEntity(blockposition) == null) && (!isSwordNoBreak))
    {
      PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, blockposition);
      packet.block = Blocks.AIR.getBlockData();
      this.player.playerConnection.sendPacket(packet);
    }
    event = new BlockBreakEvent(block, this.player.getBukkitEntity());
    
    event.setCancelled(isSwordNoBreak);
    
    IBlockData nmsData = this.world.getType(blockposition);
    Block nmsBlock = nmsData.getBlock();
    
    ItemStack itemstack = this.player.getEquipment(EnumItemSlot.MAINHAND);
    if ((nmsBlock != null) && (!event.isCancelled()) && (!isCreative()) && (this.player.hasBlock(nmsBlock.getBlockData()))) {
      if ((!nmsBlock.o()) || (EnchantmentManager.getEnchantmentLevel(Enchantments.SILK_TOUCH, itemstack) <= 0))
      {
        int bonusLevel = EnchantmentManager.getEnchantmentLevel(Enchantments.LOOT_BONUS_BLOCKS, itemstack);
        
        event.setExpToDrop(nmsBlock.getExpDrop(this.world, nmsData, bonusLevel));
      }
    }
    this.world.getServer().getPluginManager().callEvent(event); // <-----
    if (event.isCancelled())
    {
      if (isSwordNoBreak) {
        return false;
      }
      this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition));
      if ((nmsBlock instanceof BlockDoor))
      {
        boolean bottom = nmsData.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER;
        this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, bottom ? blockposition.up() : blockposition.down()));
      }
      tileentity = this.world.getTileEntity(blockposition);
      if (tileentity != null) {
        this.player.playerConnection.sendPacket(tileentity.getUpdatePacket());
      }
      return false;
    }
  }
  IBlockData iblockdata = this.world.getType(blockposition);
  if (iblockdata.getBlock() == Blocks.AIR) {
    return false;
  }
  TileEntity tileentity = this.world.getTileEntity(blockposition);
  Block block = iblockdata.getBlock();
  if ((iblockdata.getBlock() == Blocks.SKULL) && (!isCreative()) && (event.isDropItems()))
  {
    iblockdata.getBlock().dropNaturally(this.world, blockposition, iblockdata, 1.0F, 0);
    return c(blockposition);
  }
  if (((iblockdata.getBlock() instanceof BlockShulkerBox)) && (event.isDropItems()))
  {
    iblockdata.getBlock().dropNaturally(this.world, blockposition, iblockdata, 1.0F, 0);
    return c(blockposition);
  }
  if ((((block instanceof BlockCommand)) || ((block instanceof BlockStructure))) && (!this.player.isCreativeAndOp()))
  {
    this.world.notify(blockposition, iblockdata, iblockdata, 3);
    return false;
  }
  if (this.gamemode.c())
  {
    if (this.gamemode == EnumGamemode.SPECTATOR) {
      return false;
    }
    if (!this.player.dk())
    {
      ItemStack itemstack = this.player.getItemInMainHand();
      if (itemstack.isEmpty()) {
        return false;
      }
      if (!itemstack.a(block)) {
        return false;
      }
    }
  }
  this.world.a(this.player, 2001, blockposition, Block.getCombinedId(iblockdata));
  
  this.world.captureDrops = new ArrayList();
  boolean flag = c(blockposition);
  if (event.isDropItems()) {
    for (EntityItem item : this.world.captureDrops) {
      this.world.addEntity(item);
    }
  }
  this.world.captureDrops = null;
  if (isCreative())
  {
    this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition));
  }
  else
  {
    ItemStack itemstack1 = this.player.getItemInMainHand();
    ItemStack itemstack2 = itemstack1.isEmpty() ? ItemStack.a : itemstack1.cloneItemStack();
    boolean flag1 = this.player.hasBlock(iblockdata);
    if (!itemstack1.isEmpty()) {
      itemstack1.a(this.world, iblockdata, blockposition, this.player);
    }
    if ((flag) && (flag1) && (event.isDropItems())) {
      iblockdata.getBlock().a(this.world, this.player, blockposition, iblockdata, tileentity, itemstack2);
    }
  }
  if ((flag) && (event != null)) {
    iblockdata.getBlock().dropExperience(this.world, blockposition, event.getExpToDrop());
  }
  return flag;
}
TODO net.minecraft.server.v1_12_R1.PlayerInteractManager.a(PlayerInteractManager.java:217)
TODO
TODO net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:889)
TODO
TODO net.minecraft.server.v1_12_R1.PacketPlayInBlockDig.a(SourceFile:40)
TODO
TODO net.minecraft.server.v1_12_R1.PacketPlayInBlockDig.a(SourceFile:10)
TODO
TODO net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
TODO
TODO java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
TODO
TODO java.util.concurrent.FutureTask.run(FutureTask.java:266)
TODO
TODO net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
TODO
TODO net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)

TODO

TODO net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
TODO
commented

This seems like an issue with Maps using System.identityHashCode. I'm not entirely sure what's causing it, but I don't think it's an issue with FastCraft.

Here are some similar crashes I found with the same problem:
https://pastebin.com/raw/gMGzUSeq
https://www.spigotmc.org/threads/my-server-is-crashing.193057/
https://www.spigotmc.org/threads/protocollib-error-for-my-plugin.256396/
CanaryModTeam/CanaryMod#119
http://www.minecraftforum.net/forums/support/server-support/2214427-server-is-constanly-crashing

commented

I'm wondering if it might be an issue with your server not having enough memory allocated. Do you know how much it's using?

e.g:

java -jar Server.jar -Xms512m -Xmx1024m
                         ^^^^     ^^^^^
commented

https://www.spigotmc.org/threads/fastcraft.133803/page-37#post-2916604

Sckaletz:
The latest update seems to crash my server all the time.
Using latest release of Spigot 1.12.2.
https://pastebin.com/amwWhCfN

commented

I had this same issue on my server. This is a really nice plug-in but unfortunately, I had to uninstall Fastcraft after this. Hopefully, sharing my server details will help you figure out what's causing this so you can fix it. This started happening to my server with an older 1.x versions, so I updated the plug-in to the newest 2.0.3 version and the problem continued, at which point, I made the difficult decision of uninslling Fastcraft. The server didn't hang at each restart/stop, but it did so maybe 70-80% of them and I couldn't figure out what was different between the times that it failed to stop and the times that it actually stopped. The console just ended at "disabling Fastcraft" and waited until I killed the server. My plugins were: CoreProtect, LuckPerms, NPC-Inventory, OpenInv, ClearLag, PlugMan, NoSpawnerChange, PingPlayer, Votifier, Multiverse-Core, VotingPlugin, FastAsyncWorldEdit, iDisguise, Multiverse-Inventories, ViaVersion, Vault, ViaBackwards, SimpleSit, WorldEdit, Essentials, Minigames, LWC, WorldGuard, DiscordSRV, EssentialsChat, EssentialsAntiBuild, ServerSigns, GriefPrevention, EssentialsSpawn, EnjinMinecraftPlugin, WorldGuardExtraFlags, RandomCoords, ChestShop, BKCommonLib, LightCleaner, HorseTpWithMe, and Fastcraft.

Good luck figuring this out!

commented

Thanks for the info! I added a temporary fix to the top of the issue, so you can give that a try.

Also, in addition to the plugins, could you share the output of these version commands?

  • Server: /version
  • Java: java -version

Thanks! ๐Ÿ˜ƒ

commented

Is this still an issue with the latest v3.0 alpha build? (here, for Bukkit 1.8+)