2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
#include "Globals.h"
|
|
|
|
#include "ItemHandler.h"
|
|
|
|
#include "../World.h"
|
2013-08-19 05:39:13 -04:00
|
|
|
#include "../Entities/Player.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "../FastRandom.h"
|
2014-02-02 09:49:37 -05:00
|
|
|
#include "../BlockInServerPluginInterface.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "../Chunk.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
// Handlers:
|
2014-04-24 14:41:25 -04:00
|
|
|
#include "ItemArmor.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemAxe.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemBed.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemBigFlower.h"
|
2013-09-07 19:14:57 -04:00
|
|
|
#include "ItemBoat.h"
|
2015-12-21 14:13:57 -05:00
|
|
|
#include "ItemBottle.h"
|
2013-08-30 08:24:03 -04:00
|
|
|
#include "ItemBow.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemBucket.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemChest.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemCloth.h"
|
2013-09-18 13:27:21 -04:00
|
|
|
#include "ItemComparator.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemCookedFish.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemDoor.h"
|
|
|
|
#include "ItemDye.h"
|
2014-02-14 10:38:22 -05:00
|
|
|
#include "ItemEmptyMap.h"
|
2019-05-11 15:43:26 -04:00
|
|
|
#include "ItemEyeOfEnder.h"
|
2013-12-19 11:34:03 -05:00
|
|
|
#include "ItemFishingRod.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemFood.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemFoodSeeds.h"
|
2014-07-31 17:04:00 -04:00
|
|
|
#include "ItemGoldenApple.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemHoe.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemItemFrame.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemLeaves.h"
|
|
|
|
#include "ItemLighter.h"
|
2014-03-28 18:51:30 -04:00
|
|
|
#include "ItemLilypad.h"
|
2014-02-17 09:27:12 -05:00
|
|
|
#include "ItemMap.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemMilk.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemMinecart.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemMobHead.h"
|
2013-12-18 12:33:18 -05:00
|
|
|
#include "ItemNetherWart.h"
|
2014-02-17 19:16:03 -05:00
|
|
|
#include "ItemPainting.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemPickaxe.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemPoisonousPotato.h"
|
2014-06-07 19:32:37 -04:00
|
|
|
#include "ItemPotion.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemPumpkin.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemRawChicken.h"
|
|
|
|
#include "ItemRawFish.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemRedstoneDust.h"
|
|
|
|
#include "ItemRedstoneRepeater.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemRottenFlesh.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemSapling.h"
|
|
|
|
#include "ItemSeeds.h"
|
|
|
|
#include "ItemShears.h"
|
|
|
|
#include "ItemShovel.h"
|
|
|
|
#include "ItemSign.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemSlab.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemSoup.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemSpawnEgg.h"
|
2020-04-04 11:13:41 -04:00
|
|
|
#include "ItemSpiderEye.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
#include "ItemSword.h"
|
2014-12-24 01:20:17 -05:00
|
|
|
#include "ItemThrowable.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
#include "../Blocks/BlockHandler.h"
|
2020-06-26 16:34:22 -04:00
|
|
|
#include "SimplePlaceableItemHandler.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cItemHandler::m_HandlerInitialized = false;
|
|
|
|
cItemHandler * cItemHandler::m_ItemHandler[2268];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-08-30 08:24:03 -04:00
|
|
|
cItemHandler * cItemHandler::GetItemHandler(int a_ItemType)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2015-04-20 03:17:12 -04:00
|
|
|
if ((a_ItemType < 0) || (static_cast<size_t>(a_ItemType) >= ARRAYCOUNT(m_ItemHandler)))
|
2013-08-30 08:24:03 -04:00
|
|
|
{
|
2013-09-14 02:16:39 -04:00
|
|
|
// Either nothing (-1), or bad value, both cases should return the air handler
|
|
|
|
if (a_ItemType < -1)
|
|
|
|
{
|
|
|
|
ASSERT(!"Bad item type");
|
|
|
|
}
|
2013-08-30 08:24:03 -04:00
|
|
|
a_ItemType = 0;
|
|
|
|
}
|
2013-07-29 07:13:03 -04:00
|
|
|
|
2013-08-30 08:24:03 -04:00
|
|
|
if (!m_HandlerInitialized)
|
|
|
|
{
|
|
|
|
// We need to initialize
|
2013-07-29 07:13:03 -04:00
|
|
|
memset(m_ItemHandler, 0, sizeof(m_ItemHandler));
|
|
|
|
m_HandlerInitialized = true;
|
|
|
|
}
|
2014-10-20 16:55:07 -04:00
|
|
|
if (m_ItemHandler[a_ItemType] == nullptr)
|
2013-08-30 08:24:03 -04:00
|
|
|
{
|
|
|
|
m_ItemHandler[a_ItemType] = CreateItemHandler(a_ItemType);
|
|
|
|
}
|
2013-07-29 07:13:03 -04:00
|
|
|
return m_ItemHandler[a_ItemType];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-12-24 01:20:17 -05:00
|
|
|
cItemHandler * cItemHandler::CreateItemHandler(int a_ItemType)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2014-07-21 09:19:48 -04:00
|
|
|
switch (a_ItemType)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
|
|
|
default: return new cItemHandler(a_ItemType);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
// Single item per handler, alphabetically sorted:
|
2014-12-24 18:51:24 -05:00
|
|
|
case E_BLOCK_BIG_FLOWER: return new cItemBigFlowerHandler;
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_BLOCK_CHEST: return new cItemChestHandler(a_ItemType);
|
|
|
|
case E_BLOCK_LEAVES: return new cItemLeavesHandler(a_ItemType);
|
2014-12-24 18:51:24 -05:00
|
|
|
case E_BLOCK_LILY_PAD: return new cItemLilypadHandler(a_ItemType);
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_BLOCK_HEAD: return new cItemMobHeadHandler(a_ItemType);
|
|
|
|
case E_BLOCK_NEW_LEAVES: return new cItemLeavesHandler(a_ItemType);
|
|
|
|
case E_BLOCK_PUMPKIN: return new cItemPumpkinHandler;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_PURPUR_SLAB: return new cItemSlabHandler(E_BLOCK_PURPUR_SLAB, E_BLOCK_PURPUR_DOUBLE_SLAB);
|
|
|
|
case E_BLOCK_RED_SANDSTONE_SLAB: return new cItemSlabHandler(E_BLOCK_RED_SANDSTONE_SLAB, E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB);
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_BLOCK_SAPLING: return new cItemSaplingHandler(a_ItemType);
|
|
|
|
case E_BLOCK_STONE_SLAB: return new cItemSlabHandler(E_BLOCK_STONE_SLAB, E_BLOCK_DOUBLE_STONE_SLAB);
|
|
|
|
case E_BLOCK_TRAPPED_CHEST: return new cItemChestHandler(a_ItemType);
|
|
|
|
case E_BLOCK_WOODEN_SLAB: return new cItemSlabHandler(E_BLOCK_WOODEN_SLAB, E_BLOCK_DOUBLE_WOODEN_SLAB);
|
|
|
|
case E_BLOCK_WOOL: return new cItemClothHandler(a_ItemType);
|
|
|
|
case E_ITEM_BED: return new cItemBedHandler(a_ItemType);
|
2013-11-16 15:58:17 -05:00
|
|
|
case E_ITEM_BOTTLE_O_ENCHANTING: return new cItemBottleOEnchantingHandler();
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_ITEM_BOW: return new cItemBowHandler();
|
2020-06-26 16:34:22 -04:00
|
|
|
case E_ITEM_BREWING_STAND: return new cSimplePlaceableItemHandler(a_ItemType, E_BLOCK_BREWING_STAND);
|
|
|
|
case E_ITEM_CAKE: return new cSimplePlaceableItemHandler(a_ItemType, E_BLOCK_CAKE);
|
|
|
|
case E_ITEM_CAULDRON: return new cSimplePlaceableItemHandler(a_ItemType, E_BLOCK_CAULDRON);
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_ITEM_COMPARATOR: return new cItemComparatorHandler(a_ItemType);
|
|
|
|
case E_ITEM_DYE: return new cItemDyeHandler(a_ItemType);
|
|
|
|
case E_ITEM_EGG: return new cItemEggHandler();
|
|
|
|
case E_ITEM_EMPTY_MAP: return new cItemEmptyMapHandler();
|
|
|
|
case E_ITEM_ENDER_PEARL: return new cItemEnderPearlHandler();
|
2019-05-11 15:43:26 -04:00
|
|
|
case E_ITEM_EYE_OF_ENDER: return new cItemEyeOfEnderHandler();
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_ITEM_FIRE_CHARGE: return new cItemLighterHandler(a_ItemType);
|
|
|
|
case E_ITEM_FIREWORK_ROCKET: return new cItemFireworkHandler();
|
|
|
|
case E_ITEM_FISHING_ROD: return new cItemFishingRodHandler(a_ItemType);
|
|
|
|
case E_ITEM_FLINT_AND_STEEL: return new cItemLighterHandler(a_ItemType);
|
2020-06-26 16:34:22 -04:00
|
|
|
case E_ITEM_FLOWER_POT: return new cSimplePlaceableItemHandler(a_ItemType, E_BLOCK_FLOWER_POT);
|
2015-12-21 14:13:57 -05:00
|
|
|
case E_ITEM_GLASS_BOTTLE: return new cItemBottleHandler();
|
2014-12-24 01:20:17 -05:00
|
|
|
case E_ITEM_MAP: return new cItemMapHandler();
|
|
|
|
case E_ITEM_MILK: return new cItemMilkHandler();
|
|
|
|
case E_ITEM_ITEM_FRAME: return new cItemItemFrameHandler(a_ItemType);
|
|
|
|
case E_ITEM_NETHER_WART: return new cItemNetherWartHandler(a_ItemType);
|
|
|
|
case E_ITEM_PAINTING: return new cItemPaintingHandler(a_ItemType);
|
|
|
|
case E_ITEM_POTIONS: return new cItemPotionHandler();
|
|
|
|
case E_ITEM_REDSTONE_DUST: return new cItemRedstoneDustHandler(a_ItemType);
|
|
|
|
case E_ITEM_REDSTONE_REPEATER: return new cItemRedstoneRepeaterHandler(a_ItemType);
|
|
|
|
case E_ITEM_SHEARS: return new cItemShearsHandler(a_ItemType);
|
|
|
|
case E_ITEM_SIGN: return new cItemSignHandler(a_ItemType);
|
|
|
|
case E_ITEM_HEAD: return new cItemMobHeadHandler(a_ItemType);
|
|
|
|
case E_ITEM_SNOWBALL: return new cItemSnowballHandler();
|
|
|
|
case E_ITEM_SPAWN_EGG: return new cItemSpawnEggHandler(a_ItemType);
|
2020-06-26 16:34:22 -04:00
|
|
|
case E_ITEM_STRING: return new cSimplePlaceableItemHandler(a_ItemType, E_BLOCK_TRIPWIRE);
|
|
|
|
case E_ITEM_SUGARCANE: return new cSimplePlaceableItemHandler(a_ItemType, E_BLOCK_SUGARCANE);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_WOODEN_HOE:
|
|
|
|
case E_ITEM_STONE_HOE:
|
|
|
|
case E_ITEM_IRON_HOE:
|
|
|
|
case E_ITEM_GOLD_HOE:
|
|
|
|
case E_ITEM_DIAMOND_HOE:
|
|
|
|
{
|
|
|
|
return new cItemHoeHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_WOODEN_PICKAXE:
|
|
|
|
case E_ITEM_STONE_PICKAXE:
|
|
|
|
case E_ITEM_IRON_PICKAXE:
|
|
|
|
case E_ITEM_GOLD_PICKAXE:
|
|
|
|
case E_ITEM_DIAMOND_PICKAXE:
|
|
|
|
{
|
|
|
|
return new cItemPickaxeHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_WOODEN_SHOVEL:
|
|
|
|
case E_ITEM_STONE_SHOVEL:
|
|
|
|
case E_ITEM_IRON_SHOVEL:
|
|
|
|
case E_ITEM_GOLD_SHOVEL:
|
|
|
|
case E_ITEM_DIAMOND_SHOVEL:
|
|
|
|
{
|
|
|
|
return new cItemShovelHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2016-11-06 13:30:19 -05:00
|
|
|
case E_ITEM_WOODEN_AXE:
|
|
|
|
case E_ITEM_STONE_AXE:
|
|
|
|
case E_ITEM_IRON_AXE:
|
|
|
|
case E_ITEM_GOLD_AXE:
|
|
|
|
case E_ITEM_DIAMOND_AXE:
|
|
|
|
{
|
|
|
|
return new cItemAxeHandler(a_ItemType);
|
|
|
|
}
|
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_WOODEN_SWORD:
|
|
|
|
case E_ITEM_STONE_SWORD:
|
|
|
|
case E_ITEM_IRON_SWORD:
|
|
|
|
case E_ITEM_GOLD_SWORD:
|
|
|
|
case E_ITEM_DIAMOND_SWORD:
|
|
|
|
{
|
|
|
|
return new cItemSwordHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_BUCKET:
|
|
|
|
case E_ITEM_WATER_BUCKET:
|
|
|
|
case E_ITEM_LAVA_BUCKET:
|
|
|
|
{
|
|
|
|
return new cItemBucketHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_BEETROOT_SEEDS:
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_MELON_SEEDS:
|
|
|
|
case E_ITEM_PUMPKIN_SEEDS:
|
|
|
|
case E_ITEM_SEEDS:
|
|
|
|
{
|
|
|
|
return new cItemSeedsHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2020-04-04 11:13:41 -04:00
|
|
|
case E_ITEM_POTATO: return new cItemFoodSeedsHandler(a_ItemType, FoodInfo(1, 0.6));
|
|
|
|
case E_ITEM_CARROT: return new cItemFoodSeedsHandler(a_ItemType, FoodInfo(3, 6.6));
|
|
|
|
|
2014-09-11 10:24:16 -04:00
|
|
|
case E_ITEM_ACACIA_DOOR:
|
|
|
|
case E_ITEM_BIRCH_DOOR:
|
|
|
|
case E_ITEM_DARK_OAK_DOOR:
|
|
|
|
case E_ITEM_JUNGLE_DOOR:
|
|
|
|
case E_ITEM_SPRUCE_DOOR:
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_IRON_DOOR:
|
|
|
|
case E_ITEM_WOODEN_DOOR:
|
|
|
|
{
|
|
|
|
return new cItemDoorHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_MINECART:
|
|
|
|
case E_ITEM_CHEST_MINECART:
|
|
|
|
case E_ITEM_FURNACE_MINECART:
|
2013-08-16 06:23:24 -04:00
|
|
|
case E_ITEM_MINECART_WITH_TNT:
|
|
|
|
case E_ITEM_MINECART_WITH_HOPPER:
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
|
|
|
return new cItemMinecartHandler(a_ItemType);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-02-03 16:16:26 -05:00
|
|
|
// Food (please keep alpha-sorted):
|
2020-04-04 11:13:41 -04:00
|
|
|
case E_ITEM_BAKED_POTATO: return new cItemFoodHandler(a_ItemType, FoodInfo(5, 6));
|
|
|
|
case E_ITEM_BEETROOT: return new cItemFoodHandler(a_ItemType, FoodInfo(1, 1.2));
|
|
|
|
case E_ITEM_BREAD: return new cItemFoodHandler(a_ItemType, FoodInfo(5, 6));
|
|
|
|
case E_ITEM_CHORUS_FRUIT: return new cItemFoodHandler(a_ItemType, FoodInfo(4, 2.4));
|
|
|
|
case E_ITEM_COOKED_CHICKEN: return new cItemFoodHandler(a_ItemType, FoodInfo(6, 7.2));
|
|
|
|
case E_ITEM_COOKED_MUTTON: return new cItemFoodHandler(a_ItemType, FoodInfo(6, 9.6));
|
|
|
|
case E_ITEM_COOKED_PORKCHOP: return new cItemFoodHandler(a_ItemType, FoodInfo(8, 12.8));
|
|
|
|
case E_ITEM_COOKED_RABBIT: return new cItemFoodHandler(a_ItemType, FoodInfo(5, 6));
|
|
|
|
case E_ITEM_COOKIE: return new cItemFoodHandler(a_ItemType, FoodInfo(2, 0.5));
|
|
|
|
case E_ITEM_GOLDEN_CARROT: return new cItemFoodHandler(a_ItemType, FoodInfo(6, 14.4));
|
|
|
|
case E_ITEM_MELON_SLICE: return new cItemFoodHandler(a_ItemType, FoodInfo(2, 1.2));
|
|
|
|
case E_ITEM_PUMPKIN_PIE: return new cItemFoodHandler(a_ItemType, FoodInfo(8, 4.8));
|
|
|
|
case E_ITEM_RED_APPLE: return new cItemFoodHandler(a_ItemType, FoodInfo(4, 2.4));
|
|
|
|
case E_ITEM_RAW_BEEF: return new cItemFoodHandler(a_ItemType, FoodInfo(3, 1.8));
|
|
|
|
case E_ITEM_RAW_MUTTON: return new cItemFoodHandler(a_ItemType, FoodInfo(2, 1.2));
|
|
|
|
case E_ITEM_RAW_PORKCHOP: return new cItemFoodHandler(a_ItemType, FoodInfo(3, 1.8));
|
|
|
|
case E_ITEM_RAW_RABBIT: return new cItemFoodHandler(a_ItemType, FoodInfo(3, 1.8));
|
|
|
|
case E_ITEM_STEAK: return new cItemFoodHandler(a_ItemType, FoodInfo(8, 12.8));
|
|
|
|
|
|
|
|
// Special-case food with their own handler
|
|
|
|
case E_ITEM_COOKED_FISH: return new cItemCookedFishHandler();
|
|
|
|
case E_ITEM_GOLDEN_APPLE: return new cItemGoldenAppleHandler();
|
|
|
|
case E_ITEM_POISONOUS_POTATO: return new cItemPoisonousPotatoHandler();
|
|
|
|
case E_ITEM_RAW_CHICKEN: return new cItemRawChickenHandler();
|
|
|
|
case E_ITEM_RAW_FISH: return new cItemRawFishHandler();
|
|
|
|
case E_ITEM_ROTTEN_FLESH: return new cItemRottenFleshHandler();
|
|
|
|
case E_ITEM_SPIDER_EYE: return new cItemSpiderEyeHandler();
|
|
|
|
|
|
|
|
// Soup:
|
|
|
|
case E_ITEM_BEETROOT_SOUP: return new cItemSoupHandler(a_ItemType, FoodInfo(6, 7.2));
|
|
|
|
case E_ITEM_MUSHROOM_SOUP: return new cItemSoupHandler(a_ItemType, FoodInfo(6, 7.2));
|
|
|
|
case E_ITEM_RABBIT_STEW: return new cItemSoupHandler(a_ItemType, FoodInfo(10, 12));
|
2014-04-24 17:03:04 -04:00
|
|
|
|
|
|
|
// Armor:
|
|
|
|
case E_ITEM_LEATHER_CAP:
|
|
|
|
case E_ITEM_GOLD_HELMET:
|
|
|
|
case E_ITEM_CHAIN_HELMET:
|
|
|
|
case E_ITEM_IRON_HELMET:
|
|
|
|
case E_ITEM_DIAMOND_HELMET:
|
|
|
|
case E_ITEM_LEATHER_TUNIC:
|
|
|
|
case E_ITEM_GOLD_CHESTPLATE:
|
|
|
|
case E_ITEM_CHAIN_CHESTPLATE:
|
|
|
|
case E_ITEM_IRON_CHESTPLATE:
|
|
|
|
case E_ITEM_DIAMOND_CHESTPLATE:
|
|
|
|
case E_ITEM_LEATHER_PANTS:
|
|
|
|
case E_ITEM_GOLD_LEGGINGS:
|
|
|
|
case E_ITEM_CHAIN_LEGGINGS:
|
|
|
|
case E_ITEM_IRON_LEGGINGS:
|
|
|
|
case E_ITEM_DIAMOND_LEGGINGS:
|
|
|
|
case E_ITEM_LEATHER_BOOTS:
|
|
|
|
case E_ITEM_GOLD_BOOTS:
|
|
|
|
case E_ITEM_CHAIN_BOOTS:
|
|
|
|
case E_ITEM_IRON_BOOTS:
|
|
|
|
case E_ITEM_DIAMOND_BOOTS:
|
|
|
|
{
|
|
|
|
return new cItemArmorHandler(a_ItemType);
|
|
|
|
}
|
2017-02-14 05:13:55 -05:00
|
|
|
|
|
|
|
case E_ITEM_ACACIA_BOAT:
|
|
|
|
case E_ITEM_BIRCH_BOAT:
|
|
|
|
case E_ITEM_BOAT:
|
|
|
|
case E_ITEM_DARK_OAK_BOAT:
|
|
|
|
case E_ITEM_JUNGLE_BOAT:
|
|
|
|
case E_ITEM_SPRUCE_BOAT:
|
|
|
|
{
|
|
|
|
return new cItemBoatHandler(a_ItemType);
|
|
|
|
}
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cItemHandler::Deinit()
|
|
|
|
{
|
2015-04-20 03:17:12 -04:00
|
|
|
for (size_t i = 0; i < ARRAYCOUNT(m_ItemHandler); i++)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
|
|
|
delete m_ItemHandler[i];
|
2014-10-20 16:55:07 -04:00
|
|
|
m_ItemHandler[i] = nullptr;
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
memset(m_ItemHandler, 0, sizeof(m_ItemHandler)); // Don't leave any dangling pointers around, just in case
|
|
|
|
m_HandlerInitialized = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cItemHandler::cItemHandler(int a_ItemType)
|
|
|
|
{
|
|
|
|
m_ItemType = a_ItemType;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-12-24 01:20:17 -05:00
|
|
|
bool cItemHandler::OnPlayerPlace(
|
2020-04-21 16:19:22 -04:00
|
|
|
cWorld & a_World,
|
|
|
|
cPlayer & a_Player,
|
|
|
|
const cItem & a_EquippedItem,
|
|
|
|
const Vector3i a_ClickedBlockPos,
|
|
|
|
eBlockFace a_ClickedBlockFace,
|
|
|
|
const Vector3i a_CursorPos
|
2014-12-24 01:20:17 -05:00
|
|
|
)
|
|
|
|
{
|
2020-04-21 16:19:22 -04:00
|
|
|
if (a_ClickedBlockFace == BLOCK_FACE_NONE)
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
2020-04-21 16:19:22 -04:00
|
|
|
// Clicked in the air, no placement possible
|
2014-12-24 01:20:17 -05:00
|
|
|
return false;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2020-04-21 16:19:22 -04:00
|
|
|
if (!cChunkDef::IsValidHeight(a_ClickedBlockPos.y))
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
|
|
|
// The clicked block is outside the world, ignore this call altogether (#128)
|
|
|
|
return false;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2020-04-21 16:19:22 -04:00
|
|
|
BLOCKTYPE ClickedBlockType;
|
2014-12-24 01:20:17 -05:00
|
|
|
NIBBLETYPE ClickedBlockMeta;
|
|
|
|
|
2020-04-21 16:19:22 -04:00
|
|
|
a_World.GetBlockTypeMeta(a_ClickedBlockPos, ClickedBlockType, ClickedBlockMeta);
|
2017-07-07 10:37:53 -04:00
|
|
|
cChunkInterface ChunkInterface(a_World.GetChunkMap());
|
2014-12-24 01:20:17 -05:00
|
|
|
|
|
|
|
// Check if the block ignores build collision (water, grass etc.):
|
2020-04-21 16:19:22 -04:00
|
|
|
auto HandlerB = BlockHandler(ClickedBlockType);
|
|
|
|
auto PlacedBlockPos = AddFaceDirection(a_ClickedBlockPos, a_ClickedBlockFace);
|
|
|
|
if (HandlerB->DoesIgnoreBuildCollision(ChunkInterface, a_ClickedBlockPos, a_Player, ClickedBlockMeta))
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
2020-04-21 16:19:22 -04:00
|
|
|
// Replace the clicked block:
|
|
|
|
a_World.DropBlockAsPickups(a_ClickedBlockPos, &a_Player, nullptr);
|
|
|
|
PlacedBlockPos = a_ClickedBlockPos;
|
2014-12-24 01:20:17 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-04-21 16:19:22 -04:00
|
|
|
if (!cChunkDef::IsValidHeight(PlacedBlockPos.y))
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
|
|
|
// The block is being placed outside the world, ignore this packet altogether (#128)
|
|
|
|
return false;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-12-24 01:20:17 -05:00
|
|
|
NIBBLETYPE PlaceMeta;
|
|
|
|
BLOCKTYPE PlaceBlock;
|
2020-04-21 16:19:22 -04:00
|
|
|
a_World.GetBlockTypeMeta(PlacedBlockPos, PlaceBlock, PlaceMeta);
|
2014-12-24 01:20:17 -05:00
|
|
|
|
|
|
|
// Clicked on side of block, make sure that placement won't be cancelled if there is a slab able to be double slabbed.
|
|
|
|
// No need to do combinability (dblslab) checks, client will do that here.
|
2020-04-21 16:19:22 -04:00
|
|
|
if (!BlockHandler(PlaceBlock)->DoesIgnoreBuildCollision(ChunkInterface, PlacedBlockPos, a_Player, PlaceMeta))
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
2015-05-09 05:16:56 -04:00
|
|
|
// Tried to place a block into another?
|
2014-12-24 01:20:17 -05:00
|
|
|
// Happens when you place a block aiming at side of block with a torch on it or stem beside it
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2015-06-21 13:49:22 -04:00
|
|
|
|
|
|
|
// Get all the blocks to place:
|
|
|
|
sSetBlockVector blocks;
|
2020-04-21 16:19:22 -04:00
|
|
|
if (!GetBlocksToPlace(a_World, a_Player, a_EquippedItem, PlacedBlockPos, a_ClickedBlockFace, a_CursorPos, blocks))
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
|
|
|
// Handler refused the placement, send that information back to the client:
|
2015-06-21 13:49:22 -04:00
|
|
|
for (const auto & blk: blocks)
|
|
|
|
{
|
2020-04-21 16:19:22 -04:00
|
|
|
const auto & AbsPos = blk.GetAbsolutePos();
|
|
|
|
a_World.SendBlockTo(AbsPos, a_Player);
|
2015-06-21 13:49:22 -04:00
|
|
|
}
|
2020-04-21 16:19:22 -04:00
|
|
|
a_World.SendBlockTo(PlacedBlockPos, a_Player);
|
2014-12-24 01:20:17 -05:00
|
|
|
a_Player.GetInventory().SendEquippedSlot();
|
|
|
|
return false;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-06-21 13:49:22 -04:00
|
|
|
// Try to place the blocks:
|
|
|
|
if (!a_Player.PlaceBlocks(blocks))
|
2014-12-24 01:20:17 -05:00
|
|
|
{
|
2015-06-21 13:49:22 -04:00
|
|
|
// The placement failed, the blocks have already been re-sent, re-send inventory:
|
2014-12-24 01:20:17 -05:00
|
|
|
a_Player.GetInventory().SendEquippedSlot();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove the "placed" item:
|
|
|
|
if (a_Player.IsGameModeSurvival())
|
|
|
|
{
|
|
|
|
a_Player.GetInventory().RemoveOneEquippedItem();
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-06-21 13:49:22 -04:00
|
|
|
bool cItemHandler::GetBlocksToPlace(
|
|
|
|
cWorld & a_World, cPlayer & a_Player, const cItem & a_EquippedItem,
|
2020-04-21 16:19:22 -04:00
|
|
|
const Vector3i a_PlacedBlockPos,
|
|
|
|
eBlockFace a_ClickedBlockFace,
|
|
|
|
const Vector3i a_CursorPos,
|
2015-06-21 13:49:22 -04:00
|
|
|
sSetBlockVector & a_BlocksToSet
|
|
|
|
)
|
|
|
|
{
|
|
|
|
BLOCKTYPE BlockType;
|
|
|
|
NIBBLETYPE BlockMeta;
|
2020-04-21 16:19:22 -04:00
|
|
|
if (!GetPlacementBlockTypeMeta(&a_World, &a_Player, a_PlacedBlockPos, a_ClickedBlockFace, a_CursorPos, BlockType, BlockMeta))
|
2015-06-21 13:49:22 -04:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2020-04-21 16:19:22 -04:00
|
|
|
a_BlocksToSet.emplace_back(a_PlacedBlockPos, BlockType, BlockMeta);
|
2015-06-21 13:49:22 -04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-14 04:49:01 -04:00
|
|
|
bool cItemHandler::OnItemUse(
|
|
|
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
2020-04-21 16:19:22 -04:00
|
|
|
const Vector3i a_ClickedBlockPos, eBlockFace a_ClickedBlockFace
|
2015-04-14 04:49:01 -04:00
|
|
|
)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2014-02-28 10:26:23 -05:00
|
|
|
UNUSED(a_World);
|
|
|
|
UNUSED(a_Player);
|
2015-04-14 04:49:01 -04:00
|
|
|
UNUSED(a_PluginInterface);
|
2014-02-28 10:26:23 -05:00
|
|
|
UNUSED(a_Item);
|
2020-04-21 16:19:22 -04:00
|
|
|
UNUSED(a_ClickedBlockPos);
|
|
|
|
UNUSED(a_ClickedBlockFace);
|
2014-02-28 10:26:23 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-04-21 16:19:22 -04:00
|
|
|
bool cItemHandler::OnDiggingBlock(
|
|
|
|
cWorld * a_World,
|
|
|
|
cPlayer * a_Player,
|
|
|
|
const cItem & a_HeldItem,
|
|
|
|
const Vector3i a_ClickedBlockPos,
|
|
|
|
eBlockFace a_ClickedBlockFace
|
|
|
|
)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2014-02-28 10:26:23 -05:00
|
|
|
UNUSED(a_World);
|
|
|
|
UNUSED(a_Player);
|
2020-04-21 16:19:22 -04:00
|
|
|
UNUSED(a_HeldItem);
|
|
|
|
UNUSED(a_ClickedBlockPos);
|
|
|
|
UNUSED(a_ClickedBlockFace);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-07-23 10:32:09 -04:00
|
|
|
void cItemHandler::OnEntityAttack(cPlayer * a_Attacker, cEntity * a_AttackedEntity)
|
|
|
|
{
|
|
|
|
UNUSED(a_AttackedEntity);
|
2018-01-05 06:28:06 -05:00
|
|
|
a_Attacker->UseEquippedItem(dlaAttackEntity);
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cItemHandler::OnFoodEaten(cWorld * a_World, cPlayer * a_Player, cItem * a_Item)
|
|
|
|
{
|
2014-02-28 10:26:23 -05:00
|
|
|
UNUSED(a_World);
|
|
|
|
UNUSED(a_Player);
|
|
|
|
UNUSED(a_Item);
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-07-26 07:26:14 -04:00
|
|
|
short cItemHandler::GetDurabilityLossByAction(eDurabilityLostAction a_Action)
|
2014-07-23 10:32:09 -04:00
|
|
|
{
|
2018-01-05 06:28:06 -05:00
|
|
|
UNUSED(a_Action);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-07-23 10:32:09 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
char cItemHandler::GetMaxStackSize(void)
|
|
|
|
{
|
|
|
|
if (m_ItemType < 256)
|
|
|
|
{
|
|
|
|
// All blocks can stack up to 64
|
|
|
|
return 64;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-07-17 16:15:34 -04:00
|
|
|
switch (m_ItemType)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_ACACIA_DOOR: return 64;
|
|
|
|
case E_ITEM_ARMOR_STAND: return 16;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_ARROW: return 64;
|
|
|
|
case E_ITEM_BAKED_POTATO: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_BANNER: return 16;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_BEETROOT: return 64;
|
|
|
|
case E_ITEM_BEETROOT_SEEDS: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_BIRCH_DOOR: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_BLAZE_POWDER: return 64;
|
|
|
|
case E_ITEM_BLAZE_ROD: return 64;
|
|
|
|
case E_ITEM_BONE: return 64;
|
|
|
|
case E_ITEM_BOOK: return 64;
|
|
|
|
case E_ITEM_BOTTLE_O_ENCHANTING: return 64;
|
|
|
|
case E_ITEM_BOWL: return 64;
|
|
|
|
case E_ITEM_BREAD: return 64;
|
|
|
|
case E_ITEM_BREWING_STAND: return 64;
|
2014-02-17 19:16:03 -05:00
|
|
|
case E_ITEM_BUCKET: return 16;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_CARROT: return 64;
|
|
|
|
case E_ITEM_CAULDRON: return 64;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_CHORUS_FRUIT: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_CLAY: return 64;
|
|
|
|
case E_ITEM_CLAY_BRICK: return 64;
|
|
|
|
case E_ITEM_CLOCK: return 64;
|
|
|
|
case E_ITEM_COAL: return 64;
|
|
|
|
case E_ITEM_COMPARATOR: return 64;
|
|
|
|
case E_ITEM_COMPASS: return 64;
|
|
|
|
case E_ITEM_COOKED_CHICKEN: return 64;
|
|
|
|
case E_ITEM_COOKED_FISH: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_COOKED_MUTTON: return 64;
|
2015-05-09 06:35:23 -04:00
|
|
|
case E_ITEM_COOKED_PORKCHOP: return 64;
|
|
|
|
case E_ITEM_COOKED_RABBIT: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_COOKIE: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_DARK_OAK_DOOR: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_DIAMOND: return 64;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_DRAGON_BREATH: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_DYE: return 64;
|
|
|
|
case E_ITEM_EGG: return 16;
|
|
|
|
case E_ITEM_EMERALD: return 64;
|
2015-06-30 10:50:15 -04:00
|
|
|
case E_ITEM_EMPTY_MAP: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_ENDER_PEARL: return 16;
|
|
|
|
case E_ITEM_EYE_OF_ENDER: return 64;
|
|
|
|
case E_ITEM_FEATHER: return 64;
|
|
|
|
case E_ITEM_FERMENTED_SPIDER_EYE: return 64;
|
|
|
|
case E_ITEM_FIRE_CHARGE: return 64;
|
|
|
|
case E_ITEM_FIREWORK_ROCKET: return 64;
|
|
|
|
case E_ITEM_FIREWORK_STAR: return 64;
|
|
|
|
case E_ITEM_FLINT: return 64;
|
|
|
|
case E_ITEM_FLOWER_POT: return 64;
|
|
|
|
case E_ITEM_GHAST_TEAR: return 64;
|
|
|
|
case E_ITEM_GLASS_BOTTLE: return 64;
|
|
|
|
case E_ITEM_GLISTERING_MELON: return 64;
|
|
|
|
case E_ITEM_GLOWSTONE_DUST: return 64;
|
|
|
|
case E_ITEM_GOLD: return 64;
|
|
|
|
case E_ITEM_GOLDEN_APPLE: return 64;
|
|
|
|
case E_ITEM_GOLDEN_CARROT: return 64;
|
|
|
|
case E_ITEM_GOLD_NUGGET: return 64;
|
|
|
|
case E_ITEM_GUNPOWDER: return 64;
|
|
|
|
case E_ITEM_HEAD: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_JUNGLE_DOOR: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_IRON: return 64;
|
2017-11-20 06:04:17 -05:00
|
|
|
case E_ITEM_IRON_DOOR: return 64;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_IRON_NUGGET: return 64;
|
2014-02-17 18:00:03 -05:00
|
|
|
case E_ITEM_ITEM_FRAME: return 64;
|
2017-08-21 04:46:41 -04:00
|
|
|
case E_ITEM_LEAD: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_LEATHER: return 64;
|
|
|
|
case E_ITEM_MAGMA_CREAM: return 64;
|
|
|
|
case E_ITEM_MAP: return 64;
|
|
|
|
case E_ITEM_MELON_SEEDS: return 64;
|
|
|
|
case E_ITEM_MELON_SLICE: return 64;
|
|
|
|
case E_ITEM_NETHER_BRICK: return 64;
|
2015-05-07 11:39:47 -04:00
|
|
|
case E_ITEM_NETHER_QUARTZ: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_NETHER_WART: return 64;
|
2014-02-17 19:16:03 -05:00
|
|
|
case E_ITEM_PAINTING: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_PAPER: return 64;
|
|
|
|
case E_ITEM_POISONOUS_POTATO: return 64;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_POPPED_CHORUS_FRUIT: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_POTATO: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_PRISMARINE_CRYSTALS: return 64;
|
|
|
|
case E_ITEM_PRISMARINE_SHARD: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_PUMPKIN_PIE: return 64;
|
|
|
|
case E_ITEM_PUMPKIN_SEEDS: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_RABBITS_FOOT: return 64;
|
|
|
|
case E_ITEM_RABBIT_HIDE: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_RAW_BEEF: return 64;
|
|
|
|
case E_ITEM_RAW_CHICKEN: return 64;
|
|
|
|
case E_ITEM_RAW_FISH: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_RAW_MUTTON: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_RAW_PORKCHOP: return 64;
|
2015-05-09 06:35:23 -04:00
|
|
|
case E_ITEM_RAW_RABBIT: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_RED_APPLE: return 64;
|
|
|
|
case E_ITEM_REDSTONE_DUST: return 64;
|
|
|
|
case E_ITEM_REDSTONE_REPEATER: return 64;
|
|
|
|
case E_ITEM_ROTTEN_FLESH: return 64;
|
|
|
|
case E_ITEM_SEEDS: return 64;
|
|
|
|
case E_ITEM_SIGN: return 16;
|
|
|
|
case E_ITEM_SLIMEBALL: return 64;
|
|
|
|
case E_ITEM_SNOWBALL: return 16;
|
|
|
|
case E_ITEM_SPAWN_EGG: return 64;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_SPECTRAL_ARROW: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_SPIDER_EYE: return 64;
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_ITEM_SPRUCE_DOOR: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_STEAK: return 64;
|
|
|
|
case E_ITEM_STICK: return 64;
|
|
|
|
case E_ITEM_STRING: return 64;
|
|
|
|
case E_ITEM_SUGAR: return 64;
|
|
|
|
case E_ITEM_SUGAR_CANE: return 64;
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_ITEM_TIPPED_ARROW: return 64;
|
2013-07-29 07:13:03 -04:00
|
|
|
case E_ITEM_WHEAT: return 64;
|
2017-11-20 06:04:17 -05:00
|
|
|
case E_ITEM_WOODEN_DOOR: return 64;
|
2017-09-14 04:48:57 -04:00
|
|
|
// By default items don't stack:
|
|
|
|
default: return 1;
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cItemHandler::IsTool()
|
|
|
|
{
|
|
|
|
// TODO: Rewrite this to list all tools specifically
|
2014-07-17 16:50:58 -04:00
|
|
|
return
|
2014-07-17 17:15:53 -04:00
|
|
|
((m_ItemType >= 256) && (m_ItemType <= 259)) ||
|
|
|
|
(m_ItemType == 261) ||
|
|
|
|
((m_ItemType >= 267) && (m_ItemType <= 279)) ||
|
|
|
|
((m_ItemType >= 283) && (m_ItemType <= 286)) ||
|
|
|
|
((m_ItemType >= 290) && (m_ItemType <= 294)) ||
|
|
|
|
(m_ItemType == 325) ||
|
|
|
|
(m_ItemType == 346);
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cItemHandler::IsFood(void)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-08 20:06:15 -04:00
|
|
|
bool cItemHandler::IsDrinkable(short a_ItemDamage)
|
2014-06-07 16:45:00 -04:00
|
|
|
{
|
2014-06-08 20:06:15 -04:00
|
|
|
UNUSED(a_ItemDamage);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-06-07 16:45:00 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
bool cItemHandler::IsPlaceable(void)
|
|
|
|
{
|
|
|
|
// We can place any block that has a corresponding E_BLOCK_TYPE:
|
|
|
|
return (m_ItemType >= 1) && (m_ItemType <= E_BLOCK_MAX_TYPE_ID);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-05-06 13:38:09 -04:00
|
|
|
bool cItemHandler::CanRepairWithRawMaterial(short a_ItemType)
|
2014-04-30 18:47:57 -04:00
|
|
|
{
|
2014-07-23 10:32:09 -04:00
|
|
|
UNUSED(a_ItemType);
|
2014-04-30 18:47:57 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
bool cItemHandler::CanHarvestBlock(BLOCKTYPE a_BlockType)
|
|
|
|
{
|
2014-07-24 16:38:25 -04:00
|
|
|
switch (a_BlockType)
|
|
|
|
{
|
|
|
|
case E_BLOCK_ANVIL:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_BLACK_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_BLOCK_OF_COAL:
|
|
|
|
case E_BLOCK_BLOCK_OF_REDSTONE:
|
|
|
|
case E_BLOCK_BLUE_GLAZED_TERRACOTTA:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_BONE_BLOCK:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_BREWING_STAND:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_BRICK:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_BRICK_STAIRS:
|
|
|
|
case E_BLOCK_BROWN_GLAZED_TERRACOTTA:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_CAULDRON:
|
2014-07-24 16:38:25 -04:00
|
|
|
case E_BLOCK_COAL_ORE:
|
|
|
|
case E_BLOCK_COBBLESTONE:
|
|
|
|
case E_BLOCK_COBBLESTONE_STAIRS:
|
|
|
|
case E_BLOCK_COBBLESTONE_WALL:
|
2014-10-07 12:21:39 -04:00
|
|
|
case E_BLOCK_COBWEB:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_CONCRETE:
|
|
|
|
case E_BLOCK_CYAN_GLAZED_TERRACOTTA:
|
2014-07-24 16:38:25 -04:00
|
|
|
case E_BLOCK_DIAMOND_BLOCK:
|
|
|
|
case E_BLOCK_DIAMOND_ORE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_DISPENSER:
|
2015-06-30 10:50:15 -04:00
|
|
|
case E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_DOUBLE_STONE_SLAB:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_DROPPER:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_EMERALD_ORE:
|
|
|
|
case E_BLOCK_ENCHANTMENT_TABLE:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_END_BRICKS:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_END_STONE:
|
|
|
|
case E_BLOCK_FURNACE:
|
2014-07-24 16:38:25 -04:00
|
|
|
case E_BLOCK_GOLD_BLOCK:
|
|
|
|
case E_BLOCK_GOLD_ORE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_GRAY_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_GREEN_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_HARDENED_CLAY:
|
|
|
|
case E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_HOPPER:
|
|
|
|
case E_BLOCK_IRON_BARS:
|
2014-07-24 16:38:25 -04:00
|
|
|
case E_BLOCK_IRON_BLOCK:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_IRON_DOOR:
|
2014-07-24 16:38:25 -04:00
|
|
|
case E_BLOCK_IRON_ORE:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_IRON_TRAPDOOR:
|
2014-07-24 16:38:25 -04:00
|
|
|
case E_BLOCK_LAPIS_BLOCK:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_LAPIS_ORE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_LIGHT_BLUE_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_LIGHT_GRAY_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_LIME_GLAZED_TERRACOTTA:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_LIT_FURNACE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_MAGENTA_GLAZED_TERRACOTTA:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_MAGMA:
|
2014-10-01 13:26:36 -04:00
|
|
|
case E_BLOCK_MOB_SPAWNER:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_MOSSY_COBBLESTONE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_NETHERRACK:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_NETHER_BRICK:
|
|
|
|
case E_BLOCK_NETHER_BRICK_FENCE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_NETHER_BRICK_STAIRS:
|
|
|
|
case E_BLOCK_NETHER_QUARTZ_ORE:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_OBSERVER:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_OBSIDIAN:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_ORANGE_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_PINK_GLAZED_TERRACOTTA:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_PRISMARINE_BLOCK:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_PURPLE_GLAZED_TERRACOTTA:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_PURPUR_BLOCK:
|
|
|
|
case E_BLOCK_PURPUR_DOUBLE_SLAB:
|
|
|
|
case E_BLOCK_PURPUR_PILLAR:
|
|
|
|
case E_BLOCK_PURPUR_SLAB:
|
|
|
|
case E_BLOCK_PURPUR_STAIRS:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_QUARTZ_BLOCK:
|
|
|
|
case E_BLOCK_QUARTZ_STAIRS:
|
|
|
|
case E_BLOCK_REDSTONE_ORE:
|
|
|
|
case E_BLOCK_REDSTONE_ORE_GLOWING:
|
|
|
|
case E_BLOCK_RED_GLAZED_TERRACOTTA:
|
2017-02-14 05:13:55 -05:00
|
|
|
case E_BLOCK_RED_NETHER_BRICK:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_RED_SANDSTONE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_RED_SANDSTONE_SLAB:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_RED_SANDSTONE_STAIRS:
|
|
|
|
case E_BLOCK_SANDSTONE:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_SANDSTONE_STAIRS:
|
2014-07-26 07:23:11 -04:00
|
|
|
case E_BLOCK_SNOW:
|
2014-09-12 10:48:37 -04:00
|
|
|
case E_BLOCK_STONE:
|
|
|
|
case E_BLOCK_STONE_BRICKS:
|
|
|
|
case E_BLOCK_STONE_BRICK_STAIRS:
|
|
|
|
case E_BLOCK_STONE_PRESSURE_PLATE:
|
|
|
|
case E_BLOCK_STONE_SLAB:
|
2014-07-26 07:23:11 -04:00
|
|
|
case E_BLOCK_VINES:
|
2020-04-07 17:59:29 -04:00
|
|
|
case E_BLOCK_WHITE_GLAZED_TERRACOTTA:
|
|
|
|
case E_BLOCK_YELLOW_GLAZED_TERRACOTTA:
|
2014-07-24 16:38:25 -04:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
default: return true;
|
|
|
|
}
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cItemHandler::GetPlacementBlockTypeMeta(
|
|
|
|
cWorld * a_World, cPlayer * a_Player,
|
2020-04-21 16:19:22 -04:00
|
|
|
const Vector3i a_PlacedBlockPos, eBlockFace a_ClickedBlockFace,
|
|
|
|
const Vector3i a_CursorPos,
|
2013-07-29 07:13:03 -04:00
|
|
|
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
|
|
|
|
)
|
|
|
|
{
|
|
|
|
ASSERT(m_ItemType < 256); // Items with IDs above 255 should all be handled by specific handlers
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-04-04 03:56:57 -04:00
|
|
|
if (m_ItemType >= 256)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2014-04-04 03:56:57 -04:00
|
|
|
LOGERROR("%s: Item %d is not eligible for direct block placement!", __FUNCTION__, m_ItemType);
|
2013-07-29 07:13:03 -04:00
|
|
|
return false;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-16 14:59:57 -04:00
|
|
|
cBlockHandler * BlockH = BlockHandler(static_cast<BLOCKTYPE>(m_ItemType));
|
2014-01-26 10:06:25 -05:00
|
|
|
cChunkInterface ChunkInterface(a_World->GetChunkMap());
|
2013-07-29 07:13:03 -04:00
|
|
|
return BlockH->GetPlacementBlockTypeMeta(
|
2017-07-31 16:17:52 -04:00
|
|
|
ChunkInterface, *a_Player,
|
2020-04-21 16:19:22 -04:00
|
|
|
a_PlacedBlockPos, a_ClickedBlockFace,
|
|
|
|
a_CursorPos,
|
2013-07-29 07:13:03 -04:00
|
|
|
a_BlockType, a_BlockMeta
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cItemHandler::EatItem(cPlayer * a_Player, cItem * a_Item)
|
|
|
|
{
|
2018-01-05 19:39:23 -05:00
|
|
|
auto FoodInfo = GetFoodInfo(a_Item);
|
|
|
|
return a_Player->Feed(FoodInfo.FoodLevel, FoodInfo.Saturation);
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-07-30 13:53:21 -04:00
|
|
|
cItemHandler::FoodInfo cItemHandler::GetFoodInfo(const cItem * a_Item)
|
2013-07-29 07:13:03 -04:00
|
|
|
{
|
2017-07-30 13:53:21 -04:00
|
|
|
UNUSED(a_Item);
|
2014-02-03 16:16:26 -05:00
|
|
|
return FoodInfo(0, 0);
|
2013-07-29 07:13:03 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-11-06 13:30:19 -05:00
|
|
|
|
|
|
|
float cItemHandler::GetBlockBreakingStrength(BLOCKTYPE a_Block)
|
|
|
|
{
|
|
|
|
return 1.0f;
|
|
|
|
}
|