Cuberite
A lightweight, fast and extensible game server for Minecraft
ItemFood.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include "ItemHandler.h"
5 
6 
7 
8 
9 
11  public cItemHandler
12 {
14 
15 public:
16  cItemFoodHandler(int a_ItemType)
17  : super(a_ItemType)
18  {
19  }
20 
21 
22  virtual bool IsFood(void) override
23  {
24  return true;
25  }
26 
27 
28  virtual FoodInfo GetFoodInfo(const cItem * a_Item) override
29  {
30  static const FoodInfo RawFishInfos[] =
31  {
32  FoodInfo(2, 0.4), // Raw fish
33  FoodInfo(2, 0.2), // Raw salmon
34  FoodInfo(1, 0.2), // Clownfish
35  FoodInfo(1, 0.2), // Pufferfish
36  };
37  static const FoodInfo CookedFishInfos[] =
38  {
39  FoodInfo(5, 6.0), // Cooked fish
40  FoodInfo(6, 9.6), // Cooked salmon
41  };
42  static const short NumRawFishInfos = sizeof(RawFishInfos) / sizeof(FoodInfo);
43  static const short NumCookedFishInfos = sizeof(CookedFishInfos) / sizeof(FoodInfo);
44 
45  switch (m_ItemType)
46  {
47  // Please keep alpha-sorted.
48  case E_ITEM_BAKED_POTATO: return FoodInfo(5, 6);
49  case E_ITEM_BEETROOT: return FoodInfo(1, 1.2);
50  case E_ITEM_BEETROOT_SOUP: return FoodInfo(6, 7.2);
51  case E_ITEM_BREAD: return FoodInfo(5, 6);
52  // Carrots handled in ItemSeeds
53  case E_ITEM_CHORUS_FRUIT: return FoodInfo(4, 2.4);
54  case E_ITEM_COOKED_CHICKEN: return FoodInfo(6, 7.2);
55  case E_ITEM_COOKED_FISH:
56  {
57  if (a_Item->m_ItemDamage >= NumCookedFishInfos)
58  {
59  LOGWARNING("Unknown cooked fish type '%d'", a_Item->m_ItemDamage);
60  return FoodInfo(0, 0);
61  }
62  return CookedFishInfos[a_Item->m_ItemDamage];
63  }
64  case E_ITEM_COOKED_MUTTON: return FoodInfo(6, 9.6);
65  case E_ITEM_COOKED_PORKCHOP: return FoodInfo(8, 12.8);
66  case E_ITEM_COOKED_RABBIT: return FoodInfo(5, 6);
67  case E_ITEM_COOKIE: return FoodInfo(2, 0.5);
68  // Golden apple handled in ItemGoldenApple
69  case E_ITEM_GOLDEN_CARROT: return FoodInfo(6, 14.4);
70  case E_ITEM_MELON_SLICE: return FoodInfo(2, 1.2);
71  case E_ITEM_MUSHROOM_SOUP: return FoodInfo(6, 7.2);
72  case E_ITEM_POISONOUS_POTATO: return FoodInfo(2, 1.2);
73  // Potatoes handled in ItemSeeds
74  case E_ITEM_PUMPKIN_PIE: return FoodInfo(8, 4.8);
75  case E_ITEM_RABBIT_STEW: return FoodInfo(10, 12);
76  case E_ITEM_RED_APPLE: return FoodInfo(4, 2.4);
77  case E_ITEM_RAW_BEEF: return FoodInfo(3, 1.8);
78  case E_ITEM_RAW_CHICKEN: return FoodInfo(2, 1.2);
79  case E_ITEM_RAW_FISH:
80  {
81  if (a_Item->m_ItemDamage >= NumRawFishInfos)
82  {
83  LOGWARNING("Unknown raw fish type '%d'", a_Item->m_ItemDamage);
84  return FoodInfo(0, 0);
85  }
86  return RawFishInfos[a_Item->m_ItemDamage];
87  }
88  case E_ITEM_RAW_MUTTON: return FoodInfo(2, 1.2);
89  case E_ITEM_RAW_PORKCHOP: return FoodInfo(3, 1.8);
90  case E_ITEM_RAW_RABBIT: return FoodInfo(3, 1.8);
91  case E_ITEM_ROTTEN_FLESH: return FoodInfo(4, 0.8);
92  case E_ITEM_SPIDER_EYE: return FoodInfo(2, 3.2);
93  case E_ITEM_STEAK: return FoodInfo(8, 12.8);
94  }
95  LOGWARNING("%s: Unknown food item (%d), returning zero nutrition", __FUNCTION__, m_ItemType);
96  return FoodInfo(0, 0.f);
97  }
98 
99  virtual bool EatItem(cPlayer * a_Player, cItem * a_Item) override
100  {
101  if (!super::EatItem(a_Player, a_Item))
102  {
103  return false;
104  }
105 
106  switch (m_ItemType)
107  {
110  case E_ITEM_RABBIT_STEW:
111  {
112  // Return a bowl to the inventory
113  if (!a_Player->IsGameModeCreative())
114  {
115  a_Player->GetInventory().AddItem(cItem(E_ITEM_BOWL));
116  }
117  break;
118  }
119  case E_ITEM_RAW_FISH:
120  {
122  {
123  a_Player->AddEntityEffect(cEntityEffect::effHunger, 20 * 15, 2);
124  a_Player->AddEntityEffect(cEntityEffect::effNausea, 20 * 15, 1);
125  a_Player->AddEntityEffect(cEntityEffect::effPoison, 20 * 60, 3);
126  }
127  break;
128  }
129  case E_ITEM_RAW_CHICKEN:
130  {
131  if (GetRandomProvider().RandBool(0.3))
132  {
133  a_Player->AddEntityEffect(cEntityEffect::effHunger, 600, 0);
134  }
135  break;
136  }
137  case E_ITEM_ROTTEN_FLESH:
138  {
139  if (GetRandomProvider().RandBool(0.8))
140  {
141  a_Player->AddEntityEffect(cEntityEffect::effHunger, 600, 0);
142  }
143  break;
144  }
145  case E_ITEM_SPIDER_EYE:
146  {
147  a_Player->AddEntityEffect(cEntityEffect::effPoison, 100, 0);
148  break;
149  }
151  {
152  if (GetRandomProvider().RandBool(0.6))
153  {
154  a_Player->AddEntityEffect(cEntityEffect::effPoison, 100, 0);
155  }
156  break;
157  }
158  }
159  return true;
160  }
161 
162 };
163 
164 
165 
166 
short m_ItemDamage
Definition: Item.h:211
MTRand & GetRandomProvider()
Returns the current thread's random number source.
Definition: FastRandom.cpp:20
Definition: Player.h:27
virtual FoodInfo GetFoodInfo(const cItem *a_Item) override
Returns the FoodInfo for this item.
Definition: ItemFood.h:28
virtual bool IsFood(void) override
Indicates if this item is food.
Definition: ItemFood.h:22
virtual bool EatItem(cPlayer *a_Player, cItem *a_Item) override
Lets the player eat a selected item.
Definition: ItemFood.h:99
cItemHandler super
Definition: ItemFood.h:13
void AddEntityEffect(cEntityEffect::eType a_EffectType, int a_EffectDurationTicks, short a_EffectIntensity, double a_DistanceModifier=1)
Applies an entity effect.
Definition: Pawn.cpp:172
void LOGWARNING(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:174
int AddItem(const cItem &a_ItemStack, bool a_AllowNewStacks=true)
Adds as many items out of a_ItemStack as can fit.
Definition: Inventory.cpp:106
cItemFoodHandler(int a_ItemType)
Definition: ItemFood.h:16
bool IsGameModeCreative(void) const
Returns true if the player is in Creative mode, either explicitly, or by inheriting from current worl...
Definition: Player.cpp:1260
cInventory & GetInventory(void)
Definition: Player.h:136
Definition: Item.h:36
virtual bool EatItem(cPlayer *a_Player, cItem *a_Item)
Lets the player eat a selected item.