bool Item::serializeAttr(PropWriteStream& propWriteStream) const { if (isStackable() || isFluidContainer() || isSplash()) { uint8_t _count = getSubType(); propWriteStream.ADD_UCHAR(ATTR_COUNT); propWriteStream.ADD_UCHAR(_count); } if (hasCharges()) { uint16_t _count = getCharges(); propWriteStream.ADD_UCHAR(ATTR_CHARGES); propWriteStream.ADD_USHORT(_count); } if (!isNotMoveable()) { uint16_t _actionId = getActionId(); if (_actionId) { propWriteStream.ADD_UCHAR(ATTR_ACTION_ID); propWriteStream.ADD_USHORT(_actionId); } } const std::string& _text = getText(); if (!_text.empty()) { propWriteStream.ADD_UCHAR(ATTR_TEXT); propWriteStream.ADD_STRING(_text); } const time_t _writtenDate = getDate(); if (_writtenDate > 0) { propWriteStream.ADD_UCHAR(ATTR_WRITTENDATE); propWriteStream.ADD_ULONG(_writtenDate); } const std::string& _writer = getWriter(); if (!_writer.empty()) { propWriteStream.ADD_UCHAR(ATTR_WRITTENBY); propWriteStream.ADD_STRING(_writer); } const std::string& _specialDesc = getSpecialDescription(); if (!_specialDesc.empty()) { propWriteStream.ADD_UCHAR(ATTR_DESC); propWriteStream.ADD_STRING(_specialDesc); } if (hasAttribute(ATTR_ITEM_DURATION)) { uint32_t duration = getDuration(); propWriteStream.ADD_UCHAR(ATTR_DURATION); propWriteStream.ADD_ULONG(duration); } ItemDecayState_t decayState = getDecaying(); if (decayState == DECAYING_TRUE || decayState == DECAYING_PENDING) { propWriteStream.ADD_UCHAR(ATTR_DECAYING_STATE); propWriteStream.ADD_UCHAR(decayState); } return true; }
int Item::getSubType() { if(isSplash() || isFluidContainer()) return m_countOrSubType; if(g_game.getProtocolVersion() >= 860) return 0; return 1; }
int Item::getSubType() { if(isSplash() || isFluidContainer()) return m_countOrSubType; if(g_game.getClientVersion() > 862) return 0; return 1; }
unsigned char Item::getItemCountOrSubtype() const { if(isFluidContainer() || isSplash()) return fluid; else if(items[id].runeMagLevel != -1) return chargecount; else return count; }
void Item::setItemCountOrSubtype(unsigned char n) { if(isFluidContainer() || isSplash()) fluid = n; else if(items[id].runeMagLevel != -1) chargecount = n; else{ count = n; } }
bool Item::serializeAttr(PropWriteStream& propWriteStream) const { if(isStackable() || isFluidContainer() || isSplash()) { propWriteStream.addByte(ATTR_COUNT); propWriteStream.addByte((uint8_t)getSubType()); } if(attributes && !attributes->empty()) { propWriteStream.addByte(ATTR_ATTRIBUTE_MAP); serializeMap(propWriteStream); } return true; }
bool Item::serializeAttr(PropWriteStream& propWriteStream) { if(isStackable() || isSplash() || isFluidContainer()){ unsigned char _count = getItemCountOrSubtype(); propWriteStream.ADD_UCHAR(ATTR_COUNT); propWriteStream.ADD_UCHAR(_count); } if(isRune()){ unsigned char _count = getItemCharge(); propWriteStream.ADD_UCHAR(ATTR_RUNE_CHARGES); propWriteStream.ADD_UCHAR(_count); } if(!isNotMoveable() /*moveable*/){ if(actionId){ unsigned short _actionId = getActionId(); propWriteStream.ADD_UCHAR(ATTR_ACTION_ID); propWriteStream.ADD_USHORT(_actionId); } } /*we are not saving unique ids if(uniqueId){ unsigned short _uniqueId = getUniqueId(); propWriteStream.ADD_UCHAR(ATTR_UNIQUE_ID); propWriteStream.ADD_USHORT(_uniqueId); } */ const std::string& _text = getText(); if(_text.length() > 0){ propWriteStream.ADD_UCHAR(ATTR_TEXT); propWriteStream.ADD_STRING(_text); } const std::string& _specialDesc = getSpecialDescription(); if(_specialDesc.length() > 0){ propWriteStream.ADD_UCHAR(ATTR_DESC); propWriteStream.ADD_STRING(_specialDesc); } return true; }
void Item::calculatePatterns(int& xPattern, int& yPattern, int& zPattern) { if(isStackable() && getNumPatternX() == 4 && getNumPatternY() == 2) { if(m_countOrSubType <= 0) { xPattern = 0; yPattern = 0; } else if(m_countOrSubType < 5) { xPattern = m_countOrSubType-1; yPattern = 0; } else if(m_countOrSubType < 10) { xPattern = 0; yPattern = 1; } else if(m_countOrSubType < 25) { xPattern = 1; yPattern = 1; } else if(m_countOrSubType < 50) { xPattern = 2; yPattern = 1; } else { xPattern = 3; yPattern = 1; } } else if(isHangable()) { const TilePtr& tile = getTile(); if(tile) { if(tile->mustHookSouth()) xPattern = getNumPatternX() >= 2 ? 1 : 0; else if(tile->mustHookEast()) xPattern = getNumPatternX() >= 3 ? 2 : 0; } } else if(isSplash() || isFluidContainer()) { int color = Otc::FluidTransparent; switch(m_countOrSubType) { case Otc::FluidNone: color = Otc::FluidTransparent; break; case Otc::FluidWater: color = Otc::FluidBlue; break; case Otc::FluidMana: color = Otc::FluidPurple; break; case Otc::FluidBeer: color = Otc::FluidBrown; break; case Otc::FluidOil: color = Otc::FluidBrown; break; case Otc::FluidBlood: color = Otc::FluidRed; break; case Otc::FluidSlime: color = Otc::FluidGreen; break; case Otc::FluidMud: color = Otc::FluidBrown; break; case Otc::FluidLemonade: color = Otc::FluidYellow; break; case Otc::FluidMilk: color = Otc::FluidWhite; break; case Otc::FluidWine: color = Otc::FluidPurple; break; case Otc::FluidHealth: color = Otc::FluidRed; break; case Otc::FluidUrine: color = Otc::FluidYellow; break; case Otc::FluidRum: color = Otc::FluidBrown; break; case Otc::FluidFruidJuice: color = Otc::FluidYellow; break; case Otc::FluidCoconutMilk: color = Otc::FluidWhite; break; case Otc::FluidTea: color = Otc::FluidBrown; break; case Otc::FluidMead: color = Otc::FluidBrown; break; default: color = Otc::FluidTransparent; break; } xPattern = (color % 4) % getNumPatternX(); yPattern = (color / 4) % getNumPatternY(); } else if(isGround() || isOnBottom()) { xPattern = m_position.x % getNumPatternX(); yPattern = m_position.y % getNumPatternY(); zPattern = m_position.z % getNumPatternZ(); } }
std::string Item::getDescription(int32_t lookDistance) const { std::stringstream s; const ItemType& it = items[id]; if (it.name.length()) { if(isStackable() && count > 1){ s << (int)count << " " << it.name << "s."; if(lookDistance <= 1) { s << std::endl << "They weight " << std::fixed << std::setprecision(2) << ((double) count * it.weight) << " oz."; } } else{ if(items[id].runeMagLevel != -1) { s << "a spell rune for level " << it.runeMagLevel << "." << std::endl; s << "It's an \"" << it.name << "\" spell ("; if(getItemCharge()) s << (int)getItemCharge(); else s << "1"; s << "x)."; } else if(isWeapon() && (getAttack() || getDefense())) { if(getAttack()){ s << "a " << it.name << " (Atk:" << (int)getAttack() << " Def:" << (int)getDefense() << ")."; } else{ s << "a " << it.name << " (Def:" << (int)getDefense() << ")."; } } else if(getArmor()){ s << "a " << it.name << " (Arm:" << (int)getArmor() << ")."; } else if(isFluidContainer()){ s << "a " << it.name; if(fluid == 0){ s << ". It is empty."; } else{ s << " of " << items[fluid].name << "."; } } else if(isSplash()){ s << "a " << it.name << " of "; if(fluid == 0){ s << items[1].name << "."; } else{ s << items[fluid].name << "."; } } else if(it.isKey()){ s << "a " << it.name << " (Key:" << actionId << ")."; } else if(it.isGroundTile()){ s << it.name << "."; } else if(it.isContainer()){ s << "a " << it.name << " (Vol:" << getContainer()->capacity() << ")."; } else if(it.allowDistRead){ s << it.name << "." << std::endl; if(lookDistance <= 4){ if(text && text->length() > 0){ s << "You read: " << *text; } else s << "Nothing is written on it."; } else s << "You are too far away to read it."; } else{ s << "a " << it.name << "."; } if(lookDistance <= 1){ double weight = getWeight(); if(weight > 0) s << std::endl << "It weighs " << std::fixed << std::setprecision(2) << weight << " oz."; } if(specialDescription) s << std::endl << specialDescription->c_str(); else if(lookDistance <= 1 && it.description.length()){ s << std::endl << it.description; } } } else s << "an item of type " << id <<"."; return s.str(); }