diff --git a/modules/game_tibiafiles/tibiafiles.lua b/modules/game_tibiafiles/tibiafiles.lua index 5661cb42..19ae6b78 100644 --- a/modules/game_tibiafiles/tibiafiles.lua +++ b/modules/game_tibiafiles/tibiafiles.lua @@ -10,4 +10,4 @@ function TibiaFiles.init() end function TibiaFiles.terminate() -end \ No newline at end of file +end diff --git a/src/framework/sound/soundmanager.cpp b/src/framework/sound/soundmanager.cpp index 743d4417..5410a256 100644 --- a/src/framework/sound/soundmanager.cpp +++ b/src/framework/sound/soundmanager.cpp @@ -107,8 +107,10 @@ void SoundManager::poll() } } -void SoundManager::preload(const std::string& filename) +void SoundManager::preload(std::string filename) { + filename = g_resources.resolvePath(filename); + auto it = m_buffers.find(filename); if(it != m_buffers.end()) return; @@ -130,11 +132,13 @@ void SoundManager::enableSound(bool enable) return; } -void SoundManager::play(const std::string& filename) +void SoundManager::play(std::string filename) { - if(!m_soundEnabled) + if(!m_soundEnabled || filename.empty()) return; + filename = g_resources.resolvePath(filename); + SoundSourcePtr soundSource = createSoundSource(filename); if(!soundSource) { g_logger.error(stdext::format("unable to play '%s'", filename)); @@ -154,17 +158,21 @@ void SoundManager::enableMusic(bool enable) m_musicEnabled = enable; - if(enable) + if(enable && !m_currentMusic.empty()) playMusic(m_currentMusic, 3.0f); else m_musicSource = nullptr; } -void SoundManager::playMusic(const std::string& filename, float fadetime) +void SoundManager::playMusic(std::string filename, float fadetime) { + if(filename.empty()) + return; + + filename = g_resources.resolvePath(filename); + if(m_currentMusic == filename && m_musicSource) return; - m_currentMusic = g_resources.resolvePath(filename); if(!m_musicEnabled) return; diff --git a/src/framework/sound/soundmanager.h b/src/framework/sound/soundmanager.h index 80cae1fa..d897424e 100644 --- a/src/framework/sound/soundmanager.h +++ b/src/framework/sound/soundmanager.h @@ -38,12 +38,12 @@ public: void terminate(); void poll(); - void preload(const std::string& filename); + void preload(std::string filename); void enableSound(bool enable); - void play(const std::string& filename); + void play(std::string filename); void enableMusic(bool enable); - void playMusic(const std::string& filename, float fadetime); + void playMusic(std::string filename, float fadetime); void stopMusic(float fadetime = 0); bool isMusicEnabled() { return m_musicEnabled; } diff --git a/src/otclient/item.cpp b/src/otclient/item.cpp index 39e32851..28e3a4a0 100644 --- a/src/otclient/item.cpp +++ b/src/otclient/item.cpp @@ -199,78 +199,67 @@ bool Item::isValid() void Item::unserializeItem(const BinaryTreePtr &in) { - while (in->canRead()) { - uint8 attrType = in->getU8(); - if(attrType == 0) - break; - - // fugly switch yes? - switch ((AttrTypes_t)attrType) { - case ATTR_COUNT: - setSubType(in->getU8()); - break; - case ATTR_CHARGES: - setSubType(in->getU16()); - break; - case ATTR_ACTION_ID: - setActionId(in->getU16()); - break; - case ATTR_UNIQUE_ID: - setUniqueId(in->getU16()); - break; - case ATTR_NAME: - m_attribs.set(ATTR_NAME, in->getString()); - break; - case ATTR_TEXT: - m_attribs.set(ATTR_TEXT, in->getString()); - break; - case ATTR_DESC: - m_attribs.set(ATTR_DESC, in->getString()); - break; - case ATTR_CONTAINER_ITEMS: - m_attribs.set(ATTR_CONTAINER_ITEMS, in->getU32()); - break; - case ATTR_HOUSEDOORID: - m_attribs.set(ATTR_HOUSEDOORID, in->getU8()); - break; - case ATTR_DEPOT_ID: - m_attribs.set(ATTR_DEPOT_ID, in->getU16()); - break; - case ATTR_TELE_DEST: { - Position teleportDestination; - teleportDestination.x = in->getU16(); - teleportDestination.y = in->getU16(); - teleportDestination.z = in->getU8(); - m_attribs.set(ATTR_TELE_DEST, teleportDestination); + try { + while(in->canRead()) { + int attrib = in->getU8(); + if(attrib == 0) break; + + switch(attrib) { + case ATTR_COUNT: + case ATTR_RUNE_CHARGES: + setCount(in->getU8()); + break; + case ATTR_CHARGES: + setCount(in->getU16()); + break; + case ATTR_HOUSEDOORID: + case ATTR_SCRIPTPROTECTED: + case ATTR_DUALWIELD: + case ATTR_DECAYING_STATE: + m_attribs.set(attrib, in->getU8()); + break; + case ATTR_ACTION_ID: + case ATTR_UNIQUE_ID: + case ATTR_DEPOT_ID: + m_attribs.set(attrib, in->getU16()); + break; + case ATTR_CONTAINER_ITEMS: + case ATTR_ATTACK: + case ATTR_EXTRAATTACK: + case ATTR_DEFENSE: + case ATTR_EXTRADEFENSE: + case ATTR_ARMOR: + case ATTR_ATTACKSPEED: + case ATTR_HITCHANCE: + case ATTR_DURATION: + case ATTR_WRITTENDATE: + case ATTR_SLEEPERGUID: + case ATTR_SLEEPSTART: + case ATTR_ATTRIBUTE_MAP: + m_attribs.set(attrib, in->getU32()); + break; + case ATTR_TELE_DEST: { + Position pos; + pos.x = in->getU16(); + pos.y = in->getU16(); + pos.z = in->getU8(); + m_attribs.set(attrib, pos); + break; + } + case ATTR_NAME: + case ATTR_TEXT: + case ATTR_DESC: + case ATTR_ARTICLE: + case ATTR_WRITTENBY: + m_attribs.set(attrib, in->getString()); + break; + default: + stdext::throw_exception(stdext::format("invalid item attribute %d", attrib)); } - case ATTR_ARTICLE: - case ATTR_WRITTENBY: - in->getString(); - break; - case ATTR_ATTACK: - case ATTR_EXTRAATTACK: - case ATTR_DEFENSE: - case ATTR_EXTRADEFENSE: - case ATTR_ARMOR: - case ATTR_ATTACKSPEED: - case ATTR_HITCHANCE: - case ATTR_DURATION: - case ATTR_WRITTENDATE: - case ATTR_SLEEPERGUID: - case ATTR_SLEEPSTART: - case ATTR_ATTRIBUTE_MAP: - in->skip(4); - break; - case ATTR_SCRIPTPROTECTED: - case ATTR_DUALWIELD: - case ATTR_DECAYING_STATE: - case ATTR_RUNE_CHARGES: - in->skip(1); - break; - default: - stdext::throw_exception(stdext::format("invalid item attribute %d", (int)attrType)); } + } catch(stdext::exception& e) { + g_logger.error(stdext::format("Failed to unserialize OTBM item: %s", e.what())); } } diff --git a/src/otclient/item.h b/src/otclient/item.h index 2ef23e82..56b80888 100644 --- a/src/otclient/item.h +++ b/src/otclient/item.h @@ -31,6 +31,8 @@ enum AttrTypes_t { ATTR_END = 0, + //ATTR_DESCRIPTION = 1, + //ATTR_EXT_FILE = 2, ATTR_TILE_FLAGS = 3, ATTR_ACTION_ID = 4, ATTR_UNIQUE_ID = 5, @@ -39,7 +41,9 @@ enum AttrTypes_t ATTR_TELE_DEST = 8, ATTR_ITEM = 9, ATTR_DEPOT_ID = 10, + //ATTR_EXT_SPAWN_FILE = 11, ATTR_RUNE_CHARGES = 12, + //ATTR_EXT_HOUSE_FILE = 13, ATTR_HOUSEDOORID = 14, ATTR_COUNT = 15, ATTR_DURATION = 16, diff --git a/src/otclient/thingtypemanager.cpp b/src/otclient/thingtypemanager.cpp index 37119353..c055d526 100644 --- a/src/otclient/thingtypemanager.cpp +++ b/src/otclient/thingtypemanager.cpp @@ -43,6 +43,9 @@ void ThingTypeManager::init() m_datLoaded = false; m_xmlLoaded = false; m_otbLoaded = false; + for(int i = 0; i < DatLastCategory; ++i) + m_datTypes[i].resize(1, m_nullDatType); + m_otbTypes.resize(1, m_nullOtbType); } void ThingTypeManager::terminate()