Otclient 1.0  14/8/2020
item.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2020 OTClient <https://github.com/edubart/otclient>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  * THE SOFTWARE.
21  */
22 
23 #include "item.h"
24 #include "container.h"
25 #include "game.h"
26 #include "houses.h"
27 #include "map.h"
28 #include "shadermanager.h"
29 #include "spritemanager.h"
30 #include "thing.h"
31 #include "thingtypemanager.h"
32 #include "tile.h"
33 
35 #include <framework/core/clock.h>
39 
41  m_clientId(0),
42  m_serverId(0),
43  m_phase(0),
44  m_countOrSubType(1),
45  m_color(Color::alpha),
46  m_canDraw(true),
47  m_async(true),
48  m_lastPhase(0)
49 {
50 }
51 
53 {
54  ItemPtr item(new Item);
55  item->setId(id);
56 
57  return item;
58 }
59 
61 {
62  ItemPtr item(new Item);
63  item->setOtbId(id);
64  return item;
65 }
66 
67 std::string Item::getName()
68 {
69  return g_things.findItemTypeByClientId(m_clientId)->getName();
70 }
71 
72 void Item::draw(const Point& dest, float scaleFactor, bool animate, int redrawFlag, LightView* lightView)
73 {
74  if(m_clientId == 0 || !canDraw())
75  return;
76 
77  // determine animation phase
78  const int animationPhase = calculateAnimationPhase(animate);
79 
80  // determine x,y,z patterns
81  int xPattern = 0, yPattern = 0, zPattern = 0;
82  calculatePatterns(xPattern, yPattern, zPattern);
83 
84  if(m_color != Color::alpha)
85  g_painter->setColor(m_color);
86 
87  rawGetThingType()->draw(dest, scaleFactor, 0, xPattern, yPattern, zPattern, animationPhase, redrawFlag, lightView);
88 
92  if(m_color != Color::alpha)
94 }
95 
97 {
99  id = 0;
100  m_serverId = g_things.findItemTypeByClientId(id)->getServerId();
101  m_clientId = id;
102 }
103 
105 {
106  if(!g_things.isValidOtbId(id))
107  id = 0;
108  auto itemType = g_things.getItemType(id);
109  m_serverId = id;
110 
111  id = itemType->getClientId();
113  id = 0;
114  m_clientId = id;
115 }
116 
118 {
119  return g_things.isValidDatId(m_clientId, ThingCategoryItem);
120 }
121 
123 {
124  try {
125  while(in->canRead()) {
126  int attrib = in->getU8();
127  if(attrib == 0)
128  break;
129 
130  switch(attrib) {
131  case ATTR_COUNT:
132  case ATTR_RUNE_CHARGES:
133  setCount(in->getU8());
134  break;
135  case ATTR_CHARGES:
136  setCount(in->getU16());
137  break;
138  case ATTR_HOUSEDOORID:
140  case ATTR_DUALWIELD:
141  case ATTR_DECAYING_STATE:
142  m_attribs.set(attrib, in->getU8());
143  break;
144  case ATTR_ACTION_ID:
145  case ATTR_UNIQUE_ID:
146  case ATTR_DEPOT_ID:
147  m_attribs.set(attrib, in->getU16());
148  break;
150  case ATTR_ATTACK:
151  case ATTR_EXTRAATTACK:
152  case ATTR_DEFENSE:
153  case ATTR_EXTRADEFENSE:
154  case ATTR_ARMOR:
155  case ATTR_ATTACKSPEED:
156  case ATTR_HITCHANCE:
157  case ATTR_DURATION:
158  case ATTR_WRITTENDATE:
159  case ATTR_SLEEPERGUID:
160  case ATTR_SLEEPSTART:
161  case ATTR_ATTRIBUTE_MAP:
162  m_attribs.set(attrib, in->getU32());
163  break;
164  case ATTR_TELE_DEST:
165  {
166  Position pos;
167  pos.x = in->getU16();
168  pos.y = in->getU16();
169  pos.z = in->getU8();
170  m_attribs.set(attrib, pos);
171  break;
172  }
173  case ATTR_NAME:
174  case ATTR_TEXT:
175  case ATTR_DESC:
176  case ATTR_ARTICLE:
177  case ATTR_WRITTENBY:
178  m_attribs.set(attrib, in->getString());
179  break;
180  default:
181  stdext::throw_exception(stdext::format("invalid item attribute %d", attrib));
182  }
183  }
184  } catch(stdext::exception& e) {
185  g_logger.error(stdext::format("Failed to unserialize OTBM item: %s", e.what()));
186  }
187 }
188 
190 {
191  out->startNode(OTBM_ITEM);
192  out->addU16(getServerId());
193 
194  out->addU8(ATTR_COUNT);
195  out->addU8(getCount());
196 
197  out->addU8(ATTR_CHARGES);
198  out->addU16(getCountOrSubType());
199 
200  const Position dest = m_attribs.get<Position>(ATTR_TELE_DEST);
201  if(dest.isValid()) {
202  out->addU8(ATTR_TELE_DEST);
203  out->addPos(dest.x, dest.y, dest.z);
204  }
205 
206  if(isDepot()) {
207  out->addU8(ATTR_DEPOT_ID);
208  out->addU16(getDepotId());
209  }
210 
211  if(isHouseDoor()) {
212  out->addU8(ATTR_HOUSEDOORID);
213  out->addU8(getDoorId());
214  }
215 
216  const uint16 aid = m_attribs.get<uint16>(ATTR_ACTION_ID);
217  const uint16 uid = m_attribs.get<uint16>(ATTR_UNIQUE_ID);
218  if(aid) {
219  out->addU8(ATTR_ACTION_ID);
220  out->addU16(aid);
221  }
222 
223  if(uid) {
224  out->addU8(ATTR_UNIQUE_ID);
225  out->addU16(uid);
226  }
227 
228  const std::string text = getText();
229  if(g_things.getItemType(m_serverId)->isWritable() && !text.empty()) {
230  out->addU8(ATTR_TEXT);
231  out->addString(text);
232  }
233  const std::string desc = getDescription();
234  if(!desc.empty()) {
235  out->addU8(ATTR_DESC);
236  out->addString(desc);
237  }
238 
239  out->endNode();
240  for(const auto& i : m_containerItems)
241  i->serializeItem(out);
242 }
243 
245 {
246  if(isSplash() || isFluidContainer())
247  return m_countOrSubType;
248  if(g_game.getClientVersion() > 862)
249  return 0;
250  return 1;
251 }
252 
254 {
255  if(isStackable())
256  return m_countOrSubType;
257  return 1;
258 }
259 
261 {
262  ItemPtr item = ItemPtr(new Item);
263  *(item.get()) = *this;
264  return item;
265 }
266 
267 void Item::calculatePatterns(int& xPattern, int& yPattern, int& zPattern)
268 {
269  // Avoid crashes with invalid items
270  if(!isValid())
271  return;
272 
273  if(isStackable() && getNumPatternX() == 4 && getNumPatternY() == 2) {
274  if(m_countOrSubType <= 0) {
275  xPattern = 0;
276  yPattern = 0;
277  } else if(m_countOrSubType < 5) {
278  xPattern = m_countOrSubType - 1;
279  yPattern = 0;
280  } else if(m_countOrSubType < 10) {
281  xPattern = 0;
282  yPattern = 1;
283  } else if(m_countOrSubType < 25) {
284  xPattern = 1;
285  yPattern = 1;
286  } else if(m_countOrSubType < 50) {
287  xPattern = 2;
288  yPattern = 1;
289  } else {
290  xPattern = 3;
291  yPattern = 1;
292  }
293  } else if(isHangable()) {
294  const TilePtr& tile = getTile();
295  if(tile) {
296  if(tile->mustHookSouth())
297  xPattern = getNumPatternX() >= 2 ? 1 : 0;
298  else if(tile->mustHookEast())
299  xPattern = getNumPatternX() >= 3 ? 2 : 0;
300  }
301  } else if(isSplash() || isFluidContainer()) {
302  int color = Otc::FluidTransparent;
304  switch(m_countOrSubType) {
305  case Otc::FluidNone:
306  color = Otc::FluidTransparent;
307  break;
308  case Otc::FluidWater:
309  color = Otc::FluidBlue;
310  break;
311  case Otc::FluidMana:
312  color = Otc::FluidPurple;
313  break;
314  case Otc::FluidBeer:
315  color = Otc::FluidBrown;
316  break;
317  case Otc::FluidOil:
318  color = Otc::FluidBrown;
319  break;
320  case Otc::FluidBlood:
321  color = Otc::FluidRed;
322  break;
323  case Otc::FluidSlime:
324  color = Otc::FluidGreen;
325  break;
326  case Otc::FluidMud:
327  color = Otc::FluidBrown;
328  break;
329  case Otc::FluidLemonade:
330  color = Otc::FluidYellow;
331  break;
332  case Otc::FluidMilk:
333  color = Otc::FluidWhite;
334  break;
335  case Otc::FluidWine:
336  color = Otc::FluidPurple;
337  break;
338  case Otc::FluidHealth:
339  color = Otc::FluidRed;
340  break;
341  case Otc::FluidUrine:
342  color = Otc::FluidYellow;
343  break;
344  case Otc::FluidRum:
345  color = Otc::FluidBrown;
346  break;
348  color = Otc::FluidYellow;
349  break;
351  color = Otc::FluidWhite;
352  break;
353  case Otc::FluidTea:
354  color = Otc::FluidBrown;
355  break;
356  case Otc::FluidMead:
357  color = Otc::FluidBrown;
358  break;
359  default:
360  color = Otc::FluidTransparent;
361  break;
362  }
363  } else
364  color = m_countOrSubType;
365 
366  xPattern = (color % 4) % getNumPatternX();
367  yPattern = (color / 4) % getNumPatternY();
368  } else {
369  xPattern = m_position.x % getNumPatternX();
370  yPattern = m_position.y % getNumPatternY();
371  zPattern = m_position.z % getNumPatternZ();
372  }
373 }
374 
376 {
377  if(!hasAnimationPhases()) return 0;
378 
379  if(!animate) return getAnimationPhases() - 1;
380 
381  if(getAnimator() != nullptr) return getAnimator()->getPhase();
382 
383  if(m_async) {
385  }
386 
387  if(g_clock.millis() - m_lastPhase >= Otc::ITEM_TICKS_PER_FRAME) {
388  m_phase = (m_phase + 1) % getAnimationPhases();
389  m_lastPhase = g_clock.millis();
390  }
391 
392  return m_phase;
393 }
394 
395 int Item::getExactSize(int layer, int xPattern, int yPattern, int zPattern, int animationPhase)
396 {
397  calculatePatterns(xPattern, yPattern, zPattern);
398  animationPhase = calculateAnimationPhase(true);
399  return Thing::getExactSize(layer, xPattern, yPattern, zPattern, animationPhase);
400 }
401 
403 {
404  if(!hasAnimationPhases()) return;
405 
406  const AnimatorPtr& animator = getAnimator();
408 }
409 
411 {
412  return g_things.getThingType(m_clientId, ThingCategoryItem);
413 }
414 
416 {
417  return g_things.rawGetThingType(m_clientId, ThingCategoryItem);
418 }
419 /* vim: set ts=4 sw=4 et :*/
binarytree.h
ThingTypeManager::rawGetThingType
ThingType * rawGetThingType(uint16 id, ThingCategory category)
Definition: thingtypemanager.h:57
Item::Item
Item()
Definition: item.cpp:40
Painter::setColor
virtual void setColor(const Color &color)
Definition: painter.h:77
ATTR_CHARGES
@ ATTR_CHARGES
Definition: item.h:56
thingtypemanager.h
Item::serializeItem
void serializeItem(const OutputBinaryTreePtr &out)
Definition: item.cpp:189
Thing::startListenerPainter
void startListenerPainter(const float duration)
Definition: thing.h:133
eventdispatcher.h
graphics.h
stdext::packed_storage::get
T get(Key id) const
Definition: packed_storage.h:80
Thing::isHangable
bool isHangable()
Definition: thing.h:109
ATTR_ARMOR
@ ATTR_ARMOR
Definition: item.h:64
Color
Definition: color.h:32
ATTR_CONTAINER_ITEMS
@ ATTR_CONTAINER_ITEMS
Definition: item.h:57
Otc::FluidSlime
@ FluidSlime
Definition: const.h:213
ATTR_ARTICLE
@ ATTR_ARTICLE
Definition: item.h:68
Thing::getTile
const TilePtr & getTile()
Definition: thing.cpp:84
ATTR_TEXT
@ ATTR_TEXT
Definition: item.h:40
ATTR_SLEEPSTART
@ ATTR_SLEEPSTART
Definition: item.h:55
Otc::FluidMead
@ FluidMead
Definition: const.h:224
Position::x
int x
Definition: position.h:265
ItemType::isWritable
bool isWritable()
Definition: itemtype.h:153
ATTR_SCRIPTPROTECTED
@ ATTR_SCRIPTPROTECTED
Definition: item.h:69
Position::isValid
bool isValid() const
Definition: position.h:196
Tile::mustHookEast
bool mustHookEast()
Definition: tile.cpp:589
ATTR_ATTACK
@ ATTR_ATTACK
Definition: item.h:60
uint32
uint32_t uint32
Definition: types.h:35
ATTR_COUNT
@ ATTR_COUNT
Definition: item.h:49
ATTR_UNIQUE_ID
@ ATTR_UNIQUE_ID
Definition: item.h:39
Otc::FluidBeer
@ FluidBeer
Definition: const.h:210
ATTR_ACTION_ID
@ ATTR_ACTION_ID
Definition: item.h:38
Otc::FluidTransparent
@ FluidTransparent
Definition: const.h:196
Thing::getAnimator
AnimatorPtr getAnimator()
Definition: thing.h:80
Item::unserializeItem
void unserializeItem(const BinaryTreePtr &in)
Definition: item.cpp:122
Logger::error
void error(const std::string &what)
Definition: logger.h:54
Thing::getAnimationPhases
int getAnimationPhases()
Definition: thing.h:78
Otc::FluidNone
@ FluidNone
Definition: const.h:207
Game::getClientVersion
int getClientVersion()
Definition: game.h:318
ItemType::getName
std::string getName()
Definition: itemtype.h:147
Otc::FluidTea
@ FluidTea
Definition: const.h:223
Item::getThingType
const ThingTypePtr & getThingType() override
Definition: item.cpp:410
ATTR_DURATION
@ ATTR_DURATION
Definition: item.h:50
ThingTypeManager::getItemType
const ItemTypePtr & getItemType(uint16 id)
Definition: thingtypemanager.cpp:385
Tile::mustHookSouth
bool mustHookSouth()
Definition: tile.cpp:598
ATTR_TELE_DEST
@ ATTR_TELE_DEST
Definition: item.h:42
Otc::FluidWine
@ FluidWine
Definition: const.h:217
Item::draw
void draw(const Point &dest, float scaleFactor, bool animate, int redrawFlag=Otc::ReDrawThing, LightView *lightView=nullptr) override
Definition: item.cpp:72
g_game
Game g_game
Definition: game.cpp:37
Position::y
int y
Definition: position.h:266
Item::canDraw
bool canDraw() const
Definition: item.h:152
Item::setOtbId
void setOtbId(uint16 id)
Definition: item.cpp:104
stdext::format
std::string format()
Definition: format.h:84
Thing::isFluidContainer
bool isFluidContainer()
Definition: thing.h:101
Item::getExactSize
int getExactSize(int layer=0, int xPattern=0, int yPattern=0, int zPattern=0, int animationPhase=0) override
Definition: item.cpp:395
LightView
Definition: lightview.h:37
Thing::getNumPatternX
int getNumPatternX()
Definition: thing.h:75
Otc::FluidUrine
@ FluidUrine
Definition: const.h:219
ATTR_DECAYING_STATE
@ ATTR_DECAYING_STATE
Definition: item.h:51
Otc::FluidWhite
@ FluidWhite
Definition: const.h:202
clock.h
Thing::m_position
Position m_position
Definition: thing.h:141
ATTR_EXTRAATTACK
@ ATTR_EXTRAATTACK
Definition: item.h:61
Position::z
short z
Definition: position.h:267
uint16
uint16_t uint16
Definition: types.h:36
Otc::ITEM_TICKS_PER_FRAME
@ ITEM_TICKS_PER_FRAME
Definition: const.h:42
Otc::FluidOil
@ FluidOil
Definition: const.h:211
Item::rawGetThingType
ThingType * rawGetThingType() override
Definition: item.cpp:415
Item::calculatePatterns
void calculatePatterns(int &xPattern, int &yPattern, int &zPattern)
Definition: item.cpp:267
Item::getName
std::string getName()
Definition: item.cpp:67
Item::getDescription
std::string getDescription()
Definition: item.h:118
Thing::isSplash
bool isSplash()
Definition: thing.h:102
Item::isValid
bool isValid()
Definition: item.cpp:117
Item::isHouseDoor
bool isHouseDoor()
Definition: item.h:127
ATTR_RUNE_CHARGES
@ ATTR_RUNE_CHARGES
Definition: item.h:46
houses.h
g_logger
Logger g_logger
Definition: logger.cpp:35
spritemanager.h
container.h
Otc::FluidRum
@ FluidRum
Definition: const.h:220
ThingTypeManager::isValidOtbId
bool isValidOtbId(uint16 id)
Definition: thingtypemanager.h:76
Otc::FluidRed
@ FluidRed
Definition: const.h:198
Position
Definition: position.h:33
Item::createFromOtb
static ItemPtr createFromOtb(int id)
Definition: item.cpp:60
Thing::getNumPatternY
int getNumPatternY()
Definition: thing.h:76
ItemType::getServerId
uint16 getServerId()
Definition: itemtype.h:138
ThingTypeManager::findItemTypeByClientId
const ItemTypePtr & findItemTypeByClientId(uint16 id)
Definition: thingtypemanager.cpp:340
Item::getServerId
uint16 getServerId()
Definition: item.h:99
ThingCategoryItem
@ ThingCategoryItem
Definition: thingtype.h:46
Item::setCount
void setCount(int count)
Definition: item.h:90
map.h
ATTR_ATTRIBUTE_MAP
@ ATTR_ATTRIBUTE_MAP
Definition: item.h:71
ThingTypeManager::getThingType
const ThingTypePtr & getThingType(uint16 id, ThingCategory category)
Definition: thingtypemanager.cpp:376
Game::getFeature
bool getFeature(Otc::GameFeature feature)
Definition: game.h:312
Item::clone
ItemPtr clone()
Definition: item.cpp:260
ATTR_WRITTENDATE
@ ATTR_WRITTENDATE
Definition: item.h:52
Thing::hasAnimationPhases
bool hasAnimationPhases()
Definition: thing.h:79
ATTR_HITCHANCE
@ ATTR_HITCHANCE
Definition: item.h:66
Otc::GameNewFluids
@ GameNewFluids
Definition: const.h:412
ThingType
Definition: thingtype.h:126
ATTR_DESC
@ ATTR_DESC
Definition: item.h:41
Item::calculateAnimationPhase
int calculateAnimationPhase(bool animate)
Definition: item.cpp:375
Item::getSubType
int getSubType()
Definition: item.cpp:244
Otc::FluidBlue
@ FluidBlue
Definition: const.h:197
Item::getText
std::string getText()
Definition: item.h:117
stdext::throw_exception
void throw_exception(const std::string &what)
Throws a generic exception.
Definition: exception.h:43
ATTR_DUALWIELD
@ ATTR_DUALWIELD
Definition: item.h:70
Item::isDepot
bool isDepot()
Definition: item.h:128
Item::create
static ItemPtr create(int id)
Definition: item.cpp:52
Otc::FluidLemonade
@ FluidLemonade
Definition: const.h:215
Otc::FluidHealth
@ FluidHealth
Definition: const.h:218
Otc::FluidMud
@ FluidMud
Definition: const.h:214
ATTR_EXTRADEFENSE
@ ATTR_EXTRADEFENSE
Definition: item.h:63
Animator::getAverageDuration
int getAverageDuration()
Definition: animator.h:57
Item
Definition: item.h:76
filestream.h
Color::alpha
static const Color alpha
Definition: color.h:100
ATTR_DEPOT_ID
@ ATTR_DEPOT_ID
Definition: item.h:44
ATTR_DEFENSE
@ ATTR_DEFENSE
Definition: item.h:62
Otc::FluidCoconutMilk
@ FluidCoconutMilk
Definition: const.h:222
stdext::exception::what
virtual const char * what() const
Definition: exception.h:37
Painter::resetColor
void resetColor()
Definition: painter.h:108
Otc::FluidPurple
@ FluidPurple
Definition: const.h:203
Thing::getNumPatternZ
int getNumPatternZ()
Definition: thing.h:77
stdext::shared_object_ptr< Item >
Otc::FluidFruidJuice
@ FluidFruidJuice
Definition: const.h:221
Thing::getExactSize
virtual int getExactSize(int layer, int xPattern, int yPattern, int zPattern, int animationPhase)
Definition: thing.h:73
Item::setId
void setId(uint32 id) override
Definition: item.cpp:96
OTBM_ITEM
@ OTBM_ITEM
Definition: map.h:74
Item::getDoorId
uint8 getDoorId()
Definition: item.h:110
g_painter
Painter * g_painter
Definition: painter.cpp:28
Item::startListenerPainter
void startListenerPainter()
Definition: item.cpp:402
Item::getDepotId
uint16 getDepotId()
Definition: item.h:107
ATTR_SLEEPERGUID
@ ATTR_SLEEPERGUID
Definition: item.h:54
game.h
Clock::millis
ticks_t millis()
Definition: clock.h:37
ATTR_WRITTENBY
@ ATTR_WRITTENBY
Definition: item.h:53
ATTR_NAME
@ ATTR_NAME
Definition: item.h:58
thing.h
stdext::packed_storage::set
void set(Key id, const T &value)
Definition: packed_storage.h:47
TPoint< int >
Item::getCount
int getCount()
Definition: item.cpp:253
ThingType::draw
void draw(const Point &dest, float scaleFactor, int layer, int xPattern, int yPattern, int zPattern, int animationPhase, int reDrawFlags=Otc::ReDrawThing, LightView *lightView=nullptr)
Definition: thingtype.cpp:428
tile.h
Otc::FluidMana
@ FluidMana
Definition: const.h:209
Otc::FluidGreen
@ FluidGreen
Definition: const.h:200
ATTR_HOUSEDOORID
@ ATTR_HOUSEDOORID
Definition: item.h:48
g_clock
Clock g_clock
Definition: clock.cpp:25
ItemPtr
stdext::shared_object_ptr< Item > ItemPtr
Definition: declarations.h:61
g_things
ThingTypeManager g_things
Definition: thingtypemanager.cpp:38
Thing::isStackable
bool isStackable()
Definition: thing.h:95
Otc::FluidYellow
@ FluidYellow
Definition: const.h:201
Item::getCountOrSubType
int getCountOrSubType()
Definition: item.h:94
Otc::FluidBlood
@ FluidBlood
Definition: const.h:212
stdext::shared_object_ptr::get
T * get() const
Definition: shared_object.h:82
Otc::FluidMilk
@ FluidMilk
Definition: const.h:216
shadermanager.h
Animator::getPhase
int getPhase()
Definition: animator.cpp:96
ThingTypeManager::isValidDatId
bool isValidDatId(uint16 id, ThingCategory category)
Definition: thingtypemanager.h:75
Otc::FluidBrown
@ FluidBrown
Definition: const.h:199
ATTR_ATTACKSPEED
@ ATTR_ATTACKSPEED
Definition: item.h:65
stdext::exception
Definition: exception.h:31
item.h
Otc::FluidWater
@ FluidWater
Definition: const.h:208