private TileEntityTombstone placeTombstone(EntityPlayer player) {
   Optional<ChunkCoordinates> chunkCoordinate = findValidTombstoneLocation(player);
   if (chunkCoordinate.isPresent()) {
     /* Place a Tombstone */
     player.worldObj.setBlock(
         chunkCoordinate.get().posX,
         chunkCoordinate.get().posY,
         chunkCoordinate.get().posZ,
         BlockList.tombstone.get());
     TileEntity tileEntity =
         player.worldObj.getTileEntity(
             chunkCoordinate.get().posX, chunkCoordinate.get().posY, chunkCoordinate.get().posZ);
     StringBuilder sb = new StringBuilder();
     sb.append("Tombstone summoned to mark the 'passing' of ")
         .append(player.getCommandSenderName())
         .append(" at [");
     sb.append(chunkCoordinate.get().posX).append(", ");
     sb.append(chunkCoordinate.get().posY).append(", ");
     sb.append(chunkCoordinate.get().posZ).append("]");
     player.addChatMessage(new ChatComponentText(sb.toString()));
     if (tileEntity != null && tileEntity instanceof TileEntityTombstone) {
       ProjectZuluLog.debug(Level.INFO, sb.toString());
       return (TileEntityTombstone) tileEntity;
     }
   }
   ProjectZuluLog.warning(
       "Failed to find location to place tombstone at player location {X:%s, Y:%s, Z:%s}",
       player.posX, player.posY, player.posZ);
   return null;
 }
 private boolean createGameruleIfAbsent(GameRules gameRule, String gameruleName, boolean value) {
   boolean added = false;
   if (!gameRule.hasRule(gameruleName)) {
     gameRule.addGameRule(gameruleName, Boolean.toString(value));
     added = true;
   }
   ProjectZuluLog.info(
       "Gamerule %s is set to %s", gameruleName, gameRule.getGameRuleBooleanValue(gameruleName));
   return added;
 }
  @SubscribeEvent
  public void onPlayerDeath(LivingDeathEvent event) {
    if (event.entity instanceof EntityPlayerMP) {
      GameRules gameRules = event.entity.worldObj.getGameRules();
      boolean dropInventory = gameRules.getGameRuleBooleanValue("dropInventory");
      boolean dropHotbar = gameRules.getGameRuleBooleanValue("dropHotbar");
      boolean dropArmor = gameRules.getGameRuleBooleanValue("dropArmor");
      boolean dropXP = gameRules.getGameRuleBooleanValue("dropXP");

      EntityPlayer player = (EntityPlayer) event.entity;

      TileEntityTombstone tombstone = tombstoneOnDeath ? placeTombstone(player) : null;
      if (tombstone != null) {
        tombstone.setSignString(event.source.func_151519_b((EntityPlayer) event.entity).toString());
      }

      if (!dropInventory && !dropHotbar && !dropArmor && !dropXP) {
        return;
      }

      player.captureDrops = true;
      player.capturedDrops.clear();

      /* Get items/XP to drop and clear them from Player */
      int xpDropped = 0;
      if (dropXP) {
        if (!player.worldObj.isRemote) {
          xpDropped = player.experienceTotal;
          xpDropped = xpDropped > maxDropXP ? maxDropXP : xpDropped;
          int keptXp = (player.experienceTotal - xpDropped) * percKeptXp / 100;
          redistributor.addExpereince(player, keptXp >= 0 ? keptXp : 0);
          player.experienceLevel = 0;
          player.experienceTotal = 0;
          player.experience = 0;
        }
      }

      List<ItemStack> itemsToDrop = new ArrayList<ItemStack>();
      if (dropArmor) {
        itemsToDrop.addAll(dropArmor(player));
      }

      if (dropInventory) {
        itemsToDrop.addAll(dropInventory(player));
      }

      if (dropHotbar) {
        itemsToDrop.addAll(dropHotbar(player));
      }

      dropItems(player, itemsToDrop);
      boolean isCancelled = false;
      if (doDropEvent) {
        PlayerDropsEvent dropEvent = createPlayerDropEvent(player, event.source);
        isCancelled = MinecraftForge.EVENT_BUS.post(dropEvent);
      }
      player.captureDrops = false;
      if (!isCancelled) {
        /* Handler actually Dropping Items or Placing them in Tombstone */
        if (tombstoneAbsorbDrops && tombstone != null) {
          for (EntityItem entityItem : player.capturedDrops) {
            tombstone.addDrop(entityItem.getEntityItem());
          }
          tombstone.experience = xpDropped;
        } else {
          if (tombstoneAbsorbDrops) {
            ProjectZuluLog.warning("Tombstone could not be placed so items dropping normally.");
          }
          while (xpDropped > 0) {
            int j = EntityXPOrb.getXPSplit(xpDropped);
            xpDropped -= j;
            player.worldObj.spawnEntityInWorld(
                new EntityXPOrb(player.worldObj, player.posX, player.posY, player.posZ, j));
          }
          for (EntityItem item : player.capturedDrops) {
            player.joinEntityItemWithWorld(item);
          }
        }
      } else {
        ProjectZuluLog.warning(
            "Player drop event was cancelled, so items will not be dropped per convention."
                + "Results may not desireable, consider disabling 'doDropEvent' in the config.");
      }
    }
  }