bool Item::unserialize(xmlNodePtr nodeItem) { int intValue; std::string strValue; if(readXMLInteger(nodeItem, "id", intValue)){ id = intValue; } else{ return false; } if(readXMLInteger(nodeItem, "count", intValue)){ setSubType(intValue); } if(readXMLString(nodeItem, "special_description", strValue)){ setSpecialDescription(strValue); } if(readXMLString(nodeItem, "text", strValue)){ setText(strValue); } if(readXMLInteger(nodeItem, "written_date", intValue)){ setWrittenDate(intValue); } if(readXMLString(nodeItem, "writer", strValue)){ setWriter(strValue); } if(readXMLInteger(nodeItem, "actionId", intValue)){ setActionId(intValue); } if(readXMLInteger(nodeItem, "uniqueId", intValue)){ setUniqueId(intValue); } if(readXMLInteger(nodeItem, "duration", intValue)){ setDuration(intValue); } if(readXMLInteger(nodeItem, "decayState", intValue)){ ItemDecayState_t decayState = (ItemDecayState_t)intValue; if(decayState != DECAYING_FALSE){ setDecaying(DECAYING_PENDING); } } return true; }
Attr_ReadValue Item::readAttr(const AttrTypes_t& attr, PropStream& propStream) { switch (attr) { case ATTR_COUNT: { uint8_t _count = 0; if (!propStream.GET_UINT8(_count)) { return ATTR_READ_ERROR; } setSubType(_count); break; } case ATTR_ACTION_ID: { uint16_t _actionid = 0; if (!propStream.GET_UINT16(_actionid)) { return ATTR_READ_ERROR; } setActionId(_actionid); break; } case ATTR_UNIQUE_ID: { uint16_t _uniqueid; if (!propStream.GET_UINT16(_uniqueid)) { return ATTR_READ_ERROR; } setUniqueId(_uniqueid); break; } case ATTR_TEXT: { std::string _text; if (!propStream.GET_STRING(_text)) { return ATTR_READ_ERROR; } setText(_text); break; } case ATTR_WRITTENDATE: { uint32_t _writtenDate; if (!propStream.GET_UINT32(_writtenDate)) { return ATTR_READ_ERROR; } setWrittenDate(_writtenDate); break; } case ATTR_WRITTENBY: { std::string _writer; if (!propStream.GET_STRING(_writer)) { return ATTR_READ_ERROR; } setWriter(_writer); break; } case ATTR_DESC: { std::string _text; if (!propStream.GET_STRING(_text)) { return ATTR_READ_ERROR; } setSpecialDescription(_text); break; } case ATTR_RUNE_CHARGES: { uint8_t _charges = 1; if (!propStream.GET_UINT8(_charges)) { return ATTR_READ_ERROR; } setSubType(_charges); break; } case ATTR_CHARGES: { uint16_t _charges = 1; if (!propStream.GET_UINT16(_charges)) { return ATTR_READ_ERROR; } setSubType(_charges); break; } case ATTR_DURATION: { uint32_t duration = 0; if (!propStream.GET_UINT32(duration)) { return ATTR_READ_ERROR; } if (((int32_t)duration) < 0) { duration = 0; } setDuration(duration); break; } case ATTR_DECAYING_STATE: { uint8_t state = 0; if (!propStream.GET_UINT8(state)) { return ATTR_READ_ERROR; } if (state != DECAYING_FALSE) { setDecaying(DECAYING_PENDING); } break; } //these should be handled through derived classes //If these are called then something has changed in the items.xml since the map was saved //just read the values //Depot class case ATTR_DEPOT_ID: { uint16_t _depotId; if (!propStream.GET_UINT16(_depotId)) { return ATTR_READ_ERROR; } return ATTR_READ_CONTINUE; } //Door class case ATTR_HOUSEDOORID: { uint8_t _doorId; if (!propStream.GET_UINT8(_doorId)) { return ATTR_READ_ERROR; } return ATTR_READ_CONTINUE; } //Bed class case ATTR_SLEEPERGUID: { uint32_t _guid; if (!propStream.GET_UINT32(_guid)) { return ATTR_READ_ERROR; } return ATTR_READ_CONTINUE; } case ATTR_SLEEPSTART: { uint32_t sleep_start; if (!propStream.GET_UINT32(sleep_start)) { return ATTR_READ_ERROR; } return ATTR_READ_CONTINUE; } //Teleport class case ATTR_TELE_DEST: { TeleportDest tele_dest; if (!propStream.GET_UINT16(tele_dest._x) || !propStream.GET_UINT16(tele_dest._y) || !propStream.GET_UINT8(tele_dest._z)) { return ATTR_READ_ERROR; } return ATTR_READ_CONTINUE; } //Container class case ATTR_CONTAINER_ITEMS: { uint32_t count; if (!propStream.GET_UINT32(count)) { return ATTR_READ_ERROR; } //We cant continue parse attributes since there is //container data after this attribute. return ATTR_READ_ERROR; } default: return ATTR_READ_ERROR; break; } return ATTR_READ_CONTINUE; }
bool Item::readAttr(AttrTypes_t attr, PropStream& propStream) { switch(attr){ case ATTR_COUNT: { uint8_t _count = 0; if(!propStream.GET_UCHAR(_count)){ return false; } setSubType(_count); break; } case ATTR_ACTION_ID: { uint16_t _actionid = 0; if(!propStream.GET_USHORT(_actionid)){ return false; } setActionId(_actionid); break; } case ATTR_UNIQUE_ID: { uint16_t _uniqueid; if(!propStream.GET_USHORT(_uniqueid)){ return false; } setUniqueId(_uniqueid); break; } case ATTR_TEXT: { std::string _text; if(!propStream.GET_STRING(_text)){ return false; } setText(_text); break; } case ATTR_WRITTENDATE: { uint32_t _writtenDate; if(!propStream.GET_ULONG(_writtenDate)){ return false; } setWrittenDate(_writtenDate); break; } case ATTR_WRITTENBY: { std::string _writer; if(!propStream.GET_STRING(_writer)){ return false; } setWriter(_writer); break; } case ATTR_DESC: { std::string _text; if(!propStream.GET_STRING(_text)){ return false; } setSpecialDescription(_text); break; } case ATTR_RUNE_CHARGES: { uint8_t _charges = 1; if(!propStream.GET_UCHAR(_charges)){ return false; } setSubType(_charges); break; } case ATTR_CHARGES: { uint16_t _charges = 1; if(!propStream.GET_USHORT(_charges)){ return false; } setSubType(_charges); break; } case ATTR_DURATION: { uint32_t duration = 0; if(!propStream.GET_ULONG(duration)){ return false; } setDuration(duration); break; } case ATTR_DECAYING_STATE: { uint8_t state = 0; if(!propStream.GET_UCHAR(state)){ return false; } if(state != DECAYING_FALSE){ setDecaying(DECAYING_PENDING); } break; } //these should be handled through derived classes //If these are called then something has changed in the items.otb since the map was saved //just read the values //Depot class case ATTR_DEPOT_ID: { uint16_t _depotId; if(!propStream.GET_USHORT(_depotId)){ return false; } return true; } //Door class case ATTR_HOUSEDOORID: { uint8_t _doorId; if(!propStream.GET_UCHAR(_doorId)){ return false; } return true; } //Teleport class case ATTR_TELE_DEST: { TeleportDest* tele_dest; if(!propStream.GET_STRUCT(tele_dest)){ return false; } return true; } default: return false; break; } return true; }